mirror of
https://github.com/platformio/platformio-core.git
synced 2025-12-23 07:12:31 +01:00
Compare commits
3352 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c0b069c920 | ||
|
|
7db04b1c3f | ||
|
|
32dbf22d44 | ||
|
|
3243a84dba | ||
|
|
f465befa68 | ||
|
|
f4b4f5c434 | ||
|
|
ffc94a88fe | ||
|
|
fb29c9c0f6 | ||
|
|
df437995df | ||
|
|
e4440ed94c | ||
|
|
b213a302e3 | ||
|
|
d50dfe19d9 | ||
|
|
9ba5dc0a60 | ||
|
|
5011c3e21c | ||
|
|
e48e15b014 | ||
|
|
357c932a88 | ||
|
|
2f07a58e4f | ||
|
|
4a2594c12e | ||
|
|
8cda6db02d | ||
|
|
f7053928f0 | ||
|
|
e22335984f | ||
|
|
6a1a1956c8 | ||
|
|
98852caefa | ||
|
|
e399c6b363 | ||
|
|
cb2c3b1b63 | ||
|
|
19003ea51b | ||
|
|
29064b6c63 | ||
|
|
ba352454ed | ||
|
|
5ee194b2b9 | ||
|
|
9d566d8905 | ||
|
|
b310c57136 | ||
|
|
9aa5f16b49 | ||
|
|
4fac523811 | ||
|
|
2bb22a86d7 | ||
|
|
39aaae303f | ||
|
|
1310b7b07b | ||
|
|
18f6f23271 | ||
|
|
366efacd81 | ||
|
|
7be1af4241 | ||
|
|
d0bc40bc24 | ||
|
|
73b1d9ccd5 | ||
|
|
94c27ae30f | ||
|
|
b476e298d3 | ||
|
|
c9fa2206ef | ||
|
|
b1caaa2208 | ||
|
|
f46072f769 | ||
|
|
7de4d6aeef | ||
|
|
31f14274af | ||
|
|
50c568c232 | ||
|
|
3bcc3e07ae | ||
|
|
2ae169d210 | ||
|
|
1c68409a08 | ||
|
|
f981916f1d | ||
|
|
0a9031e448 | ||
|
|
2d1daa756d | ||
|
|
6b6860196a | ||
|
|
ccb63a9ecc | ||
|
|
3ce62fbafe | ||
|
|
b77160d363 | ||
|
|
6a04f52620 | ||
|
|
aa28beddd8 | ||
|
|
d0cc3a045e | ||
|
|
02efe4f7f3 | ||
|
|
2c0ca3e437 | ||
|
|
aa8de4ff4b | ||
|
|
59fe190f20 | ||
|
|
e0fc44aa42 | ||
|
|
e7b5a14e11 | ||
|
|
0710c094e7 | ||
|
|
1410dd093a | ||
|
|
d1362c3751 | ||
|
|
2299383b03 | ||
|
|
622e4033c1 | ||
|
|
ec9a2b02ea | ||
|
|
275648a882 | ||
|
|
5214b32ee3 | ||
|
|
c1c2be0b58 | ||
|
|
44fc500c93 | ||
|
|
b6d2e1b243 | ||
|
|
d54327f1a9 | ||
|
|
0f4ab5b50b | ||
|
|
ca34da51aa | ||
|
|
f937eabc1a | ||
|
|
e019341e59 | ||
|
|
50b2bc07dc | ||
|
|
8f7206b186 | ||
|
|
1461953341 | ||
|
|
cd3245960b | ||
|
|
580c0601cf | ||
|
|
979a6a80f0 | ||
|
|
6f9fac5663 | ||
|
|
85730619f4 | ||
|
|
61374f15f1 | ||
|
|
ad52f618cf | ||
|
|
bbb32607ed | ||
|
|
669ef3cc93 | ||
|
|
d47022b8c3 | ||
|
|
c20cd1b464 | ||
|
|
3161e5f606 | ||
|
|
233d48fac0 | ||
|
|
218a1dccf6 | ||
|
|
02bad10652 | ||
|
|
7495160374 | ||
|
|
3663dc3470 | ||
|
|
d2b34d42f7 | ||
|
|
b78a151706 | ||
|
|
6a49df7dfe | ||
|
|
f79e2e38ef | ||
|
|
bc323252e8 | ||
|
|
f63a6d73ee | ||
|
|
5e6d1d9361 | ||
|
|
7e875553c2 | ||
|
|
105cd0fa71 | ||
|
|
8676f471f1 | ||
|
|
93d524a392 | ||
|
|
e5b73dcd2b | ||
|
|
ade6c25056 | ||
|
|
e0ce40d6b3 | ||
|
|
90993ec69f | ||
|
|
3269d243a8 | ||
|
|
ef861ed702 | ||
|
|
b1c9eb9022 | ||
|
|
3d300414ac | ||
|
|
3a16ecbaa1 | ||
|
|
9415b369e1 | ||
|
|
6ec1890f52 | ||
|
|
d1c7f56950 | ||
|
|
2ccb30b0f0 | ||
|
|
e95354afeb | ||
|
|
cfb9ec77ce | ||
|
|
3a52f35fe5 | ||
|
|
ba0e87b978 | ||
|
|
1cb1af3375 | ||
|
|
7c0cd12f80 | ||
|
|
a3457dfca6 | ||
|
|
cdee242333 | ||
|
|
aa0b6c2071 | ||
|
|
be306224e3 | ||
|
|
1fce214a6b | ||
|
|
f1f42c6888 | ||
|
|
1d6dcb1c5a | ||
|
|
6b36a29858 | ||
|
|
18c6fe98ee | ||
|
|
f86885a523 | ||
|
|
0c2f973412 | ||
|
|
591e876660 | ||
|
|
acefc8d276 | ||
|
|
0763a54af3 | ||
|
|
d7f7418812 | ||
|
|
06cce20707 | ||
|
|
b553b8f9df | ||
|
|
8736e7bfb0 | ||
|
|
231bd8b294 | ||
|
|
cc08bb0fd0 | ||
|
|
46cca359e7 | ||
|
|
aac0b29929 | ||
|
|
f7023aa8ff | ||
|
|
904c5464c3 | ||
|
|
31edb2a570 | ||
|
|
d428d18fae | ||
|
|
e7e80ff152 | ||
|
|
1362630ed6 | ||
|
|
e5543b2aee | ||
|
|
53afdc5e02 | ||
|
|
20641bb4ff | ||
|
|
33a05fa7ca | ||
|
|
f358a4ff57 | ||
|
|
aa57924488 | ||
|
|
c5af85f123 | ||
|
|
55b8ff7e74 | ||
|
|
8913f1b1ea | ||
|
|
4360ff7463 | ||
|
|
718d1f2de1 | ||
|
|
195444b253 | ||
|
|
17dc5f594f | ||
|
|
3b99dabbf4 | ||
|
|
c9e578f977 | ||
|
|
00782fc624 | ||
|
|
19d2dfdad0 | ||
|
|
1890162f3f | ||
|
|
4980d3e4bb | ||
|
|
fc53cb4489 | ||
|
|
640aa72cff | ||
|
|
6235328194 | ||
|
|
332472e84b | ||
|
|
59fb4b103f | ||
|
|
8186aed8d9 | ||
|
|
31700c6bfc | ||
|
|
316c2c6e1a | ||
|
|
b6ad672f6a | ||
|
|
59337c71c1 | ||
|
|
7a40992cc1 | ||
|
|
1412f085b8 | ||
|
|
6b826abce0 | ||
|
|
f8dafbca80 | ||
|
|
dabe9ba2a7 | ||
|
|
b8fde283fd | ||
|
|
fa738650da | ||
|
|
717a699546 | ||
|
|
f512ccbe68 | ||
|
|
de523493b2 | ||
|
|
c0b277d9c8 | ||
|
|
e615e7529e | ||
|
|
86667c5664 | ||
|
|
dcb299e9b9 | ||
|
|
2b4b2eb571 | ||
|
|
3caa2a9e8d | ||
|
|
0b5769dc57 | ||
|
|
9b9b05439b | ||
|
|
93d4e68378 | ||
|
|
2c79de971e | ||
|
|
bc18941eb0 | ||
|
|
23ecce297a | ||
|
|
cc646b19bf | ||
|
|
4b08dbd602 | ||
|
|
d822334fdd | ||
|
|
3289b36450 | ||
|
|
affd53eb27 | ||
|
|
06a6822173 | ||
|
|
6380d6c3ea | ||
|
|
24f314d73d | ||
|
|
6cddaf9eb7 | ||
|
|
ec419f3d0e | ||
|
|
a6c84da83a | ||
|
|
7cad113f0a | ||
|
|
712155243c | ||
|
|
2091a33fb9 | ||
|
|
1d5245edbd | ||
|
|
cfb22f2a36 | ||
|
|
16eb41b84e | ||
|
|
ae38d17b7f | ||
|
|
7bbb850c2f | ||
|
|
fda439841e | ||
|
|
c558584640 | ||
|
|
cfb04b31a4 | ||
|
|
1090c414f5 | ||
|
|
5b64bf1f7c | ||
|
|
61eb989edd | ||
|
|
23ae8e0d3e | ||
|
|
e4f8a1877c | ||
|
|
61872dd734 | ||
|
|
16b307d1b3 | ||
|
|
a4770a27f4 | ||
|
|
ba858989f2 | ||
|
|
93c055a2ec | ||
|
|
2b3bc05f2b | ||
|
|
5260217537 | ||
|
|
62235ef32d | ||
|
|
ec40dcada7 | ||
|
|
5e666492c3 | ||
|
|
82246a837e | ||
|
|
2758e99295 | ||
|
|
7354515845 | ||
|
|
d58c392930 | ||
|
|
86cb2efd64 | ||
|
|
b307855207 | ||
|
|
3ad4ff02e8 | ||
|
|
4ef3818482 | ||
|
|
0082dc43a3 | ||
|
|
755ade05c6 | ||
|
|
12e4318de7 | ||
|
|
34e9063ddd | ||
|
|
2315b08909 | ||
|
|
9c9a40a531 | ||
|
|
ac4b485521 | ||
|
|
f13bf35dbd | ||
|
|
012cb85e31 | ||
|
|
62ee8066c2 | ||
|
|
fc064aaf05 | ||
|
|
0516cd74e1 | ||
|
|
5b7a0e6997 | ||
|
|
ad08ed8d12 | ||
|
|
55d4fc23d0 | ||
|
|
e29ecb47a5 | ||
|
|
c96c1f2b2f | ||
|
|
fab4f00ad4 | ||
|
|
adaa3757ac | ||
|
|
2eb7d0e8be | ||
|
|
d16d715898 | ||
|
|
1171cb204c | ||
|
|
d70a90f1d5 | ||
|
|
06574e3066 | ||
|
|
39dfbbdd87 | ||
|
|
7b8c68c934 | ||
|
|
6d81c230a5 | ||
|
|
a6c1869eb2 | ||
|
|
0c3f2b54ed | ||
|
|
c6abdf8206 | ||
|
|
9f2875fcd7 | ||
|
|
78b296f2ec | ||
|
|
903ad6c6f8 | ||
|
|
9441f776cc | ||
|
|
5dd97a35cc | ||
|
|
31814b5122 | ||
|
|
724135f40e | ||
|
|
cbb7db552a | ||
|
|
cdf4639c97 | ||
|
|
170917a927 | ||
|
|
efceb5db72 | ||
|
|
cee2da7448 | ||
|
|
3d8183a2e1 | ||
|
|
25341d1ec7 | ||
|
|
05081561c3 | ||
|
|
abbba7fe2e | ||
|
|
269935726d | ||
|
|
56aeff87dd | ||
|
|
42fb589369 | ||
|
|
bff590e207 | ||
|
|
0933e46a58 | ||
|
|
1a7429a1ef | ||
|
|
fd0b45afdb | ||
|
|
3d67535a9e | ||
|
|
0eb67a7b61 | ||
|
|
75774ad9fa | ||
|
|
7b6ecf4e45 | ||
|
|
ca8bc3819f | ||
|
|
0bd103a46d | ||
|
|
736c6a9a1e | ||
|
|
ef00ecd7f1 | ||
|
|
70b63d8618 | ||
|
|
a632583f89 | ||
|
|
15bb626e78 | ||
|
|
bc0d1f06e0 | ||
|
|
bd611bbee8 | ||
|
|
2522d19453 | ||
|
|
5c4b5c2270 | ||
|
|
2d0ac1a9c2 | ||
|
|
0f37e15b6c | ||
|
|
3d0f0659ae | ||
|
|
02a263fdce | ||
|
|
f7815d6c9b | ||
|
|
786dd8fe18 | ||
|
|
f9b9ed317d | ||
|
|
0394e43ba4 | ||
|
|
3b1fa572fa | ||
|
|
ea99701172 | ||
|
|
e329688954 | ||
|
|
18b10a7fbf | ||
|
|
05069f7ac6 | ||
|
|
1b1453808f | ||
|
|
d0e32ebcb5 | ||
|
|
ad48b85a44 | ||
|
|
75160bb231 | ||
|
|
4b1716e42b | ||
|
|
10d21595c6 | ||
|
|
f922fac9d9 | ||
|
|
5846566bbb | ||
|
|
8f97181ea7 | ||
|
|
3c6bd9824e | ||
|
|
1b0776167c | ||
|
|
f5f3cd85d8 | ||
|
|
79b7974f35 | ||
|
|
32c92eec95 | ||
|
|
7ec90ac23b | ||
|
|
bab8ad088e | ||
|
|
46acad952e | ||
|
|
200cbae177 | ||
|
|
d8ee64a545 | ||
|
|
7b324ebc3c | ||
|
|
02d9272d2a | ||
|
|
9fc5aecb64 | ||
|
|
5ca472050c | ||
|
|
dcab855d2c | ||
|
|
0c9c6d1092 | ||
|
|
301b8dc649 | ||
|
|
547e983a86 | ||
|
|
9b514ba194 | ||
|
|
37a2ccedbd | ||
|
|
a983f60fa0 | ||
|
|
fc96806e68 | ||
|
|
53b37216cc | ||
|
|
d07833e010 | ||
|
|
5b5387d97b | ||
|
|
1c20efe9d1 | ||
|
|
8b4104bf5b | ||
|
|
448e0f27b6 | ||
|
|
02db510048 | ||
|
|
ce9c563c9f | ||
|
|
4c170b7934 | ||
|
|
d1a2dba68c | ||
|
|
5d2867d8a9 | ||
|
|
4504a65b92 | ||
|
|
25f52917ef | ||
|
|
75770bcedf | ||
|
|
1c9fe4561a | ||
|
|
909b773f6d | ||
|
|
0343dc0785 | ||
|
|
b670ab4888 | ||
|
|
f85202d64c | ||
|
|
e5e5ebb7db | ||
|
|
86de58b9e1 | ||
|
|
675cd456b6 | ||
|
|
9fe581e425 | ||
|
|
a0626ac958 | ||
|
|
1fab2a5bec | ||
|
|
d9ae367281 | ||
|
|
837b040761 | ||
|
|
71afea8d80 | ||
|
|
7c9989d999 | ||
|
|
2e2b1fda9c | ||
|
|
25da978fee | ||
|
|
c677f24d8e | ||
|
|
77fe1e8184 | ||
|
|
377008ee08 | ||
|
|
22fb89e56a | ||
|
|
68c56e042c | ||
|
|
16c242e7fa | ||
|
|
c9e1ae2548 | ||
|
|
fc7f1c0728 | ||
|
|
aa1c7609d2 | ||
|
|
998f4ed6e6 | ||
|
|
33242a02ce | ||
|
|
7963ce2cdd | ||
|
|
b4159f9144 | ||
|
|
674aa5c4d8 | ||
|
|
e176e9922a | ||
|
|
fd98aa0ff8 | ||
|
|
f24e97e933 | ||
|
|
a934efa90a | ||
|
|
a0cae2b1a6 | ||
|
|
274c1a40a5 | ||
|
|
059a408e95 | ||
|
|
f4c6919800 | ||
|
|
7301b9e808 | ||
|
|
113746dc74 | ||
|
|
95aaca5e02 | ||
|
|
ed6b196459 | ||
|
|
34ed4678d7 | ||
|
|
a127251107 | ||
|
|
b55b80ecc8 | ||
|
|
68c75735f4 | ||
|
|
9b66abf5ef | ||
|
|
ccd650dda0 | ||
|
|
3afac476e5 | ||
|
|
8f7483cddf | ||
|
|
3b5c73b1a3 | ||
|
|
04ec65df3e | ||
|
|
49244072c4 | ||
|
|
3fe9ea1b01 | ||
|
|
a55ccb2b28 | ||
|
|
01a6ae656f | ||
|
|
2b7b852a68 | ||
|
|
b12c4d171e | ||
|
|
3ce7104542 | ||
|
|
297c173418 | ||
|
|
22733ea110 | ||
|
|
845991f1d3 | ||
|
|
e6faed5dd9 | ||
|
|
44909f9ce8 | ||
|
|
4ff1d640b3 | ||
|
|
743de42484 | ||
|
|
04c381d440 | ||
|
|
bda4b5d264 | ||
|
|
3f13821c43 | ||
|
|
e60e076d16 | ||
|
|
541993c06b | ||
|
|
3d5114655f | ||
|
|
3229933ed0 | ||
|
|
d7d66fd4a6 | ||
|
|
4a7cd5be6a | ||
|
|
fd56e5cec9 | ||
|
|
2cb7fcca9a | ||
|
|
9b2e7bf927 | ||
|
|
d913fb5600 | ||
|
|
6bf42f90ed | ||
|
|
51ff2b65f4 | ||
|
|
c05e1f7c9b | ||
|
|
4700419590 | ||
|
|
5f320cc5c8 | ||
|
|
351aaa3974 | ||
|
|
327d42d02d | ||
|
|
bbcc79208c | ||
|
|
578dfa40aa | ||
|
|
a43c6c6b9e | ||
|
|
5f99dd620d | ||
|
|
e959710d6d | ||
|
|
f0f1d0a61a | ||
|
|
7f63928d21 | ||
|
|
b929e452b0 | ||
|
|
b4f927a84d | ||
|
|
fe4a72edd0 | ||
|
|
5f4a10086f | ||
|
|
d5baa153a5 | ||
|
|
3f96530c32 | ||
|
|
861659e890 | ||
|
|
cd5b88dd1f | ||
|
|
06b49ec3ec | ||
|
|
4944731dc6 | ||
|
|
5d31d6825b | ||
|
|
0099b037f3 | ||
|
|
9994ed8b5e | ||
|
|
954357bdd2 | ||
|
|
c7f5629f82 | ||
|
|
dfe769c92e | ||
|
|
53017b24d1 | ||
|
|
f13537cabb | ||
|
|
16ea8f29a1 | ||
|
|
e708b74507 | ||
|
|
f61c7f6030 | ||
|
|
1260859c42 | ||
|
|
ec9324d77f | ||
|
|
d66b1780ce | ||
|
|
35cab82605 | ||
|
|
12222c0f42 | ||
|
|
12ec11c7e2 | ||
|
|
c926ca389c | ||
|
|
e01c0a1eff | ||
|
|
8008f87ffa | ||
|
|
91d3a8ffad | ||
|
|
309d3a45d6 | ||
|
|
ebe0d41b77 | ||
|
|
6403cf0c8b | ||
|
|
7964aed453 | ||
|
|
97866cf44d | ||
|
|
4eb92ff2e3 | ||
|
|
0e8fb1ba83 | ||
|
|
8741f37831 | ||
|
|
68ccabda56 | ||
|
|
a0cd0bc189 | ||
|
|
aadb186054 | ||
|
|
2c232f2f3f | ||
|
|
f85c894b52 | ||
|
|
fb432da26b | ||
|
|
e8da7b4673 | ||
|
|
53906c49cb | ||
|
|
b774bd6a55 | ||
|
|
cefc2fa21c | ||
|
|
546993b12c | ||
|
|
08ab80187c | ||
|
|
bf48643865 | ||
|
|
35a91dbd57 | ||
|
|
7a56ec614c | ||
|
|
7d2728845e | ||
|
|
94a834ecc4 | ||
|
|
46774466db | ||
|
|
671eff5012 | ||
|
|
a3e7535db5 | ||
|
|
f7ee7e2e8c | ||
|
|
7a04061d6d | ||
|
|
7827994791 | ||
|
|
dae290ad2d | ||
|
|
61fc7d8589 | ||
|
|
0deb623ad5 | ||
|
|
ef8aeeb5f0 | ||
|
|
2695c985a4 | ||
|
|
fcfdc5c206 | ||
|
|
3a96b460df | ||
|
|
78616bf06f | ||
|
|
43ebff2a84 | ||
|
|
7afbbadef1 | ||
|
|
e26372075d | ||
|
|
d0f6c69135 | ||
|
|
b1780c54db | ||
|
|
7cc51035aa | ||
|
|
820efaeb21 | ||
|
|
1ee53137ec | ||
|
|
01afcb1c9e | ||
|
|
574bbd1692 | ||
|
|
0c06982d75 | ||
|
|
8f4c09a600 | ||
|
|
1c5b08de59 | ||
|
|
d8a0272bec | ||
|
|
f6960a0f98 | ||
|
|
2849d78ece | ||
|
|
954ff8dca0 | ||
|
|
93db0fa064 | ||
|
|
839fe8e02f | ||
|
|
60b668342f | ||
|
|
178cf35a43 | ||
|
|
adf30f3640 | ||
|
|
2793059c70 | ||
|
|
6e7de3a01c | ||
|
|
77a14f3c7b | ||
|
|
a9543037b2 | ||
|
|
902b8e0a52 | ||
|
|
613d92c32f | ||
|
|
ebf9607c99 | ||
|
|
89dc767a1c | ||
|
|
cb54910529 | ||
|
|
f78837d467 | ||
|
|
6ad1ce5239 | ||
|
|
707384aeed | ||
|
|
e3b976e189 | ||
|
|
8c7fa61f62 | ||
|
|
0bdb877fe1 | ||
|
|
fddcc3c965 | ||
|
|
8dde7e2efb | ||
|
|
2f40f32988 | ||
|
|
bb0063d5cf | ||
|
|
dcdd552856 | ||
|
|
c4f23be1dc | ||
|
|
571fe4dc04 | ||
|
|
1827223b1c | ||
|
|
b2c37311b9 | ||
|
|
70e4181b17 | ||
|
|
e8d7aae53c | ||
|
|
41312ef86d | ||
|
|
b04fc327c0 | ||
|
|
a37eb9868f | ||
|
|
4d1a135d76 | ||
|
|
45e75f7473 | ||
|
|
8127e8b2ff | ||
|
|
d30b8fffa1 | ||
|
|
52f0e556e2 | ||
|
|
0376a92ebb | ||
|
|
5da5bd43e4 | ||
|
|
e2811a4a28 | ||
|
|
a53a38b5dd | ||
|
|
6502cf5552 | ||
|
|
aed6d9a91b | ||
|
|
ff6353a1ea | ||
|
|
b6f9220f3f | ||
|
|
0c9e6ef577 | ||
|
|
198dadc209 | ||
|
|
f6a3d9f474 | ||
|
|
232a735dde | ||
|
|
2ea9af8151 | ||
|
|
1e14792ea0 | ||
|
|
908f0ba833 | ||
|
|
466d1b1c14 | ||
|
|
68d7630b44 | ||
|
|
641c981c4b | ||
|
|
50ec9e48bf | ||
|
|
801ac28c11 | ||
|
|
7637e1ad69 | ||
|
|
fa24d61680 | ||
|
|
1bd159e60d | ||
|
|
959dab4dc2 | ||
|
|
20086b0816 | ||
|
|
e21b8a841b | ||
|
|
a045469584 | ||
|
|
228db871b4 | ||
|
|
49b2e7303e | ||
|
|
074e262e66 | ||
|
|
021f0323cb | ||
|
|
bb55e5bc58 | ||
|
|
5d6d49f7e1 | ||
|
|
548d0692ba | ||
|
|
5d87fc3461 | ||
|
|
0a254c52c0 | ||
|
|
eafa586fdc | ||
|
|
1e36731076 | ||
|
|
d5d3bb19de | ||
|
|
d367f726ba | ||
|
|
cb241b703a | ||
|
|
c02d180e11 | ||
|
|
90fc207bf2 | ||
|
|
41f1806009 | ||
|
|
6941b822b6 | ||
|
|
5eb2fc67e5 | ||
|
|
c14ba16297 | ||
|
|
861e68ab3c | ||
|
|
4beecd62a8 | ||
|
|
1e2e409e8d | ||
|
|
90cefe4809 | ||
|
|
866b3e915a | ||
|
|
2827e7dc3a | ||
|
|
a8da7dcfd3 | ||
|
|
70df106f57 | ||
|
|
d37c6fcdce | ||
|
|
f3f8374253 | ||
|
|
a5973043b1 | ||
|
|
d3d87a0bfb | ||
|
|
c69269ea3d | ||
|
|
30ff491a34 | ||
|
|
56d4d545c1 | ||
|
|
884859324d | ||
|
|
7d92bcdf58 | ||
|
|
ba545bfa29 | ||
|
|
7c31a9c9b8 | ||
|
|
13cd09d161 | ||
|
|
d55f28e3d7 | ||
|
|
1e5df747cd | ||
|
|
46e82e08ce | ||
|
|
9658bcdb73 | ||
|
|
81c96808b6 | ||
|
|
969e72c4a4 | ||
|
|
3d2df9f9a9 | ||
|
|
384c3c45e4 | ||
|
|
6b0467ead5 | ||
|
|
1344ab5bb6 | ||
|
|
ae3aeeca69 | ||
|
|
e976c617f7 | ||
|
|
a63592894c | ||
|
|
bd4636c98f | ||
|
|
dff3c7d093 | ||
|
|
d0f2aa38ca | ||
|
|
abb2fb7045 | ||
|
|
44be1dc1c7 | ||
|
|
64ed76762e | ||
|
|
f194a1a572 | ||
|
|
c7249aadf3 | ||
|
|
d16fd73b05 | ||
|
|
59b65ba668 | ||
|
|
ba17c57026 | ||
|
|
b5217682fd | ||
|
|
a60792d20e | ||
|
|
f4c9d09020 | ||
|
|
97185fffb8 | ||
|
|
48ed0a508c | ||
|
|
73f4bce99a | ||
|
|
8055c84087 | ||
|
|
7a8aff47e9 | ||
|
|
62e755ce60 | ||
|
|
75e1173f80 | ||
|
|
fe7c93d004 | ||
|
|
d77dea5fe1 | ||
|
|
df226df87d | ||
|
|
dca2e10570 | ||
|
|
aedbda8d7a | ||
|
|
3721a8f039 | ||
|
|
e736b08a49 | ||
|
|
b7a61f12e8 | ||
|
|
ac245ad0a4 | ||
|
|
64eaa1516b | ||
|
|
4e5f34ec19 | ||
|
|
bb124ce681 | ||
|
|
d3679671ac | ||
|
|
571a52b432 | ||
|
|
a20434ace5 | ||
|
|
31715e937b | ||
|
|
f39cda041c | ||
|
|
09e15f6d2a | ||
|
|
23ac02bea1 | ||
|
|
2cd3592a49 | ||
|
|
f8b2902c91 | ||
|
|
36d6421312 | ||
|
|
8c283dc8a0 | ||
|
|
d994da9d53 | ||
|
|
2fe4b7c0ec | ||
|
|
58942c3f38 | ||
|
|
41cea76603 | ||
|
|
a235c532e4 | ||
|
|
5e5c9d3bcf | ||
|
|
93ce65b28b | ||
|
|
3c10e84def | ||
|
|
20d6b2ebbb | ||
|
|
cb927c276c | ||
|
|
3adc3eace3 | ||
|
|
fe1846c2e1 | ||
|
|
cfd1f03023 | ||
|
|
ba750f0eee | ||
|
|
a119fdfc48 | ||
|
|
2e6d66fcd4 | ||
|
|
c0c8368905 | ||
|
|
8f79d865aa | ||
|
|
8f5e23ae95 | ||
|
|
30f698ddf0 | ||
|
|
d4cd3dd600 | ||
|
|
8e0ad02249 | ||
|
|
2f6c594ee6 | ||
|
|
570b72f4c2 | ||
|
|
024d830621 | ||
|
|
a817ec19ed | ||
|
|
bcb265b42d | ||
|
|
2467d5a5d0 | ||
|
|
c098b8bbca | ||
|
|
ea6bf48b3d | ||
|
|
6ede03f880 | ||
|
|
e180f1cf45 | ||
|
|
b3ee14bf55 | ||
|
|
ec88b719f6 | ||
|
|
c03d7bd1c4 | ||
|
|
84d5fbcfe5 | ||
|
|
20d9f7dae7 | ||
|
|
50dc608456 | ||
|
|
3d6dab39ca | ||
|
|
ba58b4ba8a | ||
|
|
cbb46fe7b6 | ||
|
|
d99ae7b1a3 | ||
|
|
b5482db581 | ||
|
|
916f4b071c | ||
|
|
1143012216 | ||
|
|
1d1c677c81 | ||
|
|
34eab69e85 | ||
|
|
c1e14b671c | ||
|
|
8a7d255361 | ||
|
|
a4d8749e44 | ||
|
|
4d566b81d1 | ||
|
|
65db6ce497 | ||
|
|
054b5cca6b | ||
|
|
6123d055f9 | ||
|
|
9cf242ad89 | ||
|
|
162caf61a2 | ||
|
|
d64f4778df | ||
|
|
a874db38be | ||
|
|
92b2782af8 | ||
|
|
682f1cb798 | ||
|
|
d31c09f786 | ||
|
|
5d8a17ba6d | ||
|
|
8314e05a71 | ||
|
|
ce066417e9 | ||
|
|
9405ca3dff | ||
|
|
b5ddf380ca | ||
|
|
06209c17b5 | ||
|
|
ddd07138dd | ||
|
|
20246a3481 | ||
|
|
101ceb538b | ||
|
|
6c111959b4 | ||
|
|
369aff9113 | ||
|
|
b8de4b26b0 | ||
|
|
a9400f5a9c | ||
|
|
fb2f1d3553 | ||
|
|
87f3cbdda7 | ||
|
|
ff5fac251e | ||
|
|
72e94398bf | ||
|
|
1df89525e6 | ||
|
|
82662d0a09 | ||
|
|
e7cc94c27e | ||
|
|
b6e09c5da4 | ||
|
|
b6de719f2b | ||
|
|
6cad7c01a7 | ||
|
|
c504001f04 | ||
|
|
ede581182c | ||
|
|
80f67df3fa | ||
|
|
c7fba32229 | ||
|
|
1a4c5df14d | ||
|
|
7f38c85738 | ||
|
|
2521a2420d | ||
|
|
8c47814d8d | ||
|
|
539ad4b5ee | ||
|
|
99c7473208 | ||
|
|
403da8e22b | ||
|
|
e9f15ba034 | ||
|
|
0d52147005 | ||
|
|
bd7d41ed37 | ||
|
|
8869680302 | ||
|
|
f1e06da156 | ||
|
|
4a6e644b2f | ||
|
|
d2b3ce55e5 | ||
|
|
65e83af982 | ||
|
|
36c0c123d3 | ||
|
|
0286567df8 | ||
|
|
4cf542c6f6 | ||
|
|
7dcddb295e | ||
|
|
ee086ff580 | ||
|
|
c71e15ca10 | ||
|
|
a1ed5c6262 | ||
|
|
c09649c996 | ||
|
|
0c04d4a435 | ||
|
|
d5725062c9 | ||
|
|
7c72445143 | ||
|
|
f02ff75f6e | ||
|
|
ea901a33d3 | ||
|
|
7d8cdcb792 | ||
|
|
8ac3c086f8 | ||
|
|
0ccd63bb46 | ||
|
|
b26442d1fe | ||
|
|
ac01a37f5f | ||
|
|
22a272061f | ||
|
|
de4bec0a21 | ||
|
|
9483c0c51f | ||
|
|
20d6901dea | ||
|
|
2a5d686d5a | ||
|
|
8d5cdf6c61 | ||
|
|
683e9ff858 | ||
|
|
42c52e2729 | ||
|
|
336aa029db | ||
|
|
898513c95f | ||
|
|
08cda5e7ea | ||
|
|
6de8325130 | ||
|
|
cd51f7c5b0 | ||
|
|
c14f515526 | ||
|
|
9867de7a41 | ||
|
|
44e11bcc33 | ||
|
|
c75fc623cb | ||
|
|
2571305dc9 | ||
|
|
9515972c31 | ||
|
|
4efc0c04e1 | ||
|
|
b51f1f18b6 | ||
|
|
aed7597bd7 | ||
|
|
50fa64d6de | ||
|
|
71c7401f6d | ||
|
|
f045e65331 | ||
|
|
822ba63486 | ||
|
|
acf56b28a1 | ||
|
|
25c979a8ee | ||
|
|
aac627abf4 | ||
|
|
738c0f9616 | ||
|
|
48b87db2fb | ||
|
|
4beb04d8b9 | ||
|
|
cbe733ce80 | ||
|
|
e0461fedf6 | ||
|
|
7ab393cea7 | ||
|
|
50df0bfc1c | ||
|
|
a93028d6e4 | ||
|
|
448ed99723 | ||
|
|
12e1cc95b6 | ||
|
|
8b121a1ccb | ||
|
|
2ac00fb4b1 | ||
|
|
a3e1856f6d | ||
|
|
d070e63c3a | ||
|
|
3b967a27c1 | ||
|
|
1d4187162a | ||
|
|
e2de7b05b9 | ||
|
|
5bcd7c574d | ||
|
|
c0e4d64ee4 | ||
|
|
dc9bc81613 | ||
|
|
bc42fdbebe | ||
|
|
f7790ce537 | ||
|
|
0e20261d76 | ||
|
|
c186689672 | ||
|
|
71432c08dd | ||
|
|
3fa8b45e4a | ||
|
|
056436edc4 | ||
|
|
f70d7a4286 | ||
|
|
5c38cb98fa | ||
|
|
3b71cdc75e | ||
|
|
9247be97d1 | ||
|
|
f965fd7c2b | ||
|
|
8c1ad8e509 | ||
|
|
3d5fe149c3 | ||
|
|
5670b7af1f | ||
|
|
7bb435cf81 | ||
|
|
39df3d0dc0 | ||
|
|
0c0043da7b | ||
|
|
4935763210 | ||
|
|
5d3927c10a | ||
|
|
5a677fa15d | ||
|
|
269500a969 | ||
|
|
4cf146bd4f | ||
|
|
9328d3bd31 | ||
|
|
5a850bd406 | ||
|
|
4767e5958f | ||
|
|
f1788ae67f | ||
|
|
4568e00f7b | ||
|
|
9cd8e67fb6 | ||
|
|
e99abc5a36 | ||
|
|
822a4d8255 | ||
|
|
b1a79db369 | ||
|
|
4f9abde70e | ||
|
|
79ed0d9024 | ||
|
|
14c8231fea | ||
|
|
f9a369561e | ||
|
|
a28a8273c5 | ||
|
|
ac3ebab070 | ||
|
|
fa11217da7 | ||
|
|
9b786ba8c7 | ||
|
|
db4dbeeca7 | ||
|
|
1c5535d75f | ||
|
|
92e3ca2686 | ||
|
|
8236f3ff86 | ||
|
|
a251470ebd | ||
|
|
653f8b87ec | ||
|
|
7b4d94ccfb | ||
|
|
e4a91b8343 | ||
|
|
e42387fbf4 | ||
|
|
c92ab885f7 | ||
|
|
76a65e9238 | ||
|
|
ef7bbe5aa6 | ||
|
|
0e3f329db9 | ||
|
|
fcd7e60b68 | ||
|
|
2cbe284e58 | ||
|
|
7c4b1cedf7 | ||
|
|
5771a9e0f8 | ||
|
|
1875495360 | ||
|
|
0a19730fa6 | ||
|
|
42000f34b0 | ||
|
|
53c4c6d2a8 | ||
|
|
3f955659a1 | ||
|
|
bf48d81c43 | ||
|
|
f907386107 | ||
|
|
4247f448a8 | ||
|
|
c2bf38f873 | ||
|
|
2ec0bbb023 | ||
|
|
63f1939c83 | ||
|
|
f027e8c52e | ||
|
|
d4ab58548f | ||
|
|
9348dc12be | ||
|
|
90e9dfcd33 | ||
|
|
27e988e63a | ||
|
|
e8866c9643 | ||
|
|
8ac31d21ec | ||
|
|
2676e77ea4 | ||
|
|
b09526a248 | ||
|
|
c2ee36a4d7 | ||
|
|
5f83861f52 | ||
|
|
1d203b46b4 | ||
|
|
4ead3f0570 | ||
|
|
1a57d0330a | ||
|
|
417780ff70 | ||
|
|
c3a16ab8c7 | ||
|
|
66d80b80cd | ||
|
|
2231461ef3 | ||
|
|
03497c40ca | ||
|
|
6c7673f17b | ||
|
|
7bf5d349d7 | ||
|
|
aa8199201f | ||
|
|
c5f6f408b7 | ||
|
|
31692901c8 | ||
|
|
d2a7d77282 | ||
|
|
485ba19601 | ||
|
|
41c69797f2 | ||
|
|
b708653c26 | ||
|
|
2c8736777b | ||
|
|
09fc30e777 | ||
|
|
5bcec6b6a0 | ||
|
|
00aeaf021d | ||
|
|
810b6d807f | ||
|
|
e51680be63 | ||
|
|
3600ef61a7 | ||
|
|
214f4501b0 | ||
|
|
0595201d81 | ||
|
|
bee52c715e | ||
|
|
36ced8010a | ||
|
|
71d74f40b0 | ||
|
|
dc874ebf49 | ||
|
|
5cfca6b1f6 | ||
|
|
36dc1c82b2 | ||
|
|
4b4ac58d60 | ||
|
|
f9a7451995 | ||
|
|
8cc06c214a | ||
|
|
417cce1929 | ||
|
|
de3157dc2a | ||
|
|
b0d9680506 | ||
|
|
77a5eb24c2 | ||
|
|
e2e28c7444 | ||
|
|
eb21d54ef8 | ||
|
|
b06c20a1a6 | ||
|
|
a3ce23e331 | ||
|
|
6147e0e29b | ||
|
|
da48ea3818 | ||
|
|
543a137506 | ||
|
|
02e7ff6b19 | ||
|
|
935894633c | ||
|
|
9b0bc500fd | ||
|
|
83b6bf6c6a | ||
|
|
5e6469596c | ||
|
|
c12df19fd1 | ||
|
|
37552a81fc | ||
|
|
e50327bccc | ||
|
|
7dc378bba7 | ||
|
|
72b6390613 | ||
|
|
52bb6fcbf0 | ||
|
|
63748cd83d | ||
|
|
254dcac149 | ||
|
|
e1f3a248ea | ||
|
|
74a8e88308 | ||
|
|
9c15fed722 | ||
|
|
a14dec70c2 | ||
|
|
18153d4168 | ||
|
|
bd30de4f18 | ||
|
|
3b6bda825b | ||
|
|
92e69a60f4 | ||
|
|
72084a2013 | ||
|
|
27df09533c | ||
|
|
bd207667e3 | ||
|
|
37eb37e2a1 | ||
|
|
7116deaf54 | ||
|
|
d2a45245e2 | ||
|
|
05bbd4a7f8 | ||
|
|
8199272328 | ||
|
|
33b5e18582 | ||
|
|
eae152959b | ||
|
|
35cbbeb457 | ||
|
|
96f7c7c0b0 | ||
|
|
ac7743e217 | ||
|
|
7d10041727 | ||
|
|
72a18125ee | ||
|
|
1bd893409d | ||
|
|
d9d5ee15fd | ||
|
|
78c86446cf | ||
|
|
2a9ba3821a | ||
|
|
4328d311a5 | ||
|
|
a42cf4ebdd | ||
|
|
39a787b0d1 | ||
|
|
f186ad30c1 | ||
|
|
160ae3fb60 | ||
|
|
80d74c608d | ||
|
|
df4560412d | ||
|
|
dab4c91c98 | ||
|
|
dd20c4273b | ||
|
|
cf5023436c | ||
|
|
ff312f0405 | ||
|
|
9012ed256c | ||
|
|
0a63b8b905 | ||
|
|
f78c9436c8 | ||
|
|
578d8910aa | ||
|
|
cd45749c82 | ||
|
|
3069abfe13 | ||
|
|
f7b994354b | ||
|
|
a28e04bfde | ||
|
|
960de87585 | ||
|
|
f525165758 | ||
|
|
9e3b2a381e | ||
|
|
f6491b2285 | ||
|
|
93aa0c2b08 | ||
|
|
0f300a24a1 | ||
|
|
a05d192beb | ||
|
|
fda7392b84 | ||
|
|
6036c54b05 | ||
|
|
7f1b569d6f | ||
|
|
c8849a4648 | ||
|
|
e2d2295866 | ||
|
|
d4ffc89c02 | ||
|
|
139bd4c10a | ||
|
|
21d34482da | ||
|
|
9b2999d64b | ||
|
|
65b5f20cf7 | ||
|
|
ec035c25a1 | ||
|
|
a1cb089d0d | ||
|
|
424d5e71a8 | ||
|
|
a48201f60f | ||
|
|
6442c86084 | ||
|
|
b06dc1e63f | ||
|
|
bbe6550abe | ||
|
|
b8af2acce5 | ||
|
|
6b63ae2e46 | ||
|
|
85439dbff7 | ||
|
|
b6269188fe | ||
|
|
bb62444f15 | ||
|
|
ac4c054d1f | ||
|
|
838063b1b7 | ||
|
|
c51ac0489f | ||
|
|
0e464b011f | ||
|
|
86aa7ad692 | ||
|
|
013c675bc4 | ||
|
|
3be35f9987 | ||
|
|
86794d2cf1 | ||
|
|
c3004c6a6c | ||
|
|
3a7b0d2c9d | ||
|
|
1b32091d7d | ||
|
|
7a88778f5e | ||
|
|
e703054716 | ||
|
|
c33a745862 | ||
|
|
a94aa898a6 | ||
|
|
8a379d2db2 | ||
|
|
34a860cfa6 | ||
|
|
d0d139511c | ||
|
|
dec5529a64 | ||
|
|
64520130f6 | ||
|
|
d516d31b30 | ||
|
|
5d2f42a5a8 | ||
|
|
f8e70c9362 | ||
|
|
023e2978ba | ||
|
|
0f8f9c94cd | ||
|
|
22bb1c39b1 | ||
|
|
6765a60ec3 | ||
|
|
d28f0b259a | ||
|
|
6894d2c5d2 | ||
|
|
7b474c69ab | ||
|
|
e232810325 | ||
|
|
4ba3625987 | ||
|
|
99dfc23d96 | ||
|
|
84abc5764d | ||
|
|
8e09d637e7 | ||
|
|
37dff70cd6 | ||
|
|
3e403ef9ee | ||
|
|
8d8bfd5587 | ||
|
|
054790d161 | ||
|
|
c637729eae | ||
|
|
6e26ce8162 | ||
|
|
f9e8ea66ea | ||
|
|
de62e5082e | ||
|
|
6ff99e4ddd | ||
|
|
8cc54bf9be | ||
|
|
012d33146c | ||
|
|
1e4ea2dde9 | ||
|
|
1aabf0ebf5 | ||
|
|
f51781c763 | ||
|
|
b1cebe9e0e | ||
|
|
a352318f0f | ||
|
|
62f1f93ad9 | ||
|
|
3979ee33a3 | ||
|
|
a57ed93923 | ||
|
|
aa19b1c424 | ||
|
|
0751c966c4 | ||
|
|
e8643528ea | ||
|
|
69773fc838 | ||
|
|
40dbc6c849 | ||
|
|
35cc57f263 | ||
|
|
e6fc0e30ec | ||
|
|
f1a14a03af | ||
|
|
5a63060699 | ||
|
|
81d3b7fd11 | ||
|
|
b3abee8513 | ||
|
|
d420e956e9 | ||
|
|
f5b4cb0ae8 | ||
|
|
0f7f301787 | ||
|
|
3426c01955 | ||
|
|
1a517995a0 | ||
|
|
e51b8d2f61 | ||
|
|
5c105a9bcb | ||
|
|
55c627e4ee | ||
|
|
ec897d217c | ||
|
|
6f8614906d | ||
|
|
dab81291eb | ||
|
|
fb6df55326 | ||
|
|
9b292e0614 | ||
|
|
f25e166ea8 | ||
|
|
ef6952b27a | ||
|
|
b0d74c4640 | ||
|
|
512ea68dce | ||
|
|
d410696729 | ||
|
|
d630aa4f37 | ||
|
|
0e9050f2e8 | ||
|
|
f01b858e90 | ||
|
|
d40d1e4f2b | ||
|
|
b2e6d16221 | ||
|
|
64cc353455 | ||
|
|
9b08244ed8 | ||
|
|
797688dedd | ||
|
|
2a3a12b816 | ||
|
|
8d8a0efdb9 | ||
|
|
94299139cf | ||
|
|
bb01ec9a1e | ||
|
|
317c7272cd | ||
|
|
d28e8a06b5 | ||
|
|
9a959a0aa4 | ||
|
|
31fdc76f25 | ||
|
|
3eadadf638 | ||
|
|
30f6d456af | ||
|
|
d3e2b2bde4 | ||
|
|
473c821132 | ||
|
|
3ba0d25f27 | ||
|
|
9299b6716a | ||
|
|
6ac2abfc3b | ||
|
|
4b50a9c721 | ||
|
|
ef0322019f | ||
|
|
a395b171e3 | ||
|
|
9177c6f210 | ||
|
|
0264c4eeea | ||
|
|
f1e65869f3 | ||
|
|
bda61d0ae2 | ||
|
|
55c1a90fc9 | ||
|
|
0ab7d53991 | ||
|
|
5ba20fc6ed | ||
|
|
92e82941fe | ||
|
|
fe76192590 | ||
|
|
20be83ef95 | ||
|
|
97c58c8dca | ||
|
|
239be03a54 | ||
|
|
70df551eef | ||
|
|
7f7cf5281f | ||
|
|
8b53f6e320 | ||
|
|
20e7525118 | ||
|
|
f9ead74b88 | ||
|
|
1efea0bd27 | ||
|
|
655efb1fb6 | ||
|
|
65e0daa06d | ||
|
|
0b749c3888 | ||
|
|
80c7a8d1ce | ||
|
|
098653aac7 | ||
|
|
db267513ca | ||
|
|
c64354ebcc | ||
|
|
6970c95aca | ||
|
|
4fc0ab0649 | ||
|
|
39542c4ef2 | ||
|
|
bf727d6905 | ||
|
|
c1178277ca | ||
|
|
976fc8975a | ||
|
|
795b8be386 | ||
|
|
e9ed55b6e9 | ||
|
|
dad8f9d80e | ||
|
|
b714fb1be0 | ||
|
|
179a971770 | ||
|
|
d27c31a389 | ||
|
|
941c7ffd07 | ||
|
|
87d0ead203 | ||
|
|
0c9d539a92 | ||
|
|
306b77a3f4 | ||
|
|
823e8374b1 | ||
|
|
6b064cb915 | ||
|
|
11c8ab52f6 | ||
|
|
82a7e67bec | ||
|
|
98a6449b06 | ||
|
|
fbadf83997 | ||
|
|
64b8df6d81 | ||
|
|
edc04987d3 | ||
|
|
a87c0c8a7a | ||
|
|
40b6072163 | ||
|
|
f15bb1d545 | ||
|
|
0b0064afd0 | ||
|
|
4f2c207bb3 | ||
|
|
9d1128af51 | ||
|
|
855c28d956 | ||
|
|
1cb8d61787 | ||
|
|
677cff1230 | ||
|
|
bd430e5afd | ||
|
|
758396c9ea | ||
|
|
a588e88fec | ||
|
|
5b5a63cb5f | ||
|
|
26dae8ee94 | ||
|
|
ca2adbac13 | ||
|
|
bfab3dac81 | ||
|
|
e60c2a6ba1 | ||
|
|
e3bf12f65c | ||
|
|
c728b91914 | ||
|
|
e5b76687a8 | ||
|
|
ef535e399e | ||
|
|
34231327b7 | ||
|
|
e49994e205 | ||
|
|
513577958f | ||
|
|
df0373c4fa | ||
|
|
4c10c85937 | ||
|
|
22e67e6fdd | ||
|
|
74af8a5c39 | ||
|
|
b364389541 | ||
|
|
e6d3f6bc3f | ||
|
|
e821a438fe | ||
|
|
34b1f3b0a1 | ||
|
|
5c53b93a49 | ||
|
|
c61ff611fb | ||
|
|
ef9e1a0170 | ||
|
|
3a7032ec9c | ||
|
|
339acab917 | ||
|
|
8c5fabe411 | ||
|
|
269967a809 | ||
|
|
b177bb5bfb | ||
|
|
3c795a215e | ||
|
|
e3e6676420 | ||
|
|
be85eb3e4a | ||
|
|
98f8c6b25a | ||
|
|
262b12524b | ||
|
|
826b518048 | ||
|
|
187315fc08 | ||
|
|
01c0b45ea2 | ||
|
|
dfc594fc39 | ||
|
|
2892cb8c2f | ||
|
|
fc9c66b0c3 | ||
|
|
6900052ecd | ||
|
|
0b862735b2 | ||
|
|
a1d9bc7cee | ||
|
|
1738f44847 | ||
|
|
30733e8376 | ||
|
|
1029233ec7 | ||
|
|
f16c05c429 | ||
|
|
d7fa255166 | ||
|
|
60b3fef37a | ||
|
|
7b8fb77250 | ||
|
|
1127914512 | ||
|
|
5b68d34764 | ||
|
|
79a4a943dc | ||
|
|
7ad8d08037 | ||
|
|
f10202c00b | ||
|
|
7b3a235bd7 | ||
|
|
e264788f8e | ||
|
|
49f5c1d078 | ||
|
|
8eed54ca45 | ||
|
|
daac1b2590 | ||
|
|
70031040b3 | ||
|
|
da6f424b11 | ||
|
|
02e883b55c | ||
|
|
9838aef6b8 | ||
|
|
2bfa3517f0 | ||
|
|
06494729f1 | ||
|
|
8726f8317c | ||
|
|
c7d9ab8474 | ||
|
|
4997528f6a | ||
|
|
4b622b8603 | ||
|
|
4f57cc52d4 | ||
|
|
ba23475425 | ||
|
|
f88466f3cd | ||
|
|
60be939a1f | ||
|
|
2dd01247e1 | ||
|
|
77a4d3f773 | ||
|
|
6cbd286836 | ||
|
|
b447e0aeab | ||
|
|
b165c3f543 | ||
|
|
d246ef9a2e | ||
|
|
8fd553fbfc | ||
|
|
f4cebfdbae | ||
|
|
2fdc57055b | ||
|
|
03b0b61aa1 | ||
|
|
3984f80bae | ||
|
|
8427b9c7ee | ||
|
|
581fd356cd | ||
|
|
d88997c418 | ||
|
|
d6b38dafc6 | ||
|
|
0056651447 | ||
|
|
a0d9173b4f | ||
|
|
f12c721f44 | ||
|
|
a73a710364 | ||
|
|
e33e950712 | ||
|
|
f767feeef9 | ||
|
|
fd924f29f3 | ||
|
|
13112ad6d4 | ||
|
|
b043a2258f | ||
|
|
7f47a2fd25 | ||
|
|
8fe8318c77 | ||
|
|
ae81ec043d | ||
|
|
9ba96d3673 | ||
|
|
db204941ed | ||
|
|
5cd3f9d84d | ||
|
|
9160e61ac7 | ||
|
|
63ae732e72 | ||
|
|
ac9c3f88f9 | ||
|
|
52f1502051 | ||
|
|
e8acc9ca39 | ||
|
|
935f7cd5c3 | ||
|
|
e8290054c2 | ||
|
|
2c7c74743d | ||
|
|
4dd90d5493 | ||
|
|
241ad8174f | ||
|
|
98f5f73a41 | ||
|
|
62ad72fb11 | ||
|
|
4552931b95 | ||
|
|
39f9789fa1 | ||
|
|
8d7ff7f37e | ||
|
|
59606410f4 | ||
|
|
486529b112 | ||
|
|
b16938937b | ||
|
|
2ba3603a3d | ||
|
|
f6b9fd02b2 | ||
|
|
85becf861f | ||
|
|
7344828cf7 | ||
|
|
51a9565a72 | ||
|
|
bc30bf5566 | ||
|
|
dd111aac4a | ||
|
|
476b43d539 | ||
|
|
1d919e5874 | ||
|
|
1089c55b26 | ||
|
|
d4a866414f | ||
|
|
2ed00064e2 | ||
|
|
1d7add213e | ||
|
|
3572b60afd | ||
|
|
f8db1d11a7 | ||
|
|
bb7bf4e91b | ||
|
|
51dd86e6da | ||
|
|
4736bfeea6 | ||
|
|
d656d6d594 | ||
|
|
76e07d5012 | ||
|
|
037b520b2c | ||
|
|
748437ef7a | ||
|
|
d219999892 | ||
|
|
53bd1df8e5 | ||
|
|
2b88ef134b | ||
|
|
2eca835ec7 | ||
|
|
8d94a62b9c | ||
|
|
4035b9ac6c | ||
|
|
8a13a18737 | ||
|
|
8a67ea9ca2 | ||
|
|
31a110c37f | ||
|
|
6a08b2126f | ||
|
|
47c238b1eb | ||
|
|
72c4db25f0 | ||
|
|
50f9186682 | ||
|
|
2cd22f725e | ||
|
|
1cab0c168e | ||
|
|
5dac4e3af6 | ||
|
|
09032fb4a5 | ||
|
|
48a8086519 | ||
|
|
c62a3f8ee6 | ||
|
|
682e435ded | ||
|
|
cdcf075635 | ||
|
|
7e027db02b | ||
|
|
4abaa67580 | ||
|
|
13d43425e5 | ||
|
|
0ba315243b | ||
|
|
1ac1e93bbf | ||
|
|
9655ca229f | ||
|
|
4b553dd659 | ||
|
|
bb22a1297b | ||
|
|
f5727af40e | ||
|
|
b842a1d9b1 | ||
|
|
2978133862 | ||
|
|
7422b99b42 | ||
|
|
d04a7de26b | ||
|
|
4383f81c0f | ||
|
|
36a9bf69de | ||
|
|
68d834fba0 | ||
|
|
64c9004036 | ||
|
|
350fb885b8 | ||
|
|
8d03f2dc80 | ||
|
|
220dcd0f5c | ||
|
|
3671d7549d | ||
|
|
a38910b381 | ||
|
|
941b8e84f5 | ||
|
|
382c860d9b | ||
|
|
3dd51a442d | ||
|
|
ed21e8c7b2 | ||
|
|
2b6ba32b2c | ||
|
|
14f582faeb | ||
|
|
768ac77ea2 | ||
|
|
f75a7c91eb | ||
|
|
104132c5d3 | ||
|
|
3a315c5575 | ||
|
|
91fb714250 | ||
|
|
10d868efa4 | ||
|
|
3b8bc42266 | ||
|
|
41617f5560 | ||
|
|
9fb7f251f6 | ||
|
|
d8ca9d79c3 | ||
|
|
5398dbef95 | ||
|
|
a4345cedc5 | ||
|
|
ba574667c7 | ||
|
|
f2c1e279c9 | ||
|
|
51ad0ed830 | ||
|
|
60ff546fec | ||
|
|
f6088cbbe1 | ||
|
|
4b093dcdbb | ||
|
|
4f39a2e3da | ||
|
|
c9020d4879 | ||
|
|
c5b5e80de4 | ||
|
|
c1a8fdb940 | ||
|
|
ff3e100b33 | ||
|
|
e892473af7 | ||
|
|
3a143270c2 | ||
|
|
0aa2db8e91 | ||
|
|
1c8de51054 | ||
|
|
d3ab58a487 | ||
|
|
34c171f9fd | ||
|
|
9b2d49455a | ||
|
|
730b2371df | ||
|
|
f1afa864cd | ||
|
|
439cd77db8 | ||
|
|
4c35870dff | ||
|
|
9f3624d26e | ||
|
|
ac4e8514db | ||
|
|
646123f9ab | ||
|
|
11ef9dbdcb | ||
|
|
f3526b1d95 | ||
|
|
45d5159fe3 | ||
|
|
439e6b4ccf | ||
|
|
fb08322c17 | ||
|
|
c815e0fadc | ||
|
|
190ffab76d | ||
|
|
882bddf77e | ||
|
|
06e42dc689 | ||
|
|
4f1e1a38c9 | ||
|
|
a9c02c9cbc | ||
|
|
331cfb5b54 | ||
|
|
0b80ed6c2b | ||
|
|
38967eab64 | ||
|
|
3ad1ad4ef1 | ||
|
|
0c8f469246 | ||
|
|
03d9351dec | ||
|
|
b3fc6617e5 | ||
|
|
1fdc2e3091 | ||
|
|
c773c8f5d5 | ||
|
|
b188a05b69 | ||
|
|
d7ca3f15a4 | ||
|
|
406e240de1 | ||
|
|
f3689ac157 | ||
|
|
ce72ee04f4 | ||
|
|
694121d49a | ||
|
|
250b39bcc8 | ||
|
|
c74a2b4529 | ||
|
|
ff7bc9092d | ||
|
|
d6b6fa2baf | ||
|
|
bfd66deb37 | ||
|
|
bf149c075d | ||
|
|
a1e7ce415b | ||
|
|
2ecc007615 | ||
|
|
7a053e6df2 | ||
|
|
ab15bafc5b | ||
|
|
806f6cd2ab | ||
|
|
b7921c7dcb | ||
|
|
f6014d2e52 | ||
|
|
420c93aaa3 | ||
|
|
23ef51a4e8 | ||
|
|
c73dd60bd1 | ||
|
|
35a602cfef | ||
|
|
6ecd86a244 | ||
|
|
0cb28f906e | ||
|
|
426389b255 | ||
|
|
825c60e2bd | ||
|
|
46893e2f04 | ||
|
|
567f9c06cc | ||
|
|
9a1f1ddb8b | ||
|
|
d68eb28629 | ||
|
|
1a305f2dd7 | ||
|
|
cd22f5197b | ||
|
|
349b159a7b | ||
|
|
b3d27b42ad | ||
|
|
ab3a5331c1 | ||
|
|
9cbe12fbb8 | ||
|
|
056cc08d68 | ||
|
|
69effbfedb | ||
|
|
d881dfb63c | ||
|
|
d89b2828e3 | ||
|
|
75ca6c6e52 | ||
|
|
304c8b7184 | ||
|
|
3c46c17242 | ||
|
|
aca646e6b9 | ||
|
|
b587927687 | ||
|
|
3edc336f62 | ||
|
|
eee6685c59 | ||
|
|
76b5434157 | ||
|
|
a05f55554f | ||
|
|
ea800f35b7 | ||
|
|
4c70856505 | ||
|
|
cf7a3e377f | ||
|
|
03c0033bed | ||
|
|
238fa36212 | ||
|
|
f42c8f10f3 | ||
|
|
0a760ce9a4 | ||
|
|
a77cbe5c16 | ||
|
|
475a521d0f | ||
|
|
6a387359c3 | ||
|
|
7498791520 | ||
|
|
f80b378a7b | ||
|
|
9b86fdcfb0 | ||
|
|
4e2e8b9f07 | ||
|
|
69d6529f7e | ||
|
|
4f0b48174b | ||
|
|
0cf78c4297 | ||
|
|
4c80a022c7 | ||
|
|
f5f9421894 | ||
|
|
f7a0374d2b | ||
|
|
ab48a2a8ff | ||
|
|
8411769b0a | ||
|
|
9a9e177c41 | ||
|
|
e98cc7e500 | ||
|
|
3529e9083d | ||
|
|
2cd12f30a4 | ||
|
|
d6d8e7ec74 | ||
|
|
b410eed57d | ||
|
|
53e5c483f7 | ||
|
|
7b131ebdde | ||
|
|
7a0ad497da | ||
|
|
4b6fc94f94 | ||
|
|
ad9ae4c0af | ||
|
|
fc96e6a145 | ||
|
|
b317e7227a | ||
|
|
ab5d7f3313 | ||
|
|
a7c0e2e944 | ||
|
|
2264141879 | ||
|
|
d5b41fe617 | ||
|
|
b036a82203 | ||
|
|
eaf325b003 | ||
|
|
3519cc1a75 | ||
|
|
2f58b9c7d2 | ||
|
|
24ef799de7 | ||
|
|
2682e8db8a | ||
|
|
00b76e6fb5 | ||
|
|
b70858261f | ||
|
|
360024af38 | ||
|
|
bfdc425e7c | ||
|
|
7b14182083 | ||
|
|
7c760da618 | ||
|
|
262307608c | ||
|
|
879efeffd5 | ||
|
|
a1ba9d542f | ||
|
|
c77e1a9ae8 | ||
|
|
c5d961e27e | ||
|
|
ffdec11db4 | ||
|
|
b51d95aba5 | ||
|
|
f3e8cd9707 | ||
|
|
19a4ccee8c | ||
|
|
f7be8ad666 | ||
|
|
d01d40d33c | ||
|
|
0dd134c338 | ||
|
|
b2aa46bf62 | ||
|
|
d1f4f82897 | ||
|
|
12ef1b26bf | ||
|
|
1872ecff16 | ||
|
|
7cb21dd981 | ||
|
|
565ca05366 | ||
|
|
db0dbe6d8c | ||
|
|
a821e5b553 | ||
|
|
0fdccddd88 | ||
|
|
9ff22f802a | ||
|
|
a2d08c6d9c | ||
|
|
da2946f45c | ||
|
|
52bfe10ed5 | ||
|
|
fb8c2c705c | ||
|
|
f75358f561 | ||
|
|
a6ac5ad19b | ||
|
|
728ef7f1b7 | ||
|
|
c1c9b1b219 | ||
|
|
2cac6796ff | ||
|
|
05a52003d0 | ||
|
|
f559d31363 | ||
|
|
b0b84560b1 | ||
|
|
2884c8b641 | ||
|
|
7e9929a310 | ||
|
|
92ffc112b8 | ||
|
|
9c15accbbb | ||
|
|
582a1f744e | ||
|
|
05277af5a7 | ||
|
|
c7880b6736 | ||
|
|
6356e49fdd | ||
|
|
669561782b | ||
|
|
fe08e1f3f9 | ||
|
|
530868a1fe | ||
|
|
9b95d68475 | ||
|
|
93f9603043 | ||
|
|
2c45f18fa1 | ||
|
|
e3b3ea53be | ||
|
|
3a0ef70249 | ||
|
|
a5b064eb26 | ||
|
|
5ceae22f5f | ||
|
|
da7ee2c86f | ||
|
|
bc3d8d26d0 | ||
|
|
b67acfec9c | ||
|
|
b5366f9d2f | ||
|
|
dbeea7ec4f | ||
|
|
9a850d4c61 | ||
|
|
9c545dc67b | ||
|
|
61256c53fe | ||
|
|
5be9b0e120 | ||
|
|
44c0575e9b | ||
|
|
14da22f5ab | ||
|
|
e50121e013 | ||
|
|
b169f2e252 | ||
|
|
d83b1280ed | ||
|
|
2d684d36e8 | ||
|
|
4023d5e558 | ||
|
|
0091ceecae | ||
|
|
9a6d15cfe6 | ||
|
|
b39dcb11ee | ||
|
|
ac4387328f | ||
|
|
5e4fcf0ed5 | ||
|
|
ea5a0ae75c | ||
|
|
657345fa7a | ||
|
|
2862c97958 | ||
|
|
b958960512 | ||
|
|
c327cd5c3f | ||
|
|
4256d6b6a3 | ||
|
|
b34b00eed2 | ||
|
|
ec2305bb10 | ||
|
|
553b91460a | ||
|
|
32e1ce219a | ||
|
|
86ddf628b1 | ||
|
|
1af462ff66 | ||
|
|
9d50803b0c | ||
|
|
08d38b0b79 | ||
|
|
edb2a50100 | ||
|
|
3011c6dd3f | ||
|
|
74a9483286 | ||
|
|
3f68eab9bc | ||
|
|
7dc80af70a | ||
|
|
83698dbdc0 | ||
|
|
e231b664fe | ||
|
|
c8c1c28054 | ||
|
|
85ad1a1f29 | ||
|
|
f412abf137 | ||
|
|
97487b617a | ||
|
|
3ce17fbcb6 | ||
|
|
af499876ff | ||
|
|
3487a21795 | ||
|
|
757df8c8ab | ||
|
|
034f431ab1 | ||
|
|
fa30a50d20 | ||
|
|
6523445185 | ||
|
|
8d22591914 | ||
|
|
a9bd45bbc8 | ||
|
|
605a5da65a | ||
|
|
739cfb2182 | ||
|
|
6005eaa9bc | ||
|
|
14f80975fa | ||
|
|
ea13e084ed | ||
|
|
f9cb31a2f3 | ||
|
|
85a5409e85 | ||
|
|
99abd8c090 | ||
|
|
f633dde50c | ||
|
|
26566282ee | ||
|
|
44fc5163e7 | ||
|
|
c231f0e41e | ||
|
|
6ee9c06285 | ||
|
|
4063cd6abd | ||
|
|
325c50e924 | ||
|
|
efd1896825 | ||
|
|
4f61a05c9e | ||
|
|
26bfd74a3c | ||
|
|
ee088f3aea | ||
|
|
c162988868 | ||
|
|
213938a9f8 | ||
|
|
d091d4f000 | ||
|
|
f74f79eed0 | ||
|
|
4c4682f457 | ||
|
|
614a736eff | ||
|
|
1332413f63 | ||
|
|
1e3e3dd999 | ||
|
|
888967eb61 | ||
|
|
7e0ccd0712 | ||
|
|
6a0cd46da7 | ||
|
|
288eb4df25 | ||
|
|
8388359b36 | ||
|
|
c9505b3acc | ||
|
|
72cb2f1240 | ||
|
|
9473e51e40 | ||
|
|
8cf3765b30 | ||
|
|
a1441b3e73 | ||
|
|
98026d83b6 | ||
|
|
b0ba8ae5e3 | ||
|
|
6190f1aa8f | ||
|
|
fdff0afd89 | ||
|
|
52bbe9af33 | ||
|
|
6d2130444d | ||
|
|
ce2bef7d26 | ||
|
|
2c4fbda5e3 | ||
|
|
f6f4366030 | ||
|
|
e6c1e35e75 | ||
|
|
bcb40fb2f9 | ||
|
|
8baf163684 | ||
|
|
99ddea6906 | ||
|
|
1c481e0840 | ||
|
|
ff08416307 | ||
|
|
d7e97731d8 | ||
|
|
0263691f8d | ||
|
|
2b2fe46772 | ||
|
|
10ad8ec987 | ||
|
|
fed45e5453 | ||
|
|
1f1dc9c5e6 | ||
|
|
caa0efd265 | ||
|
|
76c8ac4e6c | ||
|
|
3e52c194ca | ||
|
|
3f8d89f34a | ||
|
|
17796de60d | ||
|
|
66713021de | ||
|
|
d3f03f3fc8 | ||
|
|
17c9e8ddc1 | ||
|
|
87bc6a7e8c | ||
|
|
2faa2e003a | ||
|
|
a965d0ea6f | ||
|
|
90382e0f0d | ||
|
|
62d226c8a3 | ||
|
|
d7c49b72a9 | ||
|
|
779798c622 | ||
|
|
fbdcda720d | ||
|
|
321640bd71 | ||
|
|
5107d767ee | ||
|
|
dc007dd136 | ||
|
|
50294274c3 | ||
|
|
63902c8215 | ||
|
|
69836be1ca | ||
|
|
851f7db825 | ||
|
|
3484c41b64 | ||
|
|
d0d292b80f | ||
|
|
7e5f6fe22a | ||
|
|
45efc0e0d6 | ||
|
|
6baf6568d2 | ||
|
|
1a4d1c7d40 | ||
|
|
afe80072c6 | ||
|
|
b17acd7605 | ||
|
|
45096c3137 | ||
|
|
c3f78d1977 | ||
|
|
8dfd6ac3bb | ||
|
|
8a2789fe3f | ||
|
|
40729c38eb | ||
|
|
6c2df7d0e1 | ||
|
|
223a055e8b | ||
|
|
96c7ef36c2 | ||
|
|
21b52031e7 | ||
|
|
b44c75a3c1 | ||
|
|
1f95b6be25 | ||
|
|
848c50c55c | ||
|
|
0c4e0327e3 | ||
|
|
3eb3ba4ee0 | ||
|
|
631fd707fe | ||
|
|
8a269b1d24 | ||
|
|
131f1eb943 | ||
|
|
c036bde86c | ||
|
|
9102a70e04 | ||
|
|
c9616ed0fa | ||
|
|
dce2f2594a | ||
|
|
8c0bcc6ad9 | ||
|
|
edf19a8cac | ||
|
|
41f2adc1f6 | ||
|
|
2b55a2fd05 | ||
|
|
45e8379d99 | ||
|
|
73041b71a4 | ||
|
|
f8419c9184 | ||
|
|
aebba5f1c1 | ||
|
|
a446386cc9 | ||
|
|
2be2a4ebf3 | ||
|
|
d20eca3f09 | ||
|
|
3bc5cb0d27 | ||
|
|
e6745de8d8 | ||
|
|
04cd772f0d | ||
|
|
d44d757985 | ||
|
|
df8fda5b69 | ||
|
|
c74f122426 | ||
|
|
c20b6af1ec | ||
|
|
de43166257 | ||
|
|
5c2ba90edf | ||
|
|
503decdf2e | ||
|
|
ec19341e05 | ||
|
|
477f387bd7 | ||
|
|
9ede9d3c6d | ||
|
|
34d5358eaa | ||
|
|
9db5a7e004 | ||
|
|
e5f3dee470 | ||
|
|
63911f5192 | ||
|
|
8824c14768 | ||
|
|
17d68652cf | ||
|
|
559c46beb0 | ||
|
|
380d6eb4be | ||
|
|
d2f3b76132 | ||
|
|
07b69e9f59 | ||
|
|
3ce32e54b2 | ||
|
|
7cce906e55 | ||
|
|
a3911eda3b | ||
|
|
3ac72e4b8c | ||
|
|
456e0109cd | ||
|
|
1a2ed160cd | ||
|
|
9b49b80051 | ||
|
|
8a55e65388 | ||
|
|
0cecd955c5 | ||
|
|
a0d3a180e4 | ||
|
|
e257eeff0a | ||
|
|
8bc54b0179 | ||
|
|
59a97bff3d | ||
|
|
870b306b86 | ||
|
|
c29399944e | ||
|
|
21834b0832 | ||
|
|
5535529903 | ||
|
|
1ae2e189dd | ||
|
|
5e8bfe5ef2 | ||
|
|
6bd7129c80 | ||
|
|
a41cf3dd48 | ||
|
|
1829952b1e | ||
|
|
d658363b53 | ||
|
|
cc1dec39cf | ||
|
|
3035d4eeec | ||
|
|
c55204cc50 | ||
|
|
c48ffc0089 | ||
|
|
257f4b1c5b | ||
|
|
7f386126cb | ||
|
|
b1e9dea790 | ||
|
|
88fe8f2129 | ||
|
|
52ceb64758 | ||
|
|
1b85a3ddd3 | ||
|
|
9ba493bcee | ||
|
|
54f2f4ce45 | ||
|
|
2d42f944cd | ||
|
|
2f9b61aee4 | ||
|
|
e2d9d0a5d8 | ||
|
|
b60eb059c3 | ||
|
|
516887c050 | ||
|
|
8a85d7ef1c | ||
|
|
fa51860268 | ||
|
|
3d0aad6df8 | ||
|
|
4e2370e0a0 | ||
|
|
5634419513 | ||
|
|
5552460b2f | ||
|
|
038b641a4d | ||
|
|
b397748f53 | ||
|
|
cd1440adb2 | ||
|
|
4097c34db8 | ||
|
|
fcf50a80ac | ||
|
|
010a8d15cd | ||
|
|
29174e343d | ||
|
|
9dde962add | ||
|
|
5c9bfdac00 | ||
|
|
a9464d7878 | ||
|
|
33543d6d8f | ||
|
|
df099e15c0 | ||
|
|
7a7fa845fe | ||
|
|
0751a2cef9 | ||
|
|
917c0e3388 | ||
|
|
13ba785400 | ||
|
|
6bc7404d3a | ||
|
|
44f0fc9720 | ||
|
|
7184d70f0c | ||
|
|
5ecf952934 | ||
|
|
39839e919e | ||
|
|
363249f165 | ||
|
|
5d74e8ae6e | ||
|
|
db50043972 | ||
|
|
fdff35e31c | ||
|
|
4d2daa9da4 | ||
|
|
7d9cd1c2ae | ||
|
|
77c192050a | ||
|
|
6be39120ae | ||
|
|
b1de8d119d | ||
|
|
f29a06e3f3 | ||
|
|
678791bd09 | ||
|
|
b408f8f0bf | ||
|
|
e101b02ccb | ||
|
|
628c54e0c6 | ||
|
|
af85f76f9a | ||
|
|
19f1ccd0df | ||
|
|
5c1c1da5f0 | ||
|
|
5272f184cf | ||
|
|
4bd507713c | ||
|
|
6aaca7d33d | ||
|
|
6e02ba17e3 | ||
|
|
b588823799 | ||
|
|
4d3a6c9791 | ||
|
|
3f19f51937 | ||
|
|
08ba6cc51c | ||
|
|
be049bfac2 | ||
|
|
b7ecdf631b | ||
|
|
02480730bb | ||
|
|
4d8265bee2 | ||
|
|
aff525e763 | ||
|
|
8d6aee3178 | ||
|
|
d139225ffb | ||
|
|
56c5ba6fbb | ||
|
|
7a91683ca6 | ||
|
|
f2cad66d79 | ||
|
|
98ec2237b7 | ||
|
|
27a555b99a | ||
|
|
680c3867db | ||
|
|
121102beef | ||
|
|
4f8138fe1f | ||
|
|
044486d46f | ||
|
|
2d2ce0661f | ||
|
|
e88ef48e18 | ||
|
|
2dd2dd4f0d | ||
|
|
38d9f0f5bc | ||
|
|
14aed800a2 | ||
|
|
621393138f | ||
|
|
a959ff767d | ||
|
|
11986354d9 | ||
|
|
5ea7ec470a | ||
|
|
a0bcb4d4f0 | ||
|
|
ed68878592 | ||
|
|
3121ca5669 | ||
|
|
5abb21c3f9 | ||
|
|
b9a87b3d54 | ||
|
|
cd1259613a | ||
|
|
023a3487e0 | ||
|
|
2c4c3a12ea | ||
|
|
cae5f1f553 | ||
|
|
d7673b69e2 | ||
|
|
85f0877d32 | ||
|
|
e152155a58 | ||
|
|
ce93e6013f | ||
|
|
bee51aadcb | ||
|
|
956633847d | ||
|
|
918deb41a4 | ||
|
|
1b7b2ca0a2 | ||
|
|
1b84078541 | ||
|
|
f7311eb94d | ||
|
|
9312ca7f0d | ||
|
|
533720218a | ||
|
|
d2088e7444 | ||
|
|
9006b8b618 | ||
|
|
b9f926d13b | ||
|
|
319636f017 | ||
|
|
4c665a292a | ||
|
|
72f93cd563 | ||
|
|
2e38b156dd | ||
|
|
a9a50f79da | ||
|
|
4b922b9de2 | ||
|
|
36912c0fe6 | ||
|
|
dfe39f386d | ||
|
|
943d16bcf8 | ||
|
|
6d0b1a8106 | ||
|
|
663a3b1aec | ||
|
|
131f6504ca | ||
|
|
94cdc9b69e | ||
|
|
1c1cd2509e | ||
|
|
abdc76aef8 | ||
|
|
9b058c3958 | ||
|
|
d91261412e | ||
|
|
2e26b5d31d | ||
|
|
3266d3b211 | ||
|
|
c2072e3e62 | ||
|
|
5266f4810b | ||
|
|
6e83b4b093 | ||
|
|
7b1b908779 | ||
|
|
7a95a201b5 | ||
|
|
70c86525cc | ||
|
|
618d32b872 | ||
|
|
66ca204697 | ||
|
|
54d650aa40 | ||
|
|
851b452c17 | ||
|
|
0ff795e798 | ||
|
|
43b50e5b9f | ||
|
|
18d68bafd0 | ||
|
|
feb951c35e | ||
|
|
41c2164755 | ||
|
|
ee87b55947 | ||
|
|
7119bb9084 | ||
|
|
132c769766 | ||
|
|
e4dbcd50cc | ||
|
|
62d5f66ae2 | ||
|
|
cfa3f1b520 | ||
|
|
0951d53f52 | ||
|
|
186580d794 | ||
|
|
1a47cfc938 | ||
|
|
edc06f12b5 | ||
|
|
3830e98c1d | ||
|
|
3cbbecb413 | ||
|
|
f0abd353ae | ||
|
|
84cbbe437d | ||
|
|
34a5d366d5 | ||
|
|
d3b7fc7ddb | ||
|
|
3d413743e4 | ||
|
|
b3d5ced193 | ||
|
|
1e38db8cae | ||
|
|
b073760711 | ||
|
|
f778bdb741 | ||
|
|
2afbe2a64b | ||
|
|
a5878c5544 | ||
|
|
997cfbf488 | ||
|
|
3afc8c7908 | ||
|
|
1e21d6e05b | ||
|
|
8eebd39426 | ||
|
|
7e985219ad | ||
|
|
7ce780bcc6 | ||
|
|
62b41e0994 | ||
|
|
4c65093a66 | ||
|
|
cb4c4e13a3 | ||
|
|
3b7de598d3 | ||
|
|
a85bf32700 | ||
|
|
004125a2ca | ||
|
|
d4e4ab07a6 | ||
|
|
94bb0dc43e | ||
|
|
becec986ea | ||
|
|
9eae55f03c | ||
|
|
4e90a2fd42 | ||
|
|
c4d5960eb6 | ||
|
|
3595c2cc88 | ||
|
|
73cc3e3ac8 | ||
|
|
1541537d0d | ||
|
|
abf4376d20 | ||
|
|
faf2839a08 | ||
|
|
15224e3c02 | ||
|
|
093176b2ee | ||
|
|
dffc8ef940 | ||
|
|
21c64b2fe1 | ||
|
|
7868566a78 | ||
|
|
f793ff1a86 | ||
|
|
e702e1eb27 | ||
|
|
5b2fac95ce | ||
|
|
2baf14f900 | ||
|
|
cc1eb4bad6 | ||
|
|
fbd2c61f40 | ||
|
|
9cc9912ef2 | ||
|
|
e69bc34678 | ||
|
|
9d01d86652 | ||
|
|
2c301ca422 | ||
|
|
9cec353d40 | ||
|
|
c42561de45 | ||
|
|
c841ba1cba | ||
|
|
eb1971fb17 | ||
|
|
983db2f3c8 | ||
|
|
c87c4691f3 | ||
|
|
68c64cd942 | ||
|
|
dfb93e9682 | ||
|
|
b7ab825860 | ||
|
|
28619a6ce7 | ||
|
|
7eed6f56f6 | ||
|
|
234517ee0a | ||
|
|
a483ecdfdb | ||
|
|
97ee8d55ce | ||
|
|
7727562f44 | ||
|
|
f6686f149b | ||
|
|
2345eb3bb7 | ||
|
|
16abaccf96 | ||
|
|
8c8de45f30 | ||
|
|
f4f65e4c84 | ||
|
|
a8ae5e4d03 | ||
|
|
b91f03f082 | ||
|
|
e1396e57b6 | ||
|
|
67cbf25b96 | ||
|
|
e721ebe171 | ||
|
|
c2d760bccb | ||
|
|
5dc1396f05 | ||
|
|
5b1ceccd1f | ||
|
|
bf1751059c | ||
|
|
7e069afbb2 | ||
|
|
bacb813b31 | ||
|
|
c670372b41 | ||
|
|
ec9b8f980d | ||
|
|
28399f8ac6 | ||
|
|
ef5fa4dea0 | ||
|
|
84e82dd39a | ||
|
|
f842898102 | ||
|
|
1bf73c268d | ||
|
|
17ec85263c | ||
|
|
50ba235917 | ||
|
|
14fc21c379 | ||
|
|
306f2f980d | ||
|
|
a7a82b1c0a | ||
|
|
d806097b60 | ||
|
|
9f4b73d821 | ||
|
|
ff5d57039e | ||
|
|
db42863f54 | ||
|
|
946f21879c | ||
|
|
20b214f3a4 | ||
|
|
8aedc50f30 | ||
|
|
cd11171e33 | ||
|
|
bcb4e1abfd | ||
|
|
786b977603 | ||
|
|
5264d85a78 | ||
|
|
5713a6233f | ||
|
|
98ad4adcf3 | ||
|
|
304c023b4e | ||
|
|
7ce1dd4f5c | ||
|
|
332b19f35b | ||
|
|
774ea5240e | ||
|
|
221b7ed188 | ||
|
|
304339e309 | ||
|
|
bf9c9b8985 | ||
|
|
e85bc39315 | ||
|
|
ed32e07e34 | ||
|
|
9bd1f99b69 | ||
|
|
25f57cc683 | ||
|
|
fb4d605e33 | ||
|
|
426b276b08 | ||
|
|
a085d90af2 | ||
|
|
8023b85085 | ||
|
|
f17d2d7f90 | ||
|
|
aef06e837a | ||
|
|
d63f6cff08 | ||
|
|
354fbf6253 | ||
|
|
238ce2e858 | ||
|
|
c8b6bd1c2c | ||
|
|
dd5a509a99 | ||
|
|
970ddd44bf | ||
|
|
c0eded84a0 | ||
|
|
5a83ebe48e | ||
|
|
d90697d8db | ||
|
|
159c0a93d2 | ||
|
|
a6040bb53d | ||
|
|
7d39c886f4 | ||
|
|
771a90a588 | ||
|
|
7b1858a5ce | ||
|
|
c95226ec1e | ||
|
|
6bece3f371 | ||
|
|
48c3e5aa29 | ||
|
|
73ae2ffb9b | ||
|
|
34aaf7b157 | ||
|
|
904b08f497 | ||
|
|
5454c35430 | ||
|
|
aa98d7dc5d | ||
|
|
020c1c7975 | ||
|
|
cf98750f4b | ||
|
|
09ccae0f30 | ||
|
|
522cbacada | ||
|
|
841fa02b18 | ||
|
|
47041272d2 | ||
|
|
c7a6f4f186 | ||
|
|
2756984273 | ||
|
|
cc46fa34e8 | ||
|
|
b94cc655c2 | ||
|
|
1c5d34cb5f | ||
|
|
ace9ae0b24 | ||
|
|
91345c0bdd | ||
|
|
1790c6bd0f | ||
|
|
d72b899471 | ||
|
|
bf9bbabfd6 | ||
|
|
fff9b34ed7 | ||
|
|
ce3a8c1f46 | ||
|
|
c420fa4bc2 | ||
|
|
8e5f9067af | ||
|
|
306b0a2f62 | ||
|
|
96f4667755 | ||
|
|
2c53bd49f2 | ||
|
|
caa0961337 | ||
|
|
32d3b632d2 | ||
|
|
3945edb7fe | ||
|
|
928feee008 | ||
|
|
9ef4b00238 | ||
|
|
616a769ff5 | ||
|
|
ef2c96ac84 | ||
|
|
1c63da7f33 | ||
|
|
2e00e5f463 | ||
|
|
8360bf9d84 | ||
|
|
1520c096a4 | ||
|
|
a965bfd32e | ||
|
|
7741790bd8 | ||
|
|
f0e6f8cee2 | ||
|
|
c4a4dcd419 | ||
|
|
b89a04acd8 | ||
|
|
b7d2619651 | ||
|
|
c07e957e28 | ||
|
|
b183431c27 | ||
|
|
177353bf7a | ||
|
|
de2d6818c1 | ||
|
|
f758d8607a | ||
|
|
1164ef31ca | ||
|
|
2997273654 | ||
|
|
20edf7de41 | ||
|
|
7467c281cc | ||
|
|
3b8d7304ff | ||
|
|
6e274cbf20 | ||
|
|
3a0614641b | ||
|
|
c395dd5ebd | ||
|
|
1c9dc2ba3d | ||
|
|
52b98dd159 | ||
|
|
1426e78793 | ||
|
|
8eb2798e5c | ||
|
|
ec6af9a460 | ||
|
|
ec844961c7 | ||
|
|
e1c9cb2c00 | ||
|
|
2c0d26e06d | ||
|
|
3c36eafdfa | ||
|
|
e22ab787dd | ||
|
|
948b75aeda | ||
|
|
4dcef89301 | ||
|
|
12b29a760a | ||
|
|
43ca0e149f | ||
|
|
ad1666dd0a | ||
|
|
1b4d4f5695 | ||
|
|
a714e6084a | ||
|
|
a8dd5d85a5 | ||
|
|
83363c7077 | ||
|
|
d99a57365f | ||
|
|
3cb41cf6b0 | ||
|
|
5201626d6a | ||
|
|
f812e74324 | ||
|
|
0668d6d290 | ||
|
|
46d1c2c86c | ||
|
|
ee7fe1fc10 | ||
|
|
c997495b5d | ||
|
|
605b5755bf | ||
|
|
b60c761cce | ||
|
|
12d6df6962 | ||
|
|
34972c77f5 | ||
|
|
2c5db64677 | ||
|
|
fa33d53180 | ||
|
|
57b877f445 | ||
|
|
dcb6d8286b | ||
|
|
3a8c515e21 | ||
|
|
50984f1475 | ||
|
|
4338bade5b | ||
|
|
ed10ecd142 | ||
|
|
6815297b0c | ||
|
|
c72bf9ea31 | ||
|
|
d4f4d9c789 | ||
|
|
61ef27c345 | ||
|
|
9c73e59772 | ||
|
|
0405ba3f31 | ||
|
|
f5f97fe0fd | ||
|
|
82a8bd01fc | ||
|
|
b15408e693 | ||
|
|
74ac9ffa1c | ||
|
|
ed5f035d1c | ||
|
|
0f5417bab4 | ||
|
|
0311418bfc | ||
|
|
bc449fec48 | ||
|
|
1e7240d6dc | ||
|
|
2732d63362 | ||
|
|
78bf56e327 | ||
|
|
01eb25cb39 | ||
|
|
1f612b466c | ||
|
|
0a85e01322 | ||
|
|
3cb4e6e854 | ||
|
|
d566eb2a36 | ||
|
|
71890a34be | ||
|
|
c254a3490c | ||
|
|
a032026f46 | ||
|
|
e1ee61d31b | ||
|
|
ca4694e1af | ||
|
|
9fea8f4488 | ||
|
|
f9f54da914 | ||
|
|
97c1a27031 | ||
|
|
0d8d5fdb32 | ||
|
|
25c448627e | ||
|
|
baa83c6ee6 | ||
|
|
2f7a6ef0a1 | ||
|
|
c50332daa2 | ||
|
|
8dbb282416 | ||
|
|
ef8f7d4fc0 | ||
|
|
74ea4ae9c2 | ||
|
|
2cf1b1420c | ||
|
|
8bdcf54d9f | ||
|
|
a815aa15ec | ||
|
|
b1dbba6224 | ||
|
|
35901a125d | ||
|
|
52b28867a0 | ||
|
|
d7d71b60f8 | ||
|
|
465e952ae4 | ||
|
|
200658ae6d | ||
|
|
e58f5e3617 | ||
|
|
78ba3176f2 | ||
|
|
abd02570f4 | ||
|
|
97b8d4eeea | ||
|
|
92036356ca | ||
|
|
6842df5577 | ||
|
|
793352dfbf | ||
|
|
b96535abff | ||
|
|
2b4b50ee08 | ||
|
|
e2795716f9 | ||
|
|
47d5783700 | ||
|
|
9f6c677276 | ||
|
|
70f117f63f | ||
|
|
83c8e914ae | ||
|
|
38b6a86858 | ||
|
|
76267b7db6 | ||
|
|
4cd0febb18 | ||
|
|
9d9488edd1 | ||
|
|
a1483c263f | ||
|
|
8e42c4ae31 | ||
|
|
bf15ba3a78 | ||
|
|
20a0592b37 | ||
|
|
5422054ae4 | ||
|
|
ac3844aa95 | ||
|
|
1b41ffba60 | ||
|
|
3393d81452 | ||
|
|
25baee266c | ||
|
|
731467d4e9 | ||
|
|
bd03d75f14 | ||
|
|
260dd03179 | ||
|
|
35f7d8a4cc | ||
|
|
84fb5e59a9 | ||
|
|
838ba3ad4f | ||
|
|
ad7be3b397 | ||
|
|
27ca987284 | ||
|
|
2b8f7824c2 | ||
|
|
5679271913 | ||
|
|
c9491f47e1 | ||
|
|
5e2415cb37 | ||
|
|
2715efd910 | ||
|
|
b65a356669 | ||
|
|
9ec0d3bc8c | ||
|
|
acd0ecf38a | ||
|
|
b75db38e45 | ||
|
|
c7a79cb8b4 | ||
|
|
7e5c22706b | ||
|
|
7d5a2c4dfc | ||
|
|
584d03c802 | ||
|
|
0646ffc93f | ||
|
|
0f8b506c76 | ||
|
|
f0d849a702 | ||
|
|
0d196ef7b7 | ||
|
|
75edcef099 | ||
|
|
ce82b14f6b | ||
|
|
e102fb2880 | ||
|
|
203026a57b | ||
|
|
86e39f9b44 | ||
|
|
edcad9c251 | ||
|
|
cb6d433e15 | ||
|
|
49d5994628 | ||
|
|
e488d53950 | ||
|
|
e6be7ab3b5 | ||
|
|
59505cb8f3 | ||
|
|
5761cea47e | ||
|
|
d27f9a9d09 | ||
|
|
e43635bf9b | ||
|
|
3813614d31 | ||
|
|
9a6189d7cd | ||
|
|
132f2d20fd | ||
|
|
c96ae1f773 | ||
|
|
45905d0992 | ||
|
|
076696cde1 | ||
|
|
25781c7631 | ||
|
|
99649614c5 | ||
|
|
7a6e8279e4 | ||
|
|
b79a79d423 | ||
|
|
5a91d0bf1b | ||
|
|
b9d14918f3 | ||
|
|
5d6b2e0eb6 | ||
|
|
3d7c3a0c7a | ||
|
|
2f7f7dcd6a | ||
|
|
5b8c6c4d56 | ||
|
|
6af7fd8007 | ||
|
|
bfb801acef | ||
|
|
9379c3cb39 | ||
|
|
d66e8fe7af | ||
|
|
b85303c12a | ||
|
|
60e3d7450f | ||
|
|
4cd294ef57 | ||
|
|
890acbc80e | ||
|
|
de1cce41b0 | ||
|
|
e20f6abef4 | ||
|
|
fa11f5d613 | ||
|
|
1e0adcfdc4 | ||
|
|
d5c852d329 | ||
|
|
c4e42c88fe | ||
|
|
4b93ec0b0b | ||
|
|
21b01c8949 | ||
|
|
76415b930f | ||
|
|
88ad2a1626 | ||
|
|
94c459258c | ||
|
|
e1b7810465 | ||
|
|
6c2883ba3b | ||
|
|
249b00df1a | ||
|
|
3fcf0a1bda | ||
|
|
c31f591ca0 | ||
|
|
c80fb5f4b3 | ||
|
|
218a978f6d | ||
|
|
f6aed63055 | ||
|
|
a119e39ede | ||
|
|
94da243dad | ||
|
|
244412daf1 | ||
|
|
29d7137a3d | ||
|
|
9017cb1600 | ||
|
|
80b012c157 | ||
|
|
b80c525952 | ||
|
|
1af6eba151 | ||
|
|
e288499db9 | ||
|
|
ebdbf79868 | ||
|
|
776a2027fb | ||
|
|
a928f4aa8f | ||
|
|
9c5f9b6e30 | ||
|
|
ae4918bdb7 | ||
|
|
a581ba9814 | ||
|
|
31840bbc11 | ||
|
|
53b005bbed | ||
|
|
82864d38e2 | ||
|
|
43205b8cd5 | ||
|
|
e240e0ee32 | ||
|
|
6c7e26412a | ||
|
|
3232ba6a6c | ||
|
|
46461b0721 | ||
|
|
90508dfd96 | ||
|
|
d8dba90f77 | ||
|
|
829d5781a5 | ||
|
|
8e95bfb464 | ||
|
|
91563b01d2 | ||
|
|
89e2f46e68 | ||
|
|
5f1f4a1b19 | ||
|
|
4669dc7f16 | ||
|
|
ca721d7262 | ||
|
|
14f84a49a6 | ||
|
|
4744f5afdc | ||
|
|
3a48f1c40b | ||
|
|
aea7121076 | ||
|
|
50875ff74b | ||
|
|
dc13048254 | ||
|
|
18145d2c1c | ||
|
|
f868c64d81 | ||
|
|
3b7ad2d333 | ||
|
|
6732c7cb7c | ||
|
|
7ba67582de | ||
|
|
35ae470196 | ||
|
|
fa339a8b70 | ||
|
|
43b27c138a | ||
|
|
36cdbb8f0c | ||
|
|
8c331df105 | ||
|
|
02d4efcfb5 | ||
|
|
00cb6bd845 | ||
|
|
f038c7a28e | ||
|
|
18b4497be7 | ||
|
|
8704ad4032 | ||
|
|
f899e255f3 | ||
|
|
23cf725c20 | ||
|
|
ba20459178 | ||
|
|
442604003d | ||
|
|
369d0e1a00 | ||
|
|
04b2f94478 | ||
|
|
61b2bd6cb8 | ||
|
|
eea4ba3581 | ||
|
|
3cb3b4f2ba | ||
|
|
2f376c9d36 | ||
|
|
c4877e4444 | ||
|
|
a288736ced | ||
|
|
1debe847d4 | ||
|
|
0c2a15a866 | ||
|
|
da7e60b49f | ||
|
|
d7c6da71f1 | ||
|
|
c4ed09c68f | ||
|
|
06baa98823 | ||
|
|
8d9071e7c2 | ||
|
|
8d0785cf1b | ||
|
|
ef0ce3fc07 | ||
|
|
af9cdd0694 | ||
|
|
a120514e9e | ||
|
|
e627a6ebdd | ||
|
|
94c37f4584 | ||
|
|
a48b62b0f2 | ||
|
|
a9a9545b37 | ||
|
|
ca1df9462d | ||
|
|
32b057d1f3 | ||
|
|
5e340843b1 | ||
|
|
0311298af1 | ||
|
|
b4c2e9301c | ||
|
|
089ef2fa08 | ||
|
|
9232c7abb1 | ||
|
|
27b7c2e201 | ||
|
|
392758a842 | ||
|
|
25fde8db86 | ||
|
|
65ad07af6b | ||
|
|
ac7479415b | ||
|
|
1f64f0aacf | ||
|
|
8fb0e1b75f | ||
|
|
78db2cda27 | ||
|
|
6534fdaf04 | ||
|
|
2e214f16e7 | ||
|
|
1f373b1e47 | ||
|
|
4d36db1319 | ||
|
|
58f0f8fab4 | ||
|
|
7d949ecb16 | ||
|
|
be70047233 | ||
|
|
7649769437 | ||
|
|
bcf0cc26aa | ||
|
|
96ce0692f8 | ||
|
|
9ba3136a24 | ||
|
|
92313c0686 | ||
|
|
a1bb98fd5c | ||
|
|
146d430695 | ||
|
|
b6a0a0f7c7 | ||
|
|
97de38d6a6 | ||
|
|
65ba676f01 | ||
|
|
5d9f81533d | ||
|
|
1948a730d9 | ||
|
|
77f2b17afd | ||
|
|
8739efaee4 | ||
|
|
8f65492d96 | ||
|
|
4f10047ba3 | ||
|
|
9560a665e5 | ||
|
|
1113e5d69c | ||
|
|
363c65da5f | ||
|
|
28dd32070f | ||
|
|
f732d4088b | ||
|
|
e22e4d23e4 | ||
|
|
ce7d6f0507 | ||
|
|
f499494963 | ||
|
|
429722724f | ||
|
|
6a7a9a78ae | ||
|
|
49842df368 | ||
|
|
5cee4463e0 | ||
|
|
e0f0ee0f1a | ||
|
|
76ddcb9d37 | ||
|
|
a7f8b65356 | ||
|
|
d3a4a04a6d | ||
|
|
3a82d4a804 | ||
|
|
274b04c08f | ||
|
|
41fc7dffaf | ||
|
|
66ac453c0f | ||
|
|
251cab64f3 | ||
|
|
963b182cb9 | ||
|
|
3af709e95b | ||
|
|
9136fe9a8b | ||
|
|
e15efa7e08 | ||
|
|
1f2b31f174 | ||
|
|
352fb01068 | ||
|
|
1a9cfc3311 | ||
|
|
77838f2938 | ||
|
|
a1cc5f4282 | ||
|
|
afdc28df80 | ||
|
|
49c389ce70 | ||
|
|
92bfa8f36d | ||
|
|
fd39a88b26 | ||
|
|
dd4fa733e1 | ||
|
|
5d54727139 | ||
|
|
18d4b3fc1b | ||
|
|
82a0ec0d2b | ||
|
|
6a4843c258 | ||
|
|
f414b91b08 | ||
|
|
8a6fe2692c | ||
|
|
8673bc15bc | ||
|
|
c7b034b154 | ||
|
|
4a132941f6 | ||
|
|
c933c1edea | ||
|
|
ccfc9afba7 | ||
|
|
0652d439e5 | ||
|
|
49aea2fcf4 | ||
|
|
10a7e38e13 | ||
|
|
5bc2cc6325 | ||
|
|
b62ac20180 | ||
|
|
c827c12710 | ||
|
|
8453d2431c | ||
|
|
7b60d595a7 | ||
|
|
b8a9afb6fb | ||
|
|
91be0fad5d | ||
|
|
e7ac08df30 | ||
|
|
7b6014c47a | ||
|
|
5de7644493 | ||
|
|
6e9418f583 | ||
|
|
84795fb9f4 | ||
|
|
4ce09f1d43 | ||
|
|
96b06db5ef | ||
|
|
49562a152e | ||
|
|
9c4960ab2f | ||
|
|
e960302b6d | ||
|
|
40322e0f9b | ||
|
|
72ebe0ec1b | ||
|
|
1a39781cff | ||
|
|
44eaf1db22 | ||
|
|
8133a12dc3 | ||
|
|
a1bad33d9d | ||
|
|
510c4decb7 | ||
|
|
7822a929f3 | ||
|
|
19b7c730ae | ||
|
|
92e81ee619 | ||
|
|
eeeed1ba08 | ||
|
|
04f246ea9d | ||
|
|
945b1324af | ||
|
|
5469b98057 | ||
|
|
f001c087ec | ||
|
|
661ca2d27e | ||
|
|
440a2b9bc8 | ||
|
|
125c7b2aba | ||
|
|
424e87a811 | ||
|
|
7391dfa936 | ||
|
|
0a474d34d8 | ||
|
|
ab9a7e05c8 | ||
|
|
6967e936a6 | ||
|
|
47903a7ac9 | ||
|
|
cd842d5a86 | ||
|
|
7b80e17664 | ||
|
|
bdcf89bf32 | ||
|
|
0d19f021f1 | ||
|
|
49bd13adc4 | ||
|
|
5a162b6341 | ||
|
|
2206ec50a5 | ||
|
|
60dc02682b | ||
|
|
3657891833 | ||
|
|
1033e827c0 | ||
|
|
c14b436aec | ||
|
|
8b8d5c360c | ||
|
|
97d229232d | ||
|
|
36ad6efa25 | ||
|
|
0bf7e68ea5 | ||
|
|
d415cbbe45 | ||
|
|
c79114c345 | ||
|
|
6fd07e1e56 | ||
|
|
97044bf5a5 | ||
|
|
31a2880c3c | ||
|
|
476de84dc5 | ||
|
|
0d648074e4 | ||
|
|
47b8a4dd69 | ||
|
|
60863a4304 | ||
|
|
4d8cbc1349 | ||
|
|
5af3b9b7c9 | ||
|
|
84354edcc1 | ||
|
|
2198e317ff | ||
|
|
9c318c1d34 | ||
|
|
c8af9aacbb | ||
|
|
71261023de | ||
|
|
4cde47af75 | ||
|
|
ee962c1919 | ||
|
|
3f52ba3d05 | ||
|
|
2c0693fa72 | ||
|
|
1cf026d956 | ||
|
|
07022bb3be | ||
|
|
b52ff11d3c | ||
|
|
333e1d05f5 | ||
|
|
a9942e675f | ||
|
|
8d75194884 | ||
|
|
bf0f4c8de4 | ||
|
|
3a08fb89b2 | ||
|
|
7918f912c4 | ||
|
|
b26856e04d | ||
|
|
0234fcd2e3 | ||
|
|
df50cf85a6 | ||
|
|
6f2441f0fe | ||
|
|
7aba4274d3 | ||
|
|
cdaaf59216 | ||
|
|
0486348fcc | ||
|
|
1031e4fa63 | ||
|
|
04b5aa7d86 | ||
|
|
52e5f7ac2e | ||
|
|
3fda492038 | ||
|
|
97d1dc2e15 | ||
|
|
181959f1de | ||
|
|
be3e7ccddd | ||
|
|
31606ad82e | ||
|
|
9b3ca7ee0b | ||
|
|
6cf2ab29da | ||
|
|
44c78525ee | ||
|
|
0a76df910d | ||
|
|
0765f6f7a5 | ||
|
|
6fa7d04e5a | ||
|
|
0ff3e8a9eb | ||
|
|
469ae260ca | ||
|
|
960eccad8c | ||
|
|
b23a8a7075 | ||
|
|
22e2cec102 | ||
|
|
bf19dc936b | ||
|
|
fd0448532c | ||
|
|
3af1814285 | ||
|
|
cdd7167e24 | ||
|
|
380937c588 | ||
|
|
b86dd33d6e | ||
|
|
afeca7e954 | ||
|
|
f20ce96401 | ||
|
|
6594601932 | ||
|
|
f072a10e9a | ||
|
|
d558480d11 | ||
|
|
432ca80c59 | ||
|
|
3dd0ceb8e0 | ||
|
|
59cb537db9 | ||
|
|
b455cab6b0 | ||
|
|
e9a476d640 | ||
|
|
8c89944adb | ||
|
|
aa86cbb51f | ||
|
|
9085399d8e | ||
|
|
a55f97a34e | ||
|
|
6b2af149dc | ||
|
|
52660aeb86 | ||
|
|
989acf5440 | ||
|
|
450ee3234f | ||
|
|
53475fc5ac | ||
|
|
810844687f | ||
|
|
b0f356ff32 | ||
|
|
5a0d57f507 | ||
|
|
40d95ace8a | ||
|
|
6385379dc9 | ||
|
|
0053919f7f | ||
|
|
646e00faa1 | ||
|
|
9b0a25a715 | ||
|
|
f800b351f3 | ||
|
|
a5f5c7be6f | ||
|
|
640e5ff0f9 | ||
|
|
5f93b450ac | ||
|
|
3018113b43 | ||
|
|
51b73410b5 | ||
|
|
f209225864 | ||
|
|
0b0f312c24 | ||
|
|
4567bcd1ea | ||
|
|
fcd763eb7f | ||
|
|
b51a088230 | ||
|
|
63925ce3cc | ||
|
|
ea9239f8c1 | ||
|
|
04964bcf3f | ||
|
|
516959bddc | ||
|
|
82bf459bdc | ||
|
|
cbcbf27d23 | ||
|
|
a013834651 | ||
|
|
162263ab6f | ||
|
|
160c6e61ea | ||
|
|
4d91c336be | ||
|
|
06812b7a02 | ||
|
|
f94da85898 | ||
|
|
e89530fca9 | ||
|
|
887372ff44 | ||
|
|
7f43df45c5 | ||
|
|
b82f9da290 | ||
|
|
fa3db92d88 | ||
|
|
b04e17ade2 | ||
|
|
2fa88966b4 | ||
|
|
cef16ab1c0 | ||
|
|
e82f8dc086 | ||
|
|
a8a9451c73 | ||
|
|
b4a253110d | ||
|
|
4c1fb0d2b2 | ||
|
|
726887732f | ||
|
|
7cfb9db046 | ||
|
|
642e1ef7bc | ||
|
|
4958e24ffc | ||
|
|
a70ecdb1be | ||
|
|
3fabd01e1b | ||
|
|
347dbb6569 | ||
|
|
2e7e7c4e74 | ||
|
|
575048faa7 | ||
|
|
744c6f12a8 | ||
|
|
9c5ef02484 | ||
|
|
4782c58752 | ||
|
|
ccc411fb47 | ||
|
|
e76efef6c7 | ||
|
|
f3f16b56b2 | ||
|
|
49ab5e718e | ||
|
|
19822ff08f | ||
|
|
0bfc6dfe3e | ||
|
|
39f052a57d | ||
|
|
c536aca961 | ||
|
|
57b84789c0 | ||
|
|
cbd67364f6 | ||
|
|
7b1aff1653 | ||
|
|
0ab6b08ff3 | ||
|
|
c00fecf992 | ||
|
|
bd9ee0c27a | ||
|
|
6fe7d952cf | ||
|
|
808c806ab9 | ||
|
|
e19f928794 | ||
|
|
040c6371cd | ||
|
|
0282c74165 | ||
|
|
8359408e54 | ||
|
|
01f65ac4b0 | ||
|
|
4e1e7ed4b5 | ||
|
|
91b6ef0504 | ||
|
|
519ed04e70 | ||
|
|
4c525e1704 | ||
|
|
042816616e | ||
|
|
d89e55e5d7 | ||
|
|
52e1345c4a | ||
|
|
f4c21be953 | ||
|
|
cd06f3ed43 | ||
|
|
b74288f2c4 | ||
|
|
a0c3c25721 | ||
|
|
c00700b7cb | ||
|
|
08808be62b | ||
|
|
ce923b6b58 | ||
|
|
286610b8c5 | ||
|
|
b511df0bd4 | ||
|
|
fe797a3265 | ||
|
|
7b4680ef6a | ||
|
|
898a9c5601 | ||
|
|
e22890ac18 | ||
|
|
af9c23ad87 | ||
|
|
7e58eb8094 | ||
|
|
326cf0da7d | ||
|
|
d4740c4daf | ||
|
|
19a9f153b9 | ||
|
|
36c926bed7 | ||
|
|
dc7e98c383 | ||
|
|
413779f0a1 | ||
|
|
d3b9322d3b | ||
|
|
4a8cd9914b | ||
|
|
5fa0a176a7 | ||
|
|
13455987ae | ||
|
|
6742629efb | ||
|
|
2224f98d2d | ||
|
|
e4627ec9ac | ||
|
|
d00740237b | ||
|
|
7de9109437 | ||
|
|
e0f2bcdeaf | ||
|
|
ae92cdedea | ||
|
|
21c60fdd99 | ||
|
|
7756504c92 | ||
|
|
386ad9a94b | ||
|
|
6f19839920 | ||
|
|
442da36115 | ||
|
|
4d5c125d82 | ||
|
|
c55f4d35ba | ||
|
|
abf0f2d5d6 | ||
|
|
8e62d9ace3 | ||
|
|
7d63d6c77c | ||
|
|
148018749a | ||
|
|
f058506bc4 | ||
|
|
3a45d443a1 | ||
|
|
beb68fa836 | ||
|
|
8b9b978db0 | ||
|
|
6dddf77774 | ||
|
|
c4967243dc | ||
|
|
637a43d6f4 | ||
|
|
ce4ce67607 | ||
|
|
f3f0979f92 | ||
|
|
05b722faa1 | ||
|
|
a1c7fa9092 | ||
|
|
aba68a9c3f | ||
|
|
35ccefae87 | ||
|
|
4168fb6dcb | ||
|
|
6d8d87dfbc | ||
|
|
8bc8bdd6bd | ||
|
|
0102e7e195 | ||
|
|
fbd3d956f7 | ||
|
|
cd764d4b10 | ||
|
|
03636ad4ae | ||
|
|
e90e641941 | ||
|
|
7a311ff503 | ||
|
|
7c0b187ca0 | ||
|
|
e2f079fc1b | ||
|
|
f12611e27c | ||
|
|
9562e2456b | ||
|
|
fedb7527f4 | ||
|
|
d142b6e6d1 | ||
|
|
7948237c94 | ||
|
|
a18e151fa4 | ||
|
|
1fc85d3d1d | ||
|
|
7accb86ece | ||
|
|
73af0eed3c | ||
|
|
9bde156294 | ||
|
|
6f634e76e7 | ||
|
|
b60552e264 | ||
|
|
6d86f72060 | ||
|
|
eceedb879b | ||
|
|
d90933d014 | ||
|
|
efb02aa056 | ||
|
|
d28430d8ae | ||
|
|
90f17ce6fb | ||
|
|
aa578fd8ec | ||
|
|
45e8251479 | ||
|
|
aab282061c | ||
|
|
b79d1944f2 | ||
|
|
f3251342b4 | ||
|
|
6a42e1de90 | ||
|
|
0487825e94 | ||
|
|
dcb1590e57 | ||
|
|
6e0ebdbc94 | ||
|
|
2ac6d63ffc | ||
|
|
d1ca17c406 | ||
|
|
f86a33c991 | ||
|
|
46ae4c1a83 | ||
|
|
e17ce83499 | ||
|
|
a4926f3c28 | ||
|
|
06b009deaa | ||
|
|
5b9504d57a | ||
|
|
05376f873d | ||
|
|
bf059b8b78 | ||
|
|
620e5e81c7 | ||
|
|
18dd64df88 | ||
|
|
4da8630578 | ||
|
|
442adc1919 | ||
|
|
751a4b9883 | ||
|
|
6e820afd74 | ||
|
|
0d7d2ce0b4 | ||
|
|
9a8abaf02b | ||
|
|
a394db1ce1 | ||
|
|
2d53d2100d | ||
|
|
1fc6b222ec | ||
|
|
3f2faeea82 | ||
|
|
a1a5995210 | ||
|
|
9a17c6870b | ||
|
|
baf34b37d9 | ||
|
|
d02eb97eeb | ||
|
|
8baf2ce241 | ||
|
|
239e1f3fe9 | ||
|
|
8374199fae | ||
|
|
591efc7257 | ||
|
|
717d8596ec | ||
|
|
9501329526 | ||
|
|
86260a48ba | ||
|
|
eb4756360a | ||
|
|
256834be48 | ||
|
|
460e896b8f | ||
|
|
ade673d546 | ||
|
|
ed5e843893 | ||
|
|
a03d2382af | ||
|
|
870ce7e0a2 | ||
|
|
69d952ea65 | ||
|
|
0d2d6cc17e | ||
|
|
be6cdc09d9 | ||
|
|
63c92152d9 | ||
|
|
c9ed663ec5 | ||
|
|
45e7fcd106 | ||
|
|
3f05146de8 | ||
|
|
9a9b2d8bae | ||
|
|
639ee9fc47 | ||
|
|
fc7e09b8c4 | ||
|
|
79d3ad245f | ||
|
|
ca266e81ef | ||
|
|
2b924d1573 | ||
|
|
00e95dbabc | ||
|
|
983b629d23 | ||
|
|
0f070d1b78 | ||
|
|
dc61722907 | ||
|
|
83dfcf6ac2 | ||
|
|
5a32f88dee | ||
|
|
9914fc1122 | ||
|
|
beab1525a9 | ||
|
|
c6b79f13c3 | ||
|
|
22257e0351 | ||
|
|
030eddb244 | ||
|
|
0047c79fcd | ||
|
|
cf925b0338 | ||
|
|
2093960719 | ||
|
|
8fffc5ee9c | ||
|
|
88f0b51312 | ||
|
|
2bfb1d5569 | ||
|
|
7a3b43040f | ||
|
|
d2ccbf7b7a | ||
|
|
55ad753bf1 | ||
|
|
efcb205116 | ||
|
|
7470fd3fdd | ||
|
|
102e3f98de | ||
|
|
b55dc0917d | ||
|
|
061d7af2ed | ||
|
|
ae50b9212f | ||
|
|
2e90ab8092 | ||
|
|
f186488fc3 | ||
|
|
1a94952b20 | ||
|
|
2c1a864390 | ||
|
|
7f258a3f4c | ||
|
|
b57375b8af | ||
|
|
3bfe2914f5 | ||
|
|
ac14103870 | ||
|
|
68db70e6bb | ||
|
|
67f1e32652 | ||
|
|
3525c3cca0 | ||
|
|
302d1eb15c | ||
|
|
bea577beb9 | ||
|
|
7f2e6a02f0 | ||
|
|
f9ec259742 | ||
|
|
3179e90aea | ||
|
|
80002dc85c | ||
|
|
fa44827bff | ||
|
|
dd18b49604 | ||
|
|
7bad31c532 | ||
|
|
42caf7865c | ||
|
|
d76f0bef77 | ||
|
|
821ede1d23 | ||
|
|
0e46dc2222 | ||
|
|
121f66b2a1 | ||
|
|
d1a2570283 | ||
|
|
3a7dec1463 | ||
|
|
42f05979e3 | ||
|
|
86b6b6886b | ||
|
|
e18552dadc | ||
|
|
c62bd88963 | ||
|
|
cf2a7af7e3 | ||
|
|
b289d0ba42 | ||
|
|
d7405c44ca | ||
|
|
2bce970809 | ||
|
|
ebd2e31efe | ||
|
|
34f7b8b19a | ||
|
|
184df4d5bb | ||
|
|
25380a7e98 | ||
|
|
fcf4b0d303 | ||
|
|
70839abf88 | ||
|
|
8a3ad923e1 | ||
|
|
15416a9447 | ||
|
|
14355cb7d4 | ||
|
|
7cdb8b0c7d | ||
|
|
6fac35fced | ||
|
|
2280c01dc7 | ||
|
|
3f062f72a2 | ||
|
|
2ab49d7f24 | ||
|
|
9a221085d4 | ||
|
|
9721172481 | ||
|
|
a884db0825 | ||
|
|
5a13454244 | ||
|
|
dc341f9350 | ||
|
|
a9781293f9 | ||
|
|
2a84aec59e | ||
|
|
68cec0448e | ||
|
|
2487dab7eb | ||
|
|
423dc248bc | ||
|
|
c402cc7c62 | ||
|
|
4a5b6fc190 | ||
|
|
f176fe759d | ||
|
|
3442b11b3d | ||
|
|
2c51c2928a | ||
|
|
6acc183111 | ||
|
|
ab27592e5d | ||
|
|
85afbdb8a7 | ||
|
|
c05418f47e | ||
|
|
d57cc7b156 | ||
|
|
eeb58da1cb | ||
|
|
cf823c471d | ||
|
|
2227267ff6 | ||
|
|
9e36975d5f | ||
|
|
297f132a0c | ||
|
|
8b3979c993 | ||
|
|
a9b98afa42 | ||
|
|
9bd4047425 | ||
|
|
666c6c70ca | ||
|
|
a7fc184662 | ||
|
|
673c484fa7 | ||
|
|
977f30d617 | ||
|
|
49b7cf6008 | ||
|
|
4bb513e460 | ||
|
|
8926e27c46 | ||
|
|
63870fd825 | ||
|
|
f06cbebf63 | ||
|
|
6e93806b12 | ||
|
|
00f75c753d | ||
|
|
8c253137a7 | ||
|
|
fc7bbc3f20 | ||
|
|
0aea0ec1ed | ||
|
|
1921164ba3 | ||
|
|
d5a7fcf75f | ||
|
|
1ae23085d4 | ||
|
|
d2ad023b52 | ||
|
|
abd6ff9145 | ||
|
|
93273e922f | ||
|
|
ef76822773 | ||
|
|
87e1b09088 | ||
|
|
f84b113b5e | ||
|
|
c71026d135 | ||
|
|
c452302735 | ||
|
|
04726fd871 | ||
|
|
2820e5a243 | ||
|
|
5dee9ae4ef | ||
|
|
ccb0a6262d | ||
|
|
8baae82b35 | ||
|
|
e8b87a0168 | ||
|
|
c8c1c7a83f | ||
|
|
e8746232f6 | ||
|
|
dcf325f64e | ||
|
|
2672f2c7f6 | ||
|
|
09493ce196 | ||
|
|
78575f12d5 | ||
|
|
be224d2d8a | ||
|
|
4b7a7d0cf0 | ||
|
|
8c53cf1d3c | ||
|
|
09159c3ac0 | ||
|
|
0f1cd87deb | ||
|
|
e0cb0003dc | ||
|
|
23017a22ec | ||
|
|
6c86bb4167 | ||
|
|
ca31230928 | ||
|
|
01f8795981 | ||
|
|
2566879a99 | ||
|
|
418b693fe0 | ||
|
|
8686936a07 | ||
|
|
79b8e6c24e | ||
|
|
8c2dd44f44 | ||
|
|
f172019edc | ||
|
|
44bf3e8479 | ||
|
|
17d6c02d83 | ||
|
|
bd6a57095a | ||
|
|
68733a447a | ||
|
|
1fb0644f51 | ||
|
|
c74d10b2e3 | ||
|
|
95582d16a6 | ||
|
|
e8628443f0 | ||
|
|
af191834d1 | ||
|
|
82744afe58 | ||
|
|
c109857707 | ||
|
|
740f609ca8 | ||
|
|
1b7065d8c1 | ||
|
|
f78f5b454b | ||
|
|
c3686b4098 | ||
|
|
9cfa4e40d0 | ||
|
|
4a5903849e | ||
|
|
200944ebb3 | ||
|
|
7af9f50426 | ||
|
|
fe60369b6a | ||
|
|
15acca7b57 | ||
|
|
2aa4d0af33 | ||
|
|
01bbfcced0 | ||
|
|
65895e658f | ||
|
|
0241d65460 | ||
|
|
060e1764cb | ||
|
|
9dcc774bfd | ||
|
|
11b26b3730 | ||
|
|
d9a7537d5d | ||
|
|
d68937afe0 | ||
|
|
43441a431e | ||
|
|
9e4618ca7e | ||
|
|
69cde35fb7 | ||
|
|
ac02348833 | ||
|
|
311c07e857 | ||
|
|
34c0ccb29f | ||
|
|
efac8ec940 | ||
|
|
4f56bf66db | ||
|
|
3157ceaa47 | ||
|
|
2b2ceb60cc | ||
|
|
4f3c4e0901 | ||
|
|
5442ee459d | ||
|
|
63dcb5586c | ||
|
|
e521a691ae | ||
|
|
b653aca20f | ||
|
|
e0120bc86e | ||
|
|
0dff38fcdd | ||
|
|
d8863d1861 | ||
|
|
8596d271a2 | ||
|
|
affb47b82e | ||
|
|
61e07fe169 | ||
|
|
caf6746e89 | ||
|
|
f1f6817615 | ||
|
|
06f4e5c835 | ||
|
|
0aeb2e89de | ||
|
|
d1513169fc | ||
|
|
2af34821aa | ||
|
|
e1ad6072dd | ||
|
|
c69c889a26 | ||
|
|
2be4bc4817 | ||
|
|
32d422bd97 | ||
|
|
be0eb901db | ||
|
|
ce1b32e4e9 | ||
|
|
e2a4f48953 | ||
|
|
2bc68df958 | ||
|
|
ba00ee20c2 | ||
|
|
107a849f88 | ||
|
|
ddab7046ca | ||
|
|
e49d4e2722 | ||
|
|
3c9e809b58 | ||
|
|
a82d09e816 | ||
|
|
6b9cbde8eb | ||
|
|
22297b9cfd | ||
|
|
d8837e4756 | ||
|
|
bcfb007c90 | ||
|
|
33d87367e7 | ||
|
|
257f751dfa | ||
|
|
e41226fcbc | ||
|
|
4efb798371 | ||
|
|
f8f47886d3 | ||
|
|
dec78d29e8 | ||
|
|
102175215c | ||
|
|
cd2cc16fcf | ||
|
|
b103dc01c0 | ||
|
|
f8ed09c3ad | ||
|
|
7f918da87d | ||
|
|
32230c6b60 | ||
|
|
d8b00eef97 | ||
|
|
2b1b64c5c1 | ||
|
|
145fcb63e2 | ||
|
|
6748fb974b | ||
|
|
da234bf228 | ||
|
|
c821cdefa4 | ||
|
|
7eb86305d4 | ||
|
|
66b5299b56 | ||
|
|
fcd0528a9e | ||
|
|
99929d7fa6 | ||
|
|
6c7be9b339 | ||
|
|
73004d0ad8 | ||
|
|
c867f9a90a | ||
|
|
7f7620a08c | ||
|
|
416bf8e7af | ||
|
|
b3eebf717d | ||
|
|
baef85aed1 | ||
|
|
2d6c0ef66d | ||
|
|
4f817a5b61 | ||
|
|
01d415cc7f | ||
|
|
d13bf3325b | ||
|
|
0e62ad1600 | ||
|
|
700c6c9b3e | ||
|
|
ac02703f5f | ||
|
|
1f80b6746e | ||
|
|
9f87342e30 | ||
|
|
13d6616b55 | ||
|
|
81700523ed | ||
|
|
7f1827f1e5 | ||
|
|
8d491b4146 | ||
|
|
0ea57b8bca | ||
|
|
466026b5c6 | ||
|
|
c90ef9919b | ||
|
|
8649114546 | ||
|
|
dcfa899520 | ||
|
|
2e03d27d27 | ||
|
|
9ead140b6e | ||
|
|
719e03da16 | ||
|
|
6a775f3951 | ||
|
|
7de5166694 | ||
|
|
907a72d3bd | ||
|
|
024be2e094 | ||
|
|
1c4b97c2f2 | ||
|
|
2a7e67b8e4 | ||
|
|
09761004dd | ||
|
|
6404b02a5d | ||
|
|
766bc44b23 | ||
|
|
c14dbb5ef1 | ||
|
|
9c2dbf73f3 | ||
|
|
c0c3c8efcd | ||
|
|
24ec2dc9e4 | ||
|
|
97a42a357a | ||
|
|
2dddbfc074 | ||
|
|
f77c195f3d | ||
|
|
70493a7721 | ||
|
|
1e1fac2fc1 | ||
|
|
fbe014f687 | ||
|
|
fd2571da04 | ||
|
|
813c818477 | ||
|
|
c4b28ab252 | ||
|
|
ac66f62262 | ||
|
|
727ec2f4dc | ||
|
|
995a25478b | ||
|
|
5fa265374c | ||
|
|
369622f3fb | ||
|
|
6fdc47beda | ||
|
|
f316308860 | ||
|
|
2ac4b9a590 | ||
|
|
23bc5188b3 | ||
|
|
1631770b85 | ||
|
|
849a49f665 | ||
|
|
be710cefd8 | ||
|
|
a98dc5bc29 | ||
|
|
46fb576c9d | ||
|
|
b370d38192 | ||
|
|
716ff3df86 | ||
|
|
c784c7ab47 | ||
|
|
bac0a5ebb1 | ||
|
|
3c030edc38 | ||
|
|
35e7c8b3a7 | ||
|
|
855df959ee | ||
|
|
3d179fe1a7 | ||
|
|
69b73935d0 | ||
|
|
a7bc72aa41 | ||
|
|
5f539fdf7b | ||
|
|
78bf6c0e23 | ||
|
|
768eea8a6d | ||
|
|
e4ba030a0c | ||
|
|
ad6acb28ae | ||
|
|
63d9914652 | ||
|
|
c41be4b294 | ||
|
|
9cec1069d6 | ||
|
|
1b359b7587 | ||
|
|
80e21f61d3 | ||
|
|
0323fe7b90 | ||
|
|
e48c6744ed | ||
|
|
fcef78ed0d | ||
|
|
fbab527ed3 | ||
|
|
7bee016a7e | ||
|
|
c496b736ea | ||
|
|
1fb8c5dcab | ||
|
|
2f79b604c7 | ||
|
|
628cf3b652 | ||
|
|
71c66b9171 | ||
|
|
a14a724836 | ||
|
|
f83e052ea2 | ||
|
|
8961c2fad4 | ||
|
|
7af95ab897 | ||
|
|
9a99409ae1 | ||
|
|
62ccafde23 | ||
|
|
75c50ef213 | ||
|
|
05908dc882 | ||
|
|
94faec9827 | ||
|
|
a2a13039ba | ||
|
|
f006561113 |
21
.appveyor.yml
Normal file
21
.appveyor.yml
Normal file
@@ -0,0 +1,21 @@
|
||||
build: off
|
||||
environment:
|
||||
|
||||
matrix:
|
||||
- TOXENV: "py27"
|
||||
|
||||
install:
|
||||
- cmd: git submodule update --init --recursive
|
||||
- cmd: SET PATH=%PATH%;C:\Python27\Scripts;C:\MinGW\bin
|
||||
- cmd: pip install tox
|
||||
|
||||
test_script:
|
||||
- cmd: tox
|
||||
|
||||
notifications:
|
||||
- provider: Slack
|
||||
incoming_webhook:
|
||||
secure: E9H0SU0Ju7WLDvgxsV8cs3J62T3nTTX7QkEjsczN0Sto/c9hWkVfhc5gGWUkxhlD975cokHByKGJIdwYwCewqOI+7BrcT8U+nlga4Uau7J8=
|
||||
on_build_success: false
|
||||
on_build_failure: true
|
||||
on_build_status_changed: true
|
||||
21
.coveragerc
Normal file
21
.coveragerc
Normal file
@@ -0,0 +1,21 @@
|
||||
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
[report]
|
||||
# Regexes for lines to exclude from consideration
|
||||
exclude_lines =
|
||||
pragma: no cover
|
||||
def __repr__
|
||||
raise AssertionError
|
||||
raise NotImplementedError
|
||||
58
.github/ISSUE_TEMPLATE.md
vendored
Normal file
58
.github/ISSUE_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
What kind of issue is this?
|
||||
|
||||
- [ ] Question. This issue tracker is not the place for questions. If you want to ask how to do
|
||||
something, or to understand why something isn't working the way you expect it to, use
|
||||
our Community Forums https://community.platformio.org
|
||||
|
||||
- [ ] PlatformIO IDE. All issues related to PlatformIO IDE should be reported to appropriate repository
|
||||
https://github.com/platformio/platformio-atom-ide/issues
|
||||
|
||||
- [ ] Development Platform or Board. All issues related to Development Platforms or Embedded Boards
|
||||
should be reported to appropriate repository.
|
||||
See full list with repositories and search for "platform-xxx" repository related to your hardware
|
||||
https://github.com/platformio?query=platform-
|
||||
|
||||
- [ ] Feature Request. Start by telling us what problem you’re trying to solve. Often a solution
|
||||
already exists! Don’t send pull requests to implement new features without first getting our
|
||||
support. Sometimes we leave features out on purpose to keep the project small.
|
||||
|
||||
- [ ] PlatformIO Core. If you’ve found a bug, please provide an information below.
|
||||
|
||||
*You can erase any parts of this template not applicable to your Issue.*
|
||||
|
||||
------------------------------------------------------------------
|
||||
|
||||
### Configuration
|
||||
|
||||
**Operating system**:
|
||||
|
||||
**PlatformIO Version** (`platformio --version`):
|
||||
|
||||
### Description of problem
|
||||
|
||||
|
||||
#### Steps to Reproduce
|
||||
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
### Actual Results
|
||||
|
||||
|
||||
### Expected Results
|
||||
|
||||
|
||||
### If problems with PlatformIO Build System:
|
||||
|
||||
**The content of `platformio.ini`:**
|
||||
```ini
|
||||
Insert here...
|
||||
```
|
||||
|
||||
**Source file to reproduce issue:**
|
||||
```cpp
|
||||
Insert here...
|
||||
```
|
||||
|
||||
### Additional info
|
||||
11
.gitignore
vendored
11
.gitignore
vendored
@@ -2,6 +2,11 @@
|
||||
*.pyc
|
||||
.pioenvs
|
||||
.tox
|
||||
.sconsign.dblite
|
||||
examples/ide-eclipse/.metadata
|
||||
examples/ide-eclipse/RemoteSystemsTempFiles
|
||||
docs/_build
|
||||
dist
|
||||
build
|
||||
.cache
|
||||
coverage.xml
|
||||
.coverage
|
||||
htmlcov
|
||||
.pytest_cache
|
||||
|
||||
7
.gitmodules
vendored
Normal file
7
.gitmodules
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
[submodule "examples"]
|
||||
path = examples
|
||||
url = https://github.com/platformio/platformio-examples.git
|
||||
[submodule "docs"]
|
||||
path = docs
|
||||
url = https://github.com/platformio/platformio-docs.git
|
||||
branch = develop
|
||||
@@ -1,3 +1,3 @@
|
||||
[settings]
|
||||
line_length=79
|
||||
known_third_party=click,requests,serial,SCons
|
||||
known_third_party=bottle,click,lockfile,python-dateutil,pytest,requests,SCons,semantic_version,serial
|
||||
|
||||
270
.pylintrc
270
.pylintrc
@@ -1,29 +1,9 @@
|
||||
[MASTER]
|
||||
|
||||
# Specify a configuration file.
|
||||
#rcfile=
|
||||
|
||||
# Python code to execute, usually for sys.path manipulation such as
|
||||
# pygtk.require().
|
||||
#init-hook=
|
||||
|
||||
# Profiled execution.
|
||||
profile=no
|
||||
|
||||
# Add files or directories to the blacklist. They should be base names, not
|
||||
# paths.
|
||||
ignore=CVS
|
||||
|
||||
# Pickle collected data for later comparisons.
|
||||
persistent=yes
|
||||
|
||||
# List of plugins (as comma separated values of python modules names) to load,
|
||||
# usually to register additional checkers.
|
||||
load-plugins=
|
||||
|
||||
|
||||
[MESSAGES CONTROL]
|
||||
|
||||
# Only show warnings with the listed confidence levels. Leave empty to show
|
||||
# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
|
||||
confidence=
|
||||
|
||||
# Enable the message, report, category or checker with the given id(s). You can
|
||||
# either give multiple identifier separated by comma (,) or put this option
|
||||
# multiple time. See also the "--disable" option for examples.
|
||||
@@ -38,244 +18,6 @@ load-plugins=
|
||||
# --enable=similarities". If you want to run only the classes checker, but have
|
||||
# no Warning level messages displayed, use"--disable=all --enable=classes
|
||||
# --disable=W"
|
||||
disable=C0103,C0111,E0611,F0401,I0011,R0801,R0903
|
||||
# disable=import-star-module-level,old-octal-literal,oct-method,print-statement,unpacking-in-except,parameter-unpacking,backtick,old-raise-syntax,old-ne-operator,long-suffix,dict-view-method,dict-iter-method,metaclass-assignment,next-method-called,raising-string,indexing-exception,raw_input-builtin,long-builtin,file-builtin,execfile-builtin,coerce-builtin,cmp-builtin,buffer-builtin,basestring-builtin,apply-builtin,filter-builtin-not-iterating,using-cmp-argument,useless-suppression,range-builtin-not-iterating,suppressed-message,no-absolute-import,old-division,cmp-method,reload-builtin,zip-builtin-not-iterating,intern-builtin,unichr-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,input-builtin,round-builtin,hex-method,nonzero-method,map-builtin-not-iterating
|
||||
|
||||
|
||||
[REPORTS]
|
||||
|
||||
# Set the output format. Available formats are text, parseable, colorized, msvs
|
||||
# (visual studio) and html. You can also give a reporter class, eg
|
||||
# mypackage.mymodule.MyReporterClass.
|
||||
output-format=text
|
||||
|
||||
# Put messages in a separate file for each module / package specified on the
|
||||
# command line instead of printing them on stdout. Reports (if any) will be
|
||||
# written in a file name "pylint_global.[txt|html]".
|
||||
files-output=no
|
||||
|
||||
# Tells whether to display a full report or only the messages
|
||||
reports=yes
|
||||
|
||||
# Python expression which should return a note less than 10 (10 is the highest
|
||||
# note). You have access to the variables errors warning, statement which
|
||||
# respectively contain the number of errors / warnings messages and the total
|
||||
# number of statements analyzed. This is used by the global evaluation report
|
||||
# (RP0004).
|
||||
evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
|
||||
|
||||
# Add a comment according to your evaluation note. This is used by the global
|
||||
# evaluation report (RP0004).
|
||||
comment=no
|
||||
|
||||
# Template used to display messages. This is a python new-style format string
|
||||
# used to format the message information. See doc for all details
|
||||
#msg-template=
|
||||
msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg}
|
||||
|
||||
|
||||
[BASIC]
|
||||
|
||||
# Required attributes for module, separated by a comma
|
||||
required-attributes=
|
||||
|
||||
# List of builtins function names that should not be used, separated by a comma
|
||||
bad-functions=map,filter,apply,input
|
||||
|
||||
# Regular expression which should only match correct module names
|
||||
module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
|
||||
|
||||
# Regular expression which should only match correct module level names
|
||||
const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$
|
||||
|
||||
# Regular expression which should only match correct class names
|
||||
class-rgx=[A-Z_][a-zA-Z0-9]+$
|
||||
|
||||
# Regular expression which should only match correct function names
|
||||
function-rgx=[a-z_][a-z0-9_]{2,30}$
|
||||
|
||||
# Regular expression which should only match correct method names
|
||||
method-rgx=[a-z_][a-z0-9_]{2,30}$
|
||||
|
||||
# Regular expression which should only match correct instance attribute names
|
||||
attr-rgx=[a-z_][a-z0-9_]{2,30}$
|
||||
|
||||
# Regular expression which should only match correct argument names
|
||||
argument-rgx=[a-z_][a-z0-9_]{2,30}$
|
||||
|
||||
# Regular expression which should only match correct variable names
|
||||
variable-rgx=[a-z_][a-z0-9_]{2,30}$
|
||||
|
||||
# Regular expression which should only match correct attribute names in class
|
||||
# bodies
|
||||
class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
|
||||
|
||||
# Regular expression which should only match correct list comprehension /
|
||||
# generator expression variable names
|
||||
inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
|
||||
|
||||
# Good variable names which should always be accepted, separated by a comma
|
||||
good-names=i,j,k,ex,Run,_
|
||||
|
||||
# Bad variable names which should always be refused, separated by a comma
|
||||
bad-names=foo,bar,baz,toto,tutu,tata
|
||||
|
||||
# Regular expression which should only match function or class names that do
|
||||
# not require a docstring.
|
||||
no-docstring-rgx=__.*__
|
||||
|
||||
# Minimum line length for functions/classes that require docstrings, shorter
|
||||
# ones are exempt.
|
||||
docstring-min-length=-1
|
||||
|
||||
|
||||
[FORMAT]
|
||||
|
||||
# Maximum number of characters on a single line.
|
||||
max-line-length=80
|
||||
|
||||
# Regexp for a line that is allowed to be longer than the limit.
|
||||
ignore-long-lines=^\s*(# )?<?https?://\S+>?$
|
||||
|
||||
# Allow the body of an if to be on the same line as the test if there is no
|
||||
# else.
|
||||
single-line-if-stmt=no
|
||||
|
||||
# List of optional constructs for which whitespace checking is disabled
|
||||
no-space-check=trailing-comma,dict-separator
|
||||
|
||||
# Maximum number of lines in a module
|
||||
max-module-lines=1000
|
||||
|
||||
# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
|
||||
# tab).
|
||||
indent-string=' '
|
||||
|
||||
|
||||
[MISCELLANEOUS]
|
||||
|
||||
# List of note tags to take in consideration, separated by a comma.
|
||||
notes=FIXME,XXX,TODO
|
||||
|
||||
|
||||
[SIMILARITIES]
|
||||
|
||||
# Minimum lines number of a similarity.
|
||||
min-similarity-lines=4
|
||||
|
||||
# Ignore comments when computing similarities.
|
||||
ignore-comments=yes
|
||||
|
||||
# Ignore docstrings when computing similarities.
|
||||
ignore-docstrings=yes
|
||||
|
||||
# Ignore imports when computing similarities.
|
||||
ignore-imports=no
|
||||
|
||||
|
||||
[TYPECHECK]
|
||||
|
||||
# Tells whether missing members accessed in mixin class should be ignored. A
|
||||
# mixin class is detected if its name ends with "mixin" (case insensitive).
|
||||
ignore-mixin-members=yes
|
||||
|
||||
# List of classes names for which member attributes should not be checked
|
||||
# (useful for classes with attributes dynamically set).
|
||||
ignored-classes=SQLObject
|
||||
|
||||
# When zope mode is activated, add a predefined set of Zope acquired attributes
|
||||
# to generated-members.
|
||||
zope=no
|
||||
|
||||
# List of members which are set dynamically and missed by pylint inference
|
||||
# system, and so shouldn't trigger E0201 when accessed. Python regular
|
||||
# expressions are accepted.
|
||||
generated-members=REQUEST,acl_users,aq_parent
|
||||
|
||||
|
||||
[VARIABLES]
|
||||
|
||||
# Tells whether we should check for unused import in __init__ files.
|
||||
init-import=no
|
||||
|
||||
# A regular expression matching the beginning of the name of dummy variables
|
||||
# (i.e. not used).
|
||||
dummy-variables-rgx=_$|dummy
|
||||
|
||||
# List of additional names supposed to be defined in builtins. Remember that
|
||||
# you should avoid to define new builtins when possible.
|
||||
additional-builtins=
|
||||
|
||||
|
||||
[CLASSES]
|
||||
|
||||
# List of interface methods to ignore, separated by a comma. This is used for
|
||||
# instance to not check methods defines in Zope's Interface base class.
|
||||
ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by
|
||||
|
||||
# List of method names used to declare (i.e. assign) instance attributes.
|
||||
defining-attr-methods=__init__,__new__,setUp
|
||||
|
||||
# List of valid names for the first argument in a class method.
|
||||
valid-classmethod-first-arg=cls
|
||||
|
||||
# List of valid names for the first argument in a metaclass class method.
|
||||
valid-metaclass-classmethod-first-arg=mcs
|
||||
|
||||
|
||||
[DESIGN]
|
||||
|
||||
# Maximum number of arguments for function / method
|
||||
max-args=5
|
||||
|
||||
# Argument names that match this expression will be ignored. Default to name
|
||||
# with leading underscore
|
||||
ignored-argument-names=_.*
|
||||
|
||||
# Maximum number of locals for function / method body
|
||||
max-locals=15
|
||||
|
||||
# Maximum number of return / yield for function / method body
|
||||
max-returns=6
|
||||
|
||||
# Maximum number of branch for function / method body
|
||||
max-branches=12
|
||||
|
||||
# Maximum number of statements in function / method body
|
||||
max-statements=50
|
||||
|
||||
# Maximum number of parents for a class (see R0901).
|
||||
max-parents=7
|
||||
|
||||
# Maximum number of attributes for a class (see R0902).
|
||||
max-attributes=7
|
||||
|
||||
# Minimum number of public methods for a class (see R0903).
|
||||
min-public-methods=2
|
||||
|
||||
# Maximum number of public methods for a class (see R0904).
|
||||
max-public-methods=20
|
||||
|
||||
|
||||
[IMPORTS]
|
||||
|
||||
# Deprecated modules which should not be used, separated by a comma
|
||||
deprecated-modules=regsub,TERMIOS,Bastion,rexec
|
||||
|
||||
# Create a graph of every (i.e. internal and external) dependencies in the
|
||||
# given file (report RP0402 must not be disabled)
|
||||
import-graph=
|
||||
|
||||
# Create a graph of external dependencies in the given file (report RP0402 must
|
||||
# not be disabled)
|
||||
ext-import-graph=
|
||||
|
||||
# Create a graph of internal dependencies in the given file (report RP0402 must
|
||||
# not be disabled)
|
||||
int-import-graph=
|
||||
|
||||
|
||||
[EXCEPTIONS]
|
||||
|
||||
# Exceptions that will emit a warning when being caught. Defaults to
|
||||
# "Exception"
|
||||
overgeneral-exceptions=Exception
|
||||
disable=locally-disabled,missing-docstring,invalid-name,too-few-public-methods,redefined-variable-type,import-error,similarities,unsupported-membership-test,unsubscriptable-object,ungrouped-imports,cyclic-import
|
||||
|
||||
3
.style.yapf
Normal file
3
.style.yapf
Normal file
@@ -0,0 +1,3 @@
|
||||
[style]
|
||||
blank_line_before_nested_class_or_def = true
|
||||
allow_multiline_lambdas = true
|
||||
43
.travis.yml
43
.travis.yml
@@ -1,12 +1,43 @@
|
||||
language: python
|
||||
python: 2.7
|
||||
|
||||
env:
|
||||
- TOX_ENV=lint
|
||||
- TOX_ENV=py26
|
||||
matrix:
|
||||
include:
|
||||
- os: linux
|
||||
sudo: false
|
||||
python: 2.7
|
||||
env: TOX_ENV=docs
|
||||
- os: linux
|
||||
sudo: false
|
||||
python: 2.7
|
||||
env: TOX_ENV=lint
|
||||
- os: linux
|
||||
sudo: required
|
||||
python: 2.7
|
||||
env: TOX_ENV=py27
|
||||
- os: osx
|
||||
language: generic
|
||||
env: TOX_ENV=skipexamples
|
||||
|
||||
install:
|
||||
- pip install tox
|
||||
- git submodule update --init --recursive
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then curl -fsSL https://bootstrap.pypa.io/get-pip.py | sudo python; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then sudo pip install tox; else pip install -U tox; fi
|
||||
|
||||
# ChipKIT issue: install 32-bit support for GCC PIC32
|
||||
- if [[ "$TOX_ENV" == "py27" ]] && [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install libc6-i386; fi
|
||||
|
||||
script:
|
||||
- tox -e $TOX_ENV
|
||||
- tox -e $TOX_ENV
|
||||
|
||||
after_success:
|
||||
- if [[ "$TOX_ENV" == "py27" ]] && [[ "$TRAVIS_OS_NAME" == "linux" ]]; then tox -e coverage; fi
|
||||
- if [[ "$TOX_ENV" == "py27" ]] && [[ "$TRAVIS_OS_NAME" == "linux" ]]; then bash <(curl -s https://codecov.io/bash); fi
|
||||
|
||||
notifications:
|
||||
email: false
|
||||
|
||||
slack:
|
||||
rooms:
|
||||
secure: JD6VGfN4+SLU2CwDdiIOr1VgwD+zbYUCE/srwyGuHavnjIkPItkl6T6Bn8Y4VrU6ysbuKotfdV2TAJJ82ivFbY8BvZBc7FBcYp/AGQ4FaCCV5ySv8RDAcQgdE12oaGzMdODiLqsB85f65zOlAFa+htaXyEiRTcotn6Y2hupatrI=
|
||||
on_failure: always
|
||||
on_success: change
|
||||
|
||||
15
.vscode/settings.json
vendored
Normal file
15
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"python.pythonPath": "${workspaceRoot}/.tox/develop/bin/python",
|
||||
"python.formatting.provider": "yapf",
|
||||
"files.exclude": {
|
||||
"**/*.pyc": true,
|
||||
"*.egg-info": true,
|
||||
".cache": true,
|
||||
"build": true,
|
||||
"dist": true
|
||||
},
|
||||
"editor.rulers": [79],
|
||||
"restructuredtext.builtDocumentationPath": "${workspaceRoot}/docs/_build/html",
|
||||
"restructuredtext.confPath": "${workspaceRoot}/docs",
|
||||
"restructuredtext.linter.executablePath": "${workspaceRoot}/.tox/docs/bin/restructuredtext-lint"
|
||||
}
|
||||
21
CONTRIBUTING.md
Normal file
21
CONTRIBUTING.md
Normal file
@@ -0,0 +1,21 @@
|
||||
Contributing
|
||||
------------
|
||||
|
||||
To get started, <a href="https://www.clahub.com/agreements/platformio/platformio-core">sign the Contributor License Agreement</a>.
|
||||
|
||||
1. Fork the repository on GitHub.
|
||||
2. Make a branch off of ``develop``
|
||||
3. Run ``pip install tox``
|
||||
4. Go to the root of project where is located ``tox.ini`` and run ``tox -e develop``
|
||||
5. Activate current development environment:
|
||||
|
||||
* Windows: ``.tox\develop\Scripts\activate``
|
||||
* Bash/ZSH: ``source .tox/develop/bin/activate``
|
||||
* Fish: ``source .tox/bin/activate.fish``
|
||||
|
||||
6. Make changes to code, documentation, etc.
|
||||
7. Lint source code ``tox -e lint``
|
||||
8. Run the tests ``tox -e py27``
|
||||
9. Build documentation ``tox -e docs`` (creates a directory _build under docs where you can find the html)
|
||||
10. Commit changes to your forked repository
|
||||
11. Submit a Pull Request on GitHub.
|
||||
1623
HISTORY.rst
1623
HISTORY.rst
File diff suppressed because it is too large
Load Diff
187
LICENSE
187
LICENSE
@@ -1,21 +1,174 @@
|
||||
The MIT License (MIT)
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
Copyright (c) 2014 Ivan Kravets
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
1. Definitions.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
26
Makefile
Normal file
26
Makefile
Normal file
@@ -0,0 +1,26 @@
|
||||
|
||||
lint:
|
||||
pylint --rcfile=./.pylintrc ./platformio
|
||||
|
||||
isort:
|
||||
isort -rc ./platformio
|
||||
isort -rc ./tests
|
||||
|
||||
yapf:
|
||||
yapf --recursive --in-place platformio/
|
||||
|
||||
test:
|
||||
py.test -v -s -n 3 --dist=loadscope tests --ignore tests/test_examples.py --ignore tests/test_pkgmanifest.py
|
||||
|
||||
before-commit: isort yapf lint test
|
||||
|
||||
clean-docs:
|
||||
rm -rf docs/_build
|
||||
|
||||
clean: clean-docs
|
||||
find . -name \*.pyc -delete
|
||||
find . -name __pycache__ -delete
|
||||
rm -rf .cache
|
||||
rm -rf build
|
||||
rm -rf htmlcov
|
||||
rm -f .coverage
|
||||
701
README.rst
701
README.rst
@@ -1,632 +1,131 @@
|
||||
PlatformIO
|
||||
==========
|
||||
|
||||
.. image:: https://travis-ci.org/ivankravets/platformio.svg?branch=develop
|
||||
:target: https://travis-ci.org/ivankravets/platformio
|
||||
:alt: Build Status
|
||||
.. image:: https://gemnasium.com/ivankravets/platformio.png
|
||||
:target: https://gemnasium.com/ivankravets/platformio
|
||||
:alt: Dependency Status
|
||||
.. image:: https://pypip.in/version/platformio/badge.png
|
||||
.. image:: https://travis-ci.org/platformio/platformio-core.svg?branch=develop
|
||||
:target: https://travis-ci.org/platformio/platformio-core
|
||||
:alt: Travis.CI Build Status
|
||||
.. image:: https://ci.appveyor.com/api/projects/status/unnpw0n3c5k14btn/branch/develop?svg=true
|
||||
:target: https://ci.appveyor.com/project/ivankravets/platformio-core
|
||||
:alt: AppVeyor.CI Build Status
|
||||
.. image:: https://requires.io/github/platformio/platformio-core/requirements.svg?branch=develop
|
||||
:target: https://requires.io/github/platformio/platformio-core/requirements/?branch=develop
|
||||
:alt: Requirements Status
|
||||
.. image:: https://img.shields.io/pypi/v/platformio.svg
|
||||
:target: https://pypi.python.org/pypi/platformio/
|
||||
:alt: Latest Version
|
||||
.. image:: https://pypip.in/download/platformio/badge.png
|
||||
:target: https://pypi.python.org/pypi/platformio/
|
||||
:alt: Downloads
|
||||
.. image:: https://pypip.in/license/platformio/badge.png
|
||||
.. image:: https://img.shields.io/pypi/l/platformio.svg
|
||||
:target: https://pypi.python.org/pypi/platformio/
|
||||
:alt: License
|
||||
.. image:: https://img.shields.io/PlatformIO/Community.png
|
||||
:alt: Community Forums
|
||||
:target: https://community.platformio.org?utm_source=github&utm_medium=core
|
||||
.. image:: https://img.shields.io/PlatformIO/Plus.png?color=orange
|
||||
:alt: PlatformIO Plus: Professional solutions for an awesome open source PlatformIO ecosystem
|
||||
:target: https://platformio.org/pricing?utm_source=github&utm_medium=core
|
||||
|
||||
`Quickstart <#quickstart>`_ |
|
||||
`Installation <#installation>`_ |
|
||||
`Documentation <#documentation>`_ |
|
||||
`Examples <https://github.com/ivankravets/platformio/tree/develop/examples>`_ |
|
||||
`Embedded Platform Boards <#embedded-platform-boards>`_ |
|
||||
`IDE Integration <#ide-integration>`_ |
|
||||
`Blog <http://www.ikravets.com/category/computer-life/platformio>`_
|
||||
**Quick Links:** `Home Page <https://platformio.org?utm_source=github&utm_medium=core>`_ |
|
||||
`PlatformIO Plus <https://platformio.org/pricing?utm_source=github&utm_medium=core>`_ |
|
||||
`PlatformIO IDE <https://platformio.org/platformio-ide?utm_source=github&utm_medium=core>`_ |
|
||||
`Project Examples <https://github.com/platformio/platformio-examples/>`_ |
|
||||
`Docs <http://docs.platformio.org?utm_source=github&utm_medium=core>`_ |
|
||||
`Donate <https://platformio.org/donate?utm_source=github&utm_medium=core>`_ |
|
||||
`Contact Us <https://platformio.org/contact?utm_source=github&utm_medium=core>`_
|
||||
|
||||
**Social:** `Twitter <https://twitter.com/PlatformIO_Org>`_ |
|
||||
`Facebook <https://www.facebook.com/platformio>`_ |
|
||||
`Hackaday <https://hackaday.io/project/7980-platformio>`_ |
|
||||
`Bintray <https://bintray.com/platformio>`_ |
|
||||
`Community <https://community.platformio.org?utm_source=github&utm_medium=core>`_
|
||||
|
||||
**PlatformIO** is a cross-platform code builder and library manager.
|
||||
.. image:: https://raw.githubusercontent.com/platformio/platformio-web/develop/app/images/platformio-ide-laptop.png
|
||||
:target: https://platformio.org?utm_source=github&utm_medium=core
|
||||
|
||||
You have no need to install any *IDE* or compile any toolchains. *PlatformIO*
|
||||
has pre-built different development platforms including: compiler, debugger,
|
||||
flasher (for embedded) and many other useful tools.
|
||||
`PlatformIO <https://platformio.org?utm_source=github&utm_medium=core>`_ is an open source ecosystem for IoT
|
||||
development. Cross-platform IDE and unified debugger. Remote unit testing and
|
||||
firmware updates.
|
||||
|
||||
**PlatformIO** allows developer to compile the same code with different
|
||||
platforms using only one command ``platformio run``. This happens due to
|
||||
``platformio.ini`` project's file (see
|
||||
`default template <https://github.com/ivankravets/platformio/blob/develop/platformio/projectconftpl.ini>`_)
|
||||
where you can setup different environments with specific settings: platform,
|
||||
firmware uploading options, pre-built framework and many more.
|
||||
Get Started
|
||||
-----------
|
||||
|
||||
Each platform consists of packages which are located in own repository.
|
||||
Due to ``platformio update`` command you will have up-to-date development
|
||||
instruments.
|
||||
* `What is PlatformIO? <http://docs.platformio.org/en/latest/what-is-platformio.html?utm_source=github&utm_medium=core>`_
|
||||
|
||||
.. image:: examples/platformio-examples.png
|
||||
:target: https://github.com/ivankravets/platformio/raw/develop/examples/platformio-examples.png
|
||||
:alt: Examples
|
||||
:width: 730px
|
||||
Products
|
||||
--------
|
||||
|
||||
**PlatformIO** is well suited for **embedded development**. It can:
|
||||
* `PlatformIO IDE <https://platformio.org/platformio-ide?utm_source=github&utm_medium=core>`_
|
||||
* `PlatformIO Core (CLI) <http://docs.platformio.org/en/latest/core.html?utm_source=github&utm_medium=core>`_
|
||||
* `PIO Remote™ <http://docs.platformio.org/en/latest/plus/pio-remote.html?utm_source=github&utm_medium=core>`_
|
||||
* `PIO Unified Debugger <http://docs.platformio.org/en/latest/plus/debugging.html?utm_source=github&utm_medium=core>`_
|
||||
* `PIO Unit Testing <http://docs.platformio.org/en/latest/plus/unit-testing.html?utm_source=github&utm_medium=core>`_
|
||||
* `PIO Delivery™ <https://platformio.org/pricing?utm_source=github&utm_medium=core#solution-pio-delivery>`_
|
||||
* `Cloud Builder <https://platformio.org/pricing?utm_source=github&utm_medium=core#solution-cloud-builder>`_
|
||||
|
||||
* Automatically analyse dependency
|
||||
* Reliably detect build changes
|
||||
* Build framework or library source code to static library
|
||||
* Build *ELF* (executable and linkable firmware)
|
||||
* Convert *ELF* to *HEX* or *BIN* file
|
||||
* Extract *EEPROM* data
|
||||
* Upload firmware to your device
|
||||
Registry
|
||||
--------
|
||||
|
||||
It has support for many popular embedded platforms like these:
|
||||
* `Libraries <https://platformio.org/lib?utm_source=github&utm_medium=core>`_
|
||||
* `Development Platforms <https://platformio.org/platforms?utm_source=github&utm_medium=core>`_
|
||||
* `Frameworks <https://platformio.org/frameworks?utm_source=github&utm_medium=core>`_
|
||||
* `Embedded Boards <https://platformio.org/boards?utm_source=github&utm_medium=core>`_
|
||||
|
||||
* ``atmelavr`` `Atmel AVR <http://en.wikipedia.org/wiki/Atmel_AVR>`_
|
||||
(including `Arduino <http://www.arduino.cc>`_ based boards)
|
||||
* ``timsp430`` `TI MSP430 <http://www.ti.com/lsds/ti/microcontroller/16-bit_msp430/overview.page>`_
|
||||
(including `MSP430 LaunchPads <http://www.ti.com/ww/en/launchpad/launchpads-msp430.html>`_)
|
||||
* ``titiva`` `TI TIVA C <http://www.ti.com/lsds/ti/microcontroller/tiva_arm_cortex/c_series/overview.page>`_
|
||||
(including `TIVA C Series LaunchPads <http://www.ti.com/ww/en/launchpad/launchpads-connected.html>`_)
|
||||
Solutions
|
||||
---------
|
||||
|
||||
* `Library Manager <http://docs.platformio.org/en/latest/librarymanager/index.html?utm_source=github&utm_medium=core>`_
|
||||
* `Cloud IDEs Integration <https://platformio.org/pricing?utm_source=github&utm_medium=core#solution-cloud-ide>`_
|
||||
* `Standalone IDEs Integration <http://docs.platformio.org/en/latest/ide.html?utm_source=github&utm_medium=core#other-ide>`_
|
||||
* `Continuous Integration <http://docs.platformio.org/en/latest/ci/index.html?utm_source=github&utm_medium=core>`_
|
||||
|
||||
See project `examples with screenshots <https://github.com/ivankravets/platformio/tree/develop/examples>`_.
|
||||
Development Platforms
|
||||
---------------------
|
||||
|
||||
* `Atmel AVR <https://platformio.org/platforms/atmelavr?utm_source=github&utm_medium=core>`_
|
||||
* `Atmel SAM <https://platformio.org/platforms/atmelsam?utm_source=github&utm_medium=core>`_
|
||||
* `Espressif 32 <https://platformio.org/platforms/espressif32?utm_source=github&utm_medium=core>`_
|
||||
* `Espressif 8266 <https://platformio.org/platforms/espressif8266?utm_source=github&utm_medium=core>`_
|
||||
* `Freescale Kinetis <https://platformio.org/platforms/freescalekinetis?utm_source=github&utm_medium=core>`_
|
||||
* `Intel ARC32 <https://platformio.org/platforms/intel_arc32?utm_source=github&utm_medium=core>`_
|
||||
* `Lattice iCE40 <https://platformio.org/platforms/lattice_ice40?utm_source=github&utm_medium=core>`_
|
||||
* `Maxim 32 <https://platformio.org/platforms/maxim32?utm_source=github&utm_medium=core>`_
|
||||
* `Microchip PIC32 <https://platformio.org/platforms/microchippic32?utm_source=github&utm_medium=core>`_
|
||||
* `Nordic nRF51 <https://platformio.org/platforms/nordicnrf51?utm_source=github&utm_medium=core>`_
|
||||
* `Nordic nRF52 <https://platformio.org/platforms/nordicnrf52?utm_source=github&utm_medium=core>`_
|
||||
* `NXP LPC <https://platformio.org/platforms/nxplpc?utm_source=github&utm_medium=core>`_
|
||||
* `Silicon Labs EFM32 <https://platformio.org/platforms/siliconlabsefm32?utm_source=github&utm_medium=core>`_
|
||||
* `ST STM32 <https://platformio.org/platforms/ststm32?utm_source=github&utm_medium=core>`_
|
||||
* `Teensy <https://platformio.org/platforms/teensy?utm_source=github&utm_medium=core>`_
|
||||
* `TI MSP430 <https://platformio.org/platforms/timsp430?utm_source=github&utm_medium=core>`_
|
||||
* `TI Tiva <https://platformio.org/platforms/titiva?utm_source=github&utm_medium=core>`_
|
||||
* `WIZNet W7500 <https://platformio.org/platforms/wiznet7500?utm_source=github&utm_medium=core>`_
|
||||
|
||||
IDE Integration
|
||||
---------------
|
||||
|
||||
* [Eclipse] `Building and debugging Atmel AVR (Arduino-based) project using Eclipse IDE+PlatformIO <http://www.ikravets.com/computer-life/programming/2014/06/20/building-and-debugging-atmel-avr-arduino-based-project-using-eclipse-ideplatformio>`_
|
||||
|
||||
|
||||
Embedded Platform Boards
|
||||
------------------------
|
||||
|
||||
**PlatformIO** has pre-configured settings for most popular platform boards. You
|
||||
have no need to specify in ``platformio.ini`` type or frequency of MCU, upload
|
||||
protocol or etc. Please use ``board`` option (for
|
||||
`example <https://github.com/ivankravets/platformio/blob/develop/examples/wiring-blink/platformio.ini>`_).
|
||||
|
||||
|
||||
Platform ``atmelavr``
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* ``diecimilaatmega168`` Arduino Duemilanove or Diecimila (ATmega168)
|
||||
* ``diecimilaatmega328`` Arduino Duemilanove or Diecimila (ATmega328)
|
||||
* ``fio`` Arduino Fio
|
||||
* ``leonardo`` Arduino Leonardo
|
||||
* ``LilyPadUSB`` Arduino LilyPad USB
|
||||
* ``lilypadatmega168`` Arduino LilyPad (ATmega168)
|
||||
* ``lilypadatmega328`` Arduino LilyPad (ATmega328)
|
||||
* ``megaatmega1280`` Arduino Mega (ATmega1280)
|
||||
* ``megaatmega2560`` Arduino Mega (ATmega2560)
|
||||
* ``megaADK`` Arduino Mega ADK
|
||||
* ``micro`` Arduino Micro
|
||||
* ``miniatmega168`` Arduino Mini (ATmega168)
|
||||
* ``miniatmega328`` Arduino Mini (ATmega328)
|
||||
* ``nanoatmega168`` Arduino Nano (ATmega168)
|
||||
* ``nanoatmega328`` Arduino Nano (ATmega328)
|
||||
* ``pro8MHzatmega168`` Arduino Pro or Pro Mini (ATmega168, 3.3V, 8MHz)
|
||||
* ``pro16MHzatmega168`` Arduino Pro or Pro Mini (ATmega168, 5V, 16MHz)
|
||||
* ``pro8MHzatmega328`` Arduino Pro or Pro Mini (ATmega328, 3.3V, 8MHz)
|
||||
* ``pro16MHzatmega328`` Arduino Pro or Pro Mini (ATmega328, 5V, 16MHz)
|
||||
* ``uno`` Arduino Uno
|
||||
* ``raspduino`` Raspduino
|
||||
* ``328p8m`` Microduino Core (ATmega328P, 3.3V, 8MHz)
|
||||
* ``328p16m`` Microduino Core (Atmega328P, 5V, 16MHz)
|
||||
* ``168pa8m`` Microduino Core (ATmega168PA, 3.3V, 8MHz)
|
||||
* ``168pa16m`` Microduino Core (ATmega168PA, 5V, 16MHz)
|
||||
* ``644pa8m`` Microduino Core+ (ATmega644PA, 3.3V, 8MHz)
|
||||
* ``644pa16m`` Microduino Core+ (ATmega644PA, 5V, 16MHz)
|
||||
* ``1284p8m`` Microduino-Core+ (ATmega1284P, 3.3V, 8MHz)
|
||||
* ``1284p16m`` Microduino-Core+ (ATmega1284P, 5V, 16MHz)
|
||||
* ``32u416m`` Microduino-Core USB (ATmega32U4, 5V, 16MHz)
|
||||
|
||||
|
||||
|
||||
Platform ``timsp430``
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* ``lpmsp430g2231`` TI LaunchPad MSP430 (msp430g2231)
|
||||
* ``lpmsp430g2452`` TI LaunchPad MSP430 (msp430g2452)
|
||||
* ``lpmsp430g2553`` TI LaunchPad MSP430 (msp430g2553)
|
||||
* ``lpmsp430f5529`` TI LaunchPad MSP430 (msp430f5529, 16MHz)
|
||||
* ``lpmsp430f5529_25`` TI LaunchPad MSP430 (msp430f5529, 25MHz)
|
||||
* ``lpmsp430fr5969`` TI LaunchPad MSP430 (msp430fr5969)
|
||||
* ``lpmsp430fr5739`` TI FraunchPad MSP430 (msp430fr5739)
|
||||
|
||||
|
||||
Platform ``titiva``
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* ``lplm4f120h5qr`` TI Stellaris LM4F120 LaunchPad
|
||||
* ``lptm4c1230c3pm`` TI Tiva C Series TM4C123G LaunchPad
|
||||
* ``lptm4c1294ncpdt`` TI Tiva C Series TM4C1294 Connected LaunchPad
|
||||
|
||||
|
||||
Python & OS Support
|
||||
-------------------
|
||||
|
||||
**PlatformIO** is written in `Python <https://www.python.org>`_ and works with
|
||||
versions 2.6 and 2.7 on Unix/Linux, OS X, and Windows.
|
||||
|
||||
|
||||
Quickstart
|
||||
Frameworks
|
||||
----------
|
||||
|
||||
.. code-block:: bash
|
||||
* `Arduino <https://platformio.org/frameworks/arduino?utm_source=github&utm_medium=core>`_
|
||||
* `ARTIK SDK <https://platformio.org/frameworks/artik-sdk?utm_source=github&utm_medium=core>`_
|
||||
* `CMSIS <https://platformio.org/frameworks/cmsis?utm_source=github&utm_medium=core>`_
|
||||
* `Energia <https://platformio.org/frameworks/energia?utm_source=github&utm_medium=core>`_
|
||||
* `ESP-IDF <https://platformio.org/frameworks/espidf?utm_source=github&utm_medium=core>`_
|
||||
* `ESP8266 Non-OS SDK <https://platformio.org/frameworks/esp8266-nonos-sdk?utm_source=github&utm_medium=core>`_
|
||||
* `ESP8266 RTOS SDK <https://platformio.org/frameworks/esp8266-rtos-sdk?utm_source=github&utm_medium=core>`_
|
||||
* `libOpenCM3 <https://platformio.org/frameworks/libopencm3?utm_source=github&utm_medium=core>`_
|
||||
* `mbed <https://platformio.org/frameworks/mbed?utm_source=github&utm_medium=core>`_
|
||||
* `Pumbaa <https://platformio.org/frameworks/pumbaa?utm_source=github&utm_medium=core>`_
|
||||
* `Simba <https://platformio.org/frameworks/simba?utm_source=github&utm_medium=core>`_
|
||||
* `SPL <https://platformio.org/frameworks/spl?utm_source=github&utm_medium=core>`_
|
||||
* `STM32Cube <https://platformio.org/frameworks/stm32cube?utm_source=github&utm_medium=core>`_
|
||||
* `Tizen RT <https://platformio.org/frameworks/tizenrt?utm_source=github&utm_medium=core>`_
|
||||
* `WiringPi <https://platformio.org/frameworks/wiringpi?utm_source=github&utm_medium=core>`_
|
||||
|
||||
# Print all availalbe development platforms for installing
|
||||
$ platformio search all
|
||||
|
||||
# Install new development platform
|
||||
$ platformio install SomePlatform
|
||||
|
||||
# Initialize new platformio based project
|
||||
$ cd /path/to/empty/directory
|
||||
$ platformio init
|
||||
|
||||
# Process the project's environments
|
||||
$ platformio run
|
||||
|
||||
For more detailed information please follow to `Installation <#installation>`_
|
||||
and `Documentation <#documentation>`_ sections.
|
||||
|
||||
|
||||
Installation
|
||||
Contributing
|
||||
------------
|
||||
|
||||
All commands below should be executed in
|
||||
`Command-line <http://en.wikipedia.org/wiki/Command-line_interface>`_
|
||||
application in your *OS*:
|
||||
See `contributing guidelines <https://github.com/platformio/platformio/blob/develop/CONTRIBUTING.md>`_.
|
||||
|
||||
* *Unix/Linux/OS X* this is *Terminal* application.
|
||||
* *Windows* this is
|
||||
`Command Prompt <http://en.wikipedia.org/wiki/Command_Prompt>`_ (``cmd.exe``)
|
||||
application.
|
||||
|
||||
Also, the `Python Interpreter <https://www.python.org/downloads/>`_ (2.6 or 2.7)
|
||||
is required.
|
||||
|
||||
|
||||
Super-Quick
|
||||
~~~~~~~~~~~
|
||||
|
||||
To install or upgrade *PlatformIO*, download
|
||||
`get-platformio.py <https://raw.githubusercontent.com/ivankravets/platformio/develop/scripts/get-platformio.py>`_ script.
|
||||
|
||||
Then run the following (which may require administrator access):
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ python get-platformio.py
|
||||
|
||||
An alternative short version for *Mac/Linux* users:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ curl -L http://bit.ly/1lpanta | python
|
||||
|
||||
|
||||
On *Windows OS* it may look like:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
C:\Python27\python.exe get-platformio.py
|
||||
|
||||
|
||||
Full Guide
|
||||
~~~~~~~~~~
|
||||
|
||||
1. Check a ``python`` version (only 2.6-2.7 is supported):
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ python --version
|
||||
|
||||
*Windows OS* Users only:
|
||||
|
||||
* `Download Python 2.7 <https://www.python.org/downloads/>`_ and install it.
|
||||
* Add to PATH system variable ``;C:\Python27;C:\Python27\Scripts;`` and
|
||||
reopen *Command Prompt* (``cmd.exe``) application. Please read this
|
||||
article `How to set the path and environment variables in Windows
|
||||
<http://www.computerhope.com/issues/ch000549.htm>`_.
|
||||
|
||||
|
||||
2. Check a ``pip`` tool for installing and managing *Python* packages:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ pip search platformio
|
||||
|
||||
You should see short information about ``platformio`` package.
|
||||
|
||||
If your computer does not recognize ``pip`` command, try to install it first
|
||||
using `these instructions <http://www.pip-installer.org/en/latest/installing.html>`_.
|
||||
|
||||
3. Install a ``platformio`` and related packages:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ pip install platformio && pip install --egg scons
|
||||
|
||||
For upgrading the ``platformio`` to new version please use this command:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ pip install -U platformio
|
||||
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
To print all available commands and options:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ platformio --help
|
||||
$ platformio COMMAND --help
|
||||
|
||||
# Example
|
||||
$ platformio --help
|
||||
Usage: platformio [OPTIONS] COMMAND [ARGS]...
|
||||
|
||||
Options:
|
||||
--version Show the version and exit.
|
||||
--help Show this message and exit.
|
||||
|
||||
Commands:
|
||||
init Initialize new PlatformIO based project
|
||||
install Install new platforms
|
||||
list List installed platforms
|
||||
run Process project environments
|
||||
search Search for development platforms
|
||||
serialports List Serial ports
|
||||
show Show details about an installed platforms
|
||||
uninstall Uninstall platforms
|
||||
update Update installed platforms
|
||||
upgrade Upgrade PlatformIO to the latest version
|
||||
|
||||
|
||||
``platformio init``
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Initialize new PlatformIO based project.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# Change directory to future project
|
||||
$ cd /path/to/empty/directory
|
||||
$ platformio init
|
||||
|
||||
# Example
|
||||
$ platformio init
|
||||
Project has been initialized!
|
||||
Please put your source code to `src` directory, external libraries to `lib`
|
||||
and setup environments in `platformio.ini` file.
|
||||
Then process project with `platformio run` command.
|
||||
|
||||
After this command ``platformio`` will create:
|
||||
|
||||
* ``.pioenvs`` - a temporary working directory.
|
||||
* ``lib`` - a directory for project specific libraries. PlatformIO will
|
||||
compile their to static libraries and link to executable file
|
||||
* ``src`` - a source directory. Put code here.
|
||||
* ``platformio.ini`` - a configuration file for project
|
||||
|
||||
|
||||
``platformio install``
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
*PlatformIO* has pre-built development platforms with related packages. You
|
||||
can install one of them:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ platformio install SomePlatform
|
||||
$ platformio install SomePlatform --with-package=toolchain|uploader|PackageName
|
||||
$ platformio install SomePlatform --without-package=toolchain|uploader|PackageName
|
||||
$ platformio install SomePlatform --skip-default-package
|
||||
|
||||
# Example
|
||||
$ platformio install timsp430
|
||||
Installing toolchain-timsp430 package:
|
||||
Downloading [####################################] 100%
|
||||
Unpacking [####################################] 100%
|
||||
Installing tool-mspdebug package:
|
||||
Downloading [####################################] 100%
|
||||
Unpacking [####################################] 100%
|
||||
Installing framework-energiamsp430 package:
|
||||
Downloading [####################################] 100%
|
||||
Unpacking [####################################] 100%
|
||||
The platform 'timsp430' has been successfully installed!
|
||||
|
||||
# Skip default packages and install uploader utility only
|
||||
$ platformio install timsp430 --skip-default-package --with-package=uploader
|
||||
Installing tool-mspdebug package:
|
||||
Downloading [####################################] 100%
|
||||
Unpacking [####################################] 100%
|
||||
The platform 'timsp430' has been successfully installed!
|
||||
|
||||
|
||||
``platformio list``
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To list installed platforms:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ platformio list
|
||||
|
||||
# Example
|
||||
$ platformio list
|
||||
timsp430 with packages: toolchain-timsp430, tool-mspdebug, framework-energiamsp430
|
||||
|
||||
|
||||
``platformio run``
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Process the project's environments defined in ``platformio.ini`` file:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ platformio run
|
||||
|
||||
# Example
|
||||
$ platformio run
|
||||
Processing arduino_pro5v environment:
|
||||
scons: `.pioenvs/arduino_pro5v/firmware.elf' is up to date.
|
||||
scons: `.pioenvs/arduino_pro5v/firmware.hex' is up to date.
|
||||
|
||||
Processing launchpad_msp430g2 environment:
|
||||
scons: `.pioenvs/launchpad_msp430g2/firmware.elf' is up to date.
|
||||
scons: `.pioenvs/launchpad_msp430g2/firmware.hex' is up to date.
|
||||
|
||||
Processing launchpad_lm4f120 environment:
|
||||
scons: `.pioenvs/launchpad_lm4f120/firmware.elf' is up to date.
|
||||
scons: `.pioenvs/launchpad_lm4f120/firmware.hex' is up to date
|
||||
|
||||
Process specific environments:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ platformio run -e myenv1 -e myenv2
|
||||
|
||||
# Example
|
||||
$ platformio run -e arduino_pro5v -e launchpad_lm4f120
|
||||
Processing arduino_pro5v environment:
|
||||
scons: `.pioenvs/arduino_pro5v/firmware.elf' is up to date.
|
||||
scons: `.pioenvs/arduino_pro5v/firmware.hex' is up to date.
|
||||
|
||||
Processing launchpad_lm4f120 environment:
|
||||
scons: `.pioenvs/launchpad_lm4f120/firmware.elf' is up to date.
|
||||
scons: `.pioenvs/launchpad_lm4f120/firmware.hex' is up to date.
|
||||
|
||||
Process specific target:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ platformio run -t clean
|
||||
$ platformio run -t upload --upload-port=/dev/ttyUSBX
|
||||
|
||||
# Example
|
||||
platformio run -t clean
|
||||
Processing arduino_pro5v environment:
|
||||
Removed .pioenvs/arduino_pro5v/src/main.o
|
||||
...
|
||||
Removed .pioenvs/arduino_pro5v/firmware.hex
|
||||
|
||||
Processing launchpad_msp430g2 environment:
|
||||
Removed .pioenvs/launchpad_msp430g2/src/main.o
|
||||
...
|
||||
Removed .pioenvs/launchpad_msp430g2/firmware.hex
|
||||
|
||||
Processing launchpad_lm4f120 environment:
|
||||
Removed .pioenvs/launchpad_lm4f120/src/main.o
|
||||
...
|
||||
Removed .pioenvs/launchpad_lm4f120/firmware.hex
|
||||
|
||||
Mix environments and targets:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ platformio run -e myembeddeddevice -t upload
|
||||
|
||||
# Example
|
||||
$ platformio run -e launchpad_msp430g2 -t upload
|
||||
Processing launchpad_msp430g2 environment:
|
||||
/Users/ikravets/.platformio/timsp430/tools/mspdebug/mspdebug rf2500 --force-reset "prog .pioenvs/launchpad_msp430g2/firmware.hex"
|
||||
MSPDebug version 0.20 - debugging tool for MSP430 MCUs
|
||||
Copyright (C) 2009-2012 Daniel Beer <dlbeer@gmail.com>
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
Trying to open interface 1 on 009
|
||||
Initializing FET...
|
||||
FET protocol version is 30394216
|
||||
Configured for Spy-Bi-Wire
|
||||
Sending reset...
|
||||
Set Vcc: 3000 mV
|
||||
Device ID: 0x2553
|
||||
Code start address: 0xc000
|
||||
Code size : 16384 byte = 16 kb
|
||||
RAM start address: 0x200
|
||||
RAM end address: 0x3ff
|
||||
RAM size : 512 byte = 0 kb
|
||||
Device: MSP430G2553/G2403
|
||||
Code memory starts at 0xc000
|
||||
Number of breakpoints: 2
|
||||
Chip ID data: 25 53
|
||||
Erasing...
|
||||
Programming...
|
||||
Writing 646 bytes at c000...
|
||||
Writing 32 bytes at ffe0...
|
||||
Done, 678 bytes total
|
||||
|
||||
|
||||
``platformio search``
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Search for development platforms:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# Print all available development platforms
|
||||
$ platformio search all
|
||||
|
||||
# Filter platforms by "Query"
|
||||
$ platformio search "Query"
|
||||
|
||||
# Example
|
||||
$ platformio search ti
|
||||
timsp430 - An embedded platform for TI MSP430 microcontrollers (with Energia Framework)
|
||||
titiva - An embedded platform for TI TIVA C ARM microcontrollers (with Energia Framework)
|
||||
|
||||
$ platformio search arduino
|
||||
atmelavr - An embedded platform for Atmel AVR microcontrollers (with Arduino Framework)
|
||||
|
||||
|
||||
``platformio serialports``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To list available `Serial Ports <http://en.wikipedia.org/wiki/Serial_port>`_:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ platformio serialports
|
||||
|
||||
# Example (Posix)
|
||||
$ platformio serialports
|
||||
/dev/cu.SLAB_USBtoUART
|
||||
----------
|
||||
Hardware ID: USB VID:PID=10c4:ea60 SNR=0001
|
||||
Description: CP2102 USB to UART Bridge Controller
|
||||
|
||||
/dev/cu.uart-1CFF4676258F4543
|
||||
----------
|
||||
Hardware ID: USB VID:PID=451:f432 SNR=1CFF4676258F4543
|
||||
Description: Texas Instruments MSP-FET430UIF
|
||||
|
||||
# Example (Windows)
|
||||
$ platformio serialports
|
||||
COM4
|
||||
----------
|
||||
Hardware ID: USB VID:PID=0451:F432
|
||||
Description: MSP430 Application UART (COM4)
|
||||
|
||||
COM3
|
||||
----------
|
||||
Hardware ID: USB VID:PID=10C4:EA60 SNR=0001
|
||||
Description: Silicon Labs CP210x USB to UART Bridge (COM3)
|
||||
|
||||
|
||||
``platformio show``
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To show details about an installed platform:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ platformio show SomePlatform
|
||||
|
||||
# Example
|
||||
$ platformio show atmelavr
|
||||
atmelavr - An embedded platform for Atmel AVR microcontrollers (with Arduino Framework)
|
||||
----------
|
||||
Package: toolchain-atmelavr
|
||||
Alias: toolchain
|
||||
Location: /Users/ikravets/.platformio/atmelavr/tools/toolchain
|
||||
Version: 1
|
||||
----------
|
||||
Package: tool-avrdude
|
||||
Alias: uploader
|
||||
Location: /Users/ikravets/.platformio/atmelavr/tools/avrdude
|
||||
Version: 1
|
||||
----------
|
||||
Package: framework-arduinoavr
|
||||
Location: /Users/ikravets/.platformio/atmelavr/frameworks/arduino
|
||||
Version: 1
|
||||
|
||||
|
||||
``platformio uninstall``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To uninstall platform:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ platformio uninstall SomePlatform
|
||||
|
||||
# Example
|
||||
$ platformio uninstall timsp430
|
||||
Uninstalling toolchain-timsp430 package: [OK]
|
||||
Uninstalling tool-mspdebug package: [OK]
|
||||
Uninstalling framework-energiamsp430 package: [OK]
|
||||
The platform 'timsp430' has been successfully uninstalled!
|
||||
|
||||
|
||||
``platformio update``
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To check or update installed platforms:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ platformio update
|
||||
|
||||
# Example
|
||||
$ platformio update
|
||||
|
||||
Platform atmelavr
|
||||
--------
|
||||
Updating toolchain-atmelavr package:
|
||||
Versions: Current=1, Latest=1 [Up-to-date]
|
||||
Updating framework-arduinoavr package:
|
||||
Versions: Current=1, Latest=1 [Up-to-date]
|
||||
Updating tool-avrdude package:
|
||||
Versions: Current=1, Latest=1 [Up-to-date]
|
||||
|
||||
Platform timsp430
|
||||
--------
|
||||
Updating toolchain-timsp430 package:
|
||||
Versions: Current=1, Latest=1 [Up-to-date]
|
||||
Updating tool-mspdebug package:
|
||||
Versions: Current=1, Latest=1 [Up-to-date]
|
||||
Updating framework-energiamsp430 package:
|
||||
Versions: Current=1, Latest=1 [Up-to-date]
|
||||
|
||||
Platform titiva
|
||||
--------
|
||||
Updating toolchain-gccarmnoneeabi package:
|
||||
Versions: Current=1, Latest=1 [Up-to-date]
|
||||
Updating tool-lm4flash package:
|
||||
Versions: Current=1, Latest=1 [Up-to-date]
|
||||
Updating framework-energiativa package:
|
||||
Versions: Current=1, Latest=1 [Up-to-date]
|
||||
|
||||
|
||||
``platformio upgrade``
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To check or upgrade PlatformIO to the latest version:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ platformio upgrade
|
||||
|
||||
# If you have problem with permissions try:
|
||||
$ sudo platformio upgrade
|
||||
|
||||
|
||||
Questions & Bugs
|
||||
----------------
|
||||
|
||||
Please use the
|
||||
`issue tracker <https://github.com/ivankravets/platformio/issues>`_
|
||||
to ask questions or report bugs.
|
||||
|
||||
|
||||
Licence
|
||||
License
|
||||
-------
|
||||
|
||||
Copyright (C) 2014 Ivan Kravets
|
||||
Copyright (c) 2014-present PlatformIO <contact@platformio.org>
|
||||
|
||||
Licenced under the MIT Licence.
|
||||
The PlatformIO is licensed under the permissive Apache 2.0 license,
|
||||
so you can use it in both commercial and personal projects with confidence.
|
||||
|
||||
1
docs
Submodule
1
docs
Submodule
Submodule docs added at 3ad76be8f7
1
examples
Submodule
1
examples
Submodule
Submodule examples added at 41f3396c58
@@ -1,22 +0,0 @@
|
||||
Arduino Example: Build \*.ino file with external Adafruit library
|
||||
=================================================================
|
||||
|
||||
1. Download ``platformio``
|
||||
`sources <https://github.com/ivankravets/platformio/archive/develop.zip>`_
|
||||
2. Extract ZIP archive
|
||||
3. Then run these commands:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# Change directory to example
|
||||
$ cd platformio-develop/examples/arduino-adafruit-library/
|
||||
|
||||
# Install Atmel AVR development platform with Arduino Framework
|
||||
$ platformio install atmelavr
|
||||
|
||||
# Process example project
|
||||
$ platformio run
|
||||
|
||||
# Upload firmware
|
||||
$ platformio run -t upload
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,179 +0,0 @@
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@file Adafruit_CC3000.h
|
||||
@author KTOWN (Kevin Townsend for Adafruit Industries)
|
||||
@license BSD (see license.txt)
|
||||
|
||||
This is a library for the Adafruit CC3000 WiFi breakout board
|
||||
This library works with the Adafruit CC3000 breakout
|
||||
----> https://www.adafruit.com/products/1469
|
||||
|
||||
Check out the links above for our tutorials and wiring diagrams
|
||||
These chips use SPI to communicate.
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
*/
|
||||
/**************************************************************************/
|
||||
|
||||
#ifndef ADAFRUIT_CC3000_H
|
||||
#define ADAFRUIT_CC3000_H
|
||||
|
||||
#if ARDUINO >= 100
|
||||
#include "Arduino.h"
|
||||
#else
|
||||
#include "WProgram.h"
|
||||
#endif
|
||||
#include "utility/cc3000_common.h"
|
||||
#include "utility/wlan.h"
|
||||
#include "utility/netapp.h"
|
||||
#include "ccspi.h"
|
||||
|
||||
#if defined(__arm__) && defined(__SAM3X8E__) // Arduino Due
|
||||
#define SPI_CLOCK_DIVIDER 6 // used to set the speed for the SPI bus; 6 == 14 Mhz on the Arduino Due
|
||||
#else
|
||||
#define SPI_CLOCK_DIVIDER SPI_CLOCK_DIV2 // Don't set this to a slower speed (i.e. larger div value)
|
||||
// or communication will be flakey on 16mhz chips!
|
||||
#endif
|
||||
|
||||
//#define ENABLE_CC3K_PRINTER
|
||||
|
||||
#ifdef ENABLE_CC3K_PRINTER
|
||||
#define CHECK_PRINTER if(CC3KPrinter != 0)
|
||||
#else
|
||||
#define CHECK_PRINTER if(false)
|
||||
#endif
|
||||
|
||||
#define WLAN_CONNECT_TIMEOUT 10000 // how long to wait, in milliseconds
|
||||
#define RXBUFFERSIZE 64 // how much to buffer on the incoming side
|
||||
#define TXBUFFERSIZE 32 // how much to buffer on the outgoing side
|
||||
|
||||
#define WIFI_ENABLE 1
|
||||
#define WIFI_DISABLE 0
|
||||
#define WIFI_STATUS_CONNECTED 1
|
||||
|
||||
typedef struct Result_Struct
|
||||
{
|
||||
uint32_t num_networks;
|
||||
uint32_t scan_status;
|
||||
uint8_t rssiByte;
|
||||
uint8_t Sec_ssidLen;
|
||||
uint16_t time;
|
||||
uint8_t ssid_name[32];
|
||||
uint8_t bssid[6];
|
||||
} ResultStruct_t; /**!ResultStruct_t : data struct to store SSID scan results */
|
||||
|
||||
/* Enum for wlan_ioctl_statusget results */
|
||||
typedef enum
|
||||
{
|
||||
STATUS_DISCONNECTED = 0,
|
||||
STATUS_SCANNING = 1,
|
||||
STATUS_CONNECTING = 2,
|
||||
STATUS_CONNECTED = 3
|
||||
} status_t;
|
||||
|
||||
class Adafruit_CC3000;
|
||||
|
||||
class Adafruit_CC3000_Client : public Print {
|
||||
public:
|
||||
Adafruit_CC3000_Client(uint16_t s);
|
||||
Adafruit_CC3000_Client(void);
|
||||
Adafruit_CC3000_Client(const Adafruit_CC3000_Client& copy);
|
||||
void operator=(const Adafruit_CC3000_Client& other);
|
||||
|
||||
// NOTE: If public functions below are added/modified/removed please make sure to update the
|
||||
// Adafruit_CC3000_ClientRef class to match!
|
||||
|
||||
bool connected(void);
|
||||
size_t write(uint8_t c);
|
||||
|
||||
size_t fastrprint(const char *str);
|
||||
size_t fastrprintln(const char *str);
|
||||
size_t fastrprint(char *str);
|
||||
size_t fastrprintln(char *str);
|
||||
size_t fastrprint(const __FlashStringHelper *ifsh);
|
||||
size_t fastrprintln(const __FlashStringHelper *ifsh);
|
||||
|
||||
int16_t write(const void *buf, uint16_t len, uint32_t flags = 0);
|
||||
int16_t read(void *buf, uint16_t len, uint32_t flags = 0);
|
||||
uint8_t read(void);
|
||||
int32_t close(void);
|
||||
uint8_t available(void);
|
||||
|
||||
uint8_t _rx_buf[RXBUFFERSIZE], _rx_buf_idx;
|
||||
int16_t bufsiz;
|
||||
|
||||
private:
|
||||
int16_t _socket;
|
||||
|
||||
};
|
||||
|
||||
// Ugly but necessary to include the server header after the client is fully defined.
|
||||
// A forward reference in the server header won't cut it because the server needs to contain
|
||||
// instances of the client. The client definition above can be pulled into a separate
|
||||
// header in a later change to make this cleaner.
|
||||
#include "Adafruit_CC3000_Server.h"
|
||||
|
||||
class Adafruit_CC3000 {
|
||||
public:
|
||||
Adafruit_CC3000(uint8_t csPin, uint8_t irqPin, uint8_t vbatPin, uint8_t spispeed = SPI_CLOCK_DIVIDER);
|
||||
bool begin(uint8_t patchReq = 0, bool useSmartConfigData = false, const char *_deviceName = NULL);
|
||||
void reboot(uint8_t patchReq = 0);
|
||||
void stop(void);
|
||||
bool disconnect(void);
|
||||
bool deleteProfiles(void);
|
||||
void printHex(const byte * data, const uint32_t numBytes);
|
||||
void printHexChar(const byte * data, const uint32_t numBytes);
|
||||
void printIPdots(uint32_t ip);
|
||||
void printIPdotsRev(uint32_t ip);
|
||||
uint32_t IP2U32(uint8_t a, uint8_t b, uint8_t c, uint8_t d);
|
||||
bool getMacAddress(uint8_t address[6]);
|
||||
bool setMacAddress(uint8_t address[6]);
|
||||
bool setStaticIPAddress(uint32_t ip, uint32_t subnetMask, uint32_t defaultGateway, uint32_t dnsServer);
|
||||
bool setDHCP();
|
||||
|
||||
bool connectToAP(const char *ssid, const char *key, uint8_t secmode, uint8_t attempts = 0);
|
||||
bool connectSecure(const char *ssid, const char *key, int32_t secMode);
|
||||
bool connectOpen(const char *ssid);
|
||||
bool checkConnected(void);
|
||||
bool checkDHCP(void);
|
||||
bool getIPAddress(uint32_t *retip, uint32_t *netmask, uint32_t *gateway, uint32_t *dhcpserv, uint32_t *dnsserv);
|
||||
|
||||
bool checkSmartConfigFinished(void);
|
||||
|
||||
Adafruit_CC3000_Client connectTCP(uint32_t destIP, uint16_t destPort);
|
||||
Adafruit_CC3000_Client connectUDP(uint32_t destIP, uint16_t destPort);
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
bool getFirmwareVersion(uint8_t *major, uint8_t *minor);
|
||||
status_t getStatus(void);
|
||||
uint16_t startSSIDscan(void);
|
||||
void stopSSIDscan();
|
||||
uint8_t getNextSSID(uint8_t *rssi, uint8_t *secMode, char *ssidname);
|
||||
|
||||
bool listSSIDResults(void);
|
||||
bool startSmartConfig(const char *_deviceName = NULL, const char *smartConfigKey = NULL);
|
||||
|
||||
bool getIPConfig(tNetappIpconfigRetArgs *ipConfig);
|
||||
|
||||
|
||||
uint16_t ping(uint32_t ip, uint8_t attempts=3, uint16_t timeout=500, uint8_t size=32);
|
||||
uint16_t getHostByName(char *hostname, uint32_t *ip);
|
||||
#endif
|
||||
|
||||
/* Functions that aren't available with the tiny driver */
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
bool scanSSIDs(uint32_t time);
|
||||
#endif
|
||||
|
||||
void setPrinter(Print*);
|
||||
|
||||
private:
|
||||
bool _initialised;
|
||||
|
||||
};
|
||||
|
||||
extern Print* CC3KPrinter;
|
||||
|
||||
#endif
|
||||
@@ -1,221 +0,0 @@
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@file Adafruit_CC3000_Server.cpp
|
||||
@author Tony DiCola (tony@tonydicola.com)
|
||||
@license BSD (see license.txt)
|
||||
|
||||
Adafruit CC3000 TCP server implementation based on the same interface as
|
||||
the Arduino Ethernet library server class.
|
||||
|
||||
See http://arduino.cc/en/Reference/Ethernet for documentation on the
|
||||
Arduino Ethernet library and its server interface.
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
#include "Adafruit_CC3000_Server.h"
|
||||
|
||||
#include "utility/socket.h"
|
||||
|
||||
#define CC3K_PRINTLN_F(text) CHECK_PRINTER { if(CC3KPrinter != NULL) { CC3KPrinter->println(F(text)); } }
|
||||
|
||||
#define HANDLE_NULL(client, value) { if (client == NULL) return value; }
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*
|
||||
Adafruit_CC3000_ClientRef implementation
|
||||
*/
|
||||
/**************************************************************************/
|
||||
|
||||
Adafruit_CC3000_ClientRef::Adafruit_CC3000_ClientRef(Adafruit_CC3000_Client* client)
|
||||
: _client(client)
|
||||
{ }
|
||||
|
||||
// Return true if the referenced client is connected. This is provided for
|
||||
// compatibility with Ethernet library code.
|
||||
Adafruit_CC3000_ClientRef::operator bool() {
|
||||
return connected();
|
||||
}
|
||||
// Below are wrappers around the public client functions. These hide the fact that users
|
||||
// are dealing with a reference to a client instance and allow code to be written using
|
||||
// value semantics like in the Ethernet library.
|
||||
bool Adafruit_CC3000_ClientRef::connected(void) {
|
||||
HANDLE_NULL(_client, false);
|
||||
return _client->connected();
|
||||
}
|
||||
|
||||
size_t Adafruit_CC3000_ClientRef::write(uint8_t c) {
|
||||
HANDLE_NULL(_client, 0);
|
||||
return _client->write(c);
|
||||
}
|
||||
|
||||
size_t Adafruit_CC3000_ClientRef::fastrprint(const char *str) {
|
||||
HANDLE_NULL(_client, 0);
|
||||
return _client->fastrprint(str);
|
||||
}
|
||||
|
||||
size_t Adafruit_CC3000_ClientRef::fastrprintln(const char *str) {
|
||||
HANDLE_NULL(_client, 0);
|
||||
return _client->fastrprintln(str);
|
||||
}
|
||||
|
||||
size_t Adafruit_CC3000_ClientRef::fastrprint(char *str) {
|
||||
HANDLE_NULL(_client, 0);
|
||||
return _client->fastrprint(str);
|
||||
}
|
||||
|
||||
size_t Adafruit_CC3000_ClientRef::fastrprintln(char *str) {
|
||||
HANDLE_NULL(_client, 0);
|
||||
return _client->fastrprintln(str);
|
||||
}
|
||||
|
||||
size_t Adafruit_CC3000_ClientRef::fastrprint(const __FlashStringHelper *ifsh) {
|
||||
HANDLE_NULL(_client, 0);
|
||||
return _client->fastrprint(ifsh);
|
||||
}
|
||||
|
||||
size_t Adafruit_CC3000_ClientRef::fastrprintln(const __FlashStringHelper *ifsh) {
|
||||
HANDLE_NULL(_client, 0);
|
||||
return _client->fastrprintln(ifsh);
|
||||
}
|
||||
|
||||
int16_t Adafruit_CC3000_ClientRef::write(const void *buf, uint16_t len, uint32_t flags) {
|
||||
HANDLE_NULL(_client, 0);
|
||||
return _client->write(buf, len, flags);
|
||||
}
|
||||
|
||||
int16_t Adafruit_CC3000_ClientRef::read(void *buf, uint16_t len, uint32_t flags) {
|
||||
HANDLE_NULL(_client, 0);
|
||||
return _client->read(buf, len, flags);
|
||||
}
|
||||
|
||||
uint8_t Adafruit_CC3000_ClientRef::read(void) {
|
||||
HANDLE_NULL(_client, 0);
|
||||
return _client->read();
|
||||
}
|
||||
|
||||
int32_t Adafruit_CC3000_ClientRef::close(void) {
|
||||
HANDLE_NULL(_client, 0);
|
||||
return _client->close();
|
||||
}
|
||||
|
||||
uint8_t Adafruit_CC3000_ClientRef::available(void) {
|
||||
HANDLE_NULL(_client, 0);
|
||||
return _client->available();
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*
|
||||
Adafruit_CC3000_Server implementation
|
||||
*/
|
||||
/**************************************************************************/
|
||||
|
||||
// Construct a TCP server to listen on the specified port.
|
||||
Adafruit_CC3000_Server::Adafruit_CC3000_Server(uint16_t port)
|
||||
: _port(port)
|
||||
, _listenSocket(-1)
|
||||
{ }
|
||||
|
||||
// Return a reference to a client instance which has data available to read.
|
||||
Adafruit_CC3000_ClientRef Adafruit_CC3000_Server::available() {
|
||||
acceptNewConnections();
|
||||
// Find the first client which is ready to read and return it.
|
||||
for (int i = 0; i < MAX_SERVER_CLIENTS; ++i) {
|
||||
if (_clients[i].connected() && _clients[i].available() > 0) {
|
||||
return Adafruit_CC3000_ClientRef(&_clients[i]);
|
||||
}
|
||||
}
|
||||
// Couldn't find a client ready to read, so return a client that is not
|
||||
// connected to signal no clients are available for reading (convention
|
||||
// used by the Ethernet library).
|
||||
return Adafruit_CC3000_ClientRef(NULL);
|
||||
}
|
||||
|
||||
// Initialize the server and start listening for connections.
|
||||
void Adafruit_CC3000_Server::begin() {
|
||||
// Set the CC3000 inactivity timeout to 0 (never timeout). This will ensure
|
||||
// the CC3000 does not close the listening socket when it's idle for more than
|
||||
// 60 seconds (the default timeout). See more information from:
|
||||
// http://e2e.ti.com/support/low_power_rf/f/851/t/292664.aspx
|
||||
unsigned long aucDHCP = 14400;
|
||||
unsigned long aucARP = 3600;
|
||||
unsigned long aucKeepalive = 30;
|
||||
unsigned long aucInactivity = 0;
|
||||
cc3k_int_poll();
|
||||
if (netapp_timeout_values(&aucDHCP, &aucARP, &aucKeepalive, &aucInactivity) != 0) {
|
||||
CC3K_PRINTLN_F("Error setting inactivity timeout!");
|
||||
return;
|
||||
}
|
||||
// Create a TCP socket
|
||||
cc3k_int_poll();
|
||||
int16_t soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||
if (soc < 0) {
|
||||
CC3K_PRINTLN_F("Couldn't create listening socket!");
|
||||
return;
|
||||
}
|
||||
// Set the socket's accept call as non-blocking.
|
||||
cc3k_int_poll();
|
||||
char arg = SOCK_ON; // nsd: looked in TI example code and they pass this as a 'short' in one example, and 'char' in two others. 'char' seems as likely work, and has no endianess issue
|
||||
if (setsockopt(soc, SOL_SOCKET, SOCKOPT_ACCEPT_NONBLOCK, &arg, sizeof(arg)) < 0) {
|
||||
CC3K_PRINTLN_F("Couldn't set socket as non-blocking!");
|
||||
return;
|
||||
}
|
||||
// Bind the socket to a TCP address.
|
||||
sockaddr_in address;
|
||||
address.sin_family = AF_INET;
|
||||
address.sin_addr.s_addr = htonl(0); // Listen on any network interface, equivalent to INADDR_ANY in sockets programming.
|
||||
address.sin_port = htons(_port); // Listen on the specified port.
|
||||
cc3k_int_poll();
|
||||
if (bind(soc, (sockaddr*) &address, sizeof(address)) < 0) {
|
||||
CC3K_PRINTLN_F("Error binding listen socket to address!");
|
||||
return;
|
||||
}
|
||||
// Start listening for connections.
|
||||
// The backlog parameter is 0 as it is not supported on TI's CC3000 firmware.
|
||||
cc3k_int_poll();
|
||||
if (listen(soc, 0) < 0) {
|
||||
CC3K_PRINTLN_F("Error opening socket for listening!");
|
||||
return;
|
||||
}
|
||||
_listenSocket = soc;
|
||||
}
|
||||
|
||||
// Write data to all connected clients. Buffer is a pointer to an array
|
||||
// of bytes, and size specifies how many bytes to write from the buffer.
|
||||
// Return the sum of bytes written to all clients.
|
||||
size_t Adafruit_CC3000_Server::write(const uint8_t *buffer, size_t size) {
|
||||
size_t written = 0;
|
||||
for (int i = 0; i < MAX_SERVER_CLIENTS; ++i) {
|
||||
if (_clients[i].connected()) {
|
||||
written += _clients[i].write(buffer, size);
|
||||
}
|
||||
}
|
||||
return written;
|
||||
}
|
||||
|
||||
// Write a byte value to all connected clients.
|
||||
// Return the sum of bytes written to all clients.
|
||||
size_t Adafruit_CC3000_Server::write(uint8_t value) {
|
||||
return write(&value, 1);
|
||||
}
|
||||
|
||||
// Accept new connections and update the connected clients.
|
||||
void Adafruit_CC3000_Server::acceptNewConnections() {
|
||||
// For any unconnected client, see if new connections are pending and accept
|
||||
// them as a new client.
|
||||
for (int i = 0; i < MAX_SERVER_CLIENTS; ++i) {
|
||||
if (!_clients[i].connected()) {
|
||||
// Note: Because the non-blocking option was set for the listening
|
||||
// socket this call will not block and instead return SOC_IN_PROGRESS (-2)
|
||||
// if there are no pending client connections. Also, the address of the
|
||||
// connected client is not needed, so those parameters are set to NULL.
|
||||
cc3k_int_poll();
|
||||
int soc = accept(_listenSocket, NULL, NULL);
|
||||
if (soc > -1) {
|
||||
_clients[i] = Adafruit_CC3000_Client(soc);
|
||||
}
|
||||
// else either there were no sockets to accept or an error occured.
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,100 +0,0 @@
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@file Adafruit_CC3000_Server.h
|
||||
@author Tony DiCola (tony@tonydicola.com)
|
||||
@license BSD (see license.txt)
|
||||
|
||||
Adafruit CC3000 TCP server implementation based on the same interface as
|
||||
the Arduino Ethernet library server class.
|
||||
|
||||
See http://arduino.cc/en/Reference/Ethernet for documentation on the
|
||||
Arduino Ethernet library and its server interface.
|
||||
|
||||
The only difference between this implementation and the Ethernet library
|
||||
is that a special client reference facade is returned by the available()
|
||||
function, instead of a copy of a client like in the Ethernet library. This
|
||||
is necessary to ensure the buffers that client instances contain aren't
|
||||
copied and get out of sync.
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
|
||||
#ifndef ADAFRUIT_CC3000_SERVER_H
|
||||
#define ADAFRUIT_CC3000_SERVER_H
|
||||
|
||||
#include "Adafruit_CC3000.h"
|
||||
|
||||
#include "Print.h"
|
||||
#include "Server.h"
|
||||
|
||||
// Assume 4 sockets available, 1 of which is used for listening, so at most 3
|
||||
// clients can be connected at once.
|
||||
#define MAX_SERVER_CLIENTS 3
|
||||
|
||||
// Facade that wraps a reference to a client instance into something that looks
|
||||
// and acts like a client instance value. This is done to mimic the semantics
|
||||
// of the Ethernet library, without running into problems allowing client buffers
|
||||
// to be copied and get out of sync.
|
||||
class Adafruit_CC3000_ClientRef : public Print {
|
||||
public:
|
||||
Adafruit_CC3000_ClientRef(Adafruit_CC3000_Client* client);
|
||||
// Return true if the referenced client is connected. This is provided for
|
||||
// compatibility with Ethernet library code.
|
||||
operator bool();
|
||||
// Below are all the public methods of the client class:
|
||||
bool connected(void);
|
||||
size_t write(uint8_t c);
|
||||
|
||||
size_t fastrprint(const char *str);
|
||||
size_t fastrprintln(const char *str);
|
||||
size_t fastrprint(char *str);
|
||||
size_t fastrprintln(char *str);
|
||||
size_t fastrprint(const __FlashStringHelper *ifsh);
|
||||
size_t fastrprintln(const __FlashStringHelper *ifsh);
|
||||
|
||||
int16_t write(const void *buf, uint16_t len, uint32_t flags = 0);
|
||||
int16_t read(void *buf, uint16_t len, uint32_t flags = 0);
|
||||
uint8_t read(void);
|
||||
int32_t close(void);
|
||||
uint8_t available(void);
|
||||
|
||||
private:
|
||||
// Hide the fact that users are really dealing with a pointer to a client
|
||||
// instance. Note: this class does not own the contents of the client
|
||||
// pointer and should NEVER attempt to free/delete this pointer.
|
||||
Adafruit_CC3000_Client* _client;
|
||||
|
||||
};
|
||||
|
||||
|
||||
class Adafruit_CC3000_Server : public Server {
|
||||
public:
|
||||
// Construct a TCP server to listen on the specified port.
|
||||
Adafruit_CC3000_Server(uint16_t port);
|
||||
// Return a reference to a client instance which has data available to read.
|
||||
Adafruit_CC3000_ClientRef available();
|
||||
// Initialize the server and start listening for connections.
|
||||
virtual void begin();
|
||||
// Write data to all connected clients. Buffer is a pointer to an array
|
||||
// of bytes, and size specifies how many bytes to write from the buffer.
|
||||
// Return the sum of bytes written to all clients.
|
||||
virtual size_t write(const uint8_t *buffer, size_t size);
|
||||
// Write a byte value to all connected clients.
|
||||
// Return the sum of bytes written to all clients.
|
||||
virtual size_t write(uint8_t value);
|
||||
// Make the overloads of write from the Print base class available.
|
||||
using Print::write;
|
||||
|
||||
private:
|
||||
// Store the clients in a simple array.
|
||||
Adafruit_CC3000_Client _clients[MAX_SERVER_CLIENTS];
|
||||
// The port this server will listen for connections on.
|
||||
uint16_t _port;
|
||||
// The id of the listening socket.
|
||||
uint16_t _listenSocket;
|
||||
|
||||
// Accept new connections and update the connected clients.
|
||||
void acceptNewConnections();
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,24 +0,0 @@
|
||||
This is a library for the Adafruit CC3000 WiFi Breakouts etc
|
||||
|
||||
Designed specifically to work with the Adafruit CC3000 Breakout
|
||||
----> https://www.adafruit.com/products/1469
|
||||
|
||||
These modules use SPI to communicate, 6 pins are required to interface
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Check out the links above for our tutorials and wiring diagrams
|
||||
|
||||
Arduino library Written by Limor Fried & Kevin Townsend for Adafruit Industries.
|
||||
CC3000 host core written by TI
|
||||
|
||||
To download. click the DOWNLOADS button in the top right corner, rename the uncompressed folder Adafruit_CC3000
|
||||
Check that the Adafruit_CC3000 folder contains Adafruit_CC3000.cpp and Adafruit_CC3000.h
|
||||
|
||||
Place the Adafruit_CC3000 library folder your *arduinosketchfolder*/libraries/ folder.
|
||||
You may need to create the libraries subfolder if its your first library. Restart the IDE.
|
||||
|
||||
NOTE: the 'SendTweet' example currently DOES NOT WORK due to Twitter API changes. The code is being kept for posterity in case a workaround can be developed.
|
||||
|
||||
@@ -1,769 +0,0 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* spi.c - CC3000 Host Driver Implementation.
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* Adapted for use with the Arduino/AVR by KTOWN (Kevin Townsend)
|
||||
* & Limor Fried for Adafruit Industries
|
||||
* This library works with the Adafruit CC3000 breakout
|
||||
* ----> https://www.adafruit.com/products/1469
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <Arduino.h>
|
||||
#include "ccspi.h"
|
||||
#include "utility/hci.h"
|
||||
#include "utility/netapp.h"
|
||||
#include "utility/evnt_handler.h"
|
||||
#include "utility/cc3000_common.h"
|
||||
#include "utility/debug.h"
|
||||
|
||||
extern uint8_t g_csPin, g_irqPin, g_vbatPin, g_IRQnum, g_SPIspeed;
|
||||
|
||||
#define READ (3)
|
||||
#define WRITE (1)
|
||||
#define HI(value) (((value) & 0xFF00) >> 8)
|
||||
#define LO(value) ((value) & 0x00FF)
|
||||
#define HEADERS_SIZE_EVNT (SPI_HEADER_SIZE + 5)
|
||||
#define SPI_HEADER_SIZE (5)
|
||||
|
||||
#define eSPI_STATE_POWERUP (0)
|
||||
#define eSPI_STATE_INITIALIZED (1)
|
||||
#define eSPI_STATE_IDLE (2)
|
||||
#define eSPI_STATE_WRITE_IRQ (3)
|
||||
#define eSPI_STATE_WRITE_FIRST_PORTION (4)
|
||||
#define eSPI_STATE_WRITE_EOT (5)
|
||||
#define eSPI_STATE_READ_IRQ (6)
|
||||
#define eSPI_STATE_READ_FIRST_PORTION (7)
|
||||
#define eSPI_STATE_READ_EOT (8)
|
||||
|
||||
/*
|
||||
these variables store the SPI configuration
|
||||
so they can be modified and restored
|
||||
this is so that we can have multiple SPI devices
|
||||
on the same bus, so they can operate at different speeds
|
||||
and in different modes
|
||||
*/
|
||||
#if defined(SPI2X) && defined(__AVR__) // most likely AVR8
|
||||
uint8_t ccspi_mySPCR, ccspi_mySPSR, ccspi_oldSPSR, ccspi_oldSPCR;
|
||||
#define SpiConfigStoreOld() { \
|
||||
ccspi_oldSPCR = SPCR; \
|
||||
ccspi_oldSPSR = SPSR & _BV(SPI2X); }
|
||||
#define SpiConfigStoreMy() { \
|
||||
ccspi_mySPCR = SPCR; \
|
||||
ccspi_mySPSR = SPSR & _BV(SPI2X); }
|
||||
#define SpiConfigPush() { \
|
||||
ccspi_oldSPCR = SPCR; \
|
||||
ccspi_oldSPSR = SPSR & _BV(SPI2X); \
|
||||
SPCR = ccspi_mySPCR; \
|
||||
if(ccspi_mySPSR) SPSR |= _BV(SPI2X); \
|
||||
else SPSR &= ~_BV(SPI2X); }
|
||||
#define SpiConfigPop() { \
|
||||
SPCR = ccspi_oldSPCR; \
|
||||
if(ccspi_oldSPSR) SPSR |= _BV(SPI2X); \
|
||||
else SPSR &= ~_BV(SPI2X); }
|
||||
|
||||
#elif defined(__AVR_XMEGA__) // most likely XMEGA
|
||||
uint8_t ccspi_mySPICTRL, ccspi_oldSPICTRL;
|
||||
#define SpiConfigStoreOld() do { ccspi_oldSPICTRL = SPCR; } while (0)
|
||||
#define SpiConfigStoreMy() do { ccspi_mySPICTRL = SPCR; } while (0)
|
||||
#define SpiConfigPush() do { ccspi_oldSPICTRL = SPCR; SPCR = ccspi_mySPICTRL; } while (0)
|
||||
#define SpiConfigPop() do { SPCR = ccspi_oldSPICTRL; } while (0)
|
||||
#else
|
||||
// TODO: ARM (Due, Teensy 3.0, etc)
|
||||
// #error platform not yet supported by Adafruit_CC3000
|
||||
#define SpiConfigStoreOld() do { } while (0)
|
||||
#define SpiConfigStoreMy() do { } while (0)
|
||||
#define SpiConfigPush() do { } while (0)
|
||||
#define SpiConfigPop() do { } while (0)
|
||||
#endif
|
||||
|
||||
#ifdef SPI_HAS_TRANSACTION
|
||||
// CC3000 SPI config + begin SPI usage + chip select
|
||||
#define CC3000_ASSERT_CS { \
|
||||
SpiConfigPush(); \
|
||||
SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE1)); \
|
||||
digitalWrite(g_csPin, LOW); }
|
||||
// CC3000 chip deselect + end SPI usage + SPI restore
|
||||
#define CC3000_DEASSERT_CS { \
|
||||
digitalWrite(g_csPin, HIGH); \
|
||||
SPI.endTransaction(); \
|
||||
SpiConfigPop(); }
|
||||
#else
|
||||
// CC3000 chip select + SPI config
|
||||
#define CC3000_ASSERT_CS { \
|
||||
digitalWrite(g_csPin, LOW); \
|
||||
SpiConfigPush(); }
|
||||
// CC3000 chip deselect + SPI restore
|
||||
#define CC3000_DEASSERT_CS { \
|
||||
digitalWrite(g_csPin, HIGH); \
|
||||
SpiConfigPop(); }
|
||||
#endif
|
||||
|
||||
|
||||
/* smartconfig flags (defined in Adafruit_CC3000.cpp) */
|
||||
// extern unsigned long ulSmartConfigFinished, ulCC3000DHCP;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
gcSpiHandleRx SPIRxHandler;
|
||||
|
||||
unsigned short usTxPacketLength;
|
||||
unsigned short usRxPacketLength;
|
||||
unsigned long ulSpiState;
|
||||
unsigned char *pTxPacket;
|
||||
unsigned char *pRxPacket;
|
||||
|
||||
} tSpiInformation;
|
||||
|
||||
tSpiInformation sSpiInformation;
|
||||
|
||||
/* Static buffer for 5 bytes of SPI HEADER */
|
||||
unsigned char tSpiReadHeader[] = {READ, 0, 0, 0, 0};
|
||||
|
||||
void SpiWriteDataSynchronous(unsigned char *data, unsigned short size);
|
||||
void SpiWriteAsync(const unsigned char *data, unsigned short size);
|
||||
void SpiPauseSpi(void);
|
||||
void SpiResumeSpi(void);
|
||||
void SSIContReadOperation(void);
|
||||
void cc3k_int_poll(void);
|
||||
|
||||
// The magic number that resides at the end of the TX/RX buffer (1 byte after the allocated size)
|
||||
// for the purpose of detection of the overrun. The location of the memory where the magic number
|
||||
// resides shall never be written. In case it is written - the overrun occured and either recevie function
|
||||
// or send function will stuck forever.
|
||||
#define CC3000_BUFFER_MAGIC_NUMBER (0xDE)
|
||||
|
||||
char spi_buffer[CC3000_RX_BUFFER_SIZE];
|
||||
unsigned char wlan_tx_buffer[CC3000_TX_BUFFER_SIZE];
|
||||
|
||||
static volatile char ccspi_is_in_irq = 0;
|
||||
static volatile char ccspi_int_enabled = 0;
|
||||
|
||||
/* Mandatory functions are:
|
||||
- SpiOpen
|
||||
- SpiWrite
|
||||
- SpiRead
|
||||
- SpiClose
|
||||
- SpiResumeSpi
|
||||
- ReadWlanInterruptPin
|
||||
- WlanInterruptEnable
|
||||
- WlanInterruptDisable
|
||||
- WriteWlanPin
|
||||
*/
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void SpiClose(void)
|
||||
{
|
||||
DEBUGPRINT_F("\tCC3000: SpiClose");
|
||||
|
||||
if (sSpiInformation.pRxPacket)
|
||||
{
|
||||
sSpiInformation.pRxPacket = 0;
|
||||
}
|
||||
|
||||
/* Disable Interrupt in GPIOA module... */
|
||||
tSLInformation.WlanInterruptDisable();
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void SpiOpen(gcSpiHandleRx pfRxHandler)
|
||||
{
|
||||
DEBUGPRINT_F("\tCC3000: SpiOpen");
|
||||
|
||||
sSpiInformation.ulSpiState = eSPI_STATE_POWERUP;
|
||||
|
||||
memset(spi_buffer, 0, sizeof(spi_buffer));
|
||||
memset(wlan_tx_buffer, 0, sizeof(spi_buffer));
|
||||
|
||||
sSpiInformation.SPIRxHandler = pfRxHandler;
|
||||
sSpiInformation.usTxPacketLength = 0;
|
||||
sSpiInformation.pTxPacket = NULL;
|
||||
sSpiInformation.pRxPacket = (unsigned char *)spi_buffer;
|
||||
sSpiInformation.usRxPacketLength = 0;
|
||||
|
||||
spi_buffer[CC3000_RX_BUFFER_SIZE - 1] = CC3000_BUFFER_MAGIC_NUMBER;
|
||||
wlan_tx_buffer[CC3000_TX_BUFFER_SIZE - 1] = CC3000_BUFFER_MAGIC_NUMBER;
|
||||
|
||||
/* Enable interrupt on the GPIO pin of WLAN IRQ */
|
||||
tSLInformation.WlanInterruptEnable();
|
||||
|
||||
DEBUGPRINT_F("\tCC3000: Finished SpiOpen\n\r");
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
int init_spi(void)
|
||||
{
|
||||
|
||||
DEBUGPRINT_F("\tCC3000: init_spi\n\r");
|
||||
|
||||
/* Set POWER_EN pin to output and disable the CC3000 by default */
|
||||
pinMode(g_vbatPin, OUTPUT);
|
||||
digitalWrite(g_vbatPin, 0);
|
||||
delay(500);
|
||||
|
||||
/* Set CS pin to output (don't de-assert yet) */
|
||||
pinMode(g_csPin, OUTPUT);
|
||||
|
||||
/* Set interrupt/gpio pin to input */
|
||||
#if defined(INPUT_PULLUP)
|
||||
pinMode(g_irqPin, INPUT_PULLUP);
|
||||
#else
|
||||
pinMode(g_irqPin, INPUT);
|
||||
digitalWrite(g_irqPin, HIGH); // w/weak pullup
|
||||
#endif
|
||||
|
||||
SpiConfigStoreOld(); // prime ccspi_old* values for DEASSERT
|
||||
|
||||
/* Initialise SPI (Mode 1) */
|
||||
SPI.begin();
|
||||
SPI.setDataMode(SPI_MODE1);
|
||||
SPI.setBitOrder(MSBFIRST);
|
||||
SPI.setClockDivider(g_SPIspeed);
|
||||
|
||||
SpiConfigStoreMy(); // prime ccspi_my* values for ASSERT
|
||||
|
||||
// Newly-initialized SPI is in the same state that ASSERT_CS will set it
|
||||
// to. Invoke DEASSERT (which also restores SPI registers) so the next
|
||||
// ASSERT call won't clobber the ccspi_old* values -- we need those!
|
||||
#ifdef SPI_HAS_TRANSACTION
|
||||
SPI.usingInterrupt(g_IRQnum);
|
||||
digitalWrite(g_csPin, HIGH); // same as CC3000_DEASSERT_CS, but not
|
||||
SpiConfigPop(); // SPI.endTransaction, because none began
|
||||
#else
|
||||
CC3000_DEASSERT_CS;
|
||||
#endif
|
||||
|
||||
/* ToDo: Configure IRQ interrupt! */
|
||||
|
||||
DEBUGPRINT_F("\tCC3000: Finished init_spi\n\r");
|
||||
|
||||
return(ESUCCESS);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
long SpiFirstWrite(unsigned char *ucBuf, unsigned short usLength)
|
||||
{
|
||||
DEBUGPRINT_F("\tCC3000: SpiWriteFirst\n\r");
|
||||
|
||||
/* Workaround for the first transaction */
|
||||
CC3000_ASSERT_CS;
|
||||
|
||||
/* delay (stay low) for ~50us */
|
||||
delay(1);
|
||||
|
||||
/* SPI writes first 4 bytes of data */
|
||||
SpiWriteDataSynchronous(ucBuf, 4);
|
||||
|
||||
delay(1);
|
||||
|
||||
SpiWriteDataSynchronous(ucBuf + 4, usLength - 4);
|
||||
|
||||
/* From this point on - operate in a regular manner */
|
||||
sSpiInformation.ulSpiState = eSPI_STATE_IDLE;
|
||||
|
||||
CC3000_DEASSERT_CS;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
long SpiWrite(unsigned char *pUserBuffer, unsigned short usLength)
|
||||
{
|
||||
unsigned char ucPad = 0;
|
||||
|
||||
DEBUGPRINT_F("\tCC3000: SpiWrite\n\r");
|
||||
|
||||
/* Figure out the total length of the packet in order to figure out if there is padding or not */
|
||||
if(!(usLength & 0x0001))
|
||||
{
|
||||
ucPad++;
|
||||
}
|
||||
|
||||
pUserBuffer[0] = WRITE;
|
||||
pUserBuffer[1] = HI(usLength + ucPad);
|
||||
pUserBuffer[2] = LO(usLength + ucPad);
|
||||
pUserBuffer[3] = 0;
|
||||
pUserBuffer[4] = 0;
|
||||
|
||||
usLength += (SPI_HEADER_SIZE + ucPad);
|
||||
|
||||
/* The magic number that resides at the end of the TX/RX buffer (1 byte after the allocated size)
|
||||
* for the purpose of overrun detection. If the magic number is overwritten - buffer overrun
|
||||
* occurred - and we will be stuck here forever! */
|
||||
if (wlan_tx_buffer[CC3000_TX_BUFFER_SIZE - 1] != CC3000_BUFFER_MAGIC_NUMBER)
|
||||
{
|
||||
DEBUGPRINT_F("\tCC3000: Error - No magic number found in SpiWrite\n\r");
|
||||
while (1);
|
||||
}
|
||||
|
||||
if (sSpiInformation.ulSpiState == eSPI_STATE_POWERUP)
|
||||
{
|
||||
while (sSpiInformation.ulSpiState != eSPI_STATE_INITIALIZED);
|
||||
}
|
||||
|
||||
if (sSpiInformation.ulSpiState == eSPI_STATE_INITIALIZED)
|
||||
{
|
||||
/* This is time for first TX/RX transactions over SPI: the IRQ is down - so need to send read buffer size command */
|
||||
SpiFirstWrite(pUserBuffer, usLength);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* We need to prevent here race that can occur in case two back to back packets are sent to the
|
||||
* device, so the state will move to IDLE and once again to not IDLE due to IRQ */
|
||||
tSLInformation.WlanInterruptDisable();
|
||||
|
||||
while (sSpiInformation.ulSpiState != eSPI_STATE_IDLE);
|
||||
|
||||
sSpiInformation.ulSpiState = eSPI_STATE_WRITE_IRQ;
|
||||
sSpiInformation.pTxPacket = pUserBuffer;
|
||||
sSpiInformation.usTxPacketLength = usLength;
|
||||
|
||||
/* Assert the CS line and wait till SSI IRQ line is active and then initialize write operation */
|
||||
CC3000_ASSERT_CS;
|
||||
|
||||
/* Re-enable IRQ - if it was not disabled - this is not a problem... */
|
||||
tSLInformation.WlanInterruptEnable();
|
||||
|
||||
/* Check for a missing interrupt between the CS assertion and enabling back the interrupts */
|
||||
if (tSLInformation.ReadWlanInterruptPin() == 0)
|
||||
{
|
||||
SpiWriteDataSynchronous(sSpiInformation.pTxPacket, sSpiInformation.usTxPacketLength);
|
||||
|
||||
sSpiInformation.ulSpiState = eSPI_STATE_IDLE;
|
||||
|
||||
CC3000_DEASSERT_CS;
|
||||
#ifdef SPI_HAS_TRANSACTION
|
||||
WlanInterruptEnable();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/* Due to the fact that we are currently implementing a blocking situation
|
||||
* here we will wait till end of transaction */
|
||||
while (eSPI_STATE_IDLE != sSpiInformation.ulSpiState);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void SpiWriteDataSynchronous(unsigned char *data, unsigned short size)
|
||||
{
|
||||
DEBUGPRINT_F("\tCC3000: SpiWriteDataSynchronous Start\n\r");
|
||||
|
||||
unsigned short loc;
|
||||
for (loc = 0; loc < size; loc ++)
|
||||
{
|
||||
SPI.transfer(data[loc]);
|
||||
#if (DEBUG_MODE == 1)
|
||||
if (!(loc==size-1))
|
||||
{
|
||||
DEBUGPRINT_F(" ");
|
||||
DEBUGPRINT_HEX(data[loc]);
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUGPRINT_F(" ");
|
||||
DEBUGPRINT_HEX(data[loc]);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
DEBUGPRINT_F("\n\r\tCC3000: SpiWriteDataSynchronous End\n\r");
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void SpiReadDataSynchronous(unsigned char *data, unsigned short size)
|
||||
{
|
||||
unsigned short i = 0;
|
||||
|
||||
DEBUGPRINT_F("\tCC3000: SpiReadDataSynchronous\n\r");
|
||||
SPI.setDataMode(SPI_MODE1);
|
||||
for (i = 0; i < size; i ++)
|
||||
{
|
||||
data[i] = SPI.transfer(0x03);
|
||||
DEBUGPRINT_F(" ");
|
||||
DEBUGPRINT_HEX(data[i]);
|
||||
}
|
||||
DEBUGPRINT_F("\n\r");
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void SpiReadHeader(void)
|
||||
{
|
||||
DEBUGPRINT_F("\tCC3000: SpiReadHeader\n\r");
|
||||
|
||||
SpiReadDataSynchronous(sSpiInformation.pRxPacket, HEADERS_SIZE_EVNT);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
long SpiReadDataCont(void)
|
||||
{
|
||||
long data_to_recv;
|
||||
unsigned char *evnt_buff, type;
|
||||
|
||||
DEBUGPRINT_F("\tCC3000: SpiReadDataCont\n\r");
|
||||
|
||||
/* Determine what type of packet we have */
|
||||
evnt_buff = sSpiInformation.pRxPacket;
|
||||
data_to_recv = 0;
|
||||
STREAM_TO_UINT8((uint8_t *)(evnt_buff + SPI_HEADER_SIZE), HCI_PACKET_TYPE_OFFSET, type);
|
||||
|
||||
switch(type)
|
||||
{
|
||||
case HCI_TYPE_DATA:
|
||||
{
|
||||
/* We need to read the rest of data.. */
|
||||
STREAM_TO_UINT16((char *)(evnt_buff + SPI_HEADER_SIZE), HCI_DATA_LENGTH_OFFSET, data_to_recv);
|
||||
if (!((HEADERS_SIZE_EVNT + data_to_recv) & 1))
|
||||
{
|
||||
data_to_recv++;
|
||||
}
|
||||
|
||||
if (data_to_recv)
|
||||
{
|
||||
SpiReadDataSynchronous(evnt_buff + HEADERS_SIZE_EVNT, data_to_recv);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HCI_TYPE_EVNT:
|
||||
{
|
||||
/* Calculate the rest length of the data */
|
||||
STREAM_TO_UINT8((char *)(evnt_buff + SPI_HEADER_SIZE), HCI_EVENT_LENGTH_OFFSET, data_to_recv);
|
||||
data_to_recv -= 1;
|
||||
|
||||
/* Add padding byte if needed */
|
||||
if ((HEADERS_SIZE_EVNT + data_to_recv) & 1)
|
||||
{
|
||||
data_to_recv++;
|
||||
}
|
||||
|
||||
if (data_to_recv)
|
||||
{
|
||||
SpiReadDataSynchronous(evnt_buff + HEADERS_SIZE_EVNT, data_to_recv);
|
||||
}
|
||||
|
||||
sSpiInformation.ulSpiState = eSPI_STATE_READ_EOT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void SpiPauseSpi(void)
|
||||
{
|
||||
DEBUGPRINT_F("\tCC3000: SpiPauseSpi\n\r");
|
||||
|
||||
ccspi_int_enabled = 0;
|
||||
detachInterrupt(g_IRQnum);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void SpiResumeSpi(void)
|
||||
{
|
||||
DEBUGPRINT_F("\tCC3000: SpiResumeSpi\n\r");
|
||||
|
||||
ccspi_int_enabled = 1;
|
||||
attachInterrupt(g_IRQnum, SPI_IRQ, FALLING);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void SpiTriggerRxProcessing(void)
|
||||
{
|
||||
DEBUGPRINT_F("\tCC3000: SpiTriggerRxProcessing\n\r");
|
||||
|
||||
/* Trigger Rx processing */
|
||||
SpiPauseSpi();
|
||||
CC3000_DEASSERT_CS;
|
||||
|
||||
//DEBUGPRINT_F("Magic?\n\r");
|
||||
/* The magic number that resides at the end of the TX/RX buffer (1 byte after the allocated size)
|
||||
* for the purpose of detection of the overrun. If the magic number is overriten - buffer overrun
|
||||
* occurred - and we will stuck here forever! */
|
||||
if (sSpiInformation.pRxPacket[CC3000_RX_BUFFER_SIZE - 1] != CC3000_BUFFER_MAGIC_NUMBER)
|
||||
{
|
||||
/* You've got problems if you're here! */
|
||||
DEBUGPRINT_F("\tCC3000: ERROR - magic number missing!\n\r");
|
||||
while (1);
|
||||
}
|
||||
|
||||
//DEBUGPRINT_F("OK!\n\r");
|
||||
sSpiInformation.ulSpiState = eSPI_STATE_IDLE;
|
||||
sSpiInformation.SPIRxHandler(sSpiInformation.pRxPacket + SPI_HEADER_SIZE);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void SSIContReadOperation(void)
|
||||
{
|
||||
DEBUGPRINT_F("\tCC3000: SpiContReadOperation\n\r");
|
||||
|
||||
/* The header was read - continue with the payload read */
|
||||
if (!SpiReadDataCont())
|
||||
{
|
||||
/* All the data was read - finalize handling by switching to teh task
|
||||
* and calling from task Event Handler */
|
||||
//DEBUGPRINT_F("SPItrig\n\r");
|
||||
SpiTriggerRxProcessing();
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void WriteWlanPin( unsigned char val )
|
||||
{
|
||||
if (DEBUG_MODE)
|
||||
{
|
||||
DEBUGPRINT_F("\tCC3000: WriteWlanPin - ");
|
||||
DEBUGPRINT_DEC(val);
|
||||
DEBUGPRINT_F("\n\r");
|
||||
delay(1);
|
||||
}
|
||||
if (val)
|
||||
{
|
||||
digitalWrite(g_vbatPin, HIGH);
|
||||
}
|
||||
else
|
||||
{
|
||||
digitalWrite(g_vbatPin, LOW);
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
long ReadWlanInterruptPin(void)
|
||||
{
|
||||
DEBUGPRINT_F("\tCC3000: ReadWlanInterruptPin - ");
|
||||
DEBUGPRINT_DEC(digitalRead(g_irqPin));
|
||||
DEBUGPRINT_F("\n\r");
|
||||
|
||||
return(digitalRead(g_irqPin));
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void WlanInterruptEnable()
|
||||
{
|
||||
DEBUGPRINT_F("\tCC3000: WlanInterruptEnable.\n\r");
|
||||
// delay(100);
|
||||
ccspi_int_enabled = 1;
|
||||
attachInterrupt(g_IRQnum, SPI_IRQ, FALLING);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void WlanInterruptDisable()
|
||||
{
|
||||
DEBUGPRINT_F("\tCC3000: WlanInterruptDisable\n\r");
|
||||
ccspi_int_enabled = 0;
|
||||
detachInterrupt(g_IRQnum);
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! sendDriverPatch
|
||||
//!
|
||||
//! @param pointer to the length
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief The function returns a pointer to the driver patch:
|
||||
//! since there is no patch in the host - it returns 0
|
||||
//
|
||||
//*****************************************************************************
|
||||
char *sendDriverPatch(unsigned long *Length) {
|
||||
*Length = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! sendBootLoaderPatch
|
||||
//!
|
||||
//! @param pointer to the length
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief The function returns a pointer to the boot loader patch:
|
||||
//! since there is no patch in the host - it returns 0
|
||||
//
|
||||
//*****************************************************************************
|
||||
char *sendBootLoaderPatch(unsigned long *Length) {
|
||||
*Length = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! sendWLFWPatch
|
||||
//!
|
||||
//! @param pointer to the length
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief The function returns a pointer to the FW patch:
|
||||
//! since there is no patch in the host - it returns 0
|
||||
//
|
||||
//*****************************************************************************
|
||||
char *sendWLFWPatch(unsigned long *Length) {
|
||||
*Length = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
*/
|
||||
/**************************************************************************/
|
||||
|
||||
void SPI_IRQ(void)
|
||||
{
|
||||
ccspi_is_in_irq = 1;
|
||||
|
||||
DEBUGPRINT_F("\tCC3000: Entering SPI_IRQ\n\r");
|
||||
|
||||
if (sSpiInformation.ulSpiState == eSPI_STATE_POWERUP)
|
||||
{
|
||||
/* IRQ line was low ... perform a callback on the HCI Layer */
|
||||
sSpiInformation.ulSpiState = eSPI_STATE_INITIALIZED;
|
||||
}
|
||||
else if (sSpiInformation.ulSpiState == eSPI_STATE_IDLE)
|
||||
{
|
||||
//DEBUGPRINT_F("IDLE\n\r");
|
||||
sSpiInformation.ulSpiState = eSPI_STATE_READ_IRQ;
|
||||
/* IRQ line goes down - start reception */
|
||||
|
||||
CC3000_ASSERT_CS;
|
||||
|
||||
// Wait for TX/RX Compete which will come as DMA interrupt
|
||||
SpiReadHeader();
|
||||
sSpiInformation.ulSpiState = eSPI_STATE_READ_EOT;
|
||||
//DEBUGPRINT_F("SSICont\n\r");
|
||||
SSIContReadOperation();
|
||||
}
|
||||
else if (sSpiInformation.ulSpiState == eSPI_STATE_WRITE_IRQ)
|
||||
{
|
||||
SpiWriteDataSynchronous(sSpiInformation.pTxPacket, sSpiInformation.usTxPacketLength);
|
||||
sSpiInformation.ulSpiState = eSPI_STATE_IDLE;
|
||||
CC3000_DEASSERT_CS;
|
||||
}
|
||||
|
||||
DEBUGPRINT_F("\tCC3000: Leaving SPI_IRQ\n\r");
|
||||
|
||||
ccspi_is_in_irq = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! cc3k_int_poll
|
||||
//!
|
||||
//! \brief checks if the interrupt pin is low
|
||||
//! just in case the hardware missed a falling edge
|
||||
//! function is in ccspi.cpp
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
void cc3k_int_poll()
|
||||
{
|
||||
if (digitalRead(g_irqPin) == LOW && ccspi_is_in_irq == 0 && ccspi_int_enabled != 0) {
|
||||
SPI_IRQ();
|
||||
}
|
||||
}
|
||||
@@ -1,90 +0,0 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* spi.h - CC3000 Host Driver Implementation.
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* Adapted for use with the Arduino/AVR by KTOWN (Kevin Townsend)
|
||||
* & Limor Fried for Adafruit Industries
|
||||
* This library works with the Adafruit CC3000 breakout
|
||||
* ----> https://www.adafruit.com/products/1469
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
#ifndef __SPI_H__
|
||||
#define __SPI_H__
|
||||
|
||||
#if ARDUINO >= 100
|
||||
#include "Arduino.h"
|
||||
#else
|
||||
#include "WProgram.h"
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <SPI.h>
|
||||
|
||||
#include "utility/wlan.h"
|
||||
|
||||
typedef void (*gcSpiHandleRx)(void *p);
|
||||
typedef void (*gcSpiHandleTx)(void);
|
||||
|
||||
extern unsigned char wlan_tx_buffer[];
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Prototypes for the APIs.
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern void SpiOpen(gcSpiHandleRx pfRxHandler);
|
||||
extern void SpiClose(void);
|
||||
extern long SpiWrite(unsigned char *pUserBuffer, unsigned short usLength);
|
||||
extern void SpiResumeSpi(void);
|
||||
extern void SpiCleanGPIOISR(void);
|
||||
extern int init_spi(void);
|
||||
extern long TXBufferIsEmpty(void);
|
||||
extern long RXBufferIsEmpty(void);
|
||||
extern void CC3000_UsynchCallback(long lEventType, char * data, unsigned char length);
|
||||
extern void WriteWlanPin( unsigned char val );
|
||||
extern long ReadWlanInterruptPin(void);
|
||||
extern void WlanInterruptEnable();
|
||||
extern void WlanInterruptDisable();
|
||||
extern char *sendDriverPatch(unsigned long *Length);
|
||||
extern char *sendBootLoaderPatch(unsigned long *Length);
|
||||
extern char *sendWLFWPatch(unsigned long *Length);
|
||||
extern void SPI_IRQ(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,179 +0,0 @@
|
||||
|
||||
/***************************************************
|
||||
Adafruit CC3000 Breakout/Shield TCP Chat Server
|
||||
|
||||
This is a simple chat server which allows clients to connect
|
||||
with telnet and exchange messages. Anything sent by one
|
||||
client will be written out to all connected clients.
|
||||
|
||||
See the CC3000 tutorial on Adafruit's learning system
|
||||
for more information on setting up and using the
|
||||
CC3000:
|
||||
http://learn.adafruit.com/adafruit-cc3000-wifi
|
||||
|
||||
Requirements:
|
||||
|
||||
This sketch requires the Adafruit CC3000 library. You can
|
||||
download the library from:
|
||||
https://github.com/adafruit/Adafruit_CC3000_Library
|
||||
|
||||
For information on installing libraries in the Arduino IDE
|
||||
see this page:
|
||||
http://arduino.cc/en/Guide/Libraries
|
||||
|
||||
Usage:
|
||||
|
||||
Update the SSID and, if necessary, the CC3000 hardware pin
|
||||
information below, then run the sketch and check the
|
||||
output of the serial port. After connecting to the
|
||||
wireless network successfully the sketch will output
|
||||
the IP address of the server and start listening for
|
||||
connections. Once listening for connections, connect
|
||||
to the server from your computer using a telnet client
|
||||
on port 23.
|
||||
|
||||
For example on Linux or Mac OSX, if your CC3000 has an
|
||||
IP address 192.168.1.100 you would execute in a command
|
||||
window:
|
||||
|
||||
telnet 192.168.1.100 23
|
||||
|
||||
Connect multiple clients and notice that whatever one client
|
||||
sends will be echoed to all other clients. Press ctrl-] and
|
||||
type quit at the prompt to close the telnet session.
|
||||
|
||||
On Windows you'll need to download a telnet client. PuTTY
|
||||
is a good, free GUI client:
|
||||
http://www.chiark.greenend.org.uk/~sgtatham/putty/
|
||||
|
||||
License:
|
||||
|
||||
This example is copyright (c) 2013 Tony DiCola (tony@tonydicola.com)
|
||||
and is released under an open source MIT license. See details at:
|
||||
http://opensource.org/licenses/MIT
|
||||
|
||||
This code was adapted from Adafruit CC3000 library example
|
||||
code which has the following license:
|
||||
|
||||
Designed specifically to work with the Adafruit WiFi products:
|
||||
----> https://www.adafruit.com/products/1469
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried & Kevin Townsend for Adafruit Industries.
|
||||
BSD license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
#include <Adafruit_CC3000.h>
|
||||
#include <SPI.h>
|
||||
#include "utility/debug.h"
|
||||
#include "utility/socket.h"
|
||||
|
||||
// These are the interrupt and control pins
|
||||
#define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin!
|
||||
// These can be any two pins
|
||||
#define ADAFRUIT_CC3000_VBAT 5
|
||||
#define ADAFRUIT_CC3000_CS 10
|
||||
// Use hardware SPI for the remaining pins
|
||||
// On an UNO, SCK = 13, MISO = 12, and MOSI = 11
|
||||
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,
|
||||
SPI_CLOCK_DIVIDER); // you can change this clock speed
|
||||
|
||||
#define WLAN_SSID "myNetwork" // cannot be longer than 32 characters!
|
||||
#define WLAN_PASS "myPassword"
|
||||
// Security can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2
|
||||
#define WLAN_SECURITY WLAN_SEC_WPA2
|
||||
|
||||
#define LISTEN_PORT 23 // What TCP port to listen on for connections.
|
||||
|
||||
Adafruit_CC3000_Server chatServer(LISTEN_PORT);
|
||||
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("Hello, CC3000!\n"));
|
||||
|
||||
Serial.print("Free RAM: "); Serial.println(getFreeRam(), DEC);
|
||||
|
||||
/* Initialise the module */
|
||||
Serial.println(F("\nInitializing..."));
|
||||
if (!cc3000.begin())
|
||||
{
|
||||
Serial.println(F("Couldn't begin()! Check your wiring?"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
Serial.print(F("\nAttempting to connect to ")); Serial.println(WLAN_SSID);
|
||||
if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
|
||||
Serial.println(F("Failed!"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
Serial.println(F("Connected!"));
|
||||
|
||||
Serial.println(F("Request DHCP"));
|
||||
while (!cc3000.checkDHCP())
|
||||
{
|
||||
delay(100); // ToDo: Insert a DHCP timeout!
|
||||
}
|
||||
|
||||
/* Display the IP address DNS, Gateway, etc. */
|
||||
while (! displayConnectionDetails()) {
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
/*********************************************************/
|
||||
/* You can safely remove this to save some flash memory! */
|
||||
/*********************************************************/
|
||||
Serial.println(F("\r\nNOTE: This sketch may cause problems with other sketches"));
|
||||
Serial.println(F("since the .disconnect() function is never called, so the"));
|
||||
Serial.println(F("AP may refuse connection requests from the CC3000 until a"));
|
||||
Serial.println(F("timeout period passes. This is normal behaviour since"));
|
||||
Serial.println(F("there isn't an obvious moment to disconnect with a server.\r\n"));
|
||||
|
||||
// Start listening for connections
|
||||
chatServer.begin();
|
||||
|
||||
Serial.println(F("Listening for connections..."));
|
||||
}
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
// Try to get a client which is connected.
|
||||
Adafruit_CC3000_ClientRef client = chatServer.available();
|
||||
if (client) {
|
||||
// Check if there is data available to read.
|
||||
if (client.available() > 0) {
|
||||
// Read a byte and write it to all clients.
|
||||
uint8_t ch = client.read();
|
||||
chatServer.write(ch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the IP address and other connection details
|
||||
*/
|
||||
/**************************************************************************/
|
||||
bool displayConnectionDetails(void)
|
||||
{
|
||||
uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;
|
||||
|
||||
if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve the IP Address!\r\n"));
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
|
||||
Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask);
|
||||
Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway);
|
||||
Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
|
||||
Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
|
||||
Serial.println();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,185 +0,0 @@
|
||||
|
||||
/***************************************************
|
||||
Adafruit CC3000 Breakout/Shield TCP Echo Server
|
||||
|
||||
This is a simple implementation of the echo
|
||||
protocol, RFC 862 http://tools.ietf.org/html/rfc862 ,
|
||||
for the Arduino platform and Adafruit CC3000 breakout
|
||||
or shield. This sketch will create a TCP server that
|
||||
listens by default on port 7 and echos back any data
|
||||
received. Up to 3 clients can be connected concurrently
|
||||
to the server. This sketch is meant as an example of how
|
||||
to write a simple server with the Arduino and CC3000.
|
||||
|
||||
See the CC3000 tutorial on Adafruit's learning system
|
||||
for more information on setting up and using the
|
||||
CC3000:
|
||||
http://learn.adafruit.com/adafruit-cc3000-wifi
|
||||
|
||||
Requirements:
|
||||
|
||||
This sketch requires the Adafruit CC3000 library. You can
|
||||
download the library from:
|
||||
https://github.com/adafruit/Adafruit_CC3000_Library
|
||||
|
||||
For information on installing libraries in the Arduino IDE
|
||||
see this page:
|
||||
http://arduino.cc/en/Guide/Libraries
|
||||
|
||||
Usage:
|
||||
|
||||
Update the SSID and, if necessary, the CC3000 hardware pin
|
||||
information below, then run the sketch and check the
|
||||
output of the serial port. After connecting to the
|
||||
wireless network successfully the sketch will output
|
||||
the IP address of the server and start listening for
|
||||
connections. Once listening for connections, connect
|
||||
to the server from your computer using a telnet client
|
||||
on port 7.
|
||||
|
||||
For example on Linux or Mac OSX, if your CC3000 has an
|
||||
IP address 192.168.1.100 you would execute in a command
|
||||
window:
|
||||
|
||||
telnet 192.168.1.100 7
|
||||
|
||||
After connecting, notice that as you type input and
|
||||
press enter to send it the CC3000 will echo back exactly
|
||||
what you typed. Press ctrl-] and type quit at the prompt
|
||||
to close the telnet session.
|
||||
|
||||
On Windows you'll need to download a telnet client. PuTTY
|
||||
is a good, free GUI client:
|
||||
http://www.chiark.greenend.org.uk/~sgtatham/putty/
|
||||
|
||||
License:
|
||||
|
||||
This example is copyright (c) 2013 Tony DiCola (tony@tonydicola.com)
|
||||
and is released under an open source MIT license. See details at:
|
||||
http://opensource.org/licenses/MIT
|
||||
|
||||
This code was adapted from Adafruit CC3000 library example
|
||||
code which has the following license:
|
||||
|
||||
Designed specifically to work with the Adafruit WiFi products:
|
||||
----> https://www.adafruit.com/products/1469
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried & Kevin Townsend for Adafruit Industries.
|
||||
BSD license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
#include <Adafruit_CC3000.h>
|
||||
#include <SPI.h>
|
||||
#include "utility/debug.h"
|
||||
#include "utility/socket.h"
|
||||
|
||||
// These are the interrupt and control pins
|
||||
#define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin!
|
||||
// These can be any two pins
|
||||
#define ADAFRUIT_CC3000_VBAT 5
|
||||
#define ADAFRUIT_CC3000_CS 10
|
||||
// Use hardware SPI for the remaining pins
|
||||
// On an UNO, SCK = 13, MISO = 12, and MOSI = 11
|
||||
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,
|
||||
SPI_CLOCK_DIVIDER); // you can change this clock speed
|
||||
|
||||
#define WLAN_SSID "myNetwork" // cannot be longer than 32 characters!
|
||||
#define WLAN_PASS "myPassword"
|
||||
// Security can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2
|
||||
#define WLAN_SECURITY WLAN_SEC_WPA2
|
||||
|
||||
#define LISTEN_PORT 7 // What TCP port to listen on for connections. The echo protocol uses port 7.
|
||||
|
||||
Adafruit_CC3000_Server echoServer(LISTEN_PORT);
|
||||
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("Hello, CC3000!\n"));
|
||||
|
||||
Serial.print("Free RAM: "); Serial.println(getFreeRam(), DEC);
|
||||
|
||||
/* Initialise the module */
|
||||
Serial.println(F("\nInitializing..."));
|
||||
if (!cc3000.begin())
|
||||
{
|
||||
Serial.println(F("Couldn't begin()! Check your wiring?"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
Serial.print(F("\nAttempting to connect to ")); Serial.println(WLAN_SSID);
|
||||
if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
|
||||
Serial.println(F("Failed!"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
Serial.println(F("Connected!"));
|
||||
|
||||
Serial.println(F("Request DHCP"));
|
||||
while (!cc3000.checkDHCP())
|
||||
{
|
||||
delay(100); // ToDo: Insert a DHCP timeout!
|
||||
}
|
||||
|
||||
/* Display the IP address DNS, Gateway, etc. */
|
||||
while (! displayConnectionDetails()) {
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
/*********************************************************/
|
||||
/* You can safely remove this to save some flash memory! */
|
||||
/*********************************************************/
|
||||
Serial.println(F("\r\nNOTE: This sketch may cause problems with other sketches"));
|
||||
Serial.println(F("since the .disconnect() function is never called, so the"));
|
||||
Serial.println(F("AP may refuse connection requests from the CC3000 until a"));
|
||||
Serial.println(F("timeout period passes. This is normal behaviour since"));
|
||||
Serial.println(F("there isn't an obvious moment to disconnect with a server.\r\n"));
|
||||
|
||||
// Start listening for connections
|
||||
echoServer.begin();
|
||||
|
||||
Serial.println(F("Listening for connections..."));
|
||||
}
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
// Try to get a client which is connected.
|
||||
Adafruit_CC3000_ClientRef client = echoServer.available();
|
||||
if (client) {
|
||||
// Check if there is data available to read.
|
||||
if (client.available() > 0) {
|
||||
// Read a byte and write it to all clients.
|
||||
uint8_t ch = client.read();
|
||||
client.write(ch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the IP address and other connection details
|
||||
*/
|
||||
/**************************************************************************/
|
||||
bool displayConnectionDetails(void)
|
||||
{
|
||||
uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;
|
||||
|
||||
if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve the IP Address!\r\n"));
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
|
||||
Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask);
|
||||
Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway);
|
||||
Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
|
||||
Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
|
||||
Serial.println();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,296 +0,0 @@
|
||||
/***************************************************
|
||||
This is an example for the Adafruit CC3000 Wifi Breakout & Shield
|
||||
|
||||
Designed specifically to work with the Adafruit WiFi products:
|
||||
----> https://www.adafruit.com/products/1469
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried, Kevin Townsend and Phil Burgess for
|
||||
Adafruit Industries. BSD license, all text above must be included
|
||||
in any redistribution
|
||||
****************************************************/
|
||||
|
||||
/*
|
||||
This example queries the freegeoip.net service to get the local
|
||||
approximate geographic location based on IP address. Combined with
|
||||
code in the InternetTime sketch, this can give absolute position and
|
||||
time, extremely useful for seasonal calculations like sun position,
|
||||
insolation, day length, etc. Sure, could always add a GPS module or
|
||||
just plug in values from one's GPS or phone, but this has the dual
|
||||
luxuries of coming 'free' with the existing WiFi hardware, and being
|
||||
automatic (albeit a bit less accurate...but totally sufficient for
|
||||
the applications mentioned).
|
||||
|
||||
Positional accuracy depends on the freegeoip.net database, in turn
|
||||
based on data collected by maxmind.com. No guarantees this will work
|
||||
for every location.
|
||||
|
||||
Position should be polled only once, at startup, or very infrequently
|
||||
if making a mobile network-hopping thing, so as not to overwhelm the
|
||||
kindly-provided free geolocation service.
|
||||
*/
|
||||
|
||||
#include <Adafruit_CC3000.h>
|
||||
#include <ccspi.h>
|
||||
#include <SPI.h>
|
||||
#include <string.h>
|
||||
#include "utility/debug.h"
|
||||
|
||||
// These are the interrupt and control pins
|
||||
#define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin!
|
||||
// These can be any two pins
|
||||
#define ADAFRUIT_CC3000_VBAT 5
|
||||
#define ADAFRUIT_CC3000_CS 10
|
||||
// Use hardware SPI for the remaining pins
|
||||
// On an UNO, SCK = 13, MISO = 12, and MOSI = 11
|
||||
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS,
|
||||
ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,
|
||||
SPI_CLOCK_DIVIDER); // you can change this clock speed
|
||||
|
||||
#define WLAN_SSID "myNetwork" // cannot be longer than 32 characters!
|
||||
#define WLAN_PASS "myPassword"
|
||||
// Security can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2
|
||||
#define WLAN_SECURITY WLAN_SEC_WPA2
|
||||
|
||||
Adafruit_CC3000_Client client;
|
||||
|
||||
const unsigned long
|
||||
dhcpTimeout = 60L * 1000L, // Max time to wait for address from DHCP
|
||||
connectTimeout = 15L * 1000L, // Max time to wait for server connection
|
||||
responseTimeout = 15L * 1000L; // Max time to wait for data from server
|
||||
|
||||
// This program prints a few tidbits of information about the current location
|
||||
// (Country, region (state), city, longitude and latitude). Additional info is
|
||||
// available but just isn't recorded by this code -- can look at jsonParse()
|
||||
// function to see how it's done and add what you need (or remove what you don't).
|
||||
// The total list of available attributes includes: ip, country_code,
|
||||
// country_name, region_code, region_name, city, zipcode, latitude, longitude,
|
||||
// metro_code and areacode.
|
||||
char
|
||||
country[20],
|
||||
region[20],
|
||||
city[20],
|
||||
name[13], // Temp space for name:value parsing
|
||||
value[64]; // Temp space for name:value parsing
|
||||
float
|
||||
longitude, latitude;
|
||||
|
||||
void setup(void) {
|
||||
uint32_t ip = 0L, t;
|
||||
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("Hello, CC3000!"));
|
||||
|
||||
Serial.print("Free RAM: "); Serial.println(getFreeRam(), DEC);
|
||||
|
||||
Serial.print(F("Initializing..."));
|
||||
if(!cc3000.begin()) {
|
||||
Serial.println(F("failed. Check your wiring?"));
|
||||
return;
|
||||
}
|
||||
|
||||
Serial.print(F("OK.\r\nConnecting to network..."));
|
||||
if(!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
|
||||
Serial.println(F("Failed!"));
|
||||
return;
|
||||
}
|
||||
Serial.println(F("connected!"));
|
||||
|
||||
Serial.print(F("Requesting address from DHCP server..."));
|
||||
for(t=millis(); !cc3000.checkDHCP() && ((millis() - t) < dhcpTimeout); delay(1000));
|
||||
if(cc3000.checkDHCP()) {
|
||||
Serial.println(F("OK"));
|
||||
} else {
|
||||
Serial.println(F("failed"));
|
||||
return;
|
||||
}
|
||||
|
||||
while(!displayConnectionDetails()) delay(1000);
|
||||
|
||||
// Look up server's IP address
|
||||
Serial.print(F("\r\nGetting server IP address..."));
|
||||
t = millis();
|
||||
while((0L == ip) && ((millis() - t) < connectTimeout)) {
|
||||
if(cc3000.getHostByName("freegeoip.net", &ip)) break;
|
||||
delay(1000);
|
||||
}
|
||||
if(0L == ip) {
|
||||
Serial.println(F("failed"));
|
||||
return;
|
||||
}
|
||||
cc3000.printIPdotsRev(ip);
|
||||
Serial.println();
|
||||
|
||||
// Request JSON-formatted data from server (port 80)
|
||||
Serial.print(F("Connecting to geo server..."));
|
||||
client = cc3000.connectTCP(ip, 80);
|
||||
if(client.connected()) {
|
||||
Serial.print(F("connected.\r\nRequesting data..."));
|
||||
client.print(F("GET /json/ HTTP/1.0\r\nConnection: close\r\n\r\n"));
|
||||
} else {
|
||||
Serial.println(F("failed"));
|
||||
return;
|
||||
}
|
||||
|
||||
Serial.print("\r\nReading response...");
|
||||
country[0] = region[0] = city[0] = 0; // Clear data
|
||||
jsonParse(0, 0);
|
||||
client.close();
|
||||
Serial.println(F("OK"));
|
||||
|
||||
/* You need to make sure to clean up after yourself or the CC3000 can freak out */
|
||||
/* the next time your try to connect ... */
|
||||
Serial.println(F("\nDisconnecting"));
|
||||
cc3000.disconnect();
|
||||
|
||||
Serial.print(F("\r\nRESULTS:\r\n Country: "));
|
||||
Serial.println(country);
|
||||
Serial.print(F(" Region: "));
|
||||
Serial.println(region);
|
||||
Serial.print(F(" City: "));
|
||||
Serial.println(city);
|
||||
Serial.print(F(" Longitude: "));
|
||||
Serial.println(longitude);
|
||||
Serial.print(F(" Latitude: "));
|
||||
Serial.println(latitude);
|
||||
}
|
||||
|
||||
void loop(void) { } // Not used by this code
|
||||
|
||||
|
||||
bool displayConnectionDetails(void) {
|
||||
uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;
|
||||
|
||||
if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv)) {
|
||||
Serial.println(F("Unable to retrieve the IP Address!\r\n"));
|
||||
return false;
|
||||
} else {
|
||||
Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
|
||||
Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask);
|
||||
Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway);
|
||||
Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
|
||||
Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
|
||||
Serial.println();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Helper functions swiped from Adafruit 'Gutenbird' code (with changes)
|
||||
|
||||
boolean jsonParse(int depth, byte endChar) {
|
||||
int c, i;
|
||||
boolean readName = true;
|
||||
for(;;) {
|
||||
while(isspace(c = timedRead())); // Scan past whitespace
|
||||
if(c < 0) return false; // Timeout
|
||||
if(c == endChar) return true; // EOD
|
||||
|
||||
if(c == '{') { // Object follows
|
||||
if(!jsonParse(depth + 1, '}')) return false;
|
||||
if(!depth) return true; // End of file
|
||||
} else if(c == '[') { // Array follows
|
||||
if(!jsonParse(depth + 1,']')) return false;
|
||||
} else if((c == '"') || (c == '\'')) { // String follows
|
||||
if(readName) { // Name-reading mode
|
||||
if(!readString(name, sizeof(name)-1, c)) return false;
|
||||
} else { // Value-reading mode
|
||||
if(!readString(value, sizeof(value)-1, c)) return false;
|
||||
// Process name and value strings:
|
||||
if (!strcasecmp(name, "country_name")) {
|
||||
strncpy(country, value, sizeof(country)-1);
|
||||
} else if(!strcasecmp(name, "region_name")) {
|
||||
strncpy(region, value, sizeof(region)-1);
|
||||
} else if(!strcasecmp(name, "city")) {
|
||||
strncpy(city, value, sizeof(city)-1);
|
||||
}
|
||||
}
|
||||
} else if(c == ':') { // Separator between name:value
|
||||
readName = false; // Now in value-reading mode
|
||||
value[0] = 0; // Clear existing value data
|
||||
} else if(c == ',') { // Separator between name/value pairs
|
||||
readName = true; // Now in name-reading mode
|
||||
name[0] = 0; // Clear existing name data
|
||||
} else {
|
||||
// Else true/false/null or a number follows.
|
||||
value[0] = c;
|
||||
if(!strcasecmp(name, "longitude")) {
|
||||
if(!readString(value+1, sizeof(value)-1, ',')) return false;
|
||||
longitude = atof(value);
|
||||
} else if(!strcasecmp(name, "latitude")) {
|
||||
if(!readString(value+1, sizeof(value)-1, ',')) return false;
|
||||
latitude = atof(value);
|
||||
}
|
||||
readName = true; // Now in name-reading mode
|
||||
name[0] = 0; // Clear existing name data
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Read string from client stream into destination buffer, up to a maximum
|
||||
// requested length. Buffer should be at least 1 byte larger than this to
|
||||
// accommodate NUL terminator. Opening quote is assumed already read,
|
||||
// closing quote will be discarded, and stream will be positioned
|
||||
// immediately following the closing quote (regardless whether max length
|
||||
// is reached -- excess chars are discarded). Returns true on success
|
||||
// (including zero-length string), false on timeout/read error.
|
||||
boolean readString(char *dest, int maxLen, char quote) {
|
||||
int c, len = 0;
|
||||
|
||||
while((c = timedRead()) != quote) { // Read until closing quote
|
||||
if(c == '\\') { // Escaped char follows
|
||||
c = timedRead(); // Read it
|
||||
// Certain escaped values are for cursor control --
|
||||
// there might be more suitable printer codes for each.
|
||||
if (c == 'b') c = '\b'; // Backspace
|
||||
else if(c == 'f') c = '\f'; // Form feed
|
||||
else if(c == 'n') c = '\n'; // Newline
|
||||
else if(c == 'r') c = '\r'; // Carriage return
|
||||
else if(c == 't') c = '\t'; // Tab
|
||||
else if(c == 'u') c = unidecode(4);
|
||||
else if(c == 'U') c = unidecode(8);
|
||||
// else c is unaltered -- an escaped char such as \ or "
|
||||
} // else c is a normal unescaped char
|
||||
|
||||
if(c < 0) return false; // Timeout
|
||||
|
||||
// In order to properly position the client stream at the end of
|
||||
// the string, characters are read to the end quote, even if the max
|
||||
// string length is reached...the extra chars are simply discarded.
|
||||
if(len < maxLen) dest[len++] = c;
|
||||
}
|
||||
|
||||
dest[len] = 0;
|
||||
return true; // Success (even if empty string)
|
||||
}
|
||||
|
||||
// Read a given number of hexadecimal characters from client stream,
|
||||
// representing a Unicode symbol. Return -1 on error, else return nearest
|
||||
// equivalent glyph in printer's charset. (See notes below -- for now,
|
||||
// always returns '-' or -1.)
|
||||
int unidecode(byte len) {
|
||||
int c, v, result = 0;
|
||||
while(len--) {
|
||||
if((c = timedRead()) < 0) return -1; // Stream timeout
|
||||
if ((c >= '0') && (c <= '9')) v = c - '0';
|
||||
else if((c >= 'A') && (c <= 'F')) v = 10 + c - 'A';
|
||||
else if((c >= 'a') && (c <= 'f')) v = 10 + c - 'a';
|
||||
else return '-'; // garbage
|
||||
result = (result << 4) | v;
|
||||
}
|
||||
|
||||
return '?';
|
||||
}
|
||||
|
||||
// Read from client stream with a 5 second timeout. Although an
|
||||
// essentially identical method already exists in the Stream() class,
|
||||
// it's declared private there...so this is a local copy.
|
||||
int timedRead(void) {
|
||||
unsigned long start = millis();
|
||||
while((!client.available()) && ((millis() - start) < 5000L));
|
||||
return client.read(); // -1 on timeout
|
||||
}
|
||||
|
||||
@@ -1,278 +0,0 @@
|
||||
/***************************************************
|
||||
This is an example for the Adafruit CC3000 Wifi Breakout & Shield
|
||||
|
||||
Designed specifically to work with the Adafruit WiFi products:
|
||||
----> https://www.adafruit.com/products/1469
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried, Kevin Townsend and Phil Burgess for
|
||||
Adafruit Industries. BSD license, all text above must be included
|
||||
in any redistribution
|
||||
****************************************************/
|
||||
|
||||
/*
|
||||
This example queries an NTP time server to get the current "UNIX time"
|
||||
(seconds since 1/1/1970, UTC (GMT)), then uses the Arduino's internal
|
||||
timer to keep relative time. The clock is re-synchronized roughly
|
||||
once per day. This minimizes NTP server misuse/abuse.
|
||||
|
||||
The RTClib library (a separate download, and not used here) contains
|
||||
functions to convert UNIX time to other formats if needed.
|
||||
*/
|
||||
|
||||
#include <Adafruit_CC3000.h>
|
||||
#include <ccspi.h>
|
||||
#include <SPI.h>
|
||||
|
||||
// These are the interrupt and control pins
|
||||
#define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin!
|
||||
// These can be any two pins
|
||||
#define ADAFRUIT_CC3000_VBAT 5
|
||||
#define ADAFRUIT_CC3000_CS 10
|
||||
// Use hardware SPI for the remaining pins
|
||||
// On an UNO, SCK = 13, MISO = 12, and MOSI = 11
|
||||
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,
|
||||
SPI_CLOCK_DIVIDER); // you can change this clock speed but DI
|
||||
|
||||
#define WLAN_SSID "myNetwork" // cannot be longer than 32 characters!
|
||||
#define WLAN_PASS "myPassword"
|
||||
// Security can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2
|
||||
#define WLAN_SECURITY WLAN_SEC_WPA2
|
||||
|
||||
Adafruit_CC3000_Client client;
|
||||
|
||||
const unsigned long
|
||||
connectTimeout = 15L * 1000L, // Max time to wait for server connection
|
||||
responseTimeout = 15L * 1000L; // Max time to wait for data from server
|
||||
int
|
||||
countdown = 0; // loop() iterations until next time server query
|
||||
unsigned long
|
||||
lastPolledTime = 0L, // Last value retrieved from time server
|
||||
sketchTime = 0L; // CPU milliseconds since last server query
|
||||
|
||||
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("Hello, CC3000!\n"));
|
||||
|
||||
displayDriverMode();
|
||||
|
||||
Serial.println(F("\nInitialising the CC3000 ..."));
|
||||
if (!cc3000.begin()) {
|
||||
Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
|
||||
for(;;);
|
||||
}
|
||||
|
||||
uint16_t firmware = checkFirmwareVersion();
|
||||
if (firmware < 0x113) {
|
||||
Serial.println(F("Wrong firmware version!"));
|
||||
for(;;);
|
||||
}
|
||||
|
||||
displayMACAddress();
|
||||
|
||||
Serial.println(F("\nDeleting old connection profiles"));
|
||||
if (!cc3000.deleteProfiles()) {
|
||||
Serial.println(F("Failed!"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
/* Attempt to connect to an access point */
|
||||
char *ssid = WLAN_SSID; /* Max 32 chars */
|
||||
Serial.print(F("\nAttempting to connect to ")); Serial.println(ssid);
|
||||
|
||||
/* NOTE: Secure connections are not available in 'Tiny' mode! */
|
||||
if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
|
||||
Serial.println(F("Failed!"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
Serial.println(F("Connected!"));
|
||||
|
||||
/* Wait for DHCP to complete */
|
||||
Serial.println(F("Request DHCP"));
|
||||
while (!cc3000.checkDHCP()) {
|
||||
delay(100); // ToDo: Insert a DHCP timeout!
|
||||
}
|
||||
|
||||
/* Display the IP address DNS, Gateway, etc. */
|
||||
while (!displayConnectionDetails()) {
|
||||
delay(1000);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// To reduce load on NTP servers, time is polled once per roughly 24 hour period.
|
||||
// Otherwise use millis() to estimate time since last query. Plenty accurate.
|
||||
void loop(void) {
|
||||
|
||||
if(countdown == 0) { // Time's up?
|
||||
unsigned long t = getTime(); // Query time server
|
||||
if(t) { // Success?
|
||||
lastPolledTime = t; // Save time
|
||||
sketchTime = millis(); // Save sketch time of last valid time query
|
||||
countdown = 24*60*4-1; // Reset counter: 24 hours * 15-second intervals
|
||||
}
|
||||
} else {
|
||||
countdown--; // Don't poll; use math to figure current time
|
||||
}
|
||||
|
||||
unsigned long currentTime = lastPolledTime + (millis() - sketchTime) / 1000;
|
||||
|
||||
Serial.print(F("Current UNIX time: "));
|
||||
Serial.print(currentTime);
|
||||
Serial.println(F(" (seconds since 1/1/1970 UTC)"));
|
||||
|
||||
delay(15000L); // Pause 15 seconds
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Displays the driver mode (tiny of normal), and the buffer
|
||||
size if tiny mode is not being used
|
||||
|
||||
@note The buffer size and driver mode are defined in cc3000_common.h
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void displayDriverMode(void)
|
||||
{
|
||||
#ifdef CC3000_TINY_DRIVER
|
||||
Serial.println(F("CC3000 is configure in 'Tiny' mode"));
|
||||
#else
|
||||
Serial.print(F("RX Buffer : "));
|
||||
Serial.print(CC3000_RX_BUFFER_SIZE);
|
||||
Serial.println(F(" bytes"));
|
||||
Serial.print(F("TX Buffer : "));
|
||||
Serial.print(CC3000_TX_BUFFER_SIZE);
|
||||
Serial.println(F(" bytes"));
|
||||
#endif
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the CC3000's internal firmware patch ID
|
||||
*/
|
||||
/**************************************************************************/
|
||||
uint16_t checkFirmwareVersion(void)
|
||||
{
|
||||
uint8_t major, minor;
|
||||
uint16_t version;
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
if(!cc3000.getFirmwareVersion(&major, &minor))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve the firmware version!\r\n"));
|
||||
version = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("Firmware V. : "));
|
||||
Serial.print(major); Serial.print(F(".")); Serial.println(minor);
|
||||
version = major; version <<= 8; version |= minor;
|
||||
}
|
||||
#endif
|
||||
return version;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the 6-byte MAC address of the CC3000 module
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void displayMACAddress(void)
|
||||
{
|
||||
uint8_t macAddress[6];
|
||||
|
||||
if(!cc3000.getMacAddress(macAddress))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve MAC Address!\r\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("MAC Address : "));
|
||||
cc3000.printHex((byte*)&macAddress, 6);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the IP address and other connection details
|
||||
*/
|
||||
/**************************************************************************/
|
||||
bool displayConnectionDetails(void)
|
||||
{
|
||||
uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;
|
||||
|
||||
if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve the IP Address!\r\n"));
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
|
||||
Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask);
|
||||
Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway);
|
||||
Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
|
||||
Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
|
||||
Serial.println();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Minimalist time server query; adapted from Adafruit Gutenbird sketch,
|
||||
// which in turn has roots in Arduino UdpNTPClient tutorial.
|
||||
unsigned long getTime(void) {
|
||||
|
||||
uint8_t buf[48];
|
||||
unsigned long ip, startTime, t = 0L;
|
||||
|
||||
Serial.print(F("Locating time server..."));
|
||||
|
||||
// Hostname to IP lookup; use NTP pool (rotates through servers)
|
||||
if(cc3000.getHostByName("pool.ntp.org", &ip)) {
|
||||
static const char PROGMEM
|
||||
timeReqA[] = { 227, 0, 6, 236 },
|
||||
timeReqB[] = { 49, 78, 49, 52 };
|
||||
|
||||
Serial.println(F("\r\nAttempting connection..."));
|
||||
startTime = millis();
|
||||
do {
|
||||
client = cc3000.connectUDP(ip, 123);
|
||||
} while((!client.connected()) &&
|
||||
((millis() - startTime) < connectTimeout));
|
||||
|
||||
if(client.connected()) {
|
||||
Serial.print(F("connected!\r\nIssuing request..."));
|
||||
|
||||
// Assemble and issue request packet
|
||||
memset(buf, 0, sizeof(buf));
|
||||
memcpy_P( buf , timeReqA, sizeof(timeReqA));
|
||||
memcpy_P(&buf[12], timeReqB, sizeof(timeReqB));
|
||||
client.write(buf, sizeof(buf));
|
||||
|
||||
Serial.print(F("\r\nAwaiting response..."));
|
||||
memset(buf, 0, sizeof(buf));
|
||||
startTime = millis();
|
||||
while((!client.available()) &&
|
||||
((millis() - startTime) < responseTimeout));
|
||||
if(client.available()) {
|
||||
client.read(buf, sizeof(buf));
|
||||
t = (((unsigned long)buf[40] << 24) |
|
||||
((unsigned long)buf[41] << 16) |
|
||||
((unsigned long)buf[42] << 8) |
|
||||
(unsigned long)buf[43]) - 2208988800UL;
|
||||
Serial.print(F("OK\r\n"));
|
||||
}
|
||||
client.close();
|
||||
}
|
||||
}
|
||||
if(!t) Serial.println(F("error"));
|
||||
return t;
|
||||
}
|
||||
@@ -1,447 +0,0 @@
|
||||
/*
|
||||
IMPORTANT: THIS SOFTWARE CURRENTLY DOES NOT WORK, and future
|
||||
status is uncertain. Twitter has changed their API to require
|
||||
SSL (Secure Sockets Layer) on -all- connections, a complex
|
||||
operation beyond the Arduino's ability to handle. The code is
|
||||
being kept around on the chance that a suitable proxy service
|
||||
becomes available...but at present we have no such service, no
|
||||
code for such, nor a schedule or even a firm commitment to
|
||||
pursue it. For projects requiring Twitter we now recommend
|
||||
using an SSL-capable system such as Raspberry Pi.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
Send tweets wirelessly from Arduino using the new Twitter 1.1 API.
|
||||
Self-contained, operates directly -- no proxy server required!
|
||||
|
||||
Designed for IoTA -- Internet of Things by Adafruit -- a series of Arduino-
|
||||
compatible WiFi products based on the TI CC3000 module, to be available in
|
||||
shield, breakout and standalone development board form-factors.
|
||||
|
||||
Written by Adafruit Industries, distributed under BSD License.
|
||||
|
||||
MUST BE CONFIGURED FOR TWITTER 1.1 API BEFORE USE. See notes below.
|
||||
|
||||
REQUIRES ARDUINO IDE 1.0 OR LATER -- Back-porting is not likely to occur,
|
||||
as the code is deeply dependent on the Stream class, etc.
|
||||
|
||||
Requires Adafruit fork of Peter Knight's Cryptosuite library for Arduino:
|
||||
https://github.com/adafruit/Cryptosuite
|
||||
|
||||
Required hardware includes an 802.11 wireless access point, any of the
|
||||
Adafruit IoTa WiFi devices, a compatible Arduino board (for shield and
|
||||
breakout form-factors) and, optionally, sensors to be read and reported
|
||||
via Twitter.
|
||||
|
||||
Resources:
|
||||
http://www.adafruit.com/products/1469 IoTa breakout board
|
||||
http://www.adafruit.com/products/201 Arduino Uno
|
||||
[ additional links will go here ]
|
||||
|
||||
Uses Twitter 1.1 API. This REQUIRES a Twitter account and some account
|
||||
configuration. Start at dev.twitter.com, sign in with your Twitter
|
||||
credentials, select "My Applications" from the avatar drop-down menu at the
|
||||
top right, then "Create a new application." Provide a name, description,
|
||||
placeholder URL and complete the captcha, after which you'll be provided a
|
||||
"consumer key" and "consumer secret" for your app. Select "Create access
|
||||
token" to also generate an "access token" and "access token secret."
|
||||
ALL FOUR STRINGS must be copied to the correct positions in the globals below,
|
||||
and configure the search string to your liking. DO NOT SHARE your keys or
|
||||
secrets! If you put code on Github or other public repository, replace them
|
||||
with dummy strings. Next, from the Twitter "Settings" tab, change the
|
||||
Application Type to "Read and Write" -- MANDATORY or the sketch won't work!
|
||||
|
||||
|
||||
Copyright (c) 2013 Adafruit Industries.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
- Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
- Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <Adafruit_CC3000.h>
|
||||
#include <ccspi.h>
|
||||
#include <SPI.h>
|
||||
#include <sha1.h>
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// This is a relatively complex sketch, not recommended as a first
|
||||
// introduction to IoTa. Try running some of the other, simpler sketches
|
||||
// first before attempting to adapt this code. Additionally, some of the
|
||||
// CC3000 helper and status functions have been pared back in this code.
|
||||
// See other example sketches for more complete and verbose debugging info
|
||||
// during your initial IoTa experiments.
|
||||
|
||||
// Configurable globals and defines. Edit to your needs. -------------------
|
||||
|
||||
// CC3000 interrupt and control pins
|
||||
#define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin!
|
||||
#define ADAFRUIT_CC3000_VBAT 5 // These can be
|
||||
#define ADAFRUIT_CC3000_CS 10 // any two pins
|
||||
// Hardware SPI required for remaining pins.
|
||||
// On an UNO, SCK = 13, MISO = 12, and MOSI = 11
|
||||
Adafruit_CC3000 cc3000 = Adafruit_CC3000(
|
||||
ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,
|
||||
SPI_CLOCK_DIVIDER);
|
||||
|
||||
// WiFi access point credentials
|
||||
#define WLAN_SSID "myNetwork" // 32 characters max
|
||||
#define WLAN_PASS "myPassword"
|
||||
#define WLAN_SECURITY WLAN_SEC_WPA2 // WLAN_SEC_UNSEC/WLAN_SEC_WEP/WLAN_SEC_WPA/WLAN_SEC_WPA2
|
||||
|
||||
const char PROGMEM
|
||||
// Twitter application credentials -- see notes above -- DO NOT SHARE.
|
||||
consumer_key[] = "PUT_YOUR_CONSUMER_KEY_HERE",
|
||||
access_token[] = "PUT_YOUR_ACCESS_TOKEN_HERE",
|
||||
signingKey[] = "PUT_YOUR_CONSUMER_SECRET_HERE" // Consumer secret
|
||||
"&" "PUT_YOUR_ACCESS_TOKEN_SECRET_HERE", // Access token secret
|
||||
// The ampersand is intentional -- do not delete!
|
||||
|
||||
// Other globals. You probably won't need to change these. ---------------
|
||||
endpoint[] = "/1.1/statuses/update.json",
|
||||
agent[] = "Arduino-Tweet-Test v1.0";
|
||||
const char
|
||||
host[] = "api.twitter.com";
|
||||
const unsigned long
|
||||
dhcpTimeout = 60L * 1000L, // Max time to wait for address from DHCP
|
||||
connectTimeout = 15L * 1000L, // Max time to wait for server connection
|
||||
responseTimeout = 15L * 1000L; // Max time to wait for data from server
|
||||
unsigned long
|
||||
currentTime = 0L;
|
||||
Adafruit_CC3000_Client
|
||||
client; // For WiFi connections
|
||||
|
||||
// Similar to F(), but for PROGMEM string pointers rather than literals
|
||||
#define F2(progmem_ptr) (const __FlashStringHelper *)progmem_ptr
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
void setup(void) {
|
||||
|
||||
uint32_t ip = 0L, t;
|
||||
|
||||
Serial.begin(115200);
|
||||
|
||||
Serial.print(F("Hello! Initializing CC3000..."));
|
||||
if(!cc3000.begin()) hang(F("failed. Check your wiring?"));
|
||||
|
||||
uint16_t firmware = checkFirmwareVersion();
|
||||
if ((firmware != 0x113) && (firmware != 0x118)) {
|
||||
hang(F("Wrong firmware version!"));
|
||||
}
|
||||
|
||||
Serial.print(F("OK\r\nDeleting old connection profiles..."));
|
||||
if(!cc3000.deleteProfiles()) hang(F("failed."));
|
||||
|
||||
Serial.print(F("OK\r\nConnecting to network..."));
|
||||
/* NOTE: Secure connections are not available in 'Tiny' mode! */
|
||||
if(!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) hang(F("Failed!"));
|
||||
|
||||
Serial.print(F("OK\r\nRequesting address from DHCP server..."));
|
||||
for(t=millis(); !cc3000.checkDHCP() && ((millis() - t) < dhcpTimeout); delay(100));
|
||||
if(!cc3000.checkDHCP()) hang(F("failed"));
|
||||
Serial.println(F("OK"));
|
||||
|
||||
while(!displayConnectionDetails());
|
||||
|
||||
// Get initial time from time server (make a few tries if needed)
|
||||
for(uint8_t i=0; (i<5) && !(currentTime = getTime()); delay(5000L), i++);
|
||||
|
||||
// Initialize crypto library
|
||||
Sha1.initHmac_P((uint8_t *)signingKey, sizeof(signingKey) - 1);
|
||||
}
|
||||
|
||||
// On error, print PROGMEM string to serial monitor and stop
|
||||
void hang(const __FlashStringHelper *str) {
|
||||
Serial.println(str);
|
||||
for(;;);
|
||||
}
|
||||
|
||||
uint8_t countdown = 23; // Countdown to next time server query (once per ~24hr)
|
||||
|
||||
void loop() {
|
||||
|
||||
unsigned long t = millis();
|
||||
|
||||
// For now this just issues a fixed tweet. In reality, you might want to
|
||||
// read from some sensors or that sort of thing, then nicely format the
|
||||
// results into a buffer to be passed to the sendTweet() function.
|
||||
sendTweet("Adafruit IoTa test. Tweet directly from Arduino...no proxy, no wires! http://www.adafruit.com/products/1469");
|
||||
|
||||
// Delay remainder of 1 hour (takes tweeting time into account)
|
||||
Serial.println("Waiting ~1 hour...");
|
||||
delay((60L * 60L * 1000L) - (millis() - t));
|
||||
currentTime += 60L * 60L * 1000L;
|
||||
|
||||
if(!countdown) { // 24 hours elapsed?
|
||||
if((t = getTime())) { // Synchronize time if server contacted
|
||||
currentTime = t;
|
||||
countdown = 23; // and reset counter
|
||||
}
|
||||
} else countdown--;
|
||||
}
|
||||
|
||||
// Returns true on success, false on error
|
||||
boolean sendTweet(char *msg) { // 140 chars max! No checks made here.
|
||||
uint8_t *in, out, i;
|
||||
char nonce[9], // 8 random digits + NUL
|
||||
searchTime[11], // 32-bit int + NUL
|
||||
b64[29];
|
||||
unsigned long startTime, t, ip;
|
||||
static const char PROGMEM b64chars[] =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
|
||||
startTime = millis();
|
||||
|
||||
sprintf(nonce, "%04x%04x", random() ^ currentTime, startTime ^ currentTime);
|
||||
sprintf(searchTime, "%ld", currentTime);
|
||||
|
||||
// A dirty hack makes the Oauth song and dance MUCH simpler within the
|
||||
// Arduino's limited RAM and CPU. A proper general-purpose implementation
|
||||
// would be expected to URL-encode keys and values (from the complete list
|
||||
// of POST parameters and authentication values), sort by encoded key,
|
||||
// concatenate and URL-encode the combined result. Sorting is avoided
|
||||
// because every POST this program performs has exactly the same set of
|
||||
// parameters, so we've pre-sorted the list as it appears here. Keys
|
||||
// (and many values) are pre-encoded because they never change; many are
|
||||
// passed through verbatim because the format is known to not require
|
||||
// encoding. Most reside in PROGMEM, not RAM. This is bending a LOT of
|
||||
// rules of Good and Proper Authentication and would land you an 'F' in
|
||||
// Comp Sci class, but it handles the required task and is VERY compact.
|
||||
Sha1.print(F("POST&http%3A%2F%2F"));
|
||||
Sha1.print(host);
|
||||
urlEncode(Sha1, endpoint, true, false);
|
||||
Sha1.print(F("&oauth_consumer_key%3D"));
|
||||
Sha1.print(F2(consumer_key));
|
||||
Sha1.print(F("%26oauth_nonce%3D"));
|
||||
Sha1.print(nonce);
|
||||
Sha1.print(F("%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D"));
|
||||
Sha1.print(searchTime);
|
||||
Sha1.print(F("%26oauth_token%3D"));
|
||||
Sha1.print(F2(access_token));
|
||||
Sha1.print(F("%26oauth_version%3D1.0%26status%3D"));
|
||||
urlEncode(Sha1, msg, false, true);
|
||||
|
||||
// base64-encode SHA-1 hash output. This is NOT a general-purpose base64
|
||||
// encoder! It's stripped down for the fixed-length hash -- always 20
|
||||
// bytes input, always 27 chars output + '='.
|
||||
for(in = Sha1.resultHmac(), out=0; ; in += 3) { // octets to sextets
|
||||
b64[out++] = in[0] >> 2;
|
||||
b64[out++] = ((in[0] & 0x03) << 4) | (in[1] >> 4);
|
||||
if(out >= 26) break;
|
||||
b64[out++] = ((in[1] & 0x0f) << 2) | (in[2] >> 6);
|
||||
b64[out++] = in[2] & 0x3f;
|
||||
}
|
||||
b64[out] = (in[1] & 0x0f) << 2;
|
||||
// Remap sextets to base64 ASCII chars
|
||||
for(i=0; i<=out; i++) b64[i] = pgm_read_byte(&b64chars[b64[i]]);
|
||||
b64[i++] = '=';
|
||||
b64[i++] = 0;
|
||||
|
||||
// Hostname lookup
|
||||
Serial.print(F("Locating Twitter server..."));
|
||||
cc3000.getHostByName((char *)host, &ip);
|
||||
|
||||
// Connect to numeric IP
|
||||
Serial.print(F("OK\r\nConnecting to server..."));
|
||||
t = millis();
|
||||
do {
|
||||
client = cc3000.connectTCP(ip, 80);
|
||||
} while((!client.connected()) &&
|
||||
((millis() - t) < connectTimeout));
|
||||
|
||||
if(client.connected()) { // Success!
|
||||
Serial.print(F("OK\r\nIssuing HTTP request..."));
|
||||
|
||||
// Unlike the hash prep, parameters in the HTTP request don't require sorting.
|
||||
client.fastrprint(F("POST "));
|
||||
client.fastrprint(F2(endpoint));
|
||||
client.fastrprint(F(" HTTP/1.1\r\nHost: "));
|
||||
client.fastrprint(host);
|
||||
client.fastrprint(F("\r\nUser-Agent: "));
|
||||
client.fastrprint(F2(agent));
|
||||
client.fastrprint(F("\r\nConnection: close\r\n"
|
||||
"Content-Type: application/x-www-form-urlencoded;charset=UTF-8\r\n"
|
||||
"Content-Length: "));
|
||||
client.print(7 + encodedLength(msg));
|
||||
client.fastrprint(F("\r\nAuthorization: Oauth oauth_consumer_key=\""));
|
||||
client.fastrprint(F2(consumer_key));
|
||||
client.fastrprint(F("\", oauth_nonce=\""));
|
||||
client.fastrprint(nonce);
|
||||
client.fastrprint(F("\", oauth_signature=\""));
|
||||
urlEncode(client, b64, false, false);
|
||||
client.fastrprint(F("\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\""));
|
||||
client.fastrprint(searchTime);
|
||||
client.fastrprint(F("\", oauth_token=\""));
|
||||
client.fastrprint(F2(access_token));
|
||||
client.fastrprint(F("\", oauth_version=\"1.0\"\r\n\r\nstatus="));
|
||||
urlEncode(client, msg, false, false);
|
||||
|
||||
Serial.print(F("OK\r\nAwaiting response..."));
|
||||
int c = 0;
|
||||
// Dirty trick: instead of parsing results, just look for opening
|
||||
// curly brace indicating the start of a successful JSON response.
|
||||
while(((c = timedRead()) > 0) && (c != '{'));
|
||||
if(c == '{') Serial.println(F("success!"));
|
||||
else if(c < 0) Serial.println(F("timeout"));
|
||||
else Serial.println(F("error (invalid Twitter credentials?)"));
|
||||
client.close();
|
||||
return (c == '{');
|
||||
} else { // Couldn't contact server
|
||||
Serial.println(F("failed"));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Helper functions. --------------------------------------------------------
|
||||
|
||||
uint16_t checkFirmwareVersion(void) {
|
||||
uint8_t major, minor;
|
||||
uint16_t version = 0;
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
if(!cc3000.getFirmwareVersion(&major, &minor)) {
|
||||
Serial.println(F("Unable to retrieve the firmware version!\r\n"));
|
||||
} else {
|
||||
Serial.print(F("Firmware V. : "));
|
||||
Serial.print(major); Serial.print(F(".")); Serial.println(minor);
|
||||
version = ((uint16_t)major << 8) | minor;
|
||||
}
|
||||
#endif
|
||||
return version;
|
||||
}
|
||||
|
||||
bool displayConnectionDetails(void) {
|
||||
uint32_t addr, netmask, gateway, dhcpserv, dnsserv;
|
||||
|
||||
if(!cc3000.getIPAddress(&addr, &netmask, &gateway, &dhcpserv, &dnsserv))
|
||||
return false;
|
||||
|
||||
Serial.print(F("IP Addr: ")); cc3000.printIPdotsRev(addr);
|
||||
Serial.print(F("\r\nNetmask: ")); cc3000.printIPdotsRev(netmask);
|
||||
Serial.print(F("\r\nGateway: ")); cc3000.printIPdotsRev(gateway);
|
||||
Serial.print(F("\r\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
|
||||
Serial.print(F("\r\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
|
||||
Serial.println();
|
||||
return true;
|
||||
}
|
||||
|
||||
// Read from client stream with a 5 second timeout. Although an
|
||||
// essentially identical method already exists in the Stream() class,
|
||||
// it's declared private there...so this is a local copy.
|
||||
int timedRead(void) {
|
||||
unsigned long start = millis();
|
||||
while((!client.available()) && ((millis() - start) < responseTimeout));
|
||||
return client.read(); // -1 on timeout
|
||||
}
|
||||
|
||||
// For URL-encoding functions below
|
||||
static const char PROGMEM hexChar[] = "0123456789ABCDEF";
|
||||
|
||||
// URL-encoding output function for Print class.
|
||||
// Input from RAM or PROGMEM (flash). Double-encoding is a weird special
|
||||
// case for Oauth (encoded strings get encoded a second time).
|
||||
void urlEncode(
|
||||
Print &p, // EthernetClient, Sha1, etc.
|
||||
const char *src, // String to be encoded
|
||||
boolean progmem, // If true, string is in PROGMEM (else RAM)
|
||||
boolean x2) // If true, "double encode" parenthesis
|
||||
{
|
||||
uint8_t c;
|
||||
|
||||
while((c = (progmem ? pgm_read_byte(src) : *src))) {
|
||||
if(((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) ||
|
||||
((c >= '0') && (c <= '9')) || strchr_P(PSTR("-_.~"), c)) {
|
||||
p.write(c);
|
||||
} else {
|
||||
if(x2) p.print("%25");
|
||||
else p.write('%');
|
||||
p.write(pgm_read_byte(&hexChar[c >> 4]));
|
||||
p.write(pgm_read_byte(&hexChar[c & 15]));
|
||||
}
|
||||
src++;
|
||||
}
|
||||
}
|
||||
|
||||
// Returns would-be length of encoded string, without actually encoding
|
||||
int encodedLength(char *src) {
|
||||
uint8_t c;
|
||||
int len = 0;
|
||||
|
||||
while((c = *src++)) {
|
||||
len += (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) ||
|
||||
((c >= '0') && (c <= '9')) || strchr_P(PSTR("-_.~"), c)) ? 1 : 3;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
// Minimalist time server query; adapted from Adafruit Gutenbird sketch,
|
||||
// which in turn has roots in Arduino UdpNTPClient tutorial.
|
||||
unsigned long getTime(void) {
|
||||
|
||||
uint8_t buf[48];
|
||||
unsigned long ip, startTime, t = 0L;
|
||||
|
||||
Serial.print(F("Locating time server..."));
|
||||
|
||||
// Hostname to IP lookup; use NTP pool (rotates through servers)
|
||||
if(cc3000.getHostByName("pool.ntp.org", &ip)) {
|
||||
static const char PROGMEM
|
||||
timeReqA[] = { 227, 0, 6, 236 },
|
||||
timeReqB[] = { 49, 78, 49, 52 };
|
||||
|
||||
Serial.println(F("found\r\nConnecting to time server..."));
|
||||
startTime = millis();
|
||||
do {
|
||||
client = cc3000.connectUDP(ip, 123);
|
||||
} while((!client.connected()) &&
|
||||
((millis() - startTime) < connectTimeout));
|
||||
|
||||
if(client.connected()) {
|
||||
Serial.print(F("connected!\r\nIssuing request..."));
|
||||
|
||||
// Assemble and issue request packet
|
||||
memset(buf, 0, sizeof(buf));
|
||||
memcpy_P( buf , timeReqA, sizeof(timeReqA));
|
||||
memcpy_P(&buf[12], timeReqB, sizeof(timeReqB));
|
||||
client.write(buf, sizeof(buf));
|
||||
|
||||
Serial.print(F("OK\r\nAwaiting response..."));
|
||||
memset(buf, 0, sizeof(buf));
|
||||
startTime = millis();
|
||||
while((!client.available()) &&
|
||||
((millis() - startTime) < responseTimeout));
|
||||
if(client.available()) {
|
||||
client.read(buf, sizeof(buf));
|
||||
t = (((unsigned long)buf[40] << 24) |
|
||||
((unsigned long)buf[41] << 16) |
|
||||
((unsigned long)buf[42] << 8) |
|
||||
(unsigned long)buf[43]) - 2208988800UL;
|
||||
Serial.println(F("success!"));
|
||||
}
|
||||
client.close();
|
||||
}
|
||||
}
|
||||
if(!t) Serial.println(F("error"));
|
||||
return t;
|
||||
}
|
||||
@@ -1,225 +0,0 @@
|
||||
/***************************************************
|
||||
This is an example for the Adafruit CC3000 Wifi Breakout & Shield
|
||||
|
||||
Designed specifically to work with the Adafruit WiFi products:
|
||||
----> https://www.adafruit.com/products/1469
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried & Kevin Townsend for Adafruit Industries.
|
||||
BSD license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
|
||||
/* This sketch will attempt to establish an AP connection
|
||||
using the SmartConfig tool, and save the connection
|
||||
details for later use (with SmartConfigReconnect, etc.).
|
||||
|
||||
If a connection is successfully established, the data
|
||||
will be stored as a connection profile in non-volatile
|
||||
memory on the CC3000, and the device will be configured
|
||||
to automatically connect to this profile on startup.
|
||||
|
||||
To see how to safely use the CC3000 without erasing
|
||||
this SmartConfig data please consult the
|
||||
SmartConfigReconnect sketch, which uses an optional flag
|
||||
in Adafruit_CC3000.begin() to avoid erasing the
|
||||
connection profiles from memory, as well as a new
|
||||
.reconnect function.
|
||||
|
||||
Using other non SmartConfig example sketches will
|
||||
erase the connection profile data on startup, but
|
||||
this sketch combined with SmartConfigReconnect hopefully
|
||||
illustrate how to use SmartConfig when hard-coded
|
||||
connection details aren't appropriate.
|
||||
|
||||
SmartConfig is still beta and kind of works but is not fully
|
||||
vetted! It might not work on all networks!
|
||||
*/
|
||||
|
||||
#include <Adafruit_CC3000.h>
|
||||
#include <ccspi.h>
|
||||
#include <SPI.h>
|
||||
#include <string.h>
|
||||
#include "utility/debug.h"
|
||||
|
||||
// These are the interrupt and control pins
|
||||
#define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin!
|
||||
// These can be any two pins
|
||||
#define ADAFRUIT_CC3000_VBAT 5
|
||||
#define ADAFRUIT_CC3000_CS 10
|
||||
|
||||
#define DEVICE_NAME "CC3000"
|
||||
|
||||
// Use hardware SPI for the remaining pins
|
||||
// On an UNO, SCK = 13, MISO = 12, and MOSI = 11
|
||||
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS,
|
||||
ADAFRUIT_CC3000_IRQ,
|
||||
ADAFRUIT_CC3000_VBAT,
|
||||
SPI_CLOCK_DIVIDER);
|
||||
|
||||
// The SSID & Password are retrieved via the Smartconfig app
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Sets up the HW and the CC3000 module (called automatically
|
||||
on startup)
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("Hello, CC3000!\n"));
|
||||
|
||||
displayDriverMode();
|
||||
Serial.print("Free RAM: "); Serial.println(getFreeRam(), DEC);
|
||||
|
||||
/* Initialise the module, deleting any existing profile data (which */
|
||||
/* is the default behaviour) */
|
||||
Serial.println(F("\nInitialising the CC3000 ..."));
|
||||
if (!cc3000.begin(false))
|
||||
{
|
||||
Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
uint16_t firmware = checkFirmwareVersion();
|
||||
if ((firmware != 0x113) && (firmware != 0x118)) {
|
||||
Serial.println(F("Wrong firmware version!"));
|
||||
for(;;);
|
||||
}
|
||||
displayMACAddress();
|
||||
|
||||
/* Try to use the smart config app (no AES encryption), saving */
|
||||
/* the connection details if we succeed */
|
||||
Serial.println(F("Waiting for a SmartConfig connection (~60s) ..."));
|
||||
if (!cc3000.startSmartConfig(DEVICE_NAME))
|
||||
{
|
||||
Serial.println(F("SmartConfig failed"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
Serial.println(F("Saved connection details and connected to AP!"));
|
||||
|
||||
/* Wait for DHCP to complete */
|
||||
Serial.println(F("Request DHCP"));
|
||||
while (!cc3000.checkDHCP())
|
||||
{
|
||||
delay(100); // ToDo: Insert a DHCP timeout!
|
||||
}
|
||||
|
||||
/* Display the IP address DNS, Gateway, etc. */
|
||||
while (! displayConnectionDetails()) {
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
Serial.println(F("\nTo use these connection details be sure to use"));
|
||||
Serial.println(F("'.begin(false, true, DEVICE_NAME)' with your Adafruit_CC3000"));
|
||||
Serial.println(F("code instead of the default '.begin()' values!"));
|
||||
|
||||
/* You need to make sure to clean up after yourself or the CC3000 can freak out */
|
||||
/* the next time your try to connect ... */
|
||||
Serial.println(F("\nClosing the connection"));
|
||||
cc3000.disconnect();
|
||||
}
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Displays the driver mode (tiny of normal), and the buffer
|
||||
size if tiny mode is not being used
|
||||
|
||||
@note The buffer size and driver mode are defined in cc3000_common.h
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void displayDriverMode(void)
|
||||
{
|
||||
#ifdef CC3000_TINY_DRIVER
|
||||
Serial.println(F("CC3000 is configure in 'Tiny' mode"));
|
||||
#else
|
||||
Serial.print(F("RX Buffer : "));
|
||||
Serial.print(CC3000_RX_BUFFER_SIZE);
|
||||
Serial.println(F(" bytes"));
|
||||
Serial.print(F("TX Buffer : "));
|
||||
Serial.print(CC3000_TX_BUFFER_SIZE);
|
||||
Serial.println(F(" bytes"));
|
||||
#endif
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the CC3000's internal firmware patch ID
|
||||
*/
|
||||
/**************************************************************************/
|
||||
uint16_t checkFirmwareVersion(void)
|
||||
{
|
||||
uint8_t major, minor;
|
||||
uint16_t version;
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
if(!cc3000.getFirmwareVersion(&major, &minor))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve the firmware version!\r\n"));
|
||||
version = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("Firmware V. : "));
|
||||
Serial.print(major); Serial.print(F(".")); Serial.println(minor);
|
||||
version = major; version <<= 8; version |= minor;
|
||||
}
|
||||
#endif
|
||||
return version;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the 6-byte MAC address of the CC3000 module
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void displayMACAddress(void)
|
||||
{
|
||||
uint8_t macAddress[6];
|
||||
|
||||
if(!cc3000.getMacAddress(macAddress))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve MAC Address!\r\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("MAC Address : "));
|
||||
cc3000.printHex((byte*)&macAddress, 6);
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the IP address and other connection details
|
||||
*/
|
||||
/**************************************************************************/
|
||||
bool displayConnectionDetails(void)
|
||||
{
|
||||
uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;
|
||||
|
||||
if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve the IP Address!\r\n"));
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
|
||||
Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask);
|
||||
Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway);
|
||||
Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
|
||||
Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
|
||||
Serial.println();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,146 +0,0 @@
|
||||
/***************************************************
|
||||
This is an example for the Adafruit CC3000 Wifi Breakout & Shield
|
||||
|
||||
Designed specifically to work with the Adafruit WiFi products:
|
||||
----> https://www.adafruit.com/products/1469
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried & Kevin Townsend for Adafruit Industries.
|
||||
BSD license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
|
||||
/* This sketch attempts to re-connect to an AP using
|
||||
data from a previous SmartConfig session (i.e. from
|
||||
the SmartConfigCreate sketch!).
|
||||
|
||||
It will attempt to do the following:
|
||||
|
||||
* Initialization the CC3000
|
||||
* Re-connect using previous SmartConfig data (see SmartConfigCreate)
|
||||
* DHCP printout
|
||||
* Disconnect
|
||||
|
||||
If the connection fails, there are two likely
|
||||
explanations:
|
||||
|
||||
1.) You haven't run the SmartConfigCreate sketch and
|
||||
successfully connected to a network, since this
|
||||
is the process that 'saves' the AP details to the
|
||||
device
|
||||
2.) You've used one of the other non SmartConfig
|
||||
sketches, which erase all stored profiles from
|
||||
the CC3000 memory in order to manually establish
|
||||
a connection using hard coded values. (This sketch
|
||||
uses an optional flag in the Adafruit_CC3000.begin
|
||||
function to avoid this erasure process!).
|
||||
|
||||
SmartConfig is still beta and kind of works but is not fully
|
||||
vetted! It might not work on all networks!
|
||||
*/
|
||||
|
||||
#include <Adafruit_CC3000.h>
|
||||
#include <ccspi.h>
|
||||
#include <SPI.h>
|
||||
#include <string.h>
|
||||
#include "utility/debug.h"
|
||||
|
||||
// These are the interrupt and control pins
|
||||
#define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin!
|
||||
// These can be any two pins
|
||||
#define ADAFRUIT_CC3000_VBAT 5
|
||||
#define ADAFRUIT_CC3000_CS 10
|
||||
|
||||
#define DEVICE_NAME "CC3000"
|
||||
|
||||
// Use hardware SPI for the remaining pins
|
||||
// On an UNO, SCK = 13, MISO = 12, and MOSI = 11
|
||||
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS,
|
||||
ADAFRUIT_CC3000_IRQ,
|
||||
ADAFRUIT_CC3000_VBAT,
|
||||
SPI_CLOCK_DIVIDER);
|
||||
|
||||
// We get the SSID & Password from memory thanks to SmartConfigCreate!
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Sets up the HW and the CC3000 module (called automatically
|
||||
on startup)
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("Hello, CC3000!\n"));
|
||||
|
||||
/* Try to reconnect using the details from SmartConfig */
|
||||
/* This basically just resets the CC3000, and the auto connect */
|
||||
/* tries to do it's magic if connections details are found */
|
||||
Serial.println(F("Trying to reconnect using SmartConfig values ..."));
|
||||
|
||||
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
|
||||
/* !!! Note the additional arguments in .begin that tell the !!! */
|
||||
/* !!! app NOT to deleted previously stored connection details !!! */
|
||||
/* !!! and reconnected using the connection details in memory! !!! */
|
||||
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
|
||||
if (!cc3000.begin(false, true, DEVICE_NAME))
|
||||
{
|
||||
Serial.println(F("Unable to re-connect!? Did you run the SmartConfigCreate"));
|
||||
Serial.println(F("sketch to store your connection details?"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
/* Round of applause! */
|
||||
Serial.println(F("Reconnected!"));
|
||||
|
||||
/* Wait for DHCP to complete */
|
||||
Serial.println(F("\nRequesting DHCP"));
|
||||
while (!cc3000.checkDHCP()) {
|
||||
delay(100); // ToDo: Insert a DHCP timeout!
|
||||
}
|
||||
|
||||
/* Display the IP address DNS, Gateway, etc. */
|
||||
while (! displayConnectionDetails()) {
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
/* This is where you'd do your own thing! */
|
||||
|
||||
/* You need to make sure to clean up after yourself or the CC3000 can freak out */
|
||||
/* the next time your try to connect ... */
|
||||
Serial.println(F("\nClosing the connection"));
|
||||
cc3000.disconnect();
|
||||
}
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the IP address and other connection details
|
||||
*/
|
||||
/**************************************************************************/
|
||||
bool displayConnectionDetails(void)
|
||||
{
|
||||
uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;
|
||||
|
||||
if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve the IP Address!\r\n"));
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
|
||||
Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask);
|
||||
Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway);
|
||||
Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
|
||||
Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
|
||||
Serial.println();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,224 +0,0 @@
|
||||
/***************************************************
|
||||
This is an example for the Adafruit CC3000 Wifi Breakout & Shield
|
||||
|
||||
Designed specifically to work with the Adafruit WiFi products:
|
||||
----> https://www.adafruit.com/products/1469
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried & Kevin Townsend for Adafruit Industries.
|
||||
BSD license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
|
||||
/*
|
||||
This example does a test of the TCP client capability:
|
||||
* Initialization
|
||||
* Optional: SSID scan
|
||||
* AP connection
|
||||
* DHCP printout
|
||||
* DNS lookup
|
||||
* Optional: Ping
|
||||
* Connect to website and print out webpage contents
|
||||
* Disconnect
|
||||
SmartConfig is still beta and kind of works but is not fully vetted!
|
||||
It might not work on all networks!
|
||||
*/
|
||||
#include <Adafruit_CC3000.h>
|
||||
#include <ccspi.h>
|
||||
#include <SPI.h>
|
||||
#include <string.h>
|
||||
#include "utility/debug.h"
|
||||
|
||||
// These are the interrupt and control pins
|
||||
#define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin!
|
||||
// These can be any two pins
|
||||
#define ADAFRUIT_CC3000_VBAT 5
|
||||
#define ADAFRUIT_CC3000_CS 10
|
||||
// Use hardware SPI for the remaining pins
|
||||
// On an UNO, SCK = 13, MISO = 12, and MOSI = 11
|
||||
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,
|
||||
SPI_CLOCK_DIVIDER); // you can change this clock speed
|
||||
|
||||
#define WLAN_SSID "myNetwork" // cannot be longer than 32 characters!
|
||||
#define WLAN_PASS "myPassword"
|
||||
// Security can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2
|
||||
#define WLAN_SECURITY WLAN_SEC_WPA2
|
||||
|
||||
#define IDLE_TIMEOUT_MS 3000 // Amount of time to wait (in milliseconds) with no data
|
||||
// received before closing the connection. If you know the server
|
||||
// you're accessing is quick to respond, you can reduce this value.
|
||||
|
||||
// What page to grab!
|
||||
#define WEBSITE "www.adafruit.com"
|
||||
#define WEBPAGE "/testwifi/index.html"
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Sets up the HW and the CC3000 module (called automatically
|
||||
on startup)
|
||||
*/
|
||||
/**************************************************************************/
|
||||
|
||||
uint32_t ip;
|
||||
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("Hello, CC3000!\n"));
|
||||
|
||||
Serial.print("Free RAM: "); Serial.println(getFreeRam(), DEC);
|
||||
|
||||
/* Initialise the module */
|
||||
Serial.println(F("\nInitializing..."));
|
||||
if (!cc3000.begin())
|
||||
{
|
||||
Serial.println(F("Couldn't begin()! Check your wiring?"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
// Optional SSID scan
|
||||
// listSSIDResults();
|
||||
|
||||
Serial.print(F("\nAttempting to connect to ")); Serial.println(WLAN_SSID);
|
||||
if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
|
||||
Serial.println(F("Failed!"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
Serial.println(F("Connected!"));
|
||||
|
||||
/* Wait for DHCP to complete */
|
||||
Serial.println(F("Request DHCP"));
|
||||
while (!cc3000.checkDHCP())
|
||||
{
|
||||
delay(100); // ToDo: Insert a DHCP timeout!
|
||||
}
|
||||
|
||||
/* Display the IP address DNS, Gateway, etc. */
|
||||
while (! displayConnectionDetails()) {
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
ip = 0;
|
||||
// Try looking up the website's IP address
|
||||
Serial.print(WEBSITE); Serial.print(F(" -> "));
|
||||
while (ip == 0) {
|
||||
if (! cc3000.getHostByName(WEBSITE, &ip)) {
|
||||
Serial.println(F("Couldn't resolve!"));
|
||||
}
|
||||
delay(500);
|
||||
}
|
||||
|
||||
cc3000.printIPdotsRev(ip);
|
||||
|
||||
// Optional: Do a ping test on the website
|
||||
/*
|
||||
Serial.print(F("\n\rPinging ")); cc3000.printIPdotsRev(ip); Serial.print("...");
|
||||
replies = cc3000.ping(ip, 5);
|
||||
Serial.print(replies); Serial.println(F(" replies"));
|
||||
*/
|
||||
|
||||
/* Try connecting to the website.
|
||||
Note: HTTP/1.1 protocol is used to keep the server from closing the connection before all data is read.
|
||||
*/
|
||||
Adafruit_CC3000_Client www = cc3000.connectTCP(ip, 80);
|
||||
if (www.connected()) {
|
||||
www.fastrprint(F("GET "));
|
||||
www.fastrprint(WEBPAGE);
|
||||
www.fastrprint(F(" HTTP/1.1\r\n"));
|
||||
www.fastrprint(F("Host: ")); www.fastrprint(WEBSITE); www.fastrprint(F("\r\n"));
|
||||
www.fastrprint(F("\r\n"));
|
||||
www.println();
|
||||
} else {
|
||||
Serial.println(F("Connection failed"));
|
||||
return;
|
||||
}
|
||||
|
||||
Serial.println(F("-------------------------------------"));
|
||||
|
||||
/* Read data until either the connection is closed, or the idle timeout is reached. */
|
||||
unsigned long lastRead = millis();
|
||||
while (www.connected() && (millis() - lastRead < IDLE_TIMEOUT_MS)) {
|
||||
while (www.available()) {
|
||||
char c = www.read();
|
||||
Serial.print(c);
|
||||
lastRead = millis();
|
||||
}
|
||||
}
|
||||
www.close();
|
||||
Serial.println(F("-------------------------------------"));
|
||||
|
||||
/* You need to make sure to clean up after yourself or the CC3000 can freak out */
|
||||
/* the next time your try to connect ... */
|
||||
Serial.println(F("\n\nDisconnecting"));
|
||||
cc3000.disconnect();
|
||||
|
||||
}
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Begins an SSID scan and prints out all the visible networks
|
||||
*/
|
||||
/**************************************************************************/
|
||||
|
||||
void listSSIDResults(void)
|
||||
{
|
||||
uint8_t valid, rssi, sec, index;
|
||||
char ssidname[33];
|
||||
|
||||
index = cc3000.startSSIDscan();
|
||||
|
||||
Serial.print(F("Networks found: ")); Serial.println(index);
|
||||
Serial.println(F("================================================"));
|
||||
|
||||
while (index) {
|
||||
index--;
|
||||
|
||||
valid = cc3000.getNextSSID(&rssi, &sec, ssidname);
|
||||
|
||||
Serial.print(F("SSID Name : ")); Serial.print(ssidname);
|
||||
Serial.println();
|
||||
Serial.print(F("RSSI : "));
|
||||
Serial.println(rssi);
|
||||
Serial.print(F("Security Mode: "));
|
||||
Serial.println(sec);
|
||||
Serial.println();
|
||||
}
|
||||
Serial.println(F("================================================"));
|
||||
|
||||
cc3000.stopSSIDscan();
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the IP address and other connection details
|
||||
*/
|
||||
/**************************************************************************/
|
||||
bool displayConnectionDetails(void)
|
||||
{
|
||||
uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;
|
||||
|
||||
if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve the IP Address!\r\n"));
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
|
||||
Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask);
|
||||
Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway);
|
||||
Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
|
||||
Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
|
||||
Serial.println();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,320 +0,0 @@
|
||||
/***************************************************
|
||||
This is an example for the Adafruit CC3000 Wifi Breakout & Shield
|
||||
|
||||
Designed specifically to work with the Adafruit WiFi products:
|
||||
----> https://www.adafruit.com/products/1469
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Kevin Townsend & Limor Fried for Adafruit Industries.
|
||||
BSD license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
|
||||
/*
|
||||
|
||||
This example does a full test of core connectivity:
|
||||
* Initialization
|
||||
* SSID Scan
|
||||
* AP connection
|
||||
* DHCP printout
|
||||
* DNS lookup
|
||||
* Ping
|
||||
* Disconnect
|
||||
It's a good idea to run this sketch when first setting up the
|
||||
module.
|
||||
|
||||
*/
|
||||
|
||||
#include <Adafruit_CC3000.h>
|
||||
#include <ccspi.h>
|
||||
#include <SPI.h>
|
||||
#include <string.h>
|
||||
#include "utility/debug.h"
|
||||
|
||||
// These are the interrupt and control pins
|
||||
#define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin!
|
||||
// These can be any two pins
|
||||
#define ADAFRUIT_CC3000_VBAT 5
|
||||
#define ADAFRUIT_CC3000_CS 10
|
||||
// Use hardware SPI for the remaining pins
|
||||
// On an UNO, SCK = 13, MISO = 12, and MOSI = 11
|
||||
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,
|
||||
SPI_CLOCK_DIVIDER); // you can change this clock speed but DI
|
||||
|
||||
#define WLAN_SSID "myNetwork" // cannot be longer than 32 characters!
|
||||
#define WLAN_PASS "myPassword"
|
||||
// Security can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2
|
||||
#define WLAN_SECURITY WLAN_SEC_WPA2
|
||||
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Sets up the HW and the CC3000 module (called automatically
|
||||
on startup)
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("Hello, CC3000!\n"));
|
||||
|
||||
displayDriverMode();
|
||||
Serial.print("Free RAM: "); Serial.println(getFreeRam(), DEC);
|
||||
|
||||
/* Initialise the module */
|
||||
Serial.println(F("\nInitialising the CC3000 ..."));
|
||||
if (!cc3000.begin())
|
||||
{
|
||||
Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
/* Optional: Update the Mac Address to a known value */
|
||||
/*
|
||||
uint8_t macAddress[6] = { 0x08, 0x00, 0x28, 0x01, 0x79, 0xB7 };
|
||||
if (!cc3000.setMacAddress(macAddress))
|
||||
{
|
||||
Serial.println(F("Failed trying to update the MAC address"));
|
||||
while(1);
|
||||
}
|
||||
*/
|
||||
|
||||
uint16_t firmware = checkFirmwareVersion();
|
||||
if (firmware < 0x113) {
|
||||
Serial.println(F("Wrong firmware version!"));
|
||||
for(;;);
|
||||
}
|
||||
|
||||
displayMACAddress();
|
||||
|
||||
/* Optional: Get the SSID list (not available in 'tiny' mode) */
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
listSSIDResults();
|
||||
#endif
|
||||
|
||||
/* Delete any old connection data on the module */
|
||||
Serial.println(F("\nDeleting old connection profiles"));
|
||||
if (!cc3000.deleteProfiles()) {
|
||||
Serial.println(F("Failed!"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
/* Optional: Set a static IP address instead of using DHCP.
|
||||
Note that the setStaticIPAddress function will save its state
|
||||
in the CC3000's internal non-volatile memory and the details
|
||||
will be used the next time the CC3000 connects to a network.
|
||||
This means you only need to call the function once and the
|
||||
CC3000 will remember the connection details. To switch back
|
||||
to using DHCP, call the setDHCP() function (again only needs
|
||||
to be called once).
|
||||
*/
|
||||
/*
|
||||
uint32_t ipAddress = cc3000.IP2U32(192, 168, 1, 19);
|
||||
uint32_t netMask = cc3000.IP2U32(255, 255, 255, 0);
|
||||
uint32_t defaultGateway = cc3000.IP2U32(192, 168, 1, 1);
|
||||
uint32_t dns = cc3000.IP2U32(8, 8, 4, 4);
|
||||
if (!cc3000.setStaticIPAddress(ipAddress, netMask, defaultGateway, dns)) {
|
||||
Serial.println(F("Failed to set static IP!"));
|
||||
while(1);
|
||||
}
|
||||
*/
|
||||
/* Optional: Revert back from static IP addres to use DHCP.
|
||||
See note for setStaticIPAddress above, this only needs to be
|
||||
called once and will be remembered afterwards by the CC3000.
|
||||
*/
|
||||
/*
|
||||
if (!cc3000.setDHCP()) {
|
||||
Serial.println(F("Failed to set DHCP!"));
|
||||
while(1);
|
||||
}
|
||||
*/
|
||||
|
||||
/* Attempt to connect to an access point */
|
||||
char *ssid = WLAN_SSID; /* Max 32 chars */
|
||||
Serial.print(F("\nAttempting to connect to ")); Serial.println(ssid);
|
||||
|
||||
/* NOTE: Secure connections are not available in 'Tiny' mode!
|
||||
By default connectToAP will retry indefinitely, however you can pass an
|
||||
optional maximum number of retries (greater than zero) as the fourth parameter.
|
||||
*/
|
||||
if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
|
||||
Serial.println(F("Failed!"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
Serial.println(F("Connected!"));
|
||||
|
||||
/* Wait for DHCP to complete */
|
||||
Serial.println(F("Request DHCP"));
|
||||
while (!cc3000.checkDHCP())
|
||||
{
|
||||
delay(100); // ToDo: Insert a DHCP timeout!
|
||||
}
|
||||
|
||||
/* Display the IP address DNS, Gateway, etc. */
|
||||
while (! displayConnectionDetails()) {
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
/* Try looking up www.adafruit.com */
|
||||
uint32_t ip = 0;
|
||||
Serial.print(F("www.adafruit.com -> "));
|
||||
while (ip == 0) {
|
||||
if (! cc3000.getHostByName("www.adafruit.com", &ip)) {
|
||||
Serial.println(F("Couldn't resolve!"));
|
||||
}
|
||||
delay(500);
|
||||
}
|
||||
cc3000.printIPdotsRev(ip);
|
||||
|
||||
/* Do a quick ping test on adafruit.com */
|
||||
Serial.print(F("\n\rPinging ")); cc3000.printIPdotsRev(ip); Serial.print("...");
|
||||
uint8_t replies = cc3000.ping(ip, 5);
|
||||
Serial.print(replies); Serial.println(F(" replies"));
|
||||
if (replies)
|
||||
Serial.println(F("Ping successful!"));
|
||||
#endif
|
||||
|
||||
/* You need to make sure to clean up after yourself or the CC3000 can freak out */
|
||||
/* the next time you try to connect ... */
|
||||
Serial.println(F("\n\nClosing the connection"));
|
||||
cc3000.disconnect();
|
||||
}
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Displays the driver mode (tiny of normal), and the buffer
|
||||
size if tiny mode is not being used
|
||||
|
||||
@note The buffer size and driver mode are defined in cc3000_common.h
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void displayDriverMode(void)
|
||||
{
|
||||
#ifdef CC3000_TINY_DRIVER
|
||||
Serial.println(F("CC3000 is configure in 'Tiny' mode"));
|
||||
#else
|
||||
Serial.print(F("RX Buffer : "));
|
||||
Serial.print(CC3000_RX_BUFFER_SIZE);
|
||||
Serial.println(F(" bytes"));
|
||||
Serial.print(F("TX Buffer : "));
|
||||
Serial.print(CC3000_TX_BUFFER_SIZE);
|
||||
Serial.println(F(" bytes"));
|
||||
#endif
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the CC3000's internal firmware patch ID
|
||||
*/
|
||||
/**************************************************************************/
|
||||
uint16_t checkFirmwareVersion(void)
|
||||
{
|
||||
uint8_t major, minor;
|
||||
uint16_t version;
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
if(!cc3000.getFirmwareVersion(&major, &minor))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve the firmware version!\r\n"));
|
||||
version = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("Firmware V. : "));
|
||||
Serial.print(major); Serial.print(F(".")); Serial.println(minor);
|
||||
version = major; version <<= 8; version |= minor;
|
||||
}
|
||||
#endif
|
||||
return version;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the 6-byte MAC address of the CC3000 module
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void displayMACAddress(void)
|
||||
{
|
||||
uint8_t macAddress[6];
|
||||
|
||||
if(!cc3000.getMacAddress(macAddress))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve MAC Address!\r\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("MAC Address : "));
|
||||
cc3000.printHex((byte*)&macAddress, 6);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the IP address and other connection details
|
||||
*/
|
||||
/**************************************************************************/
|
||||
bool displayConnectionDetails(void)
|
||||
{
|
||||
uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;
|
||||
|
||||
if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve the IP Address!\r\n"));
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
|
||||
Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask);
|
||||
Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway);
|
||||
Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
|
||||
Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
|
||||
Serial.println();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Begins an SSID scan and prints out all the visible networks
|
||||
*/
|
||||
/**************************************************************************/
|
||||
|
||||
void listSSIDResults(void)
|
||||
{
|
||||
uint8_t valid, rssi, sec, index;
|
||||
char ssidname[33];
|
||||
|
||||
index = cc3000.startSSIDscan();
|
||||
|
||||
Serial.print(F("Networks found: ")); Serial.println(index);
|
||||
Serial.println(F("================================================"));
|
||||
|
||||
while (index) {
|
||||
index--;
|
||||
|
||||
valid = cc3000.getNextSSID(&rssi, &sec, ssidname);
|
||||
|
||||
Serial.print(F("SSID Name : ")); Serial.print(ssidname);
|
||||
Serial.println();
|
||||
Serial.print(F("RSSI : "));
|
||||
Serial.println(rssi);
|
||||
Serial.print(F("Security Mode: "));
|
||||
Serial.println(sec);
|
||||
Serial.println();
|
||||
}
|
||||
Serial.println(F("================================================"));
|
||||
|
||||
cc3000.stopSSIDscan();
|
||||
}
|
||||
@@ -1,347 +0,0 @@
|
||||
// This driver patcher will take 1.11.1 firmware modules up to 1.12
|
||||
// It seems to work, but it is 100% not guaranteed! Based on the TI driver patch
|
||||
// code for MSP430 - ladyada
|
||||
|
||||
// If you fail halfway thru update, you may have to restart and you may have lost
|
||||
// the MAC address in EEPROM so before you begin, write down your mac address!
|
||||
// You can re-burn the mac address in the buildtest example
|
||||
|
||||
#include <Adafruit_CC3000.h>
|
||||
#include <ccspi.h>
|
||||
#include <SPI.h>
|
||||
#include <string.h>
|
||||
#include <EEPROM.h>
|
||||
|
||||
#include "utility/debug.h"
|
||||
#include "utility/nvmem.h"
|
||||
#include "driverpatchinc.h"
|
||||
|
||||
#define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin!
|
||||
#define ADAFRUIT_CC3000_CS 10
|
||||
#define ADAFRUIT_CC3000_VBAT 5
|
||||
|
||||
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT);
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Displays the driver mode (tiny of normal), and the buffer
|
||||
size if tiny mode is not being used
|
||||
|
||||
@note The buffer size and driver mode are defined in cc3000_common.h
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void displayDriverMode(void)
|
||||
{
|
||||
#ifdef CC3000_TINY_DRIVER
|
||||
Serial.println(F("CC3000 is configure in 'Tiny' mode"));
|
||||
#else
|
||||
Serial.print(F("RX Buffer : "));
|
||||
Serial.print(CC3000_RX_BUFFER_SIZE);
|
||||
Serial.println(F(" bytes"));
|
||||
Serial.print(F("TX Buffer : "));
|
||||
Serial.print(CC3000_TX_BUFFER_SIZE);
|
||||
Serial.println(F(" bytes"));
|
||||
#endif
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the CC3000's internal firmware patch ID
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void displayFirmwareVersion(void)
|
||||
{
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
uint8_t major, minor;
|
||||
|
||||
if(!cc3000.getFirmwareVersion(&major, &minor))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve the firmware version!\r\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("Firmware V. : "));
|
||||
Serial.print(major); Serial.print(F(".")); Serial.println(minor);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the 6-byte MAC address of the CC3000 module
|
||||
*/
|
||||
/**************************************************************************/
|
||||
boolean MACvalid = false;
|
||||
// array to store MAC address from EEPROM
|
||||
uint8_t cMacFromEeprom[MAC_ADDR_LEN];
|
||||
void displayMACAddress(void)
|
||||
{
|
||||
if(!cc3000.getMacAddress(cMacFromEeprom))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve MAC Address!\r\n"));
|
||||
MACvalid = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("MAC Address : "));
|
||||
cc3000.printHex((byte*)&cMacFromEeprom, 6);
|
||||
MACvalid = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Sets up the HW and the CC3000 module (called automatically
|
||||
on startup)
|
||||
*/
|
||||
/**************************************************************************/
|
||||
|
||||
uint8_t ucStatus_Dr, return_status = 0xFF;
|
||||
uint8_t counter = 0;
|
||||
|
||||
// array to store RM parameters from EEPROM
|
||||
unsigned char cRMParamsFromEeprom[128];
|
||||
|
||||
|
||||
// 2 dim array to store address and length of new FAT
|
||||
uint16_t aFATEntries[2][NVMEM_RM_FILEID + 1] =
|
||||
/* address */ {{0x50, 0x1f0, 0x1390, 0x0390, 0x2390, 0x4390, 0x6390, 0x63a0, 0x63b0, 0x63f0, 0x6430, 0x6830},
|
||||
/* length */ {0x1a0, 0x1a0, 0x1000, 0x1000, 0x2000, 0x2000, 0x10, 0x10, 0x40, 0x40, 0x400, 0x200 }};
|
||||
/* 0. NVS */
|
||||
/* 1. NVS Shadow */
|
||||
/* 2. Wireless Conf */
|
||||
/* 3. Wireless Conf Shadow */
|
||||
/* 4. BT (WLAN driver) Patches */
|
||||
/* 5. WiLink (Firmware) Patches */
|
||||
/* 6. MAC addr */
|
||||
/* 7. Frontend Vars */
|
||||
/* 8. IP config */
|
||||
/* 9. IP config Shadow */
|
||||
/* 10. Bootloader Patches */
|
||||
/* 11. Radio Module params */
|
||||
/* 12. AES128 for smart config */
|
||||
/* 13. user file */
|
||||
/* 14. user file */
|
||||
/* 15. user file */
|
||||
|
||||
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("Hello, CC3000!\n"));
|
||||
|
||||
Serial.println(F("Hit any key & return to start"));
|
||||
while (!Serial.available());
|
||||
|
||||
pinMode(9, OUTPUT);
|
||||
pinMode(8, OUTPUT);
|
||||
pinMode(7, OUTPUT);
|
||||
pinMode(6, OUTPUT);
|
||||
digitalWrite(9, LOW);
|
||||
digitalWrite(8, LOW);
|
||||
digitalWrite(7, LOW);
|
||||
digitalWrite(6, LOW);
|
||||
|
||||
displayDriverMode();
|
||||
displayFreeRam();
|
||||
|
||||
/* Initialise the module */
|
||||
Serial.println(F("\nInitialising the CC3000 ..."));
|
||||
if (!cc3000.begin(2)) // init with NO patches!
|
||||
{
|
||||
Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
//displayFirmwareVersion();
|
||||
displayMACAddress();
|
||||
|
||||
return_status = 1;
|
||||
uint8_t index;
|
||||
uint8_t *pRMParams;
|
||||
|
||||
while ((return_status) && (counter < 3)) {
|
||||
// read RM parameters
|
||||
// read in 16 parts to work with tiny driver
|
||||
|
||||
return_status = 0;
|
||||
pRMParams = cRMParamsFromEeprom;
|
||||
|
||||
for (index = 0; index < 16; index++) {
|
||||
return_status |= nvmem_read(NVMEM_RM_FILEID, 8, 8*index, pRMParams);
|
||||
Serial.print(F("\n\rRead NVRAM $")); Serial.print(8*index); Serial.print("\t");
|
||||
for(uint8_t x=0; x<8; x++) {
|
||||
Serial.print("0x"); Serial.print(pRMParams[x], HEX); Serial.print(", ");
|
||||
}
|
||||
pRMParams += 8;
|
||||
}
|
||||
counter++;
|
||||
}
|
||||
// if RM file is not valid, load the default one
|
||||
if (counter == 3) {
|
||||
Serial.println(F("\n\rLoad default params"));
|
||||
pRMParams = (uint8_t *)cRMdefaultParams;
|
||||
} else {
|
||||
Serial.println(F("\n\rLoad EEPROM params"));
|
||||
pRMParams = cRMParamsFromEeprom;
|
||||
if (EEPROM.read(0) == 0xFF) {
|
||||
for (uint8_t e=0; e<128; e++) {
|
||||
EEPROM.write(e, cRMParamsFromEeprom[e]);
|
||||
}
|
||||
Serial.println(F("Backed up to eeprom!"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return_status = 1;
|
||||
|
||||
while (return_status) {
|
||||
// write new FAT
|
||||
return_status = fat_write_content(aFATEntries[0], aFATEntries[1]);
|
||||
Serial.print(F("Wrote FAT entries: ")); Serial.println(return_status, DEC);
|
||||
}
|
||||
|
||||
//Serial.println(F("Stopping..."));
|
||||
//cc3000.stop();
|
||||
|
||||
//Serial.println(F("\nInitialising the CC3000 ..."));
|
||||
|
||||
//if (!cc3000.begin(2)) // no patches!
|
||||
//{
|
||||
// Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
|
||||
// while(1);
|
||||
//}
|
||||
|
||||
return_status = 1;
|
||||
|
||||
Serial.println(F("Write params"));
|
||||
|
||||
while (return_status) {
|
||||
// write RM parameters
|
||||
// write in 4 parts to work with tiny driver
|
||||
|
||||
return_status = 0;
|
||||
|
||||
for (index = 0; index < 4; index++) {
|
||||
return_status |= nvmem_write(NVMEM_RM_FILEID, 32, 32*index, (pRMParams + 32*index));
|
||||
Serial.println(F("Wrote 32 bytes to NVRAM"));
|
||||
}
|
||||
}
|
||||
Serial.println(F("Wrote params"));
|
||||
|
||||
return_status = 1;
|
||||
|
||||
// write back the MAC address, only if exist
|
||||
if (MACvalid) {
|
||||
// zero out MCAST bit if set
|
||||
cMacFromEeprom[0] &= 0xfe;
|
||||
while (return_status) {
|
||||
return_status = nvmem_set_mac_address(cMacFromEeprom);
|
||||
}
|
||||
}
|
||||
|
||||
ucStatus_Dr = 1;
|
||||
Serial.println(F("Writing driver patch"));
|
||||
|
||||
while (ucStatus_Dr) {
|
||||
//writing driver patch to EEPRROM - PROTABLE CODE
|
||||
// Note that the array itself is changing between the different Service Packs
|
||||
ucStatus_Dr = nvmem_write_patch(NVMEM_WLAN_DRIVER_SP_FILEID, drv_length, wlan_drv_patch);
|
||||
}
|
||||
|
||||
|
||||
Serial.println(F("Wrote driver patch"));
|
||||
|
||||
Serial.println(F("Starting w/o patches"));
|
||||
|
||||
//if (!cc3000.begin(2))
|
||||
//{
|
||||
// Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
|
||||
// while(1);
|
||||
//}
|
||||
|
||||
Serial.println(F("Writing firmware"));
|
||||
|
||||
unsigned char ucStatus_FW = 1;
|
||||
|
||||
while (ucStatus_FW) {
|
||||
//writing FW patch to EAPRROM - PROTABLE CODE
|
||||
//Note that the array itself is changing between the different Service Packs
|
||||
ucStatus_FW = nvmem_write_patch(NVMEM_WLAN_FW_SP_FILEID, fw_length, fw_patch);
|
||||
}
|
||||
|
||||
Serial.println(F("Starting w/patches"));
|
||||
|
||||
cc3000.reboot();
|
||||
/*
|
||||
if (!)
|
||||
{
|
||||
Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
|
||||
while(1);
|
||||
}
|
||||
*/
|
||||
Serial.println(F("Patched!"));
|
||||
displayFirmwareVersion();
|
||||
displayMACAddress();
|
||||
}
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! fat_write_content
|
||||
//!
|
||||
//! \param[in] file_address array of file address in FAT table:\n
|
||||
//! this is the absolute address of the file in the EEPROM.
|
||||
//! \param[in] file_length array of file length in FAT table:\n
|
||||
//! this is the upper limit of the file size in the EEPROM.
|
||||
//!
|
||||
//! \return on succes 0, error otherwise
|
||||
//!
|
||||
//! \brief parse the FAT table from eeprom
|
||||
//
|
||||
//*****************************************************************************
|
||||
uint8_t fat_write_content(uint16_t *file_address, uint16_t *file_length)
|
||||
{
|
||||
uint16_t index = 0;
|
||||
uint8_t ucStatus;
|
||||
uint8_t fatTable[48];
|
||||
uint8_t* fatTablePtr = fatTable;
|
||||
uint8_t LS[3] = "LS";
|
||||
|
||||
// first, write the magic number
|
||||
ucStatus = nvmem_write(16, 2, 0, LS);
|
||||
|
||||
for (; index <= NVMEM_RM_FILEID; index++)
|
||||
{
|
||||
// write address low char and mark as allocated
|
||||
*fatTablePtr++ = (uint8_t)(file_address[index] & 0xff) | _BV(0);
|
||||
|
||||
// write address high char
|
||||
*fatTablePtr++ = (uint8_t)((file_address[index]>>8) & 0xff);
|
||||
|
||||
// write length low char
|
||||
*fatTablePtr++ = (uint8_t)(file_length[index] & 0xff);
|
||||
|
||||
// write length high char
|
||||
*fatTablePtr++ = (uint8_t)((file_length[index]>>8) & 0xff);
|
||||
}
|
||||
|
||||
// second, write the FAT
|
||||
// write in two parts to work with tiny driver
|
||||
ucStatus = nvmem_write(16, 24, 4, fatTable);
|
||||
ucStatus = nvmem_write(16, 24, 24+4, &fatTable[24]);
|
||||
|
||||
// third, we want to erase any user files
|
||||
memset(fatTable, 0, sizeof(fatTable));
|
||||
ucStatus = nvmem_write(16, 16, 52, fatTable);
|
||||
|
||||
return ucStatus;
|
||||
}
|
||||
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
delay(1000);
|
||||
}
|
||||
@@ -1,104 +0,0 @@
|
||||
//Service Pack version P1.12.7.15.26 - Driver patches
|
||||
|
||||
uint8_t cRMdefaultParams[128] = { 0x03, 0x00, 0x01, 0x01, 0x14, 0x14, 0x00, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x23, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x23, 0x23, 0x23, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x01, 0x77, 0x80, 0x1D, 0x1F, 0x22, 0x26, 0x28, 0x29, 0x1A, 0x1F, 0x22, 0x24, 0x26, 0x28, 0x16, 0x1D, 0x1E, 0x20, 0x24, 0x25, 0x1E, 0x2D, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x15, 0x15, 0x15, 0x11, 0x15, 0x15, 0x0E, 0x00};
|
||||
|
||||
unsigned char PROGMEM wlan_drv_patch[8076] = { 0x00, 0x01, 0x00, 0x00, 0x84, 0x1F, 0x00, 0x00, 0xF0, 0x03, 0x18, 0x00, 0xE4, 0x62, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7A, 0x63, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x10, 0x64, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x20, 0x0C, 0x49, 0x08, 0x60, 0x0C, 0x48, 0x19, 0x30, 0xF7, 0x46, 0x30, 0xB5, 0x05, 0x1C, 0xAC, 0x69, 0x68, 0x68, 0x5F, 0x30, 0x09, 0xD1, 0x60, 0x6B, 0x0C, 0x38, 0x01, 0x21, 0x8E, 0x46, 0x06, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x00, 0x20, 0x60, 0x63, 0xAC, 0x69, 0x6C, 0x60, 0x04, 0x48, 0x5B, 0x30, 0x30, 0xBD, 0x40, 0x3B, 0x08, 0x00, 0x49, 0xD0, 0x01, 0x00, 0x09, 0xEA, 0x02, 0x00, 0x91, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA6, 0x64, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3C, 0x65, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xB5, 0x85, 0xB0, 0x05, 0x1C, 0xA8, 0x88, 0x00, 0x90, 0x28, 0x89, 0x01, 0x90, 0xE9, 0x68, 0x02, 0x91, 0x28, 0x7C, 0x03, 0x90, 0x2A, 0x6A, 0x00, 0x20, 0x17, 0x56, 0x68, 0x60, 0x00, 0x29, 0x4C, 0xD0, 0x00, 0x2F, 0x4A, 0xDC ,
|
||||
0xCA, 0x49, 0x0C, 0x1C, 0x08, 0x26, 0x04, 0x90, 0x21, 0x88, 0x00, 0x98, 0x81, 0x42, 0x0C, 0xD1, 0x62, 0x88, 0x01, 0x98, 0x82, 0x42, 0x08, 0xD1, 0x46, 0x20, 0x02, 0x5D, 0x03, 0x98, 0x82, 0x42, 0x03, 0xD1, 0x0E, 0x20, 0x00, 0x57, 0xB8, 0x42, 0x0A, 0xD0, 0x46, 0x20, 0x00, 0x5D, 0x11, 0x28, 0x22, 0xD1, 0x00, 0x98, 0x81, 0x42, 0x1F, 0xD1, 0x0E, 0x20, 0x00, 0x57, 0xFF, 0xFF, 0xD2, 0x65, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0xB8, 0x42, 0x1B, 0xD1, 0x04, 0x20, 0x02, 0x1C, 0x02, 0x98, 0xB9, 0x49, 0x01, 0x23, 0x9E, 0x46, 0xEA, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x00, 0x28, 0x17, 0xD0, 0x20, 0x1D, 0x02, 0x99, 0x04, 0x22, 0x01, 0x23, 0x9E, 0x46, 0xE5, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x00, 0x28, 0x0D, 0xD0, 0x46, 0x20, 0x00, 0x5D, 0x11, 0x28, 0x09, 0xD0, 0xA0, 0x6D, 0x00, 0x28, 0x06, 0xD0, 0xAC, 0x34, 0x04, 0x98, 0x01, 0x30, 0x04, 0x90, 0x01, 0x3E, 0xC1, 0xD1, 0x07, 0xE0, 0x04, 0x98, 0x00, 0x06, 0x00, 0x0E ,
|
||||
0xAC, 0x21, 0x41, 0x43, 0xA6, 0x48, 0x40, 0x18, 0x68, 0x60, 0xA6, 0x48, 0xAD, 0x30, 0x05, 0xB0, 0xF0, 0xBD, 0x00, 0xB5, 0xC2, 0x68, 0x90, 0x69, 0x02, 0x21, 0x01, 0x23, 0x9E, 0x46, 0xA2, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xA2, 0x48, 0x61, 0x30, 0x00, 0xBD, 0x01, 0x79, 0x0B, 0x29, 0x03, 0xD0, 0x89, 0x00, 0x9F, 0x4A, 0x51, 0x5A, 0x01, 0xE0, 0x01, 0x21, 0x49, 0x02, 0x41, 0x60, 0x9D, 0x48, 0x0D, 0x30, 0xF7, 0x46, 0x01, 0x1C, 0xFF, 0xFF, 0x68, 0x66, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x9C, 0x48, 0x02, 0x68, 0x9C, 0x48, 0x01, 0x2A, 0x01, 0xD1, 0x25, 0x30, 0xF7, 0x46, 0x9B, 0x4A, 0x12, 0x68, 0x4A, 0x60, 0x19, 0x30, 0xF7, 0x46, 0x00, 0x21, 0x41, 0x60, 0x99, 0x48, 0x98, 0x49, 0x08, 0x18, 0xF7, 0x46, 0x00, 0x21, 0x41, 0x60, 0x97, 0x48, 0xE5, 0x49, 0x08, 0x18, 0xF7, 0x46, 0xFF, 0xB5, 0x46, 0x69, 0x40, 0x68, 0x01, 0x90, 0x94, 0x49, 0x0A, 0x7C, 0x9A, 0x4F, 0x01, 0x2A, 0x63, 0xD0, 0x09, 0x7C, 0x03, 0x29 ,
|
||||
0x60, 0xD0, 0x91, 0x4A, 0x92, 0x4B, 0x00, 0x21, 0x02, 0x91, 0x59, 0x56, 0x24, 0x23, 0x59, 0x43, 0x53, 0x18, 0x03, 0x93, 0x01, 0x28, 0x17, 0xD1, 0x8A, 0x18, 0x04, 0x23, 0x6C, 0x46, 0x8C, 0x49, 0x15, 0x79, 0x08, 0x78, 0xC0, 0x43, 0x28, 0x43, 0x20, 0x70, 0x01, 0x32, 0x01, 0x31, 0x01, 0x34, 0x01, 0x3B, 0xF5, 0xD1, 0x31, 0x1D, 0x68, 0x46, 0x04, 0x22, 0x01, 0x23, 0x9E, 0x46, 0xA7, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x00, 0x28, 0x40, 0xD0, 0x35, 0x1D, 0x82, 0x48, 0x00, 0x78, 0xFF, 0x28, 0xFF, 0xFF, 0xFE, 0x66, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x11, 0xD0, 0x00, 0x28, 0x0F, 0xD0, 0x03, 0x98, 0x01, 0x1D, 0x28, 0x1C, 0x01, 0x24, 0xA6, 0x46, 0x7E, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x00, 0x28, 0x05, 0xD1, 0x7A, 0x48, 0xA6, 0x46, 0x7B, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x05, 0xE0, 0x28, 0x1C, 0x01, 0x21, 0x8E, 0x46, 0x78, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x01, 0x99, 0x01, 0x29, 0x01, 0xD1, 0x00, 0x28, 0x1E, 0xD1 ,
|
||||
0x01, 0x99, 0x5F, 0x31, 0x01, 0xD0, 0x00, 0x28, 0x0F, 0xD1, 0xA8, 0x20, 0x81, 0x5D, 0x00, 0x29, 0x08, 0xD0, 0x49, 0x1E, 0x81, 0x55, 0x80, 0x5D, 0x00, 0x28, 0x09, 0xD1, 0x38, 0x1C, 0xFF, 0x30, 0x08, 0x30, 0x11, 0xE0, 0x03, 0x21, 0x02, 0x91, 0x00, 0xE0, 0xA8, 0x20, 0x02, 0x99, 0x81, 0x55, 0x38, 0x1C, 0xFF, 0x30, 0x16, 0x30, 0x07, 0xE0, 0x01, 0x98, 0x01, 0x28, 0x02, 0xD1, 0x38, 0x1C, 0xA3, 0x30, 0x01, 0xE0, 0x38, 0x1C, 0x9F, 0x30, 0x00, 0x90, 0xFF, 0xBD, 0x00, 0xB5, 0x02, 0x1C, 0x10, 0x6A, 0xD1, 0x69, 0x52, 0x69, 0xC3, 0x69, 0x5A, 0x60, 0xFF, 0xFF, 0x94, 0x67, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x01, 0x22, 0x96, 0x46, 0x5E, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x5E, 0x48, 0xFF, 0x30, 0x6E, 0x30, 0x00, 0xBD, 0x10, 0xB5, 0x0A, 0x1C, 0x41, 0x69, 0x00, 0x6A, 0x93, 0x69, 0xDB, 0x69, 0x58, 0x60, 0x90, 0x69, 0x01, 0x24, 0xA6, 0x46, 0x56, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0xA6, 0x46, 0x56, 0x48, 0xFE, 0x44 ,
|
||||
0x00, 0x47, 0x55, 0x48, 0xFF, 0x30, 0xB6, 0x30, 0x10, 0xBD, 0x70, 0xB5, 0x05, 0x1C, 0x6E, 0x69, 0x53, 0x48, 0x02, 0x68, 0x5C, 0x21, 0x88, 0x5D, 0x04, 0x28, 0x15, 0xD1, 0x07, 0x20, 0x88, 0x55, 0x10, 0x0B, 0x11, 0xD2, 0x01, 0x24, 0xA6, 0x46, 0x4E, 0x48, 0xFE, 0x44, 0x00, 0x47, 0x00, 0x28, 0x0A, 0xD0, 0x47, 0x21, 0x89, 0x57, 0xC1, 0x60, 0x11, 0x21, 0xC9, 0x02, 0x00, 0x22, 0x04, 0x23, 0xA6, 0x46, 0x48, 0x4C, 0xFE, 0x44, 0x20, 0x47, 0x01, 0x20, 0x68, 0x60, 0x43, 0x48, 0x46, 0x49, 0x08, 0x18, 0x70, 0xBD, 0x70, 0xB5, 0x05, 0x1C, 0xAE, 0x69, 0x9C, 0x20, 0x80, 0x19, 0x4B, 0x21, 0x89, 0x00, 0x01, 0x24, 0xFF, 0xFF, 0x2A, 0x68, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0xA6, 0x46, 0x41, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x5C, 0x21, 0x88, 0x5D, 0x07, 0x28, 0x01, 0xD1, 0x09, 0x20, 0x00, 0xE0, 0x05, 0x20, 0xAA, 0x69, 0x88, 0x54, 0x30, 0x1C, 0xA6, 0x46, 0xEA, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x68, 0x60, 0xE9, 0x48 ,
|
||||
0x4D, 0x30, 0x70, 0xBD, 0xF0, 0xB5, 0x41, 0x68, 0x82, 0x68, 0x88, 0x23, 0x5E, 0x18, 0x37, 0x88, 0x0B, 0x6F, 0x00, 0x2B, 0x01, 0xD1, 0x00, 0x2F, 0x10, 0xD1, 0x06, 0x2F, 0x02, 0xDD, 0x00, 0x21, 0xC9, 0x43, 0x07, 0xE0, 0x33, 0x88, 0x9B, 0x00, 0xC9, 0x18, 0x0A, 0x67, 0x31, 0x88, 0x01, 0x31, 0x31, 0x80, 0x01, 0x21, 0x81, 0x60, 0xEA, 0x48, 0x1D, 0x30, 0xF0, 0xBD, 0x0B, 0x1C, 0x01, 0x24, 0x5D, 0x6F, 0x1D, 0x67, 0x04, 0x33, 0x01, 0x34, 0x06, 0x2C, 0xE1, 0xDA, 0xF8, 0xE7, 0x00, 0xB5, 0x00, 0x21, 0xC1, 0x60, 0xEB, 0x48, 0x01, 0x68, 0x10, 0x31, 0xE8, 0x48, 0x20, 0x22, 0x01, 0x23, 0x9E, 0x46, 0xE9, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xE7, 0x48, 0xFB, 0x30, 0x00, 0xBD, 0xFF, 0xFF, 0xC0, 0x68, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x14, 0x0D, 0x1B, 0x00, 0x54, 0x19, 0x1B, 0x00, 0x91, 0x1A, 0x01, 0x00, 0x4B, 0xAD, 0x03, 0x00, 0x61, 0x4E, 0x01, 0x00, 0x06, 0x32, 0x08, 0x00, 0x1F, 0x0B, 0x02, 0x00, 0x54, 0x3F ,
|
||||
0x08, 0x00, 0x45, 0xC1, 0x00, 0x00, 0x84, 0x3C, 0x08, 0x00, 0x1B, 0x02, 0x00, 0x00, 0xED, 0x17, 0x00, 0x00, 0xF3, 0xC1, 0x01, 0x00, 0x34, 0x19, 0x1B, 0x00, 0x08, 0x19, 0x1B, 0x00, 0xA6, 0x44, 0x08, 0x00, 0x1C, 0x17, 0x1B, 0x00, 0x18, 0x17, 0x1B, 0x00, 0xCB, 0x67, 0x03, 0x00, 0x0D, 0x47, 0x02, 0x00, 0x39, 0x42, 0x03, 0x00, 0xBD, 0xE7, 0x02, 0x00, 0xB1, 0x40, 0x03, 0x00, 0xB9, 0xEA, 0x01, 0x00, 0x45, 0xDA, 0x00, 0x00, 0x24, 0x41, 0x08, 0x00, 0x71, 0xC0, 0x02, 0x00, 0x7B, 0xC0, 0x02, 0x00, 0x9F, 0x03, 0x00, 0x00, 0x7D, 0xB8, 0x03, 0x00, 0xF0, 0xB5, 0x88, 0xB0, 0x06, 0x91, 0x07, 0x90, 0x86, 0x69, 0xF0, 0x1C, 0xE5, 0xA1, 0x04, 0x22, 0x01, 0x24, 0xA6, 0x46, 0x0F, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x00, 0x28, 0x40, 0xD1, 0xFF, 0xFF, 0x56, 0x69, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0xF3, 0x79, 0xE3, 0x48, 0x1A, 0x1C, 0x03, 0x70, 0x30, 0x7A, 0x00, 0x90, 0x70, 0x7A, 0x01, 0x90, 0x03, 0x20, 0x2F, 0x49 ,
|
||||
0xF0, 0x31, 0xA6, 0x46, 0xDF, 0x4D, 0xFE, 0x44, 0x28, 0x47, 0xF2, 0x79, 0x35, 0x7A, 0x77, 0x7A, 0x78, 0x1B, 0x43, 0x1C, 0x93, 0x42, 0x1E, 0xD0, 0x16, 0x2A, 0x0F, 0xDB, 0x00, 0x2D, 0x0D, 0xD1, 0x01, 0xE0, 0x8F, 0xC6, 0x03, 0x00, 0xDB, 0x48, 0x04, 0x70, 0x0A, 0x20, 0x81, 0x19, 0xD5, 0x48, 0x1A, 0x1C, 0xA6, 0x46, 0xAF, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x82, 0xE0, 0xD7, 0x48, 0x04, 0x70, 0xD1, 0x48, 0x40, 0x19, 0x0A, 0x21, 0x89, 0x19, 0x7A, 0x1B, 0x52, 0x1C, 0xA6, 0x46, 0xA8, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x75, 0xE0, 0xCF, 0x48, 0x04, 0x70, 0xCF, 0x48, 0x04, 0x70, 0x0A, 0x20, 0x81, 0x19, 0xC8, 0x48, 0xA6, 0x46, 0xA2, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x69, 0xE0, 0xF0, 0x1C, 0x03, 0x27, 0xC1, 0xA1, 0x3A, 0x1C, 0xA6, 0x46, 0xCC, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x00, 0x28, 0x5F, 0xD1, 0xFF, 0xFF, 0xEC, 0x69, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0xFF, 0xE7, 0xF1, 0x79, 0xC0, 0x48, 0x01, 0x70, 0xC0, 0x4D ,
|
||||
0xB2, 0x79, 0x2A, 0x70, 0x38, 0x1C, 0x0A, 0x49, 0xF4, 0x31, 0xA6, 0x46, 0xBE, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x28, 0x78, 0x00, 0x28, 0x0E, 0xD1, 0xBE, 0x48, 0x04, 0x70, 0xBE, 0x48, 0x04, 0x70, 0x38, 0x1C, 0x03, 0x49, 0xF5, 0x31, 0xA6, 0x46, 0xBC, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x02, 0xE0, 0xC0, 0x46, 0xC7, 0x04, 0x00, 0x00, 0x30, 0x7A, 0x00, 0x90, 0x70, 0x7A, 0x01, 0x90, 0xAF, 0x48, 0x02, 0x78, 0xF3, 0x79, 0x38, 0x1C, 0xB6, 0x49, 0xF6, 0x31, 0xA6, 0x46, 0xAA, 0x4D, 0xFE, 0x44, 0x28, 0x47, 0x23, 0x1C, 0xF2, 0x79, 0x37, 0x7A, 0x70, 0x7A, 0xC1, 0x1B, 0x4D, 0x1C, 0x95, 0x42, 0x1E, 0xD0, 0xA6, 0x49, 0x09, 0x78, 0x16, 0x29, 0x0C, 0xDB, 0x00, 0x2F, 0x0A, 0xD1, 0xA8, 0x48, 0x03, 0x70, 0x0A, 0x20, 0x81, 0x19, 0xE7, 0x48, 0x2A, 0x1C, 0xA6, 0x46, 0x7A, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x18, 0xE0, 0xA4, 0x49, 0x0B, 0x70, 0xE3, 0x49, 0xCB, 0x19, 0xFF, 0xFF, 0x82, 0x6A, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00 ,
|
||||
0x0A, 0x21, 0x89, 0x19, 0xC0, 0x1B, 0x42, 0x1C, 0x18, 0x1C, 0xA6, 0x46, 0x73, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x0A, 0xE0, 0x9C, 0x48, 0x03, 0x70, 0x9C, 0x48, 0x03, 0x70, 0x0A, 0x20, 0x81, 0x19, 0xDA, 0x48, 0xA6, 0x46, 0x6D, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x94, 0x48, 0x00, 0x78, 0x00, 0x28, 0x0A, 0xD0, 0x93, 0x48, 0x00, 0x78, 0x00, 0x28, 0x06, 0xD0, 0x92, 0x48, 0x00, 0x78, 0x00, 0x28, 0x02, 0xD0, 0x91, 0x48, 0x00, 0x78, 0x00, 0x28, 0x00, 0xD1, 0x8C, 0xE0, 0x03, 0x20, 0x17, 0x21, 0x89, 0x01, 0xA6, 0x46, 0x8E, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x85, 0x48, 0x01, 0x78, 0x85, 0x48, 0x07, 0x78, 0x82, 0x4E, 0x80, 0x4D, 0xDF, 0x48, 0x00, 0x68, 0x00, 0x28, 0x2E, 0xD1, 0x07, 0x98, 0x41, 0x61, 0x06, 0x62, 0xC5, 0x48, 0x06, 0x9A, 0x10, 0x64, 0x02, 0x2F, 0x01, 0xD0, 0x03, 0x2F, 0x01, 0xD1, 0x03, 0x22, 0x00, 0xE0, 0x3A, 0x1C, 0x06, 0x9B, 0xDA, 0x63, 0x2A, 0x78, 0x9A, 0x63, 0x01, 0x2F, 0x03, 0xD1, 0x05, 0x29 ,
|
||||
0xFF, 0xFF, 0x18, 0x6B, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x04, 0xD0, 0x0D, 0x29, 0x02, 0xD0, 0xEB, 0x48, 0xDB, 0x30, 0x64, 0xE0, 0x00, 0x25, 0x00, 0x95, 0x01, 0x91, 0x02, 0x96, 0x03, 0x95, 0x04, 0x90, 0x2B, 0x1C, 0x20, 0x1C, 0x01, 0x1C, 0x8E, 0x46, 0xE5, 0x4E, 0xFE, 0x44, 0x30, 0x47, 0xE5, 0x48, 0x04, 0x60, 0x28, 0x1C, 0xA6, 0x46, 0xE4, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x4C, 0xE0, 0x0D, 0x27, 0x00, 0x20, 0x39, 0x1C, 0x05, 0xAA, 0xA6, 0x46, 0xE1, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x68, 0x46, 0x80, 0x8A, 0x40, 0x08, 0x05, 0xD2, 0x38, 0x1C, 0x50, 0x21, 0xA6, 0x46, 0xDB, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x38, 0x1C, 0x23, 0x1C, 0x29, 0x1C, 0x00, 0x22, 0x9E, 0x46, 0xEE, 0x4F, 0xFE, 0x44, 0x38, 0x47, 0x2B, 0x78, 0x0D, 0x20, 0x31, 0x1C, 0x22, 0x1C, 0x96, 0x46, 0xEA, 0x4E, 0xFE, 0x44, 0x30, 0x47, 0x28, 0x78, 0x01, 0x30, 0x02, 0x1C, 0x0D, 0x20, 0x56, 0x49, 0x23, 0x1C, 0x9E, 0x46, 0xE5, 0x4E, 0xFE, 0x44 ,
|
||||
0x30, 0x47, 0x54, 0x4E, 0x28, 0x78, 0x02, 0x30, 0x02, 0x1C, 0xFF, 0xFF, 0xAE, 0x6B, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x0D, 0x20, 0x31, 0x1C, 0x23, 0x1C, 0x9E, 0x46, 0xE0, 0x4F, 0xFE, 0x44, 0x38, 0x47, 0x30, 0x78, 0x00, 0x28, 0x0A, 0xD0, 0x28, 0x78, 0x03, 0x30, 0x02, 0x1C, 0x4A, 0x48, 0x03, 0x78, 0x0D, 0x20, 0x8F, 0x49, 0xA6, 0x46, 0xD9, 0x4D, 0xFE, 0x44, 0x28, 0x47, 0xBE, 0x48, 0x21, 0x1C, 0x01, 0x60, 0x00, 0x20, 0x8E, 0x46, 0xBD, 0x49, 0xFE, 0x44, 0x08, 0x47, 0xB8, 0x48, 0xEB, 0x49, 0x08, 0x18, 0x08, 0xB0, 0xF0, 0xBD, 0xC0, 0x46, 0xC9, 0x21, 0x01, 0x00, 0x91, 0xE1, 0x00, 0x00, 0x01, 0x1C, 0xE7, 0x48, 0x02, 0x68, 0xE7, 0x48, 0x00, 0x2A, 0x04, 0xD0, 0x00, 0x22, 0x0A, 0x62, 0x8A, 0x61, 0x1D, 0x30, 0xF7, 0x46, 0xD7, 0x30, 0xF7, 0x46, 0x01, 0x1C, 0xE2, 0x48, 0x02, 0x68, 0xE2, 0x48, 0x00, 0x2A, 0x02, 0xD0, 0xFF, 0x30, 0xB4, 0x30, 0xF7, 0x46, 0x00, 0x22, 0xCA, 0x61, 0x8A, 0x61, 0x4F, 0x30 ,
|
||||
0xF7, 0x46, 0xC0, 0x46, 0x89, 0x17, 0x02, 0x00, 0xDC, 0x48, 0x01, 0x68, 0x8A, 0x69, 0x01, 0x20, 0xC0, 0x03, 0x10, 0x43, 0xFF, 0xFF, 0x44, 0x6C, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x88, 0x61, 0x00, 0x20, 0x08, 0x61, 0xD9, 0x48, 0x23, 0x30, 0xF7, 0x46, 0x46, 0x17, 0x1B, 0x00, 0x30, 0x3F, 0x08, 0x00, 0x41, 0xEB, 0x00, 0x00, 0x09, 0xB4, 0x03, 0x00, 0x70, 0xB5, 0x05, 0x1C, 0xD3, 0x4E, 0x29, 0x6A, 0xEA, 0x69, 0x30, 0x1C, 0x01, 0x24, 0xA6, 0x46, 0xD4, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x68, 0x69, 0xA6, 0x46, 0xCF, 0x49, 0xFE, 0x44, 0x08, 0x47, 0xA8, 0x69, 0x06, 0x30, 0xA8, 0x60, 0xCD, 0x48, 0x00, 0x68, 0x68, 0x60, 0xEE, 0x60, 0xCC, 0x48, 0x6D, 0x30, 0x70, 0xBD, 0x30, 0xB5, 0xF1, 0x48, 0x01, 0x6D, 0x80, 0x6C, 0x08, 0x43, 0x18, 0xD0, 0xEF, 0x49, 0x08, 0x1C, 0x07, 0x22, 0xFF, 0x23, 0x09, 0x33, 0x1B, 0x58, 0x00, 0x2B, 0x04, 0xD0, 0xFF, 0x30, 0x1D, 0x30, 0x01, 0x3A, 0xF6, 0xD1, 0x0B, 0xE0, 0x02, 0x20 ,
|
||||
0xF0, 0x4A, 0xF1, 0x4B, 0x01, 0x24, 0xA6, 0x46, 0xF0, 0x4D, 0xFE, 0x44, 0x28, 0x47, 0xA6, 0x46, 0xEF, 0x48, 0xFE, 0x44, 0x00, 0x47, 0xEF, 0x48, 0xFF, 0x30, 0x5C, 0x30, 0x30, 0xBD, 0xFF, 0xFF, 0xDA, 0x6C, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0xC0, 0x46, 0x53, 0x53, 0x49, 0x44, 0x00, 0xC0, 0x46, 0xC0, 0x4B, 0x45, 0x59, 0x00, 0xEE, 0x62, 0x08, 0x00, 0x13, 0x7F, 0x03, 0x00, 0xF0, 0x62, 0x08, 0x00, 0xEC, 0x62, 0x08, 0x00, 0xED, 0x62, 0x08, 0x00, 0xE7, 0x7E, 0x03, 0x00, 0xE8, 0x62, 0x08, 0x00, 0xE9, 0x62, 0x08, 0x00, 0xEA, 0x62, 0x08, 0x00, 0xEB, 0x62, 0x08, 0x00, 0xDD, 0x7E, 0x03, 0x00, 0x8F, 0xC6, 0x03, 0x00, 0xC7, 0x04, 0x00, 0x00, 0xF0, 0xB5, 0x87, 0xB0, 0x00, 0x91, 0x01, 0x90, 0x6B, 0x48, 0x01, 0x68, 0xCD, 0x4A, 0x14, 0x1C, 0x02, 0x94, 0x07, 0x26, 0x00, 0x25, 0x03, 0x95, 0x04, 0x94, 0x05, 0x95, 0xDD, 0x48, 0x00, 0x68, 0x08, 0x43, 0x27, 0xD0, 0xE0, 0x68, 0x03, 0x99, 0x88, 0x42, 0x0A, 0xDD ,
|
||||
0x03, 0x90, 0x40, 0x1C, 0x00, 0x99, 0x88, 0x60, 0xC3, 0x49, 0xFF, 0x20, 0x1D, 0x30, 0x68, 0x43, 0x0C, 0x18, 0xE0, 0x68, 0x04, 0x91, 0x02, 0x99, 0xC9, 0x68, 0x88, 0x42, 0x10, 0xDB, 0x88, 0x42, 0x10, 0xD1, 0x02, 0x98, 0x01, 0x27, 0xBE, 0x46, 0xFF, 0xFF, 0x70, 0x6D, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0xCC, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x06, 0x90, 0x20, 0x1C, 0xBE, 0x46, 0xC9, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x06, 0x99, 0x88, 0x42, 0x01, 0xDA, 0x05, 0x95, 0x02, 0x94, 0x51, 0x48, 0x01, 0x68, 0xFF, 0x27, 0x09, 0x37, 0x38, 0x59, 0x00, 0x28, 0x06, 0xD0, 0xC5, 0x48, 0x00, 0x68, 0x07, 0x2E, 0x00, 0xD1, 0x2E, 0x1C, 0x08, 0x43, 0x04, 0xD0, 0xFF, 0x34, 0x1D, 0x34, 0x01, 0x35, 0x07, 0x2D, 0xC2, 0xDB, 0x07, 0x2E, 0x0A, 0xD1, 0xBE, 0x48, 0x00, 0x68, 0x08, 0x43, 0x06, 0xD0, 0x05, 0x9E, 0x30, 0x1C, 0x01, 0x21, 0x8E, 0x46, 0xB8, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x01, 0x98, 0x47, 0x61, 0x00, 0x21, 0x81, 0x61 ,
|
||||
0xFF, 0x22, 0x1D, 0x32, 0x72, 0x43, 0x04, 0x99, 0x89, 0x18, 0xC1, 0x61, 0x06, 0x62, 0xB2, 0x48, 0x39, 0x30, 0x07, 0xB0, 0xF0, 0xBD, 0x10, 0xB5, 0x04, 0x1C, 0x00, 0x20, 0x01, 0x21, 0x8E, 0x46, 0xAF, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x40, 0x1E, 0x00, 0xD5, 0x00, 0x20, 0x60, 0x60, 0xE0, 0x61, 0xAC, 0x48, 0xFF, 0xFF, 0x06, 0x6E, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x21, 0x30, 0x10, 0xBD, 0xC0, 0x46, 0x10, 0x63, 0x08, 0x00, 0x70, 0xB5, 0x04, 0x1C, 0xE5, 0x69, 0x66, 0x69, 0x00, 0x20, 0x01, 0x21, 0x8E, 0x46, 0xA5, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x60, 0x60, 0xAB, 0x19, 0xA4, 0x4A, 0xA3, 0x49, 0x93, 0x42, 0x02, 0xD3, 0x9A, 0x1A, 0x82, 0x42, 0x02, 0xD9, 0x08, 0x1C, 0x99, 0x30, 0x70, 0xBD, 0x08, 0x1C, 0xAB, 0x30, 0x70, 0xBD, 0x08, 0x6B, 0x41, 0x7D, 0x02, 0x88, 0x92, 0x00, 0x51, 0x1A, 0x3C, 0x39, 0xFF, 0x22, 0x5F, 0x32, 0x91, 0x42, 0x03, 0xD9, 0x65, 0x21, 0x01, 0x80, 0x02, 0x21, 0x81, 0x73, 0x99, 0x48 ,
|
||||
0x97, 0x49, 0x08, 0x18, 0xF7, 0x46, 0xC0, 0x46, 0x30, 0x63, 0x08, 0x00, 0xF8, 0xB5, 0x40, 0x68, 0x24, 0x21, 0x41, 0x43, 0x95, 0x48, 0x45, 0x18, 0x28, 0x1D, 0x0C, 0x21, 0x49, 0x19, 0x04, 0x22, 0x01, 0x23, 0x9E, 0x46, 0x92, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x8F, 0x4C, 0x00, 0x28, 0x1B, 0xD0, 0x2B, 0x1C, 0x04, 0x22, 0x6E, 0x46, 0x8F, 0x49, 0x1F, 0x7B, 0x08, 0x78, 0xFF, 0xFF, 0x9C, 0x6E, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0xC0, 0x43, 0x38, 0x43, 0x30, 0x70, 0x01, 0x33, 0x01, 0x31, 0x01, 0x36, 0x01, 0x3A, 0xF5, 0xD1, 0x0C, 0x20, 0x41, 0x19, 0x68, 0x46, 0x04, 0x22, 0x01, 0x23, 0x9E, 0x46, 0x85, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x00, 0x28, 0x02, 0xD0, 0x20, 0x1C, 0x4A, 0x30, 0xF8, 0xBD, 0x20, 0x1C, 0xF8, 0xBD, 0xB1, 0xBD, 0x00, 0x00, 0x15, 0x95, 0x00, 0x00, 0x58, 0x3F, 0x08, 0x00, 0xF3, 0xF8, 0x00, 0x00, 0xE9, 0x09, 0x02, 0x00, 0xDD, 0x0A, 0x02, 0x00, 0xF8, 0xB5, 0x05, 0x1C, 0xAA, 0x69, 0x7C, 0x49 ,
|
||||
0x00, 0x20, 0x08, 0x56, 0x24, 0x21, 0x41, 0x43, 0x75, 0x48, 0x43, 0x18, 0x04, 0x24, 0x6E, 0x46, 0x75, 0x49, 0x1F, 0x79, 0x08, 0x78, 0xC0, 0x43, 0x38, 0x43, 0x30, 0x70, 0x01, 0x33, 0x01, 0x31, 0x01, 0x36, 0x01, 0x3C, 0xF5, 0xD1, 0x11, 0x1D, 0x68, 0x46, 0x04, 0x22, 0x01, 0x24, 0xA6, 0x46, 0x6C, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x01, 0x1C, 0x6C, 0x48, 0x04, 0xD0, 0x6D, 0x49, 0x09, 0x78, 0x69, 0x60, 0x45, 0x30, 0xF8, 0xBD, 0xFF, 0xFF, 0x32, 0x6F, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0xEC, 0x61, 0xAF, 0x30, 0xF8, 0xBD, 0x2B, 0x09, 0x02, 0x00, 0x70, 0xB5, 0xC5, 0x68, 0x81, 0x68, 0x0A, 0x89, 0x6B, 0x4E, 0x00, 0x2A, 0x22, 0xD0, 0x01, 0x24, 0xC2, 0x6D, 0xA2, 0x18, 0xC2, 0x65, 0x08, 0x89, 0x0D, 0x28, 0x1B, 0xD1, 0x68, 0x6B, 0x21, 0x1C, 0xA6, 0x46, 0x61, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x22, 0x1C, 0x28, 0x1C, 0x00, 0x21, 0xA6, 0x46, 0x5E, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x2C, 0x60, 0xE9, 0x6B, 0x28, 0x1C ,
|
||||
0xA6, 0x46, 0x5C, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x28, 0x1C, 0xA6, 0x46, 0x5A, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x30, 0x1C, 0x3D, 0x30, 0x70, 0xBD, 0x30, 0x1C, 0x23, 0x30, 0x70, 0xBD, 0xC0, 0x46, 0xB1, 0x02, 0x00, 0x00, 0x74, 0x3F, 0x08, 0x00, 0x19, 0xC6, 0x00, 0x00, 0x5C, 0x3F, 0x08, 0x00, 0x1D, 0xC2, 0x00, 0x00, 0x68, 0x44, 0x08, 0x00, 0x43, 0x12, 0x03, 0x00, 0x34, 0x63, 0x08, 0x00, 0x2F, 0x7A, 0x02, 0x00, 0xB4, 0x36, 0x08, 0x00, 0x8F, 0xF4, 0x01, 0x00, 0x09, 0xB4, 0x03, 0x00, 0xFF, 0xFF, 0xC8, 0x6F, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0xF0, 0xB5, 0x05, 0x1C, 0xAB, 0x69, 0xEC, 0x69, 0x60, 0x68, 0x00, 0x68, 0x2A, 0x30, 0x01, 0x78, 0x0A, 0x06, 0x41, 0x78, 0x09, 0x04, 0x8A, 0x18, 0x81, 0x78, 0x09, 0x02, 0x8A, 0x18, 0xC1, 0x78, 0x8A, 0x18, 0x8E, 0x26, 0xF1, 0x5A, 0x09, 0x0A, 0x01, 0x70, 0xF0, 0x5C, 0x61, 0x68, 0x09, 0x68, 0x2B, 0x26, 0x70, 0x54, 0x8C, 0x20, 0xC0, 0x18, 0x61, 0x68, 0x0E, 0x68 ,
|
||||
0x01, 0x88, 0x09, 0x0A, 0x2C, 0x27, 0xB9, 0x55, 0x61, 0x68, 0x09, 0x68, 0x2D, 0x26, 0x00, 0x78, 0x70, 0x54, 0x60, 0x68, 0x01, 0x68, 0x32, 0x31, 0x08, 0x78, 0x00, 0x02, 0x49, 0x78, 0x08, 0x18, 0x00, 0x04, 0x00, 0x0C, 0x8C, 0x21, 0xCB, 0x58, 0x32, 0x49, 0x41, 0x40, 0x08, 0x04, 0x00, 0x0C, 0xC0, 0x18, 0x80, 0x1A, 0x01, 0x21, 0x8E, 0x46, 0x2F, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x61, 0x68, 0x0A, 0x68, 0x32, 0x23, 0x01, 0x0A, 0x99, 0x54, 0x61, 0x68, 0x09, 0x68, 0x33, 0x22, 0x50, 0x54, 0x60, 0x68, 0x68, 0x60, 0x29, 0x48, 0xF0, 0xBD, 0x00, 0x00, 0xFF, 0xFF, 0x5E, 0x70, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x34, 0x04, 0x1B, 0x00, 0x02, 0x6A, 0x8B, 0x69, 0xDB, 0x69, 0x1B, 0x68, 0x83, 0x60, 0x88, 0x69, 0xC0, 0x69, 0x41, 0x68, 0x8A, 0x42, 0x00, 0xDA, 0x42, 0x60, 0x22, 0x48, 0x79, 0x30, 0xF7, 0x46, 0x32, 0x04, 0x00, 0x00, 0xC4, 0x07, 0x00, 0x00, 0x15, 0x09, 0x02, 0x00, 0xC5, 0x93, 0x00, 0x00 ,
|
||||
0x0D, 0x91, 0x00, 0x00, 0x40, 0x1E, 0x80, 0x00, 0x1C, 0x4B, 0x19, 0x50, 0x1A, 0x49, 0x0A, 0x50, 0xF7, 0x46, 0xC0, 0x46, 0xBD, 0xB5, 0x00, 0x00, 0x95, 0x92, 0x00, 0x00, 0xFD, 0x93, 0x00, 0x00, 0x54, 0x3F, 0x08, 0x00, 0x29, 0x4F, 0x03, 0x00, 0xDF, 0xE8, 0x02, 0x00, 0x36, 0x89, 0x41, 0x00, 0x81, 0x06, 0x00, 0x00, 0xB1, 0x78, 0x00, 0x00, 0x94, 0xEC, 0x01, 0x00, 0x08, 0x19, 0x1B, 0x00, 0x8F, 0xC6, 0x03, 0x00, 0x1C, 0x17, 0x1B, 0x00, 0x67, 0x66, 0x03, 0x00, 0xA6, 0x44, 0x08, 0x00, 0x18, 0x17, 0x1B, 0x00, 0xA7, 0x2F, 0x02, 0x00, 0x91, 0x44, 0x03, 0x00, 0x91, 0x63, 0x03, 0x00, 0x5B, 0x44, 0x03, 0x00, 0xFF, 0xFF, 0xF4, 0x70, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0xE7, 0x44, 0x03, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x61, 0xA2, 0x03, 0x00, 0x6A, 0x1E, 0x01, 0x00, 0x45, 0xDA, 0x00, 0x00, 0x04, 0xF3, 0x1A, 0x00, 0x80, 0x7B, 0x08, 0x00, 0xFC, 0xB5, 0x04, 0x1C, 0xA5, 0x69, 0x60, 0x6A, 0x01, 0x90, 0x20, 0x69 ,
|
||||
0x00, 0x28, 0x35, 0xD4, 0x08, 0x28, 0x33, 0xDA, 0xE1, 0x69, 0x09, 0x68, 0x10, 0x29, 0x2F, 0xD1, 0xAC, 0x21, 0x41, 0x43, 0x9E, 0x4A, 0x51, 0x5C, 0x49, 0x08, 0x27, 0xD3, 0x00, 0x06, 0x00, 0x16, 0xA2, 0x68, 0x69, 0x46, 0x01, 0x23, 0x9E, 0x46, 0x9A, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x06, 0x1C, 0x39, 0x30, 0x1F, 0xD0, 0x00, 0x2E, 0x1D, 0xD0, 0x00, 0x98, 0x07, 0x68, 0x00, 0x99, 0x0C, 0x39, 0x01, 0x98, 0x01, 0x60, 0x28, 0x1D, 0x10, 0x21, 0x79, 0x1A, 0x04, 0x22, 0x01, 0x23, 0x9E, 0x46, 0x91, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x02, 0x22, 0x2A, 0x80, 0xA8, 0x1C, 0x08, 0x21, 0x79, 0x1A, 0x01, 0x23, 0x9E, 0x46, 0x8C, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x03, 0xE0, 0x38, 0x20, 0xFF, 0xFF, 0x8A, 0x71, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x20, 0xC6, 0x43, 0x26, 0x60, 0x89, 0x48, 0x7C, 0x30, 0x20, 0x62, 0xFC, 0xBD, 0x30, 0xB5, 0x05, 0x1C, 0x28, 0x69, 0xA9, 0x69, 0x90, 0x29, 0x1D, 0xD1, 0x69, 0x69 ,
|
||||
0x09, 0x78, 0x04, 0x29, 0x19, 0xD0, 0x05, 0x29, 0x17, 0xD0, 0x0A, 0x29, 0x15, 0xD0, 0x06, 0x29, 0x13, 0xD0, 0x0C, 0x29, 0x01, 0xDB, 0x10, 0x29, 0x0F, 0xD1, 0x01, 0x24, 0xA6, 0x46, 0x7D, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x7C, 0x48, 0x7D, 0x49, 0x00, 0x22, 0xA6, 0x46, 0x7C, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x7C, 0x48, 0xFF, 0x30, 0x5F, 0x30, 0x28, 0x62, 0x30, 0xBD, 0xF0, 0xB5, 0x89, 0xB0, 0x05, 0x90, 0x41, 0x69, 0x02, 0x69, 0x75, 0x48, 0x79, 0x4E, 0x82, 0x42, 0x3A, 0xD0, 0x04, 0x30, 0x82, 0x42, 0x25, 0xD0, 0x74, 0x4D, 0xAA, 0x42, 0x00, 0xD0, 0xCC, 0xE0, 0x08, 0x68, 0x06, 0x1C, 0x0C, 0x22, 0x8F, 0x1A, 0x4A, 0x68, 0x89, 0x18, 0x09, 0x1D, 0x10, 0x22, 0x01, 0x24, 0xA6, 0x46, 0x6E, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x01, 0x1C, 0xFF, 0xFF, 0x20, 0x72, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x09, 0xD1, 0xAC, 0x22, 0x72, 0x43, 0xCB, 0x48, 0x80, 0x18, 0x46, 0x22, 0x12, 0x5C, 0x11, 0x2A, 0x01, 0xD1, 0x44, 0x22 ,
|
||||
0x14, 0x54, 0x28, 0x1C, 0x3A, 0x1C, 0xA6, 0x46, 0x62, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x69, 0x48, 0xEC, 0x30, 0xAB, 0xE0, 0x08, 0x68, 0xC0, 0x00, 0x30, 0x18, 0x8A, 0x68, 0x02, 0x2A, 0x02, 0xD0, 0xE7, 0x20, 0x80, 0x00, 0xA2, 0xE0, 0xCA, 0x68, 0x89, 0x18, 0x09, 0x7B, 0x41, 0x60, 0x80, 0x21, 0x01, 0x60, 0x3B, 0x20, 0x00, 0x01, 0x99, 0xE0, 0x08, 0x68, 0x06, 0x90, 0xC0, 0x00, 0x34, 0x58, 0x10, 0x20, 0x04, 0x90, 0x01, 0x25, 0xAE, 0x46, 0x57, 0x48, 0xFE, 0x44, 0x00, 0x47, 0x07, 0x90, 0x00, 0x28, 0x00, 0xD1, 0x89, 0xE0, 0x0C, 0x21, 0x07, 0x98, 0x0F, 0x18, 0xB0, 0x49, 0xAC, 0x20, 0x06, 0x9A, 0x50, 0x43, 0x08, 0x18, 0x48, 0x22, 0x13, 0x5C, 0x5B, 0x06, 0x5B, 0x0E, 0x13, 0x54, 0x06, 0x9A, 0xD2, 0x00, 0xB6, 0x18, 0x71, 0x68, 0x00, 0x29, 0x47, 0xD1, 0x00, 0x2C, 0x01, 0xDD, 0x08, 0x2C, 0xFF, 0xFF, 0xB6, 0x72, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x21, 0xDB, 0x00, 0x22, 0x69, 0x46, 0x0A, 0x70, 0x01, 0x92 ,
|
||||
0x0A, 0x81, 0x8A, 0x72, 0xCD, 0x72, 0x0D, 0x73, 0x4D, 0x73, 0x01, 0x88, 0x44, 0x48, 0x06, 0x23, 0xAE, 0x46, 0x44, 0x4C, 0xFE, 0x44, 0x20, 0x47, 0x04, 0x1C, 0x02, 0xDC, 0x00, 0x20, 0xC0, 0x43, 0x36, 0xE0, 0x34, 0x60, 0xAC, 0x20, 0x60, 0x43, 0x9A, 0x49, 0x09, 0x18, 0x5C, 0x22, 0x28, 0x1C, 0x50, 0x54, 0x48, 0x20, 0x42, 0x5C, 0x52, 0x06, 0x52, 0x0E, 0x42, 0x54, 0xAC, 0x20, 0x60, 0x43, 0x94, 0x49, 0x08, 0x18, 0x5C, 0x21, 0x09, 0x5C, 0x49, 0x1E, 0x02, 0x29, 0x16, 0xD9, 0x03, 0x39, 0x08, 0xD0, 0x00, 0x20, 0x30, 0x56, 0xAE, 0x46, 0xEA, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x80, 0x20, 0x30, 0x60, 0xDB, 0xE7, 0x08, 0x94, 0x80, 0x21, 0x31, 0x60, 0x48, 0x22, 0x13, 0x5C, 0x19, 0x43, 0x11, 0x54, 0xAE, 0x46, 0xE4, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x0A, 0xE0, 0x01, 0x20, 0xCE, 0xE7, 0x06, 0x98, 0x39, 0x1C, 0x04, 0xAA, 0xAE, 0x46, 0xE0, 0x4B, 0xFE, 0x44, 0xFF, 0xFF, 0x4C, 0x73, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00 ,
|
||||
0x18, 0x47, 0x04, 0x1C, 0x08, 0x90, 0x06, 0x98, 0x38, 0x60, 0x08, 0x98, 0x78, 0x60, 0x00, 0x28, 0x15, 0xD0, 0xAC, 0x20, 0x60, 0x43, 0x7C, 0x49, 0x09, 0x18, 0x48, 0x88, 0x02, 0x04, 0x02, 0x20, 0x10, 0x43, 0xB8, 0x60, 0x48, 0x68, 0x02, 0x0E, 0x01, 0x02, 0x09, 0x0E, 0x09, 0x02, 0x11, 0x43, 0x02, 0x04, 0x12, 0x0E, 0x12, 0x04, 0x0A, 0x43, 0x00, 0x06, 0x10, 0x43, 0xF8, 0x60, 0x07, 0x98, 0x0D, 0x49, 0x00, 0x22, 0x10, 0x23, 0xAE, 0x46, 0xCE, 0x4C, 0xFE, 0x44, 0x20, 0x47, 0x13, 0x48, 0x00, 0xE0, 0x16, 0x20, 0xCC, 0x49, 0x09, 0x18, 0x05, 0x98, 0x01, 0x62, 0x09, 0xB0, 0xF0, 0xBD, 0x5D, 0x0D, 0x1B, 0x00, 0x81, 0xE7, 0x02, 0x00, 0x09, 0xB4, 0x03, 0x00, 0x27, 0x1A, 0x02, 0x00, 0x2F, 0x7A, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x05, 0x10, 0x00, 0x00, 0xCF, 0xF6, 0x00, 0x00, 0xD5, 0xF4, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x91, 0x19, 0x02, 0x00, 0x50, 0x65, 0x08, 0x00, 0x71, 0xC0, 0x02, 0x00, 0x50, 0x19 ,
|
||||
0xFF, 0xFF, 0xE2, 0x73, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x29, 0x16, 0x01, 0x00, 0x2A, 0x03, 0x00, 0x00, 0xF0, 0xB5, 0x8B, 0xB0, 0x07, 0x90, 0x05, 0x69, 0x47, 0x69, 0x0C, 0x20, 0x38, 0x1A, 0x08, 0x90, 0xB6, 0x49, 0x8D, 0x42, 0x16, 0xD1, 0x78, 0x68, 0x0F, 0x30, 0x00, 0x11, 0x00, 0x01, 0x78, 0x60, 0x38, 0x68, 0x0B, 0x28, 0x0E, 0xD8, 0x00, 0x23, 0x68, 0x46, 0x03, 0x70, 0x08, 0x98, 0x05, 0x22, 0x01, 0x24, 0xA6, 0x46, 0xAE, 0x4C, 0xFE, 0x44, 0x20, 0x47, 0xAE, 0x48, 0xFF, 0x30, 0x95, 0x30, 0x07, 0x99, 0x08, 0x62, 0xAC, 0x48, 0x85, 0x42, 0x23, 0xD1, 0xAC, 0x48, 0x02, 0x78, 0x6C, 0x46, 0x22, 0x72, 0x43, 0x78, 0x63, 0x72, 0x81, 0x78, 0xA1, 0x72, 0xC0, 0x78, 0xE0, 0x72, 0x00, 0x91, 0x01, 0x90, 0x03, 0x20, 0xA6, 0x49, 0x01, 0x39, 0x01, 0x26, 0xB6, 0x46, 0xF3, 0x4E, 0xFE, 0x44, 0x30, 0x47, 0x04, 0x20, 0x20, 0x70, 0x08, 0x98, 0x9F, 0x49, 0x00, 0x22, 0x02, 0xAB, 0x01, 0x24, 0xA6, 0x46 ,
|
||||
0x9B, 0x4C, 0xFE, 0x44, 0x20, 0x47, 0x9A, 0x48, 0xFF, 0x30, 0xFF, 0xFF, 0x78, 0x74, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x95, 0x30, 0x07, 0x99, 0x08, 0x62, 0xEB, 0x49, 0x8D, 0x42, 0x14, 0xD1, 0x02, 0x22, 0x68, 0x46, 0x02, 0x70, 0x3A, 0x68, 0xAC, 0x20, 0x42, 0x43, 0x30, 0x48, 0x68, 0x30, 0x83, 0x18, 0x08, 0x98, 0x00, 0x22, 0x01, 0x24, 0xA6, 0x46, 0x8F, 0x4C, 0xFE, 0x44, 0x20, 0x47, 0x8E, 0x48, 0xFF, 0x30, 0x95, 0x30, 0x07, 0x99, 0x08, 0x62, 0xEF, 0x48, 0x85, 0x42, 0x00, 0xD0, 0x04, 0xE1, 0x03, 0x20, 0x8C, 0x49, 0x01, 0x22, 0x96, 0x46, 0xEC, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x86, 0x48, 0xFF, 0x30, 0x95, 0x30, 0x09, 0x90, 0x38, 0x68, 0xEA, 0x4D, 0x00, 0x28, 0x00, 0xD1, 0xE2, 0xE0, 0x01, 0x24, 0xA6, 0x46, 0xE6, 0x48, 0xFE, 0x44, 0x00, 0x47, 0x00, 0x28, 0x00, 0xD1, 0xD6, 0xE0, 0xE4, 0x48, 0x02, 0x68, 0x03, 0x20, 0x7F, 0x49, 0x01, 0x31, 0xA6, 0x46, 0xE2, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xDF, 0x48 ,
|
||||
0x00, 0x68, 0x00, 0x28, 0x5A, 0xD1, 0xDF, 0x4D, 0x2E, 0x20, 0x41, 0x19, 0xB8, 0x68, 0x03, 0x30, 0x08, 0x70, 0x38, 0x7A, 0xFF, 0xFF, 0x0E, 0x75, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x48, 0x70, 0x2E, 0x1C, 0x30, 0x36, 0xB8, 0x68, 0x28, 0x18, 0x30, 0x30, 0xDA, 0x49, 0x0A, 0x68, 0x30, 0x3A, 0x31, 0x1C, 0xA6, 0x46, 0xD8, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x78, 0x68, 0x38, 0x18, 0x01, 0x1D, 0xBA, 0x68, 0x30, 0x1C, 0xA6, 0x46, 0xD9, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xB8, 0x68, 0x41, 0x19, 0x97, 0x22, 0x09, 0x30, 0x50, 0x54, 0xB8, 0x68, 0x46, 0x19, 0x9E, 0x36, 0x30, 0x70, 0x01, 0x36, 0xB8, 0x68, 0x01, 0xE0, 0x14, 0x0D, 0x1B, 0x00, 0x30, 0x18, 0xCA, 0x49, 0x0A, 0x68, 0x9E, 0x3A, 0x31, 0x1C, 0xA6, 0x46, 0xC8, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x78, 0x68, 0x38, 0x18, 0x01, 0x1D, 0xBA, 0x68, 0x30, 0x1C, 0xA6, 0x46, 0xC9, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xB8, 0x68, 0x40, 0x00, 0xC0, 0x49, 0x09, 0x68, 0x08, 0x18 ,
|
||||
0x28, 0x18, 0xC0, 0x49, 0x0A, 0x79, 0x02, 0x70, 0x4A, 0x79, 0x42, 0x70, 0x8A, 0x79, 0x82, 0x70, 0xC9, 0x79, 0xC1, 0x70, 0x04, 0x30, 0x0F, 0x21, 0x41, 0x1A, 0x0A, 0x78, 0xBB, 0x68, 0xFF, 0xFF, 0xA4, 0x75, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x9A, 0x18, 0x0A, 0x70, 0x40, 0x1B, 0x00, 0x04, 0x00, 0x0C, 0xB5, 0x49, 0x08, 0x60, 0xB1, 0x48, 0x04, 0x60, 0x02, 0x20, 0x01, 0x1C, 0x11, 0x22, 0xA6, 0x46, 0xB4, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x06, 0x1C, 0x63, 0xD4, 0x03, 0x20, 0xA6, 0x46, 0xB1, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x0A, 0x90, 0x00, 0x25, 0x01, 0x1C, 0x8D, 0x42, 0x50, 0xD0, 0x29, 0x1C, 0x2B, 0x22, 0xA6, 0x46, 0xAD, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x0C, 0x20, 0x0A, 0x99, 0x40, 0x18, 0xAC, 0x22, 0x72, 0x43, 0xAB, 0x49, 0x8F, 0x18, 0x78, 0x63, 0x29, 0x1C, 0x18, 0x22, 0xA6, 0x46, 0xA6, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x9F, 0x48, 0x02, 0x68, 0x79, 0x6B, 0x4A, 0x60, 0x0A, 0x98, 0xAC, 0x30, 0x08, 0x60 ,
|
||||
0x08, 0x68, 0x9A, 0x49, 0xA6, 0x46, 0xA0, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x29, 0x1C, 0x03, 0xA8, 0x10, 0x22, 0xA6, 0x46, 0x9C, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xE0, 0x21, 0x68, 0x46, 0x01, 0x74, 0x45, 0x74, 0x85, 0x74, 0xFB, 0x21, 0xC1, 0x74, 0xFF, 0xFF, 0x3A, 0x76, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0xEE, 0x49, 0xC1, 0x81, 0x02, 0x21, 0x81, 0x81, 0x79, 0x6B, 0xCA, 0x68, 0x01, 0x20, 0xC0, 0x03, 0x10, 0x43, 0xC8, 0x60, 0x48, 0x68, 0x00, 0x90, 0x2A, 0x1C, 0x30, 0x1C, 0x0A, 0x9D, 0x29, 0x1C, 0x03, 0xAB, 0xA6, 0x46, 0xE6, 0x4F, 0xFE, 0x44, 0x38, 0x47, 0x07, 0x1C, 0x30, 0x06, 0x00, 0x16, 0xA6, 0x46, 0xEF, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x28, 0x1C, 0xA6, 0x46, 0xEE, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x11, 0xE0, 0x30, 0x06, 0x00, 0x16, 0xA6, 0x46, 0xE9, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x01, 0x20, 0xC7, 0x43, 0x08, 0xE0, 0x07, 0x1C, 0x06, 0xE0, 0x00, 0x20, 0x00, 0x21, 0xCF, 0x43, 0x01, 0xE0, 0x00, 0x20 ,
|
||||
0x07, 0x1C, 0x28, 0x60, 0x00, 0x23, 0x68, 0x46, 0x03, 0x70, 0x3A, 0x06, 0x12, 0x0E, 0x08, 0x98, 0x6F, 0x49, 0x01, 0x24, 0xA6, 0x46, 0x09, 0x4C, 0xFE, 0x44, 0x20, 0x47, 0x07, 0x98, 0x09, 0x99, 0x01, 0x62, 0x0B, 0xB0, 0xF0, 0xBD, 0xC1, 0x18, 0x01, 0x00, 0xF1, 0x1B, 0x01, 0x00, 0xF3, 0x1C, 0x02, 0x00, 0xFF, 0xFF, 0xD0, 0x76, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x7B, 0xC0, 0x02, 0x00, 0x91, 0xF0, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0xA3, 0xC0, 0x02, 0x00, 0xA9, 0xE9, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0xE4, 0x62, 0x08, 0x00, 0xAC, 0x05, 0x00, 0x00, 0xFE, 0xB5, 0x07, 0x1C, 0x7D, 0x69, 0xBE, 0x69, 0x0C, 0x20, 0x30, 0x1A, 0x01, 0x90, 0xDF, 0x4C, 0x0A, 0x2D, 0x13, 0xD1, 0x30, 0x68, 0xDB, 0x49, 0x08, 0x60, 0x01, 0x20, 0x86, 0x46, 0xDA, 0x48, 0xFE, 0x44, 0x00, 0x47, 0x0A, 0x20, 0x00, 0x21, 0x01, 0x9A, 0x01, 0x23, 0x9E, 0x46, 0xE6, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xF5, 0x20, 0x80, 0x00, 0x00, 0x19 ,
|
||||
0x38, 0x62, 0x03, 0x2D, 0x79, 0xD1, 0xF5, 0x20, 0x80, 0x00, 0x00, 0x19, 0x02, 0x90, 0x70, 0x68, 0x00, 0x28, 0x0C, 0xD1, 0x00, 0x21, 0xCF, 0x48, 0x01, 0x60, 0xCF, 0x48, 0x00, 0x68, 0x00, 0x28, 0x61, 0xD0, 0x01, 0x21, 0x8E, 0x46, 0xCD, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x5B, 0xE0, 0xCC, 0x48, 0xB1, 0x68, 0x01, 0x60, 0xF1, 0x68, 0x41, 0x60, 0x31, 0x69, 0x81, 0x60, 0xFF, 0xFF, 0x66, 0x77, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x71, 0x69, 0xC1, 0x60, 0xB1, 0x69, 0xC1, 0x63, 0xF1, 0x69, 0x01, 0x64, 0x31, 0x6A, 0xC1, 0x64, 0x01, 0x24, 0xA6, 0x46, 0xC5, 0x48, 0xFE, 0x44, 0x00, 0x47, 0xA6, 0x46, 0xC4, 0x48, 0xFE, 0x44, 0x00, 0x47, 0x70, 0x68, 0x7D, 0x25, 0xED, 0x00, 0xA8, 0x42, 0x21, 0xD8, 0x01, 0x28, 0x18, 0xD0, 0x02, 0x28, 0x05, 0xD0, 0x28, 0x1C, 0xA6, 0x46, 0xBE, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x1C, 0xE0, 0xB9, 0x48, 0x00, 0x23, 0x19, 0x1C, 0x59, 0x43, 0x3E, 0x22, 0x4A, 0x43, 0x82, 0x83, 0x02, 0x30 ,
|
||||
0x01, 0x33, 0x10, 0x2B, 0xF6, 0xDB, 0xA6, 0x46, 0xB4, 0x48, 0xFE, 0x44, 0x00, 0x47, 0xB5, 0x48, 0x0D, 0xE0, 0xB5, 0x4D, 0x28, 0x1C, 0xA6, 0x46, 0xB2, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x04, 0xE0, 0xA6, 0x46, 0xAF, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x75, 0x68, 0xAE, 0x48, 0x05, 0x60, 0x05, 0x1C, 0xA7, 0x4E, 0x30, 0x68, 0x00, 0x28, 0x06, 0xD1, 0xAD, 0x48, 0x00, 0x68, 0xA6, 0x46, 0xAC, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x30, 0x60, 0xFF, 0xFF, 0xFC, 0x77, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x94, 0x2B, 0x68, 0xAA, 0x49, 0xAB, 0x4A, 0xA6, 0x46, 0xAB, 0x4D, 0xFE, 0x44, 0x28, 0x47, 0x9C, 0x48, 0x04, 0x60, 0x03, 0x20, 0x00, 0x21, 0x01, 0x9A, 0x01, 0x23, 0x9E, 0x46, 0xA7, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x02, 0x98, 0x38, 0x62, 0xFE, 0xBD, 0xC0, 0x46, 0x13, 0x7F, 0x03, 0x00, 0x12, 0x10, 0x00, 0x00, 0x30, 0xB5, 0x05, 0x1C, 0x00, 0x20, 0x01, 0x24, 0xA6, 0x46, 0xA0, 0x49, 0xFE, 0x44, 0x08, 0x47, 0xA6, 0x46 ,
|
||||
0x9F, 0x49, 0xFE, 0x44, 0x08, 0x47, 0xA6, 0x46, 0x9E, 0x48, 0xFE, 0x44, 0x00, 0x47, 0x7D, 0x21, 0xC9, 0x00, 0xA6, 0x46, 0x9E, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x9B, 0x49, 0x08, 0x18, 0x99, 0x49, 0x08, 0x80, 0x9B, 0x48, 0x0A, 0x30, 0x28, 0x62, 0x30, 0xBD, 0x11, 0x10, 0x00, 0x00, 0xDD, 0x7E, 0x03, 0x00, 0xB9, 0x90, 0x00, 0x00, 0x6C, 0x64, 0x08, 0x00, 0xE7, 0x7E, 0x03, 0x00, 0x74, 0x64, 0x08, 0x00, 0x70, 0x64, 0x08, 0x00, 0x6D, 0xC6, 0x03, 0x00, 0x08, 0x19, 0x1B, 0x00, 0x11, 0x18, 0xFF, 0xFF, 0x92, 0x78, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x02, 0x00, 0xD1, 0x78, 0x02, 0x00, 0xC9, 0xBA, 0x03, 0x00, 0x09, 0xB4, 0x03, 0x00, 0x14, 0x0D, 0x1B, 0x00, 0xFE, 0xB5, 0x02, 0x90, 0x45, 0x69, 0x68, 0x46, 0x01, 0x21, 0x8E, 0x46, 0x89, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x89, 0x48, 0x04, 0x1C, 0x68, 0x68, 0x01, 0x69, 0x4A, 0x78, 0x00, 0x27, 0x3E, 0x1C, 0x20, 0x88, 0x40, 0x08, 0x22, 0xD3, 0x20, 0x1D, 0x89, 0x1C ,
|
||||
0x01, 0x23, 0x9E, 0x46, 0x83, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x00, 0x28, 0x07, 0xD1, 0x68, 0x68, 0x00, 0x69, 0x40, 0x78, 0x21, 0x88, 0x09, 0x04, 0x89, 0x16, 0x81, 0x42, 0x3D, 0xD0, 0x02, 0x20, 0x00, 0x5F, 0x00, 0x99, 0x08, 0x1A, 0x00, 0x04, 0x00, 0x14, 0x3C, 0x28, 0x03, 0xDD, 0x20, 0x88, 0x40, 0x10, 0x40, 0x00, 0x20, 0x80, 0x78, 0x1C, 0x07, 0x06, 0x3F, 0x0E, 0x68, 0x68, 0x01, 0x69, 0x4A, 0x78, 0x2A, 0x34, 0x01, 0x36, 0x14, 0x2E, 0xD5, 0xDB, 0x00, 0x2A, 0x02, 0xD1, 0xAB, 0x20, 0x40, 0x00, 0x50, 0xE0, 0x00, 0x9B, 0x6D, 0x48, 0x14, 0x21, 0xFF, 0xFF, 0x28, 0x79, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x22, 0x04, 0x88, 0x64, 0x08, 0x03, 0xD3, 0x2A, 0x30, 0x01, 0x32, 0x01, 0x39, 0xF8, 0xD1, 0x12, 0x06, 0x12, 0x0E, 0x14, 0x2F, 0x16, 0xD1, 0x66, 0x48, 0x00, 0x88, 0x00, 0x06, 0x44, 0x16, 0x64, 0x49, 0x00, 0x22, 0x01, 0x20, 0x4E, 0x8D, 0x36, 0x06, 0x76, 0x16, 0xA6, 0x42, 0x02, 0xDD, 0x34, 0x1C ,
|
||||
0x02, 0x06, 0x12, 0x0E, 0x2A, 0x31, 0x01, 0x30, 0x14, 0x28, 0xF3, 0xDB, 0x02, 0xE0, 0x32, 0x06, 0x12, 0x0E, 0x00, 0x9B, 0x2A, 0x20, 0x42, 0x43, 0x5A, 0x48, 0x11, 0x18, 0x0C, 0x88, 0x01, 0x20, 0x20, 0x43, 0x00, 0x04, 0x00, 0x0C, 0x08, 0x80, 0xFE, 0x24, 0xA0, 0x43, 0x14, 0x24, 0x64, 0x57, 0x64, 0x06, 0x24, 0x0E, 0x04, 0x43, 0x52, 0x48, 0x14, 0x52, 0x14, 0x18, 0x63, 0x80, 0x08, 0x88, 0x80, 0x05, 0x82, 0x0D, 0x68, 0x68, 0x00, 0x69, 0x40, 0x78, 0x80, 0x02, 0x10, 0x43, 0x08, 0x80, 0x68, 0x68, 0x02, 0x69, 0x20, 0x1D, 0x91, 0x1C, 0x52, 0x78, 0x01, 0x23, 0x9E, 0x46, 0x4B, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xFF, 0xFF, 0xBE, 0x79, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x02, 0x98, 0x04, 0x61, 0xFE, 0x20, 0x47, 0x49, 0x09, 0x18, 0x02, 0x98, 0x01, 0x62, 0xFE, 0xBD, 0x82, 0x69, 0x41, 0x69, 0x03, 0x69, 0x02, 0x2B, 0x0A, 0xD1, 0x01, 0x2A, 0x01, 0xD1, 0x00, 0x29, 0x05, 0xD0, 0x02, 0x2A, 0x04, 0xD1, 0x00, 0x29 ,
|
||||
0x02, 0xD1, 0x11, 0x21, 0x00, 0xE0, 0x06, 0x21, 0x41, 0x61, 0xF7, 0x46, 0xC0, 0x46, 0x14, 0xE9, 0x00, 0x00, 0xC9, 0x18, 0x02, 0x00, 0x30, 0xB5, 0x05, 0x1C, 0x3A, 0x48, 0x00, 0x78, 0x00, 0x28, 0x04, 0xD0, 0x01, 0x20, 0x86, 0x46, 0x38, 0x48, 0xFE, 0x44, 0x00, 0x47, 0x01, 0x24, 0xA6, 0x46, 0x37, 0x48, 0xFE, 0x44, 0x00, 0x47, 0xA6, 0x46, 0x36, 0x48, 0xFE, 0x44, 0x00, 0x47, 0x35, 0x48, 0x0E, 0x30, 0x28, 0x62, 0x30, 0xBD, 0x49, 0x19, 0x01, 0x00, 0x2F, 0x7A, 0x02, 0x00, 0x18, 0xB5, 0x43, 0x69, 0x81, 0x69, 0x31, 0x48, 0x81, 0x29, 0x00, 0xD1, 0x0B, 0x38, 0x00, 0x21, 0x00, 0x91, 0x1A, 0x68, 0x9B, 0x68, 0x01, 0x24, 0xA6, 0x46, 0x2D, 0x4C, 0xFE, 0x44, 0x20, 0x47, 0xFF, 0xFF, 0x54, 0x7A, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x18, 0xBD, 0x18, 0xB5, 0x40, 0x69, 0x00, 0x21, 0x00, 0x91, 0x02, 0x68, 0x83, 0x68, 0x27, 0x48, 0x01, 0x30, 0x01, 0x24, 0xA6, 0x46, 0x26, 0x4C, 0xFE, 0x44, 0x20, 0x47, 0x18, 0xBD ,
|
||||
0xC0, 0x46, 0x30, 0x63, 0x08, 0x00, 0x19, 0x9E, 0x00, 0x00, 0xB9, 0xEC, 0x00, 0x00, 0x74, 0x3F, 0x08, 0x00, 0x80, 0x3F, 0x08, 0x00, 0xB7, 0x5D, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0xD3, 0x8E, 0x00, 0x00, 0xF7, 0xC6, 0x00, 0x00, 0xE5, 0x90, 0x00, 0x00, 0x68, 0x64, 0x08, 0x00, 0xC0, 0x27, 0x09, 0x00, 0xA0, 0x3B, 0x08, 0x00, 0x3D, 0x5D, 0x03, 0x00, 0x19, 0xC6, 0x00, 0x00, 0xE8, 0x3A, 0x08, 0x00, 0x81, 0x5D, 0x03, 0x00, 0xCF, 0xF6, 0x00, 0x00, 0x4B, 0x4F, 0x03, 0x00, 0x6B, 0xC0, 0x03, 0x00, 0x95, 0x1E, 0x01, 0x00, 0xDA, 0x40, 0x08, 0x00, 0xDC, 0x05, 0x00, 0x00, 0x55, 0xAA, 0x03, 0x00, 0x0D, 0x91, 0x00, 0x00, 0xD7, 0x56, 0x03, 0x00, 0x08, 0x51, 0x08, 0x00, 0x8F, 0xC6, 0x03, 0x00, 0x65, 0xB8, 0x00, 0x00, 0x09, 0xB4, 0xFF, 0xFF, 0xEA, 0x7A, 0x08, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x84, 0x17, 0x1B, 0x00, 0xB5, 0x86, 0x01, 0x00, 0x3D, 0x47, 0x02, 0x00, 0x73, 0x49, 0x02, 0x00, 0x5F, 0x90 ,
|
||||
0x00, 0x00, 0x0E, 0x10, 0x00, 0x00, 0xF7, 0xF6, 0x00, 0x00, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0x76, 0xFF, 0xFF, 0xBD, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0x5A, 0xFF, 0xFF, 0xBD, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0x99, 0xFF, 0xFF, 0xBD, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0x83, 0xFF, 0xFF, 0xBD, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0xB6, 0xFE, 0xFF, 0xBD, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0x55, 0xFC, 0xFF, 0xBD, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0x27, 0xFB, 0xFF, 0xBD, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0xDD, 0xFA, 0xFF, 0xBD, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0x68, 0xFE, 0xFF, 0xBD, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0x3D, 0xFB, 0xFF, 0xBD, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0xBE, 0xFD, 0xFF, 0xBD, 0x78, 0x7B, 0x08, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0xB5, 0xF8, 0xF0, 0x43, 0xFA, 0x00, 0xBD, 0x35, 0x66, 0x08, 0x00, 0x67, 0x66, 0x08, 0x00, 0x71, 0x65, 0x08, 0x00, 0x4D, 0x66 ,
|
||||
0x08, 0x00, 0x25, 0x64, 0x08, 0x00, 0x81, 0x66, 0x08, 0x00, 0x8D, 0x66, 0x08, 0x00, 0x99, 0x66, 0x08, 0x00, 0x87, 0x67, 0x08, 0x00, 0xA7, 0x67, 0x08, 0x00, 0xD1, 0x67, 0x08, 0x00, 0x1B, 0x68, 0x08, 0x00, 0x57, 0x68, 0x08, 0x00, 0x39, 0x69, 0x08, 0x00, 0xFD, 0x6B, 0x08, 0x00, 0x17, 0x6C, 0x08, 0x00, 0x39, 0x6C, 0x08, 0x00, 0x61, 0x6C, 0x08, 0x00, 0xA1, 0x68, 0x08, 0x00, 0x95, 0x6C, 0x08, 0x00, 0xEB, 0x6D, 0x08, 0x00, 0x43, 0x6E, 0x08, 0x00, 0x6D, 0x6E, 0x08, 0x00, 0x3D, 0x6F, 0x08, 0x00, 0x1D, 0x6D, 0x08, 0x00, 0xE5, 0x6E, 0x08, 0x00, 0x11, 0x6E, 0x08, 0x00, 0xC9, 0x6F, 0x08, 0x00, 0x65, 0x70, 0x08, 0x00, 0x31, 0x64, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xF3, 0x1A, 0x00, 0x80, 0x00, 0x00, 0x00, 0xB2, 0x4E, 0x01, 0x00, 0x5A, 0xC1, 0x00, 0x00, 0x96, 0x1A, 0x01, 0x00, 0x22, 0x0B, 0x02, 0x00, 0x60, 0xD0, 0x01, 0x00, 0x06, 0x1A, 0x00, 0x00, 0xB8, 0xC6, 0x01, 0x00 ,
|
||||
0xD8, 0x42, 0x03, 0x00, 0x16, 0x42, 0x03, 0x00, 0xEE, 0xDB, 0x00, 0x00, 0x62, 0xDC, 0x00, 0x00, 0xC8, 0xE1, 0x00, 0x00, 0x8A, 0x17, 0x02, 0x00, 0x38, 0xBE, 0x00, 0x00, 0x26, 0xC6, 0x00, 0x00, 0x56, 0xC2, 0x00, 0x00, 0x62, 0x12, 0x03, 0x00, 0xE4, 0xF4, 0x01, 0x00, 0x3A, 0xEC, 0x00, 0x00, 0x5E, 0x92, 0x00, 0x00, 0xFE, 0xE8, 0x02, 0x00, 0x18, 0x7F, 0x00, 0x00, 0x64, 0xEC, 0x01, 0x00, 0xFE, 0x44, 0x03, 0x00, 0x1C, 0x94, 0x00, 0x00, 0xA8, 0x66, 0x03, 0x00, 0x74, 0xE9, 0x02, 0x00, 0x68, 0x1E, 0x01, 0x00, 0xBC, 0xDA, 0x00, 0x00, 0xEA, 0xE1, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x18, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x1A, 0xF0, 0xB5, 0x88, 0xB0, 0xCA, 0x4C, 0x03, 0x20, 0x22, 0x78, 0x63, 0x78, 0xCA, 0x4E, 0x31, 0x1C, 0x01, 0x39, 0x01, 0x25, 0xAE, 0x46, 0xC7, 0x4F, 0xFE, 0x44, 0x38, 0x47, 0xA2, 0x78, 0xE3, 0x78, 0x03, 0x20, 0x31, 0x1C, 0xAE, 0x46 ,
|
||||
0xC3, 0x4F, 0xFE, 0x44, 0x38, 0x47, 0x03, 0x20, 0x31, 0x1C, 0x01, 0x31, 0xAE, 0x46, 0xC1, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0xC1, 0x48, 0x21, 0x78, 0x01, 0x70, 0x61, 0x78, 0x41, 0x70, 0xE1, 0x78, 0xC1, 0x70, 0xA1, 0x78, 0x81, 0x70, 0xBF, 0x48, 0x04, 0x1C, 0x33, 0x3C, 0x20, 0x1C, 0x00, 0x21, 0xDC, 0x22, 0xAE, 0x46, 0xBA, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x84, 0x20, 0xA0, 0x70, 0x05, 0x27, 0xE7, 0x71, 0x0C, 0x26, 0x26, 0x73, 0x0D, 0x20, 0x00, 0x19, 0x98, 0xA1, 0x32, 0x1C, 0xAE, 0x46, 0xB4, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x04, 0x20, 0x60, 0x76, 0x1A, 0x20, 0x00, 0x19, 0x97, 0xA1, 0x06, 0x91, 0x04, 0x22, 0xAE, 0x46, 0xAE, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xFF, 0xFF, 0x96, 0x00, 0x18, 0x00, 0x96, 0x00, 0x00, 0x00, 0xA7, 0x77, 0x1F, 0x34, 0x95, 0xA1, 0x07, 0x91, 0x20, 0x1C, 0x3A, 0x1C, 0xAE, 0x46, 0xA9, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xE6, 0x71, 0x28, 0x1C, 0x60, 0x72, 0x11, 0x20, 0x20, 0x73, 0x94, 0x20 ,
|
||||
0x60, 0x73, 0xC0, 0x25, 0x65, 0x74, 0xA6, 0x74, 0x09, 0x22, 0xE2, 0x74, 0xA3, 0x4C, 0x20, 0x1C, 0x8C, 0xA1, 0x01, 0x23, 0x9E, 0x46, 0x9F, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x07, 0x22, 0x62, 0x72, 0x9E, 0x4C, 0x0A, 0x34, 0x20, 0x1C, 0x89, 0xA1, 0x01, 0x23, 0x9E, 0x46, 0x9A, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x04, 0x20, 0xE0, 0x71, 0x98, 0x4C, 0x12, 0x34, 0x20, 0x1C, 0x06, 0x99, 0x04, 0x22, 0x01, 0x23, 0x9E, 0x46, 0x94, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x27, 0x71, 0x93, 0x4C, 0x17, 0x34, 0x20, 0x1C, 0x07, 0x99, 0x3A, 0x1C, 0x01, 0x23, 0x9E, 0x46, 0x8E, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xE6, 0x71, 0x01, 0x20, 0x60, 0x72, 0x11, 0x20, 0x20, 0x73, 0x94, 0x20, 0x60, 0x73, 0x02, 0x20, 0xE0, 0x73, 0x25, 0x74, 0x66, 0x74, 0xFF, 0xFF, 0x2C, 0x01, 0x18, 0x00, 0x96, 0x00, 0x00, 0x00, 0xA5, 0x74, 0x2F, 0x27, 0xE7, 0x74, 0x10, 0x20, 0x60, 0x75, 0x80, 0x26, 0xA6, 0x75, 0x01, 0x20, 0xE0, 0x75, 0x11, 0x20, 0xA0, 0x76 ,
|
||||
0x94, 0x20, 0xE0, 0x76, 0x24, 0x20, 0x60, 0x77, 0x0A, 0x22, 0xA2, 0x77, 0x80, 0x4C, 0x36, 0x34, 0x20, 0x1C, 0x6D, 0xA1, 0x01, 0x23, 0x9E, 0x46, 0x7C, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x18, 0x22, 0xA2, 0x72, 0x7A, 0x4C, 0x41, 0x34, 0x20, 0x1C, 0x6B, 0xA1, 0x01, 0x23, 0x9E, 0x46, 0x76, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x25, 0x76, 0x67, 0x76, 0x21, 0x20, 0xE0, 0x76, 0x26, 0x77, 0x01, 0x20, 0x60, 0x77, 0x72, 0x48, 0x61, 0x30, 0x11, 0x21, 0x01, 0x70, 0x94, 0x21, 0x41, 0x70, 0x04, 0x21, 0x01, 0x72, 0xD2, 0x21, 0x41, 0x72, 0xC5, 0x72, 0x1E, 0x21, 0x01, 0x73, 0x45, 0x73, 0x9E, 0x21, 0x81, 0x73, 0x01, 0x21, 0x01, 0x74, 0x46, 0x74, 0x81, 0x74, 0x11, 0x21, 0x41, 0x75, 0x94, 0x21, 0x81, 0x75, 0x04, 0x21, 0x01, 0x76, 0xAD, 0x20, 0x66, 0x49, 0x08, 0x60, 0x00, 0x24, 0x0F, 0x25, 0xFF, 0xFF, 0xC2, 0x01, 0x18, 0x00, 0x96, 0x00, 0x00, 0x00, 0x29, 0x06, 0x09, 0x0E, 0x00, 0x20, 0x6A, 0x46, 0x01, 0x23, 0x9E, 0x46 ,
|
||||
0x62, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x6B, 0x46, 0x18, 0x88, 0x40, 0x08, 0x0E, 0xD3, 0xA0, 0x00, 0x0F, 0x21, 0xCA, 0x43, 0x69, 0x46, 0x0E, 0x88, 0x16, 0x40, 0x01, 0xAF, 0x3E, 0x52, 0x49, 0x88, 0x11, 0x40, 0x68, 0x44, 0xC1, 0x80, 0x60, 0x1C, 0x04, 0x04, 0x24, 0x0C, 0x01, 0x3D, 0x0B, 0x2D, 0xE0, 0xDA, 0x60, 0x1E, 0x00, 0x04, 0x00, 0x0C, 0x1D, 0xD0, 0x86, 0x46, 0x01, 0x1C, 0x01, 0xAD, 0x01, 0x22, 0xAE, 0x88, 0x90, 0x00, 0xC7, 0x5A, 0xB7, 0x42, 0x0A, 0xDA, 0xBC, 0x46, 0x07, 0x1C, 0x6F, 0x44, 0x7F, 0x88, 0x68, 0x44, 0x06, 0x80, 0xEE, 0x88, 0x46, 0x80, 0x60, 0x46, 0xA8, 0x80, 0xEF, 0x80, 0x04, 0x35, 0x50, 0x1C, 0x02, 0x04, 0x12, 0x0C, 0x01, 0x39, 0xE9, 0xD1, 0x70, 0x46, 0x01, 0x38, 0x86, 0x46, 0xE2, 0xD1, 0x99, 0x88, 0x68, 0x46, 0xC0, 0x88, 0x40, 0x18, 0x00, 0x04, 0x00, 0x0C, 0x42, 0x4B, 0x18, 0x80, 0x42, 0x49, 0x08, 0x1A, 0xFF, 0xFF, 0x58, 0x02, 0x18, 0x00, 0x96, 0x00, 0x00, 0x00, 0x58, 0x80 ,
|
||||
0x02, 0x2C, 0x1E, 0xDB, 0x65, 0x1E, 0x01, 0xAA, 0x01, 0x20, 0x01, 0x1C, 0x8C, 0x00, 0x6B, 0x46, 0xE6, 0x5A, 0x93, 0x88, 0xD4, 0x88, 0xE7, 0x18, 0xB7, 0x42, 0x0C, 0xDA, 0x06, 0x24, 0x44, 0x43, 0x38, 0x4B, 0x1B, 0x19, 0x1F, 0x80, 0x1C, 0x88, 0x34, 0x1B, 0x5C, 0x80, 0x01, 0x24, 0x1C, 0x71, 0x40, 0x1C, 0x00, 0x04, 0x00, 0x0C, 0x04, 0x32, 0x49, 0x1C, 0x09, 0x06, 0x09, 0x0E, 0x01, 0x3D, 0xE4, 0xD1, 0x00, 0x24, 0x31, 0x48, 0x04, 0x70, 0x31, 0x48, 0x04, 0x70, 0x31, 0x48, 0x04, 0x70, 0x31, 0x48, 0x04, 0x70, 0x01, 0x20, 0x86, 0x46, 0x30, 0x48, 0xFE, 0x44, 0x00, 0x47, 0x2F, 0x49, 0x22, 0x1C, 0x08, 0x68, 0x00, 0x28, 0x02, 0xD0, 0x01, 0x20, 0x90, 0x40, 0x04, 0x43, 0x04, 0x31, 0x01, 0x32, 0x20, 0x2A, 0xF5, 0xD3, 0x2A, 0x48, 0x04, 0x60, 0x08, 0xB0, 0xF0, 0xBD, 0x5F, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2D, 0x69, 0x6E, 0x66, 0x6F, 0x00, 0xC0, 0x46, 0xC0, 0x5F, 0x75, 0x64, 0x70, 0x00, 0xC0, 0xFF, 0xFF ,
|
||||
0xEE, 0x02, 0x18, 0x00, 0x96, 0x00, 0x00, 0x00, 0x46, 0xC0, 0x6C, 0x6F, 0x63, 0x61, 0x6C, 0x00, 0xC0, 0x46, 0x5F, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x00, 0xC0, 0x46, 0x5F, 0x64, 0x6E, 0x73, 0x2D, 0x73, 0x64, 0x00, 0x64, 0x65, 0x76, 0x3D, 0x43, 0x43, 0x33, 0x30, 0x30, 0x30, 0x00, 0xC0, 0x76, 0x65, 0x6E, 0x64, 0x6F, 0x72, 0x3D, 0x54, 0x65, 0x78, 0x61, 0x73, 0x2D, 0x49, 0x6E, 0x73, 0x74, 0x72, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x73, 0x00, 0xC0, 0x46, 0xC0, 0x00, 0x00, 0x18, 0x00, 0xF3, 0x7E, 0x03, 0x00, 0xC6, 0x05, 0x00, 0x00, 0xDD, 0x7E, 0x03, 0x00, 0xE4, 0x62, 0x08, 0x00, 0xC9, 0xBA, 0x03, 0x00, 0x09, 0xB4, 0x03, 0x00, 0xA7, 0x64, 0x08, 0x00, 0x70, 0x64, 0x08, 0x00, 0xDD, 0x0A, 0x02, 0x00, 0x48, 0x32, 0x08, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xE8, 0x62, 0x08, 0x00, 0xE9, 0x62, 0x08, 0x00, 0xEA, 0x62, 0x08, 0x00, 0xEB, 0x62, 0x08, 0x00, 0x81, 0x03, 0x18, 0x00, 0x80, 0x7B, 0x08, 0x00 ,
|
||||
0x84, 0xF3, 0x1A, 0x00, 0x0D, 0x49, 0x0E, 0x48, 0xFF, 0xFF, 0x84, 0x03, 0x18, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x88, 0x67, 0x0E, 0x48, 0x88, 0x64, 0x0E, 0x48, 0x48, 0x64, 0x0E, 0x48, 0xC8, 0x64, 0x0E, 0x48, 0x08, 0x65, 0x11, 0x48, 0x02, 0x1C, 0x04, 0x32, 0x0C, 0x4B, 0x13, 0x60, 0x0C, 0x4B, 0x93, 0x62, 0x0C, 0x4A, 0x8A, 0x66, 0x0D, 0x49, 0x01, 0x60, 0x0D, 0x48, 0x0E, 0x49, 0x01, 0x60, 0x0E, 0x49, 0x41, 0x60, 0xF7, 0x46, 0x1C, 0x21, 0x08, 0x00, 0x4F, 0x7B, 0x08, 0x00, 0x45, 0x7B, 0x08, 0x00, 0x3B, 0x7B, 0x08, 0x00, 0x6D, 0x7B, 0x08, 0x00, 0x63, 0x7B, 0x08, 0x00, 0x59, 0x7B, 0x08, 0x00, 0x31, 0x7B, 0x08, 0x00, 0x13, 0x7B, 0x08, 0x00, 0x50, 0x23, 0x08, 0x00, 0x09, 0x7B, 0x08, 0x00, 0x58, 0x26, 0x08, 0x00, 0x27, 0x7B, 0x08, 0x00, 0x1D, 0x7B, 0x08, 0x00 };
|
||||
|
||||
uint16_t drv_length = 8076;
|
||||
|
||||
//Service Pack version P1.12.7.15.15 - FW patches
|
||||
unsigned char PROGMEM fw_patch[5700] = { 0x00, 0x01, 0x00, 0x00, 0x3C, 0x16, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x14, 0x03, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x68, 0x46, 0x25, 0xF0, 0x95, 0xFB, 0xE0, 0x6B, 0xD0, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x38, 0xFB, 0x2C, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x0A, 0xFB, 0x04, 0x15, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xB8, 0xF1, 0x90, 0x0F, 0xA4, 0x16, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x66, 0xE0, 0x04, 0xA8, 0x35, 0x1D, 0x21, 0xF0, 0x99, 0xFC, 0x68, 0x46, 0x23, 0xF0, 0x28, 0xFB, 0x9A, 0xF8, 0x00, 0x00, 0x01, 0x28, 0x07, 0xD1, 0x28, 0x46, 0x05, 0xF0, 0xC3, 0xFE, 0x01, 0x46, 0x01, 0xAA, 0x00, 0x20, 0x21, 0xF0, 0x50, 0xF9, 0x28, 0x46, 0x05, 0xF0, 0xBB, 0xFE, 0x01, 0xA9, 0x21, 0xF0, 0x2A, 0xFA, 0xE9, 0x79, 0x4F, 0xEA, 0xE0, 0x00, 0x40, 0xB2, 0x11, 0xB1, 0x00, 0xF1, 0x06, 0x00, 0x40, 0xB2, 0xA8, 0x71, 0x1F, 0x38, 0x40, 0x00, 0xE8, 0x71, 0x30, 0x46 ,
|
||||
0x01, 0xF0, 0x0D, 0xFF, 0x10, 0xF1, 0x00, 0x09, 0x4F, 0xF0, 0x00, 0x01, 0x09, 0xD0, 0x28, 0x68, 0x40, 0x0C, 0x09, 0xD3, 0xE8, 0x68, 0xC0, 0x0B, 0x03, 0xD2, 0x48, 0x46, 0xFF, 0xF7, 0xDD, 0xFE, 0x01, 0x21, 0x28, 0x68, 0x40, 0x0C, 0x0A, 0xD2, 0x38, 0x68, 0x40, 0x1C, 0x38, 0x60, 0x20, 0x68, 0x6F, 0xF3, 0x0F, 0x00, 0x20, 0x60, 0x22, 0x68, 0x38, 0x68, 0x10, 0x43, 0x20, 0x60, 0xE8, 0x68, 0xC0, 0x0B, 0x0F, 0xD3, 0xD8, 0xF8, 0x00, 0x00, 0x00, 0xF1, 0x01, 0x00, 0xC8, 0xF8, 0x00, 0x00, 0x20, 0x68, 0x6F, 0xF3, 0x1F, 0x40, 0x20, 0x60, 0xD8, 0xF8, 0x00, 0x20, 0x20, 0x68, 0x40, 0xEA, 0x02, 0x40, 0x20, 0x60, 0x49, 0xB9, 0xB9, 0xF1, 0x00, 0x0F, 0x03, 0xD1, 0x30, 0x46, 0x07, 0xF0, 0xBE, 0xF9, 0x02, 0xE0, 0x48, 0x46, 0x07, 0xF0, 0x06, 0xFA, 0x6C, 0x17, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x68, 0x46, 0x0E, 0xF0, 0x85, 0xFB, 0x00, 0x9E, 0x00, 0x2E, 0x96, 0xD1, 0x05, 0xB0, 0xBD, 0xE8, 0xF0, 0x87, 0xC0, 0x46 ,
|
||||
0x9C, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x23, 0xF0, 0x2A, 0xFE, 0x74, 0x47, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0B, 0x21, 0x21, 0xF0, 0x41, 0xFA, 0x20, 0x68, 0x18, 0x4B, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0xF0, 0x1C, 0xF9, 0x0A, 0xE0, 0x20, 0x68, 0x00, 0x68, 0x0C, 0x21, 0x40, 0xF0, 0x20, 0x00, 0x21, 0xF0, 0x14, 0xF9, 0x10, 0x57, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0xA8, 0x20, 0xF0, 0x97, 0xF9, 0x01, 0x98, 0x5C, 0x57, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0xA8, 0x20, 0xF0, 0x71, 0xF9, 0x03, 0x98, 0x00, 0x58, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0xF0, 0x20, 0xF9, 0x1C, 0x58, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0xF0, 0x12, 0xF9, 0x54, 0x58, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0xA8, 0x20, 0xF0, 0xF5, 0xF8, 0x04, 0xAB, 0x04, 0x62, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x79, 0x1F, 0xF0, 0x1B, 0xFD, 0x69, 0xE0, 0x60, 0x93, 0x00, 0x00, 0x40, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xA6, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x78, 0x1B, 0xF0, 0x39, 0xFB, 0x28, 0x46, 0x90, 0xA8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x78, 0x1B, 0xF0, 0x69, 0xF9, 0x1E, 0x48, 0x34, 0xAD, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x68, 0xFF, 0x29, 0x98, 0xAD, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0xD4, 0x21, 0xD4, 0xB2, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0xD0, 0x1A, 0xF0, 0x47, 0xFC, 0x20, 0x98, 0xAC, 0xC5, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x78, 0x19, 0xF0 ,
|
||||
0xDB, 0xFA, 0x09, 0x49, 0x28, 0xC6, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x19, 0xF0, 0x9E, 0xFA, 0xDC, 0xD3, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x18, 0xF0, 0xAB, 0xFC, 0x00, 0xF0, 0x03, 0xF8, 0x00, 0xBD, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xDF, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x17, 0xF0, 0xA8, 0xFD, 0xCC, 0xEB, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x38, 0x78, 0x17, 0xF0, 0x77, 0xF8, 0x38, 0x78, 0x16, 0xF0, 0xF0, 0xFF, 0xA8, 0xF7, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0E, 0x49, 0x09, 0x68, 0x23, 0x22, 0x41, 0x61, 0xC8, 0xF7, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x31, 0x2E, 0x31, 0x39, 0x2E, 0x33, 0x31, 0x34, 0x5F, 0x4E, 0x65, 0x77, 0x5F, 0x43, 0x43, 0x41, 0x5F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x69, 0x74, 0x68, 0x6D, 0x00, 0xC0, 0x74, 0x56, 0x30, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xF9, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0xA8, 0x16, 0xF0, 0x79, 0xF8 ,
|
||||
0x12, 0xE0, 0x38, 0xFA, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0xA8, 0x16, 0xF0, 0x03, 0xF8, 0x32, 0x20, 0x94, 0xFB, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x0C, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0xA8, 0x14, 0xF0, 0x05, 0xFF, 0x01, 0xF0, 0x10, 0x1B, 0x01, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x1E, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x13, 0xF0, 0x46, 0xBF, 0x18, 0x30, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x30, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0xF0, 0xD8, 0xFC, 0x9C, 0x31, 0x01, 0x00, 0x08, 0x00 ,
|
||||
0x00, 0x00, 0x68, 0x46, 0x12, 0xF0, 0x51, 0xFC, 0xFE, 0xF7, 0xF0, 0x35, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x68, 0x46, 0x12, 0xF0, 0x27, 0xFA, 0xFE, 0xF7, 0xF0, 0x3D, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0xA9, 0x11, 0xF0, 0x27, 0xFE, 0x20, 0x6F, 0xD0, 0x62, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0xB8, 0xFB, 0x80, 0x7E, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0xDF, 0xF8, 0x58, 0x82, 0xE0, 0x7E, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0D, 0xF0, 0x6A, 0xFE, 0x0B, 0xF0, 0x9A, 0xF9, 0x03, 0x20, 0xA8, 0xF5, 0x88, 0x71, 0x08, 0x60, 0xF2, 0xF7, 0x16, 0xF9, 0x7A, 0x48, 0x6B, 0x49, 0x9C, 0x7F, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x70, 0x51, 0x4D, 0xC4, 0x7F, 0x01, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x40, 0x49, 0x00, 0xF1, 0x52, 0x00, 0x3A, 0x4A, 0xA8, 0x81, 0x28, 0x83, 0xE8, 0x83, 0xE8, 0x84, 0xA8, 0x85, 0x2A, 0x60, 0x39, 0x48, 0x41, 0xF2, 0x11, 0x12, 0x2A, 0x85, 0x18, 0x90, 0x19, 0x91 ,
|
||||
0x39, 0x49, 0x1A, 0x91, 0x39, 0x49, 0x1B, 0x91, 0x39, 0x49, 0x20, 0x46, 0xDF, 0xF8, 0xC4, 0x90, 0x1C, 0x91, 0x38, 0x49, 0xDF, 0xF8, 0xC0, 0xB0, 0x31, 0x4E, 0x1D, 0x91, 0x48, 0x80, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0D, 0xF0, 0x7C, 0xFA, 0xB4, 0x80, 0x01, 0x00, 0x34, 0x00, 0x00, 0x00, 0x34, 0x12, 0x66, 0x09, 0x84, 0x6B, 0x00, 0x20, 0x94, 0x70, 0x00, 0x20, 0xB4, 0x70, 0x00, 0x20, 0xC4, 0x78, 0x00, 0x20, 0x50, 0x7A, 0x00, 0x20, 0xFE, 0xFF, 0x03, 0x00, 0xA4, 0x70, 0x00, 0x20, 0xB0, 0x70, 0x00, 0x20, 0xB8, 0x70, 0x00, 0x20, 0x60, 0x55, 0x30, 0x80, 0x3C, 0x5C, 0x00, 0x20, 0x04, 0x74, 0x00, 0x20, 0xB8, 0xE4, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x20, 0x78, 0x07, 0xF0, 0x01, 0xFC, 0x20, 0x78, 0x07, 0xF0, 0x7A, 0xFB, 0x04, 0x4D, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x2D, 0xE9, 0xF0, 0x4F, 0xAD, 0xF1, 0x8C, 0x0D, 0x04, 0x68, 0x0F, 0x30, 0x03, 0x94, 0xFE, 0xF7, 0xDB, 0xFA, 0x04, 0xF1, 0x14, 0x00 ,
|
||||
0x04, 0x90, 0x21, 0x7D, 0x00, 0x20, 0x21, 0xF0, 0x73, 0x01, 0x88, 0x29, 0x08, 0xBF, 0x01, 0x20, 0x05, 0x90, 0x03, 0x98, 0x00, 0x1D, 0x06, 0x90, 0x5D, 0x48, 0x00, 0x68, 0x01, 0x28, 0x40, 0xF0, 0xFA, 0x83, 0x5B, 0x4D, 0x5C, 0x48, 0xDF, 0xF8, 0x70, 0x91, 0x29, 0x68, 0xDF, 0xF8, 0x70, 0x81, 0xDF, 0xF8, 0x74, 0xA1, 0x88, 0x42, 0x21, 0xD1, 0x10, 0x22, 0x00, 0x21, 0x48, 0x46, 0x4F, 0x46, 0xFB, 0xF7, 0xB7, 0xFE, 0x10, 0x22, 0x00, 0x21, 0x40, 0x46, 0xFB, 0xF7, 0xB2, 0xFE, 0x54, 0x49, 0x08, 0x68, 0x40, 0xF4, 0x80, 0x10, 0x08, 0x60, 0x01, 0x20, 0x51, 0x46, 0x08, 0x60, 0x00, 0x21, 0x29, 0x60, 0x39, 0x78, 0x46, 0x46, 0x00, 0x91, 0x31, 0x78, 0x41, 0xF2, 0x11, 0x13, 0x04, 0x22, 0x01, 0x91, 0x07, 0x21, 0x02, 0x90, 0x03, 0x20, 0xF3, 0xF7, 0x41, 0xFC, 0x51, 0x46, 0x07, 0x91, 0x08, 0x68, 0x56, 0x49, 0xDF, 0xF8, 0x5C, 0xB1, 0x01, 0x28, 0x08, 0x91, 0x56, 0x49, 0xDF, 0xF8, 0x48, 0xA1, 0x09, 0x91, 0x55, 0x49 ,
|
||||
0x0A, 0x91, 0x44, 0x49, 0x0B, 0x91, 0x44, 0x49, 0x0C, 0x91, 0x44, 0x49, 0x0D, 0x91, 0x44, 0x49, 0x0E, 0x91, 0x44, 0x49, 0x0F, 0x91, 0x44, 0x49, 0x10, 0x91, 0x44, 0x49, 0xCC, 0x4D, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x11, 0x91, 0x44, 0x49, 0x12, 0x91, 0x44, 0x49, 0x13, 0x91, 0x44, 0x49, 0x14, 0x91, 0x44, 0x49, 0x15, 0x91, 0x44, 0x49, 0x16, 0x91, 0x9F, 0x49, 0x17, 0x91, 0x9F, 0x49, 0x18, 0x91, 0x9F, 0x49, 0x19, 0x91, 0x9F, 0x49, 0x1A, 0x91, 0x9F, 0x49, 0x1B, 0x91, 0x9F, 0x49, 0x1C, 0x91, 0x9F, 0x49, 0x1D, 0x91, 0x9F, 0x49, 0x1E, 0x91, 0x9F, 0x49, 0x1F, 0x91, 0x40, 0xF0, 0x00, 0x81, 0x04, 0x98, 0x40, 0x78, 0x00, 0xF0, 0x03, 0x01, 0x01, 0x29, 0x40, 0xF0, 0xF9, 0x80, 0x04, 0x99, 0x09, 0x78, 0x01, 0xF0, 0x0C, 0x01, 0x08, 0x29, 0x40, 0xF0, 0xF2, 0x80, 0x06, 0x99, 0x09, 0x88, 0xA1, 0xF1, 0x3C, 0x01, 0x0E, 0xB2, 0x05, 0x99, 0x11, 0xB1, 0xA6, 0xF1, 0x02, 0x06, 0x36, 0xB2, 0xC0, 0x09, 0x4F, 0xF0 ,
|
||||
0x00, 0x07, 0x15, 0xD3, 0x08, 0x3E, 0x36, 0xB2, 0x03, 0x2E, 0x10, 0xD0, 0x17, 0x2E, 0x0E, 0xD0, 0x08, 0x3E, 0x36, 0xB2, 0x03, 0x2E, 0x08, 0xD0, 0x17, 0x2E, 0x06, 0xD0, 0x36, 0x1F, 0x36, 0xB2, 0x03, 0x2E, 0x14, 0xBF, 0x17, 0x2E, 0x02, 0x27, 0x02, 0xE0, 0x03, 0x27, 0x00, 0xE0, 0x01, 0x27, 0x03, 0x2E, 0x18, 0xBF, 0x17, 0x2E, 0x04, 0x9A, 0x40, 0xF0, 0xC8, 0x80, 0x0A, 0x32, 0x12, 0xF8, 0x01, 0x1B, 0x05, 0x24, 0x12, 0xF8, 0x01, 0x3B, 0x4B, 0x40, 0x64, 0x1E, 0xD9, 0xB2, 0xF9, 0xD1, 0x81, 0xEA, 0x21, 0x11, 0x03, 0x2E, 0x94, 0x4E, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x0F, 0x01, 0x48, 0x46, 0x35, 0xD0, 0x43, 0x46, 0xCA, 0x5C, 0x52, 0x1C, 0xCA, 0x54, 0x0C, 0x18, 0x33, 0xE0, 0x50, 0x57, 0x02, 0x00, 0x04, 0x74, 0x00, 0x20, 0x34, 0x12, 0x66, 0x09, 0x60, 0x57, 0x02, 0x00, 0x70, 0x57, 0x02, 0x00, 0xC8, 0x48, 0x30, 0x80, 0x4C, 0x57, 0x02, 0x00, 0x88, 0x57, 0x02, 0x00, 0x80, 0x57, 0x02, 0x00 ,
|
||||
0x18, 0x58, 0x02, 0x00, 0x20, 0x58, 0x02, 0x00, 0x28, 0x58, 0x02, 0x00, 0x30, 0x58, 0x02, 0x00, 0x38, 0x58, 0x02, 0x00, 0x40, 0x58, 0x02, 0x00, 0xE4, 0x58, 0x02, 0x00, 0xE2, 0x58, 0x02, 0x00, 0x14, 0x58, 0x02, 0x00, 0xEF, 0x58, 0x02, 0x00, 0xE0, 0x58, 0x02, 0x00, 0xEE, 0x58, 0x02, 0x00, 0x5C, 0x57, 0x02, 0x00, 0xE6, 0x58, 0x02, 0x00, 0xE8, 0x58, 0x02, 0x00, 0x0C, 0x18, 0x20, 0x78, 0x40, 0x1C, 0x20, 0x70, 0x20, 0x78, 0x43, 0x46, 0x03, 0xEB, 0x01, 0x08, 0x0A, 0x28, 0x76, 0xDB, 0x98, 0xF8, 0x00, 0x00, 0x0A, 0x28, 0x72, 0xDB, 0x94, 0x48, 0x00, 0x25, 0x01, 0x60, 0x04, 0x98, 0x00, 0xF1, 0x0A, 0x09, 0x40, 0x78, 0x41, 0x08, 0x24, 0xBF, 0x04, 0x99, 0x09, 0x1D, 0x04, 0xD2, 0x80, 0x08, 0x2E, 0xBF, 0x49, 0x46, 0x04, 0x99, 0x10, 0x31, 0x0B, 0x98, 0x06, 0x22, 0xFA, 0xF7, 0xB9, 0xFC, 0x0C, 0x98, 0x06, 0x22, 0x49, 0x46, 0xFA, 0xF7, 0xB4, 0xFC, 0x9B, 0x48, 0x9A, 0x49, 0x5C, 0x4F, 0x02, 0x00, 0xC8, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x78, 0x08, 0x22, 0x08, 0x60, 0x58, 0x46, 0x07, 0x60, 0x0D, 0x98, 0x29, 0x46, 0xFB, 0xF7, 0xAF, 0xFD, 0x08, 0x22, 0x0E, 0x98, 0x29, 0x46, 0xFB, 0xF7, 0xAA, 0xFD, 0x08, 0x22, 0x0F, 0x98, 0x29, 0x46, 0xFB, 0xF7, 0xA5, 0xFD, 0x08, 0x22, 0x10, 0x98, 0x29, 0x46, 0xFB, 0xF7, 0xA0, 0xFD, 0x08, 0x22, 0x11, 0x98, 0x29, 0x46, 0xFB, 0xF7, 0x9B, 0xFD, 0x08, 0x22, 0x12, 0x98, 0x29, 0x46, 0xFB, 0xF7, 0x96, 0xFD, 0x07, 0x99, 0x02, 0x20, 0x08, 0x60, 0x13, 0x99, 0x28, 0x46, 0x08, 0x80, 0x08, 0x99, 0x08, 0x70, 0x14, 0x99, 0x08, 0x70, 0x15, 0x99, 0x08, 0x60, 0x16, 0x99, 0x08, 0x70, 0x17, 0x99, 0x08, 0x60, 0x18, 0x99, 0x08, 0x60, 0x19, 0x99, 0x08, 0x60, 0x09, 0x99, 0x08, 0x80, 0x0A, 0x99, 0x08, 0x80, 0x1A, 0x99, 0x08, 0x80, 0x7D, 0x49, 0x0D, 0x60, 0x1B, 0x99, 0x08, 0x70, 0x1C, 0x99, 0x08, 0x70, 0x1D, 0x99, 0x08, 0x70, 0x1E, 0x99, 0x08, 0x80, 0x1F, 0x99, 0x08, 0x80, 0x51, 0x46, 0x08, 0x80 ,
|
||||
0x20, 0x78, 0x00, 0x96, 0x04, 0x22, 0x01, 0x90, 0x98, 0xF8, 0x00, 0x00, 0x41, 0xF2, 0x14, 0x13, 0x07, 0x21, 0x02, 0x90, 0x03, 0x20, 0xF3, 0xF7, 0x07, 0xFB, 0x07, 0x98, 0xA2, 0x49, 0x00, 0x68, 0x20, 0x91, 0xA2, 0x49, 0x05, 0x28, 0x21, 0x91, 0x9E, 0x49, 0x22, 0x91, 0x40, 0xF0, 0x37, 0x82, 0x04, 0x98, 0x40, 0x78, 0x24, 0x50, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x41, 0x08, 0x24, 0xBF, 0x04, 0x99, 0x09, 0x1D, 0x05, 0xD2, 0x80, 0x08, 0x27, 0xBF, 0x04, 0x99, 0x0A, 0x31, 0x04, 0x99, 0x10, 0x31, 0x0B, 0x98, 0xF8, 0xF7, 0x2D, 0xFC, 0x01, 0x28, 0x04, 0x98, 0x40, 0xF0, 0x23, 0x82, 0x40, 0x78, 0x00, 0xF0, 0x03, 0x00, 0x03, 0x28, 0x18, 0xD0, 0x02, 0x28, 0x07, 0xBF, 0x04, 0x99, 0x10, 0x31, 0x04, 0x99, 0x0A, 0x31, 0x13, 0xE0, 0x48, 0x58, 0x02, 0x00, 0x4C, 0x58, 0x02, 0x00, 0x50, 0x58, 0x02, 0x00, 0xF0, 0x58, 0x02, 0x00, 0xF2, 0x58, 0x02, 0x00, 0xF3, 0x58, 0x02, 0x00, 0xF4, 0x58, 0x02, 0x00, 0xEA, 0x58 ,
|
||||
0x02, 0x00, 0xEC, 0x58, 0x02, 0x00, 0x04, 0x99, 0x18, 0x31, 0x0C, 0x98, 0xF8, 0xF7, 0x06, 0xFC, 0x04, 0x99, 0x01, 0x28, 0x40, 0xF0, 0xFC, 0x81, 0x49, 0x78, 0x01, 0xF0, 0x03, 0x01, 0x01, 0x29, 0x40, 0xF0, 0xF6, 0x81, 0x59, 0x46, 0x09, 0x68, 0x04, 0x9A, 0x8E, 0x46, 0x51, 0x46, 0xD2, 0x8A, 0x0B, 0x88, 0x12, 0x11, 0x93, 0x42, 0x00, 0xF0, 0x37, 0x82, 0x0A, 0x80, 0x06, 0x99, 0x09, 0x88, 0x3C, 0x39, 0x0B, 0xB2, 0x71, 0x46, 0x49, 0x1E, 0x09, 0xD0, 0x49, 0x1E, 0x04, 0xD0, 0x49, 0x1E, 0x08, 0xD1, 0xA3, 0xF1, 0x10, 0x03, 0x04, 0xE0, 0xA3, 0xF1, 0x14, 0x03, 0x01, 0xE0, 0xA3, 0xF1, 0x08, 0x03, 0x1B, 0xB2, 0x05, 0x98, 0x10, 0xB1, 0xA3, 0xF1, 0x02, 0x03, 0x1B, 0xB2, 0xEC, 0x50, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0xF1, 0xCE, 0x81, 0x16, 0x98, 0x40, 0xF2, 0x77, 0x51, 0x99, 0x42, 0x0B, 0x90, 0x14, 0x98, 0x05, 0x90, 0x00, 0xF0, 0xA3, 0x81, 0x08, 0x46, 0x00, 0xF1, 0x3C, 0x00, 0x98, 0x42 ,
|
||||
0x05, 0x9A, 0x00, 0xF0, 0x9A, 0x81, 0xDF, 0xF8, 0x48, 0x82, 0x14, 0x78, 0x0B, 0x9A, 0xBB, 0x2C, 0x12, 0x78, 0x0C, 0x92, 0x63, 0xD1, 0xDD, 0xF8, 0x68, 0xC0, 0xBC, 0xF9, 0x00, 0x20, 0x91, 0x42, 0x18, 0xBF, 0x90, 0x42, 0x5B, 0xD1, 0x1C, 0x2B, 0x4F, 0xF0, 0x00, 0x00, 0xC0, 0xF2, 0x82, 0x81, 0x3D, 0x2B, 0x13, 0x9D, 0x80, 0xF2, 0x7E, 0x81, 0xA3, 0xF1, 0x1C, 0x01, 0x09, 0xB2, 0x29, 0x80, 0x1E, 0x9A, 0xDD, 0xF8, 0x30, 0x90, 0xB2, 0xF9, 0x00, 0x60, 0xB9, 0xF1, 0x01, 0x0F, 0x15, 0xD1, 0xDD, 0xF8, 0x24, 0x90, 0x03, 0x2E, 0x0D, 0xDA, 0xB9, 0xF9, 0x00, 0x70, 0xB9, 0x42, 0x07, 0xD0, 0x01, 0x26, 0x16, 0x80, 0x4A, 0x46, 0x0E, 0x46, 0x03, 0xE0, 0xC0, 0x46, 0x90, 0x57, 0x02, 0x00, 0x76, 0x1C, 0x16, 0x80, 0x1B, 0x9A, 0x16, 0x78, 0x1D, 0x9A, 0x16, 0x70, 0x0C, 0x9A, 0x1F, 0x9E, 0x02, 0x2A, 0x28, 0xD1, 0xB6, 0xF9, 0x00, 0x20, 0xBE, 0xF1, 0x00, 0x0F, 0x1A, 0xD0, 0x03, 0x2A, 0x35, 0x46, 0x0B, 0xDA, 0x0A, 0x9E ,
|
||||
0xB6, 0xF9, 0x00, 0x70, 0xB9, 0x42, 0x04, 0xD0, 0x01, 0x22, 0x2A, 0x80, 0x0A, 0x46, 0x35, 0x46, 0x00, 0xE0, 0xB4, 0x51, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x52, 0x1C, 0x2A, 0x80, 0x1C, 0x99, 0x0A, 0x78, 0x1D, 0x99, 0x0A, 0x70, 0x0F, 0xE0, 0xC0, 0x46, 0x58, 0x57, 0x02, 0x00, 0xA6, 0x64, 0x00, 0x20, 0x54, 0x57, 0x02, 0x00, 0x28, 0x80, 0x05, 0x99, 0x08, 0x70, 0x08, 0x9A, 0x11, 0x78, 0x41, 0xF0, 0x04, 0x01, 0x11, 0x70, 0x04, 0x46, 0x45, 0x46, 0xAC, 0xF8, 0x00, 0x00, 0x28, 0x70, 0xCC, 0x2C, 0x09, 0x9A, 0x40, 0xF0, 0x00, 0x81, 0xDD, 0xF8, 0x7C, 0xC0, 0x0A, 0x99, 0x1E, 0x9F, 0x45, 0x46, 0xB1, 0xF9, 0x00, 0x60, 0xB2, 0xF9, 0x00, 0x90, 0x28, 0x78, 0xCD, 0xF8, 0x50, 0xC0, 0x16, 0x91, 0x0A, 0x97, 0x13, 0x92, 0x09, 0x95, 0x0C, 0x99, 0x01, 0x29, 0x05, 0xD1, 0x05, 0x9A, 0xB0, 0xEB, 0x49, 0x0F, 0x01, 0xD1, 0x00, 0x21, 0x11, 0x70, 0x0C, 0x99, 0x02, 0x29, 0x05, 0xD1, 0x05, 0x9A, 0xB0, 0xEB, 0x46, 0x0F ,
|
||||
0x01, 0xD1, 0x00, 0x21, 0x11, 0x70, 0xB3, 0xF5, 0x14, 0x7F, 0x40, 0xF3, 0xBA, 0x80, 0x40, 0xF2, 0x51, 0x31, 0x99, 0x42, 0x08, 0x99, 0x40, 0xF3, 0xB4, 0x80, 0x09, 0x78, 0x06, 0x29, 0x00, 0xF0, 0xB0, 0x80, 0xA3, 0xF2, 0x51, 0x21, 0x0B, 0xB2, 0x4F, 0xEA, 0xE3, 0x01, 0x03, 0xEB, 0x11, 0x71, 0x4F, 0xEA, 0x21, 0x11, 0xCA, 0xB2, 0x4F, 0xEA, 0xE3, 0x01, 0x03, 0xEB, 0x11, 0x71, 0x15, 0x9D, 0x21, 0xF0, 0x0F, 0x01, 0xA3, 0xEB, 0x01, 0x03, 0x1D, 0x99, 0x2E, 0x68, 0x7C, 0x52, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x91, 0xF8, 0x00, 0xE0, 0x5F, 0xFA, 0x83, 0xF8, 0x60, 0xB1, 0x31, 0x18, 0x11, 0xF8, 0x01, 0x1C, 0x51, 0x40, 0xCB, 0xB2, 0x07, 0xE0, 0xC0, 0x46, 0x58, 0x58, 0x02, 0x00, 0x54, 0x58, 0x02, 0x00, 0xDC, 0x58, 0x02, 0x00, 0x13, 0x46, 0x19, 0x99, 0xDD, 0xF8, 0x6C, 0xA0, 0xDD, 0xF8, 0x70, 0xB0, 0xD1, 0xF8, 0x00, 0xC0, 0x00, 0xF0, 0x0F, 0x01, 0x99, 0x42, 0x22, 0xD0, 0x0A, 0x9B, 0x86, 0x45, 0x9A, 0xF8 ,
|
||||
0x00, 0x10, 0xB3, 0xF9, 0x00, 0x30, 0x9B, 0xF8, 0x00, 0x50, 0x15, 0xDD, 0x37, 0x5C, 0x44, 0x1C, 0x82, 0xEA, 0x07, 0x0C, 0x04, 0xF0, 0x0F, 0x07, 0x67, 0x45, 0x0B, 0xD0, 0xA6, 0x45, 0x06, 0x44, 0x0A, 0xDD, 0x76, 0x78, 0x72, 0x40, 0x86, 0x1C, 0x06, 0xF0, 0x0F, 0x06, 0x96, 0x42, 0x03, 0xD1, 0xC0, 0x1C, 0x4D, 0xE0, 0x80, 0x1C, 0x4B, 0xE0, 0x05, 0x9E, 0x00, 0x22, 0x32, 0x70, 0x4A, 0xE0, 0x00, 0xF0, 0x1F, 0x01, 0x01, 0x22, 0x8A, 0x40, 0x17, 0x99, 0xC4, 0x10, 0x0B, 0x68, 0x24, 0xF0, 0x03, 0x01, 0x5C, 0xF8, 0x01, 0x70, 0x3A, 0x42, 0x32, 0xD1, 0x5F, 0x58, 0x3A, 0x42, 0x06, 0x44, 0x1F, 0xD0, 0x18, 0x9B, 0x37, 0x78, 0x1B, 0x68, 0xB8, 0x45, 0x04, 0xD1, 0x58, 0x58, 0x02, 0x42, 0x19, 0xD0, 0x63, 0x46, 0x15, 0xE0, 0xA1, 0x10, 0x8C, 0x00, 0x19, 0x59, 0x91, 0x43, 0x19, 0x51, 0x00, 0x90, 0x30, 0x78, 0x01, 0x90, 0x44, 0x53, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x03, 0x20, 0x06, 0x21, 0x02, 0x46, 0x4D, 0xF6 ,
|
||||
0x80, 0x53, 0xF3, 0xF7, 0x63, 0xF9, 0x09, 0x99, 0x28, 0x68, 0x0E, 0x78, 0x36, 0x18, 0x06, 0xE0, 0xE3, 0x58, 0x02, 0x00, 0xA0, 0x10, 0x81, 0x00, 0x58, 0x58, 0x02, 0x43, 0x5A, 0x50, 0x86, 0xF8, 0x00, 0x80, 0x0B, 0x98, 0x00, 0x78, 0x0C, 0x90, 0x13, 0x98, 0xB0, 0xF9, 0x00, 0x90, 0x09, 0x98, 0x00, 0x78, 0x0A, 0x9A, 0x40, 0x1C, 0x9B, 0xF8, 0x00, 0x50, 0x9A, 0xF8, 0x00, 0x10, 0xB2, 0xF9, 0x00, 0x30, 0x09, 0x9A, 0xC0, 0xB2, 0x10, 0x70, 0x0C, 0x9A, 0x01, 0x2A, 0x03, 0xD1, 0x88, 0x42, 0xC8, 0xBF, 0x8A, 0xF8, 0x00, 0x00, 0x0C, 0x99, 0x02, 0x29, 0x07, 0xD1, 0xA8, 0x42, 0xC8, 0xBF, 0x8B, 0xF8, 0x00, 0x00, 0x02, 0xE0, 0x0A, 0x98, 0xB0, 0xF9, 0x00, 0x30, 0xB9, 0xF1, 0x00, 0x0F, 0x06, 0xDD, 0x03, 0x2B, 0x04, 0xD1, 0x11, 0x98, 0x01, 0x22, 0x49, 0x46, 0x00, 0xF0, 0x72, 0xFB, 0x16, 0x98, 0xB0, 0xF9, 0x00, 0x10, 0x14, 0x98, 0x00, 0x29, 0xB0, 0xF9, 0x00, 0x00, 0x05, 0xDD, 0x03, 0x28, 0x03, 0xD1, 0x12, 0x98 ,
|
||||
0x02, 0x22, 0x00, 0xF0, 0x64, 0xFB, 0x05, 0x98, 0x04, 0x78, 0x0B, 0x98, 0x00, 0x78, 0x0C, 0x90, 0x08, 0x98, 0xBB, 0x2C, 0x01, 0x78, 0x02, 0xD0, 0xAA, 0x2C, 0x2F, 0xD0, 0x31, 0xE0, 0x0C, 0x98, 0x01, 0x28, 0x0B, 0xD1, 0x0D, 0x98, 0x17, 0x9A, 0x10, 0x60, 0x0C, 0x54, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x0F, 0x98, 0x18, 0x9A, 0x10, 0x60, 0x19, 0x9A, 0x11, 0x98, 0x10, 0x60, 0x47, 0x4A, 0x15, 0x98, 0x02, 0x60, 0x0C, 0x98, 0x02, 0x28, 0x0B, 0xD1, 0x0E, 0x98, 0x17, 0x9A, 0x10, 0x60, 0x10, 0x98, 0x18, 0x9A, 0x10, 0x60, 0x19, 0x9A, 0x12, 0x98, 0x10, 0x60, 0x41, 0x4A, 0x15, 0x98, 0x02, 0x60, 0xCC, 0x20, 0x0F, 0xE0, 0x08, 0x99, 0x09, 0x78, 0x0C, 0xE0, 0x02, 0x20, 0x00, 0xE0, 0x01, 0x20, 0x0B, 0x99, 0x08, 0x70, 0x1A, 0x99, 0x0B, 0x80, 0x13, 0x99, 0x00, 0x20, 0x08, 0x80, 0x08, 0x98, 0x01, 0x78, 0xBB, 0x20, 0x05, 0x9A, 0x10, 0x70, 0x06, 0x29, 0x07, 0x99, 0x11, 0xD1, 0x06, 0x20, 0x08, 0x60, 0x20, 0x98 ,
|
||||
0x00, 0x25, 0x05, 0x70, 0x21, 0x98, 0x29, 0x46, 0x04, 0x22, 0xFB, 0xF7, 0x27, 0xFB, 0x01, 0x20, 0x00, 0xF0, 0x3A, 0xFA, 0x02, 0x20, 0x00, 0xF0, 0x37, 0xFA, 0x22, 0x98, 0x05, 0x60, 0x07, 0x98, 0x04, 0x99, 0x00, 0x68, 0x07, 0x28, 0x44, 0xD1, 0x09, 0x78, 0x03, 0x9C, 0x80, 0x29, 0x40, 0xD1, 0x38, 0x34, 0x21, 0x78, 0x64, 0x1C, 0x22, 0x46, 0x00, 0x29, 0x3A, 0xD1, 0x20, 0x98, 0x90, 0xF8, 0x00, 0xA0, 0x22, 0x98, 0x05, 0x90, 0xD0, 0xF8, 0x00, 0x90, 0x51, 0x46, 0x48, 0x46, 0xFD, 0xF7, 0x79, 0xF9, 0x5F, 0xFA, 0x80, 0xF8, 0x21, 0x9F, 0x15, 0x78, 0x51, 0x46, 0x48, 0x46, 0x17, 0xF8, 0x08, 0x30, 0xFD, 0xF7, 0xD4, 0x54, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x6F, 0xF9, 0x1E, 0x46, 0x1B, 0x1D, 0xC0, 0xB2, 0x38, 0x5C, 0x00, 0x1D, 0xA8, 0x42, 0x28, 0x46, 0x07, 0xDD, 0x80, 0x18, 0x82, 0x1C, 0x10, 0x78, 0x2D, 0x18, 0xAD, 0x1C, 0xAD, 0xB2, 0xAB, 0x42, 0xF7, 0xDC, 0x04, 0xF8, 0x01, 0x6B, 0x11, 0x49, 0x32, 0x46 ,
|
||||
0x20, 0x46, 0x01, 0xEB, 0x48, 0x11, 0xFA, 0xF7, 0xDC, 0xF9, 0xAD, 0x1B, 0xFF, 0x20, 0x34, 0x19, 0xAD, 0x1E, 0x04, 0xF8, 0x01, 0x0B, 0x25, 0x70, 0x05, 0x98, 0x01, 0x68, 0x49, 0x1C, 0x01, 0x60, 0x07, 0x98, 0x00, 0x68, 0x07, 0x28, 0x04, 0xD0, 0x06, 0x99, 0x08, 0x68, 0x20, 0xF4, 0x80, 0x30, 0x08, 0x60, 0x23, 0xB0, 0xBD, 0xE8, 0xF0, 0x8F, 0xC0, 0x46, 0x94, 0x57, 0x02, 0x00, 0xD4, 0x57, 0x02, 0x00, 0x5C, 0x58, 0x02, 0x00, 0x6E, 0x48, 0x2D, 0xE9, 0xF0, 0x47, 0x6E, 0x4D, 0x82, 0x89, 0x4A, 0xF6, 0x55, 0x21, 0xAD, 0xF5, 0xFE, 0x7D, 0x91, 0x42, 0x4F, 0xF0, 0x00, 0x01, 0xAD, 0xF1, 0x38, 0x0D, 0x12, 0xD1, 0x29, 0x60, 0x68, 0x4A, 0x11, 0x70, 0x41, 0xF2, 0x10, 0x41, 0x81, 0x81, 0x4F, 0xF6, 0xFF, 0x70, 0x66, 0x49, 0x08, 0x60, 0x28, 0x68, 0x00, 0x90, 0x02, 0x22, 0x05, 0x21, 0x03, 0x20, 0x41, 0xF2, 0x34, 0x23, 0xF3, 0xF7, 0x48, 0xF8, 0x29, 0x68, 0x61, 0x4C, 0x01, 0x29, 0x20, 0x68, 0x40, 0xF0, 0xAF, 0x80 ,
|
||||
0x5F, 0x4D, 0x02, 0x28, 0x29, 0x68, 0x23, 0xD1, 0x9C, 0x55, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x5E, 0x48, 0x00, 0x68, 0x5F, 0x4A, 0x12, 0x5C, 0x00, 0x92, 0x01, 0x91, 0x5E, 0x49, 0x09, 0x68, 0x02, 0x91, 0x5B, 0x49, 0x0B, 0x5C, 0x03, 0x20, 0x07, 0x21, 0x04, 0x22, 0xF3, 0xF7, 0x2E, 0xF8, 0x5B, 0x49, 0x4A, 0x79, 0x59, 0x48, 0x00, 0x92, 0x02, 0x79, 0x01, 0x92, 0x40, 0x79, 0x04, 0x22, 0x02, 0x90, 0x03, 0x20, 0x0B, 0x79, 0x07, 0x21, 0xF3, 0xF7, 0x20, 0xF8, 0x03, 0x20, 0x20, 0x60, 0xEC, 0xF7, 0x1A, 0xFF, 0x20, 0x68, 0x29, 0x68, 0x04, 0x28, 0x15, 0xD1, 0x0D, 0x20, 0x8D, 0xF8, 0x10, 0x00, 0x00, 0x25, 0x8D, 0xF8, 0x14, 0x50, 0x8D, 0xF8, 0x15, 0x10, 0x28, 0x46, 0x63, 0x21, 0x00, 0xF0, 0xAA, 0xFB, 0x63, 0x21, 0x28, 0x46, 0x00, 0xF0, 0xFA, 0xFA, 0x03, 0xA9, 0x04, 0xA8, 0xE0, 0xF7, 0xCA, 0xFC, 0x05, 0x20, 0x20, 0x60, 0x46, 0x4D, 0x05, 0x28, 0x29, 0x68, 0x01, 0xF1, 0x01, 0x01, 0x29, 0x60, 0x1D, 0xD1 ,
|
||||
0x44, 0x4A, 0x8A, 0x42, 0x1A, 0xD1, 0x43, 0x48, 0x01, 0x68, 0x00, 0x91, 0x40, 0x68, 0x01, 0x90, 0x03, 0x20, 0x02, 0x46, 0x06, 0x21, 0x41, 0x4E, 0x33, 0x46, 0x22, 0x3B, 0xF2, 0xF7, 0xEB, 0xFF, 0x3E, 0x48, 0x01, 0x68, 0x00, 0x91, 0x40, 0x68, 0x33, 0x46, 0x06, 0x21, 0x01, 0x90, 0x03, 0x20, 0x02, 0x46, 0xF2, 0xF7, 0xE0, 0xFF, 0x00, 0x20, 0x28, 0x60, 0x20, 0x68, 0x06, 0x28, 0x47, 0xD1, 0x4F, 0xF0, 0x64, 0x56, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x07, 0x0A, 0xC4, 0xF8, 0x00, 0xA0, 0x03, 0x20, 0x48, 0xF2, 0x70, 0x53, 0x01, 0x22, 0x04, 0x21, 0xF2, 0xF7, 0xD0, 0xFF, 0xDF, 0xF8, 0xCC, 0x80, 0x31, 0x4F, 0x48, 0xF2, 0x70, 0x59, 0x01, 0x25, 0x49, 0xEA, 0x05, 0x03, 0x01, 0x22, 0x04, 0x21, 0x03, 0x20, 0xF2, 0xF7, 0xC3, 0xFF, 0x00, 0x24, 0x17, 0xF8, 0x02, 0x0F, 0x20, 0xE0, 0x69, 0x01, 0x04, 0xEB, 0x08, 0x02, 0x88, 0x18, 0xC6, 0x1C, 0x43, 0x78, 0x00, 0x93, 0x80, 0x78, 0x01, 0x90, 0x30, 0x78, 0x02, 0x90 ,
|
||||
0x53, 0x5C, 0x51, 0x46, 0x04, 0x22, 0x03, 0x20, 0xF2, 0xF7, 0xAE, 0xFF, 0x38, 0x78, 0x01, 0x1B, 0xB1, 0xF1, 0xFF, 0x3F, 0x08, 0xD1, 0xF0, 0x78, 0x00, 0x90, 0xB3, 0x78, 0x03, 0x20, 0x02, 0x22, 0x05, 0x21, 0xF2, 0xF7, 0xA1, 0xFF, 0x38, 0x78, 0x24, 0x1D, 0xE4, 0xB2, 0xA0, 0x42, 0xDC, 0xDC, 0xAD, 0x1C, 0xED, 0xB2, 0x04, 0x2D, 0xCD, 0xDB, 0x63, 0x21, 0x4F, 0xF4, 0x05, 0x70, 0xF1, 0xF7, 0xA3, 0xFC, 0xE1, 0xF7, 0x85, 0xFD, 0x7F, 0xB0, 0x0E, 0xB0, 0xBD, 0xE8, 0xF0, 0x87, 0xC0, 0x46, 0x04, 0x74, 0x00, 0x20, 0x50, 0x57, 0x02, 0x00, 0x6C, 0x5D, 0x02, 0x00, 0x40, 0x00, 0x3D, 0x80, 0x4C, 0x57, 0x02, 0x00, 0x58, 0x57, 0x02, 0x00, 0x90, 0x57, 0x02, 0x00, 0x60, 0x57, 0x02, 0x00, 0x70, 0x57, 0x02, 0x00, 0x5C, 0x57, 0x02, 0x00, 0x80, 0x57, 0x02, 0x00, 0x2C, 0x57, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x88, 0x57, 0x02, 0x00, 0x54, 0x57, 0x02, 0x00, 0xFF, 0xFF, 0x03, 0x00, 0x38, 0x58, 0x02, 0x00, 0x40, 0x58 ,
|
||||
0x02, 0x00, 0x66, 0x55, 0xDD, 0xEE, 0xDB, 0x58, 0x02, 0x00, 0x5C, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x57, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0x58, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xE9, 0xFE, 0x4F, 0x4A, 0x4A, 0x49, 0x4D, 0x00, 0x90, 0xB2, 0xF9, 0x00, 0x20, 0x43, 0xA3, 0x29, 0x78, 0x01, 0x93, 0x43, 0xA3, 0x01, 0x28, 0x02, 0x93, 0x47, 0x4E, 0xDF, 0xF8, 0x1C, 0x81, 0xDF, 0xF8, 0x1C, 0x91, 0x1E, 0xD0, 0x43, 0x48, 0x04, 0x78, 0x48, 0x01, 0x87, 0x19, 0x30, 0x18, 0x01, 0x99, 0x06, 0x22, 0xF9, 0xF7, 0xC8, 0xFF, 0x40, 0x46, 0x01, 0x78, 0x00, 0x68, 0x07, 0xF1, 0x06, 0x07, 0x07, 0xF8, 0x01, 0x1B, 0x07, 0xF8, 0x01, 0x4B, 0x4F, 0xF0, 0x00, 0x01, 0x07, 0xF8, 0x01, 0x1B, 0x20, 0xB9, 0x39, 0x70, 0x28, 0x78, 0x4E, 0x46, 0x0A, 0x21, 0x58, 0xE0, 0xDF, 0xF8, 0xE4, 0xB0, 0x0F, 0xE0, 0xD4, 0xB2, 0x48, 0x01, 0x87, 0x19, 0x30, 0x18, 0x02, 0x99, 0x07, 0x22, 0xF9, 0xF7, 0xAA, 0xFF, 0xFF, 0x1D, 0x00, 0x20, 0xDF, 0xF8, 0xCC, 0xB0, 0x07, 0xF8, 0x01, 0x4B, 0x07, 0xF8, 0x01, 0x0B, 0x16, 0x2C, 0xB2, 0x46, 0xAE, 0xBF, 0x14, 0x20, 0x84, 0x59 ,
|
||||
0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x60, 0x1E, 0xC0, 0xB2, 0x38, 0x70, 0x4E, 0x46, 0x7F, 0x1C, 0x40, 0x1C, 0xC2, 0xB2, 0x28, 0x78, 0x5B, 0x46, 0x00, 0x21, 0x32, 0x54, 0x38, 0x46, 0x00, 0xF0, 0xBC, 0xF9, 0x28, 0x78, 0x16, 0x2C, 0x31, 0x5C, 0x01, 0xF1, 0x0A, 0x01, 0x31, 0x54, 0x00, 0xF1, 0x01, 0x00, 0xC0, 0xB2, 0x28, 0x70, 0x2B, 0xDB, 0x00, 0x99, 0x0A, 0xEB, 0x40, 0x10, 0x07, 0x46, 0x01, 0x29, 0xA4, 0xF1, 0x01, 0x09, 0x09, 0xD0, 0x01, 0x99, 0x06, 0x22, 0xF9, 0xF7, 0x79, 0xFF, 0x40, 0x46, 0x00, 0x78, 0xBF, 0x1D, 0x07, 0xF8, 0x01, 0x0B, 0x04, 0xE0, 0x02, 0x99, 0x07, 0x22, 0xF9, 0xF7, 0x6F, 0xFF, 0xFF, 0x1D, 0x07, 0xF8, 0x01, 0x4B, 0x15, 0x3C, 0x15, 0x21, 0x28, 0x78, 0xE2, 0xB2, 0x5B, 0x46, 0x07, 0xF8, 0x01, 0x1B, 0x32, 0x54, 0x07, 0xF8, 0x01, 0x9B, 0x38, 0x46, 0x00, 0xF0, 0x8B, 0xF9, 0x28, 0x78, 0x31, 0x5C, 0x0A, 0x31, 0x31, 0x54, 0x40, 0x1C, 0x28, 0x70, 0xBD, 0xE8, 0xFE, 0x8F, 0xC0, 0x46 ,
|
||||
0x54, 0x54, 0x54, 0x4B, 0x45, 0x59, 0x00, 0xC0, 0x54, 0x54, 0x54, 0x53, 0x53, 0x49, 0x44, 0x00, 0x54, 0x58, 0x02, 0x00, 0xE6, 0x58, 0x02, 0x00, 0xE8, 0x58, 0x02, 0x00, 0x5C, 0x58, 0x02, 0x00, 0x5C, 0x57, 0x02, 0x00, 0xDC, 0x58, 0x02, 0x00, 0xD4, 0x57, 0x02, 0x00, 0x94, 0x57, 0x02, 0x00, 0xFF, 0xB5, 0x0C, 0x46, 0x06, 0x46, 0xF7, 0xF7, 0x4C, 0x5A, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xE3, 0xFE, 0x15, 0x49, 0x15, 0x4A, 0x0D, 0x68, 0x01, 0xA9, 0x92, 0xE8, 0x8C, 0x00, 0x81, 0xE8, 0x8C, 0x00, 0xF7, 0xF7, 0xFD, 0xFE, 0x01, 0x98, 0x11, 0x49, 0x28, 0x1A, 0x03, 0x9D, 0x25, 0x60, 0x02, 0x9A, 0x80, 0x18, 0x82, 0x42, 0x30, 0x60, 0x0E, 0xD8, 0x08, 0x46, 0x00, 0x68, 0x22, 0x68, 0x82, 0x42, 0x0E, 0xD2, 0x68, 0x46, 0xE8, 0xF7, 0xB9, 0xFF, 0x9D, 0xF8, 0x00, 0x00, 0x05, 0xF1, 0x01, 0x05, 0x30, 0xB9, 0x03, 0x95, 0x03, 0xE0, 0x25, 0x68, 0x6D, 0x1C, 0x25, 0x60, 0x0C, 0x46, 0x25, 0x60, 0x00, 0x20, 0x00, 0x90 ,
|
||||
0xFF, 0xBD, 0x60, 0x55, 0x30, 0x80, 0x24, 0x5D, 0x00, 0x20, 0x6C, 0x5D, 0x02, 0x00, 0x70, 0xB5, 0x4D, 0x00, 0x20, 0x2D, 0x4F, 0xF0, 0x00, 0x01, 0x0C, 0x46, 0x4F, 0xEA, 0x55, 0x13, 0x09, 0xD3, 0x50, 0xF8, 0x21, 0x60, 0xB6, 0xF1, 0xFF, 0x3F, 0x04, 0xD1, 0x49, 0x1C, 0xC9, 0xB2, 0x20, 0x3D, 0x5B, 0x1E, 0xF5, 0xD1, 0x4D, 0xB1, 0x20, 0x2D, 0x09, 0xD2, 0x01, 0x23, 0xAB, 0x40, 0x5B, 0x1E, 0x50, 0xF8, 0x21, 0x00, 0x18, 0x40, 0x83, 0x42, 0x01, 0xD1, 0x4F, 0xF0, 0x01, 0x04, 0x07, 0x48, 0x03, 0x78, 0x2C, 0xB9, 0x01, 0x21, 0x91, 0x40, 0xC9, 0x43, 0xC9, 0xB2, 0x0B, 0x40, 0x03, 0xE0, 0x01, 0x21, 0x91, 0x40, 0xC9, 0xB2, 0x0B, 0x43, 0x03, 0x70, 0x70, 0xBD, 0xC0, 0x46, 0xEE, 0x58, 0x02, 0x00, 0x14, 0x5B, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x7E, 0xB5, 0x05, 0x46, 0x95, 0xF8, 0x36, 0x20, 0x0E, 0x46, 0x0F, 0x49, 0x07, 0x2A, 0x12, 0xBF, 0x08, 0x68, 0x01, 0x20, 0x08, 0x60, 0x0D, 0x4C, 0x00, 0x92, 0x21, 0x68 ,
|
||||
0x41, 0xF2, 0x12, 0x13, 0x04, 0x22, 0x01, 0x91, 0x07, 0x21, 0x02, 0x90, 0x03, 0x20, 0xF2, 0xF7, 0x6B, 0xFD, 0x31, 0x46, 0x28, 0x46, 0xE7, 0xF7, 0x21, 0xFC, 0x21, 0x68, 0x00, 0x22, 0x05, 0x29, 0x02, 0xD1, 0x04, 0x49, 0x08, 0x31, 0x0A, 0x60, 0x7E, 0xBD, 0xC0, 0x46, 0x50, 0x57, 0x02, 0x00, 0x4C, 0x57, 0x02, 0x00, 0x00, 0x7C, 0x00, 0x20, 0x0E, 0x49, 0x09, 0x68, 0x49, 0x08, 0x15, 0xD2, 0x0D, 0x49, 0x09, 0x78, 0x91, 0xB1, 0x44, 0xF2, 0xE9, 0x21, 0x68, 0xB9, 0x0B, 0x48, 0x01, 0x78, 0x07, 0x48, 0x01, 0x29, 0x03, 0xD1, 0x0A, 0x49, 0x09, 0x78, 0x0E, 0x29, 0x02, 0xD0, 0x44, 0xF2, 0xDE, 0x21, 0x41, 0x60, 0x01, 0x21, 0x00, 0xE0, 0x06, 0x48, 0x01, 0x60, 0x70, 0x47, 0xC0, 0x46, 0x00, 0x97, 0x3C, 0x80, 0x10, 0x0C, 0x30, 0x80, 0xDD, 0x6A, 0x00, 0x20, 0xE0, 0x7C, 0x00, 0x20, 0xA6, 0x64, 0x00, 0x20, 0x04, 0x97, 0x3C, 0x80, 0x00, 0xB5, 0xAD, 0xF1, 0x18, 0x0D, 0x4F, 0xF0, 0x09, 0x00, 0x00, 0x90, 0x4F, 0xF4 ,
|
||||
0x0C, 0x60, 0x03, 0x90, 0x4F, 0xF0, 0x00, 0x00, 0x01, 0x90, 0x02, 0x90, 0x08, 0x48, 0x08, 0x49, 0x05, 0x90, 0x08, 0x68, 0x20, 0xB9, 0xDC, 0x5B, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x68, 0x46, 0x03, 0x22, 0xED, 0xF7, 0x3A, 0xFA, 0x03, 0xE0, 0x68, 0x46, 0x03, 0x22, 0xED, 0xF7, 0xC1, 0xFC, 0x06, 0xB0, 0x00, 0xBD, 0xC0, 0x46, 0x81, 0x5C, 0x02, 0x00, 0xDC, 0x7C, 0x00, 0x20, 0x1C, 0xB5, 0x0F, 0x4C, 0x22, 0x68, 0x01, 0x2A, 0x15, 0xD1, 0x0C, 0x48, 0x00, 0x68, 0x07, 0x28, 0x14, 0xBF, 0x40, 0x20, 0x4F, 0xF4, 0x05, 0x70, 0x63, 0x21, 0xF1, 0xF7, 0x0F, 0xFA, 0x20, 0x68, 0x00, 0x90, 0x43, 0xF2, 0x33, 0x33, 0x06, 0x21, 0x40, 0x20, 0x01, 0x90, 0x03, 0x20, 0x02, 0x46, 0xF2, 0xF7, 0xF4, 0xFC, 0x1C, 0xBD, 0xF1, 0xF7, 0x01, 0xFA, 0x1C, 0xBD, 0x4C, 0x57, 0x02, 0x00, 0x50, 0x57, 0x02, 0x00, 0x1E, 0xB5, 0x04, 0x46, 0x0A, 0x49, 0x00, 0x20, 0x0A, 0x4A, 0x08, 0x60, 0x0A, 0x49, 0x00, 0x90, 0x01, 0x90, 0x11, 0x60 ,
|
||||
0x09, 0x4A, 0x45, 0xF2, 0x55, 0x53, 0x02, 0x91, 0x10, 0x60, 0x07, 0x21, 0x04, 0x22, 0x03, 0x20, 0xF2, 0xF7, 0xD8, 0xFC, 0x20, 0x46, 0xE7, 0xF7, 0x59, 0xFD, 0x1E, 0xBD, 0x50, 0x57, 0x02, 0x00, 0x04, 0x74, 0x00, 0x20, 0x34, 0x12, 0x66, 0x09, 0x4C, 0x57, 0x02, 0x00, 0x00, 0xB5, 0x0B, 0x49, 0x00, 0x20, 0x08, 0x60, 0xE0, 0x20, 0xF7, 0xF7, 0xAA, 0xFD, 0x09, 0x49, 0x09, 0x78, 0x49, 0xB1, 0x08, 0x49, 0x0A, 0x78, 0x08, 0x49, 0x00, 0x2A, 0x06, 0xBF, 0x01, 0x22, 0x09, 0x1F, 0x44, 0xF2, 0xA4, 0x5C, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xE9, 0x22, 0x0A, 0x60, 0xF7, 0xF7, 0xA1, 0xFD, 0x00, 0xBD, 0xC0, 0x46, 0xDC, 0x7C, 0x00, 0x20, 0xDD, 0x6A, 0x00, 0x20, 0xA7, 0x64, 0x00, 0x20, 0x04, 0x97, 0x3C, 0x80, 0x50, 0xB9, 0x09, 0x48, 0x00, 0x78, 0x01, 0x28, 0x06, 0xD1, 0x08, 0x48, 0x00, 0x78, 0x0E, 0x28, 0x08, 0xBF, 0x44, 0xF2, 0xCB, 0x20, 0x01, 0xD0, 0x44, 0xF2, 0xDE, 0x20, 0x04, 0x49, 0x08, 0x60, 0x01, 0x20 ,
|
||||
0x41, 0xF8, 0x04, 0x0C, 0x70, 0x47, 0xE0, 0x7C, 0x00, 0x20, 0xA6, 0x64, 0x00, 0x20, 0x04, 0x97, 0x3C, 0x80, 0x30, 0xB5, 0x0D, 0x46, 0x84, 0x69, 0xDC, 0xF7, 0x97, 0xFB, 0x24, 0x1D, 0x01, 0x28, 0x04, 0xEB, 0x45, 0x01, 0x06, 0xD1, 0x89, 0x8E, 0x04, 0xEB, 0x85, 0x04, 0x11, 0xB9, 0x21, 0x69, 0x01, 0xB9, 0x00, 0x20, 0x30, 0xBD, 0x30, 0xB5, 0x05, 0x46, 0x5A, 0xB1, 0x03, 0xEB, 0x41, 0x03, 0x1C, 0x78, 0x59, 0x78, 0x41, 0xEA, 0x04, 0x11, 0x52, 0x1E, 0x03, 0xF1, 0x02, 0x03, 0x05, 0xF8, 0x01, 0x1B, 0xF5, 0xD1, 0x30, 0xBD, 0x00, 0xB5, 0x00, 0x20, 0xE7, 0xF7, 0xD6, 0xFE, 0x03, 0x48, 0x01, 0x68, 0x03, 0x29, 0x04, 0xBF, 0x04, 0x21, 0x01, 0x60, 0x00, 0xBD, 0xC0, 0x46, 0x4C, 0x57, 0x02, 0x00, 0x03, 0x4A, 0x12, 0x68, 0x01, 0x2A, 0x04, 0xBF, 0x02, 0x48, 0x63, 0x21, 0xF1, 0xF7, 0x76, 0xB9, 0x50, 0x57, 0x02, 0x00, 0x02, 0x20, 0x01, 0x00, 0x6C, 0x5D, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
|
||||
uint16_t fw_length = 5700;
|
||||
|
||||
|
||||
@@ -1,372 +0,0 @@
|
||||
// Adafruit CC3000 Firmware V1.13 Upgrade Sketch
|
||||
// Based on firmware patcher for MSP430 chips published by Texas Instruments.
|
||||
//
|
||||
// This sketch will upgrade CC3000 modules up to firmware version 1.13.
|
||||
//
|
||||
// You can find more details about the changes in the 1.13 firmware from TI at:
|
||||
// http://processors.wiki.ti.com/index.php/CC3000_Release_Notes
|
||||
//
|
||||
// In general the 1.13 release is a bug fix release with fixes for stability
|
||||
// issues that caused the CC3000 to hang when under load.
|
||||
//
|
||||
// WARNING: Upgrade firmware at your own risk! In general if the CC3000 is
|
||||
// currently working fine for your needs then hold off on the upgrade.
|
||||
//
|
||||
// Usage (read all the steps before strarting):
|
||||
// - Wire up your Arduino to the CC3000 just like you're running buildtest or
|
||||
// other examples.
|
||||
// - Adjust the ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_VBAT
|
||||
// defines below to match your wiring (just like running buildtest).
|
||||
// - Load the sketch on your Arduino and open the serial monitor at 115200 baud.
|
||||
// - You should see a prompt waiting for a key press to continue. Enter text
|
||||
// and press enter to start the upgrade.
|
||||
// - You will see text printed as the firmware is upgraded. The upgrade process
|
||||
// should be quick and take less than a minute.
|
||||
// - You might see a message at the end that the firmware version or MAC address
|
||||
// couldn't be read--this can be ignored.
|
||||
// - Once the firmware upgrade is complete, run the buildtest sketch to check
|
||||
// the CC3000 functionality.
|
||||
// - During the firmware upgrade the CC3000 MAC address might be lost. You can
|
||||
// write a new MAC address by uncommenting the appropriate line in the buildtest
|
||||
// example. Make sure to save your MAC address before upgrading the firmware
|
||||
// if you'd like to keep it the same after
|
||||
|
||||
#include <Adafruit_CC3000.h>
|
||||
#include <ccspi.h>
|
||||
#include <SPI.h>
|
||||
#include <string.h>
|
||||
#include <EEPROM.h>
|
||||
|
||||
#include "utility/debug.h"
|
||||
#include "utility/nvmem.h"
|
||||
#include "driverpatchinc_1_13.h"
|
||||
|
||||
#define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin!
|
||||
#define ADAFRUIT_CC3000_CS 10
|
||||
#define ADAFRUIT_CC3000_VBAT 5
|
||||
|
||||
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT);
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Displays the driver mode (tiny of normal), and the buffer
|
||||
size if tiny mode is not being used
|
||||
|
||||
@note The buffer size and driver mode are defined in cc3000_common.h
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void displayDriverMode(void)
|
||||
{
|
||||
#ifdef CC3000_TINY_DRIVER
|
||||
Serial.println(F("CC3000 is configure in 'Tiny' mode"));
|
||||
#else
|
||||
Serial.print(F("RX Buffer : "));
|
||||
Serial.print(CC3000_RX_BUFFER_SIZE);
|
||||
Serial.println(F(" bytes"));
|
||||
Serial.print(F("TX Buffer : "));
|
||||
Serial.print(CC3000_TX_BUFFER_SIZE);
|
||||
Serial.println(F(" bytes"));
|
||||
#endif
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the CC3000's internal firmware patch ID
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void displayFirmwareVersion(void)
|
||||
{
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
uint8_t major, minor;
|
||||
|
||||
if(!cc3000.getFirmwareVersion(&major, &minor))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve the firmware version!\r\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("Firmware V. : "));
|
||||
Serial.print(major); Serial.print(F(".")); Serial.println(minor);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the 6-byte MAC address of the CC3000 module
|
||||
*/
|
||||
/**************************************************************************/
|
||||
boolean MACvalid = false;
|
||||
// array to store MAC address from EEPROM
|
||||
uint8_t cMacFromEeprom[MAC_ADDR_LEN];
|
||||
void displayMACAddress(void)
|
||||
{
|
||||
if(!cc3000.getMacAddress(cMacFromEeprom))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve MAC Address!\r\n"));
|
||||
MACvalid = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("MAC Address : "));
|
||||
cc3000.printHex((byte*)&cMacFromEeprom, 6);
|
||||
MACvalid = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Sets up the HW and the CC3000 module (called automatically
|
||||
on startup)
|
||||
*/
|
||||
/**************************************************************************/
|
||||
|
||||
uint8_t ucStatus_Dr, return_status = 0xFF;
|
||||
uint8_t counter = 0;
|
||||
|
||||
// array to store RM parameters from EEPROM
|
||||
unsigned char cRMParamsFromEeprom[128];
|
||||
|
||||
|
||||
// 2 dim array to store address and length of new FAT
|
||||
uint16_t aFATEntries[2][NVMEM_RM_FILEID + 1] =
|
||||
/* address */ {{0x50, 0x1f0, 0x1390, 0x0390, 0x2390, 0x4390, 0x6390, 0x63a0, 0x63b0, 0x63f0, 0x6430, 0x6830},
|
||||
/* length */ {0x1a0, 0x1a0, 0x1000, 0x1000, 0x2000, 0x2000, 0x10, 0x10, 0x40, 0x40, 0x400, 0x200 }};
|
||||
/* 0. NVS */
|
||||
/* 1. NVS Shadow */
|
||||
/* 2. Wireless Conf */
|
||||
/* 3. Wireless Conf Shadow */
|
||||
/* 4. BT (WLAN driver) Patches */
|
||||
/* 5. WiLink (Firmware) Patches */
|
||||
/* 6. MAC addr */
|
||||
/* 7. Frontend Vars */
|
||||
/* 8. IP config */
|
||||
/* 9. IP config Shadow */
|
||||
/* 10. Bootloader Patches */
|
||||
/* 11. Radio Module params */
|
||||
/* 12. AES128 for smart config */
|
||||
/* 13. user file */
|
||||
/* 14. user file */
|
||||
/* 15. user file */
|
||||
|
||||
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("Hello, CC3000!\n"));
|
||||
|
||||
Serial.println(F("Hit any key & return to start"));
|
||||
while (!Serial.available());
|
||||
|
||||
pinMode(9, OUTPUT);
|
||||
pinMode(8, OUTPUT);
|
||||
pinMode(7, OUTPUT);
|
||||
pinMode(6, OUTPUT);
|
||||
digitalWrite(9, LOW);
|
||||
digitalWrite(8, LOW);
|
||||
digitalWrite(7, LOW);
|
||||
digitalWrite(6, LOW);
|
||||
|
||||
displayDriverMode();
|
||||
displayFreeRam();
|
||||
|
||||
/* Initialise the module */
|
||||
Serial.println(F("\nInitialising the CC3000 ..."));
|
||||
if (!cc3000.begin(2)) // init with NO patches!
|
||||
{
|
||||
Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
displayFirmwareVersion();
|
||||
displayMACAddress();
|
||||
|
||||
return_status = 1;
|
||||
uint8_t index;
|
||||
uint8_t *pRMParams;
|
||||
|
||||
while ((return_status) && (counter < 3)) {
|
||||
// read RM parameters
|
||||
// read in 16 parts to work with tiny driver
|
||||
|
||||
return_status = 0;
|
||||
pRMParams = cRMParamsFromEeprom;
|
||||
|
||||
for (index = 0; index < 16; index++) {
|
||||
return_status |= nvmem_read(NVMEM_RM_FILEID, 8, 8*index, pRMParams);
|
||||
Serial.print(F("\n\rRead NVRAM $")); Serial.print(8*index); Serial.print("\t");
|
||||
for(uint8_t x=0; x<8; x++) {
|
||||
Serial.print("0x"); Serial.print(pRMParams[x], HEX); Serial.print(", ");
|
||||
}
|
||||
pRMParams += 8;
|
||||
}
|
||||
counter++;
|
||||
}
|
||||
// if RM file is not valid, load the default one
|
||||
if (counter == 3) {
|
||||
Serial.println(F("\n\rLoad default params"));
|
||||
pRMParams = (uint8_t *)cRMdefaultParams;
|
||||
} else {
|
||||
Serial.println(F("\n\rLoad EEPROM params"));
|
||||
pRMParams = cRMParamsFromEeprom;
|
||||
if (EEPROM.read(0) == 0xFF) {
|
||||
for (uint8_t e=0; e<128; e++) {
|
||||
EEPROM.write(e, cRMParamsFromEeprom[e]);
|
||||
}
|
||||
Serial.println(F("Backed up to eeprom!"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return_status = 1;
|
||||
|
||||
while (return_status) {
|
||||
// write new FAT
|
||||
return_status = fat_write_content(aFATEntries[0], aFATEntries[1]);
|
||||
Serial.print(F("Wrote FAT entries: ")); Serial.println(return_status, DEC);
|
||||
}
|
||||
|
||||
//Serial.println(F("Stopping..."));
|
||||
//cc3000.stop();
|
||||
|
||||
//Serial.println(F("\nInitialising the CC3000 ..."));
|
||||
|
||||
//if (!cc3000.begin(2)) // no patches!
|
||||
//{
|
||||
// Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
|
||||
// while(1);
|
||||
//}
|
||||
|
||||
return_status = 1;
|
||||
|
||||
Serial.println(F("Write params"));
|
||||
|
||||
while (return_status) {
|
||||
// write RM parameters
|
||||
// write in 4 parts to work with tiny driver
|
||||
|
||||
return_status = 0;
|
||||
|
||||
for (index = 0; index < 4; index++) {
|
||||
return_status |= nvmem_write(NVMEM_RM_FILEID, 32, 32*index, (pRMParams + 32*index));
|
||||
Serial.println(F("Wrote 32 bytes to NVRAM"));
|
||||
}
|
||||
}
|
||||
Serial.println(F("Wrote params"));
|
||||
|
||||
return_status = 1;
|
||||
|
||||
// write back the MAC address, only if exist
|
||||
if (MACvalid) {
|
||||
// zero out MCAST bit if set
|
||||
cMacFromEeprom[0] &= 0xfe;
|
||||
while (return_status) {
|
||||
return_status = nvmem_set_mac_address(cMacFromEeprom);
|
||||
}
|
||||
}
|
||||
|
||||
ucStatus_Dr = 1;
|
||||
Serial.println(F("Writing driver patch"));
|
||||
|
||||
while (ucStatus_Dr) {
|
||||
//writing driver patch to EEPRROM - PROTABLE CODE
|
||||
// Note that the array itself is changing between the different Service Packs
|
||||
ucStatus_Dr = nvmem_write_patch(NVMEM_WLAN_DRIVER_SP_FILEID, drv_length, wlan_drv_patch);
|
||||
}
|
||||
|
||||
|
||||
Serial.println(F("Wrote driver patch"));
|
||||
|
||||
Serial.println(F("Starting w/o patches"));
|
||||
|
||||
//if (!cc3000.begin(2))
|
||||
//{
|
||||
// Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
|
||||
// while(1);
|
||||
//}
|
||||
|
||||
Serial.println(F("Writing firmware"));
|
||||
|
||||
unsigned char ucStatus_FW = 1;
|
||||
|
||||
while (ucStatus_FW) {
|
||||
//writing FW patch to EAPRROM - PROTABLE CODE
|
||||
//Note that the array itself is changing between the different Service Packs
|
||||
ucStatus_FW = nvmem_write_patch(NVMEM_WLAN_FW_SP_FILEID, fw_length, fw_patch);
|
||||
}
|
||||
|
||||
Serial.println(F("Starting w/patches"));
|
||||
|
||||
cc3000.reboot();
|
||||
/*
|
||||
if (!)
|
||||
{
|
||||
Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
|
||||
while(1);
|
||||
}
|
||||
*/
|
||||
Serial.println(F("Patched!"));
|
||||
displayFirmwareVersion();
|
||||
displayMACAddress();
|
||||
}
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! fat_write_content
|
||||
//!
|
||||
//! \param[in] file_address array of file address in FAT table:\n
|
||||
//! this is the absolute address of the file in the EEPROM.
|
||||
//! \param[in] file_length array of file length in FAT table:\n
|
||||
//! this is the upper limit of the file size in the EEPROM.
|
||||
//!
|
||||
//! \return on succes 0, error otherwise
|
||||
//!
|
||||
//! \brief parse the FAT table from eeprom
|
||||
//
|
||||
//*****************************************************************************
|
||||
uint8_t fat_write_content(uint16_t *file_address, uint16_t *file_length)
|
||||
{
|
||||
uint16_t index = 0;
|
||||
uint8_t ucStatus;
|
||||
uint8_t fatTable[48];
|
||||
uint8_t* fatTablePtr = fatTable;
|
||||
uint8_t LS[3] = "LS";
|
||||
|
||||
// first, write the magic number
|
||||
ucStatus = nvmem_write(16, 2, 0, LS);
|
||||
|
||||
for (; index <= NVMEM_RM_FILEID; index++)
|
||||
{
|
||||
// write address low char and mark as allocated
|
||||
*fatTablePtr++ = (uint8_t)(file_address[index] & 0xff) | _BV(0);
|
||||
|
||||
// write address high char
|
||||
*fatTablePtr++ = (uint8_t)((file_address[index]>>8) & 0xff);
|
||||
|
||||
// write length low char
|
||||
*fatTablePtr++ = (uint8_t)(file_length[index] & 0xff);
|
||||
|
||||
// write length high char
|
||||
*fatTablePtr++ = (uint8_t)((file_length[index]>>8) & 0xff);
|
||||
}
|
||||
|
||||
// second, write the FAT
|
||||
// write in two parts to work with tiny driver
|
||||
ucStatus = nvmem_write(16, 24, 4, fatTable);
|
||||
ucStatus = nvmem_write(16, 24, 24+4, &fatTable[24]);
|
||||
|
||||
// third, we want to erase any user files
|
||||
memset(fatTable, 0, sizeof(fatTable));
|
||||
ucStatus = nvmem_write(16, 16, 52, fatTable);
|
||||
|
||||
return ucStatus;
|
||||
}
|
||||
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
delay(1000);
|
||||
}
|
||||
@@ -1,102 +0,0 @@
|
||||
//Service Pack version P1.12.7.15.26 - Driver patches
|
||||
|
||||
uint8_t cRMdefaultParams[128] = { 0x03, 0x00, 0x01, 0x01, 0x14, 0x14, 0x00, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x23, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x23, 0x23, 0x23, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x01, 0x77, 0x80, 0x1D, 0x1F, 0x22, 0x26, 0x28, 0x29, 0x1A, 0x1F, 0x22, 0x24, 0x26, 0x28, 0x16, 0x1D, 0x1E, 0x20, 0x24, 0x25, 0x1E, 0x2D, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x15, 0x15, 0x15, 0x11, 0x15, 0x15, 0x0E, 0x00};
|
||||
|
||||
unsigned char PROGMEM wlan_drv_patch[8024] = { 0x00, 0x01, 0x00, 0x00, 0x50, 0x1F, 0x00, 0x00, 0xF0, 0x03, 0x18, 0x00, 0xE4, 0x62, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7A, 0x63, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x10, 0x64, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x20, 0x0C, 0x49, 0x08, 0x60, 0x0C, 0x48, 0x19, 0x30, 0xF7, 0x46, 0x30, 0xB5, 0x05, 0x1C, 0xAC, 0x69, 0x68, 0x68, 0x5F, 0x30, 0x09, 0xD1, 0x60, 0x6B, 0x0C, 0x38, 0x01, 0x21, 0x8E, 0x46, 0x06, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x00, 0x20, 0x60, 0x63, 0xAC, 0x69, 0x6C, 0x60, 0x04, 0x48, 0x5B, 0x30, 0x30, 0xBD, 0x40, 0x3B, 0x08, 0x00, 0x49, 0xD0, 0x01, 0x00, 0x09, 0xEA, 0x02, 0x00, 0x91, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA6, 0x64, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3C, 0x65, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xB5, 0x85, 0xB0, 0x05, 0x1C, 0xA8, 0x88, 0x00, 0x90, 0x28, 0x89, 0x01, 0x90, 0xE9, 0x68, 0x02, 0x91, 0x28, 0x7C, 0x03, 0x90, 0x2A, 0x6A, 0x00, 0x20, 0x17, 0x56, 0x68, 0x60, 0x00, 0x29, 0x4C, 0xD0, 0x00, 0x2F, 0x4A, 0xDC ,
|
||||
0xCA, 0x49, 0x0C, 0x1C, 0x08, 0x26, 0x04, 0x90, 0x21, 0x88, 0x00, 0x98, 0x81, 0x42, 0x0C, 0xD1, 0x62, 0x88, 0x01, 0x98, 0x82, 0x42, 0x08, 0xD1, 0x46, 0x20, 0x02, 0x5D, 0x03, 0x98, 0x82, 0x42, 0x03, 0xD1, 0x0E, 0x20, 0x00, 0x57, 0xB8, 0x42, 0x0A, 0xD0, 0x46, 0x20, 0x00, 0x5D, 0x11, 0x28, 0x22, 0xD1, 0x00, 0x98, 0x81, 0x42, 0x1F, 0xD1, 0x0E, 0x20, 0x00, 0x57, 0xFF, 0xFF, 0xD2, 0x65, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0xB8, 0x42, 0x1B, 0xD1, 0x04, 0x20, 0x02, 0x1C, 0x02, 0x98, 0xB9, 0x49, 0x01, 0x23, 0x9E, 0x46, 0xEC, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x00, 0x28, 0x17, 0xD0, 0x20, 0x1D, 0x02, 0x99, 0x04, 0x22, 0x01, 0x23, 0x9E, 0x46, 0xE7, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x00, 0x28, 0x0D, 0xD0, 0x46, 0x20, 0x00, 0x5D, 0x11, 0x28, 0x09, 0xD0, 0xA0, 0x6D, 0x00, 0x28, 0x06, 0xD0, 0xAC, 0x34, 0x04, 0x98, 0x01, 0x30, 0x04, 0x90, 0x01, 0x3E, 0xC1, 0xD1, 0x07, 0xE0, 0x04, 0x98, 0x00, 0x06, 0x00, 0x0E ,
|
||||
0xAC, 0x21, 0x41, 0x43, 0xA6, 0x48, 0x40, 0x18, 0x68, 0x60, 0xA6, 0x48, 0xAD, 0x30, 0x05, 0xB0, 0xF0, 0xBD, 0x00, 0xB5, 0xC2, 0x68, 0x90, 0x69, 0x02, 0x21, 0x01, 0x23, 0x9E, 0x46, 0xA2, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xA2, 0x48, 0x61, 0x30, 0x00, 0xBD, 0x01, 0x79, 0x0B, 0x29, 0x03, 0xD0, 0x89, 0x00, 0x9F, 0x4A, 0x51, 0x5A, 0x01, 0xE0, 0x01, 0x21, 0x49, 0x02, 0x41, 0x60, 0x9D, 0x48, 0x0D, 0x30, 0xF7, 0x46, 0x01, 0x1C, 0xFF, 0xFF, 0x68, 0x66, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x9C, 0x48, 0x02, 0x68, 0x9C, 0x48, 0x01, 0x2A, 0x01, 0xD1, 0x25, 0x30, 0xF7, 0x46, 0x9B, 0x4A, 0x12, 0x68, 0x4A, 0x60, 0x19, 0x30, 0xF7, 0x46, 0x00, 0x21, 0x41, 0x60, 0x99, 0x48, 0x98, 0x49, 0x08, 0x18, 0xF7, 0x46, 0x00, 0x21, 0x41, 0x60, 0x97, 0x48, 0xE7, 0x49, 0x08, 0x18, 0xF7, 0x46, 0xFF, 0xB5, 0x46, 0x69, 0x40, 0x68, 0x01, 0x90, 0x94, 0x49, 0x0A, 0x7C, 0x9A, 0x4F, 0x01, 0x2A, 0x63, 0xD0, 0x09, 0x7C, 0x03, 0x29 ,
|
||||
0x60, 0xD0, 0x91, 0x4A, 0x92, 0x4B, 0x00, 0x21, 0x02, 0x91, 0x59, 0x56, 0x24, 0x23, 0x59, 0x43, 0x53, 0x18, 0x03, 0x93, 0x01, 0x28, 0x17, 0xD1, 0x8A, 0x18, 0x04, 0x23, 0x6C, 0x46, 0x8C, 0x49, 0x15, 0x79, 0x08, 0x78, 0xC0, 0x43, 0x28, 0x43, 0x20, 0x70, 0x01, 0x32, 0x01, 0x31, 0x01, 0x34, 0x01, 0x3B, 0xF5, 0xD1, 0x31, 0x1D, 0x68, 0x46, 0x04, 0x22, 0x01, 0x23, 0x9E, 0x46, 0xA9, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x00, 0x28, 0x40, 0xD0, 0x35, 0x1D, 0x82, 0x48, 0x00, 0x78, 0xFF, 0x28, 0xFF, 0xFF, 0xFE, 0x66, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x11, 0xD0, 0x00, 0x28, 0x0F, 0xD0, 0x03, 0x98, 0x01, 0x1D, 0x28, 0x1C, 0x01, 0x24, 0xA6, 0x46, 0x7E, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x00, 0x28, 0x05, 0xD1, 0x7A, 0x48, 0xA6, 0x46, 0x7B, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x05, 0xE0, 0x28, 0x1C, 0x01, 0x21, 0x8E, 0x46, 0x78, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x01, 0x99, 0x01, 0x29, 0x01, 0xD1, 0x00, 0x28, 0x1E, 0xD1 ,
|
||||
0x01, 0x99, 0x5F, 0x31, 0x01, 0xD0, 0x00, 0x28, 0x0F, 0xD1, 0xA8, 0x20, 0x81, 0x5D, 0x00, 0x29, 0x08, 0xD0, 0x49, 0x1E, 0x81, 0x55, 0x80, 0x5D, 0x00, 0x28, 0x09, 0xD1, 0x38, 0x1C, 0xFF, 0x30, 0x08, 0x30, 0x11, 0xE0, 0x03, 0x21, 0x02, 0x91, 0x00, 0xE0, 0xA8, 0x20, 0x02, 0x99, 0x81, 0x55, 0x38, 0x1C, 0xFF, 0x30, 0x16, 0x30, 0x07, 0xE0, 0x01, 0x98, 0x01, 0x28, 0x02, 0xD1, 0x38, 0x1C, 0xA3, 0x30, 0x01, 0xE0, 0x38, 0x1C, 0x9F, 0x30, 0x00, 0x90, 0xFF, 0xBD, 0x00, 0xB5, 0x02, 0x1C, 0x10, 0x6A, 0xD1, 0x69, 0x52, 0x69, 0xC3, 0x69, 0x5A, 0x60, 0xFF, 0xFF, 0x94, 0x67, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x01, 0x22, 0x96, 0x46, 0x5E, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x5E, 0x48, 0xFF, 0x30, 0x6E, 0x30, 0x00, 0xBD, 0x10, 0xB5, 0x0A, 0x1C, 0x41, 0x69, 0x00, 0x6A, 0x93, 0x69, 0xDB, 0x69, 0x58, 0x60, 0x90, 0x69, 0x01, 0x24, 0xA6, 0x46, 0x56, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0xA6, 0x46, 0x56, 0x48, 0xFE, 0x44 ,
|
||||
0x00, 0x47, 0x55, 0x48, 0xFF, 0x30, 0xB6, 0x30, 0x10, 0xBD, 0x70, 0xB5, 0x05, 0x1C, 0x6E, 0x69, 0x53, 0x48, 0x02, 0x68, 0x5C, 0x21, 0x88, 0x5D, 0x04, 0x28, 0x15, 0xD1, 0x07, 0x20, 0x88, 0x55, 0x10, 0x0B, 0x11, 0xD2, 0x01, 0x24, 0xA6, 0x46, 0x4E, 0x48, 0xFE, 0x44, 0x00, 0x47, 0x00, 0x28, 0x0A, 0xD0, 0x47, 0x21, 0x89, 0x57, 0xC1, 0x60, 0x11, 0x21, 0xC9, 0x02, 0x00, 0x22, 0x04, 0x23, 0xA6, 0x46, 0xE8, 0x4C, 0xFE, 0x44, 0x20, 0x47, 0x01, 0x20, 0x68, 0x60, 0x43, 0x48, 0xED, 0x49, 0x08, 0x18, 0x70, 0xBD, 0x70, 0xB5, 0x05, 0x1C, 0xAE, 0x69, 0x9C, 0x20, 0x80, 0x19, 0x4B, 0x21, 0x89, 0x00, 0x01, 0x24, 0xFF, 0xFF, 0x2A, 0x68, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0xA6, 0x46, 0xE8, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x5C, 0x21, 0x88, 0x5D, 0x07, 0x28, 0x01, 0xD1, 0x09, 0x20, 0x00, 0xE0, 0x05, 0x20, 0xAA, 0x69, 0x88, 0x54, 0x30, 0x1C, 0xA6, 0x46, 0xE9, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x68, 0x60, 0xE8, 0x48 ,
|
||||
0x4D, 0x30, 0x70, 0xBD, 0xF0, 0xB5, 0x41, 0x68, 0x82, 0x68, 0x88, 0x23, 0x5E, 0x18, 0x37, 0x88, 0x0B, 0x6F, 0x00, 0x2B, 0x01, 0xD1, 0x00, 0x2F, 0x10, 0xD1, 0x06, 0x2F, 0x02, 0xDD, 0x00, 0x21, 0xC9, 0x43, 0x07, 0xE0, 0x33, 0x88, 0x9B, 0x00, 0xC9, 0x18, 0x0A, 0x67, 0x31, 0x88, 0x01, 0x31, 0x31, 0x80, 0x01, 0x21, 0x81, 0x60, 0xE1, 0x48, 0x1D, 0x30, 0xF0, 0xBD, 0x0B, 0x1C, 0x01, 0x24, 0x5D, 0x6F, 0x1D, 0x67, 0x04, 0x33, 0x01, 0x34, 0x06, 0x2C, 0xE1, 0xDA, 0xF8, 0xE7, 0x00, 0xB5, 0x00, 0x21, 0xC1, 0x60, 0xE9, 0x48, 0x01, 0x68, 0x10, 0x31, 0xE6, 0x48, 0x20, 0x22, 0x01, 0x23, 0x9E, 0x46, 0xE7, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xE5, 0x48, 0xFB, 0x30, 0x00, 0xBD, 0xFF, 0xFF, 0xC0, 0x68, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x14, 0x0D, 0x1B, 0x00, 0x54, 0x19, 0x1B, 0x00, 0x91, 0x1A, 0x01, 0x00, 0x4B, 0xAD, 0x03, 0x00, 0x61, 0x4E, 0x01, 0x00, 0x06, 0x32, 0x08, 0x00, 0x1F, 0x0B, 0x02, 0x00, 0x54, 0x3F ,
|
||||
0x08, 0x00, 0x45, 0xC1, 0x00, 0x00, 0x84, 0x3C, 0x08, 0x00, 0x1B, 0x02, 0x00, 0x00, 0xED, 0x17, 0x00, 0x00, 0xF3, 0xC1, 0x01, 0x00, 0x34, 0x19, 0x1B, 0x00, 0x08, 0x19, 0x1B, 0x00, 0xA6, 0x44, 0x08, 0x00, 0x1C, 0x17, 0x1B, 0x00, 0x18, 0x17, 0x1B, 0x00, 0xCB, 0x67, 0x03, 0x00, 0x0D, 0x47, 0x02, 0x00, 0x39, 0x42, 0x03, 0x00, 0xBD, 0xE7, 0x02, 0x00, 0xB1, 0x40, 0x03, 0x00, 0xB9, 0xEA, 0x01, 0x00, 0x45, 0xDA, 0x00, 0x00, 0x24, 0x41, 0x08, 0x00, 0x71, 0xC0, 0x02, 0x00, 0xF0, 0xB5, 0x88, 0xB0, 0x06, 0x91, 0x07, 0x90, 0x86, 0x69, 0xF0, 0x1C, 0xD9, 0xA1, 0x04, 0x22, 0x01, 0x24, 0xA6, 0x46, 0x14, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x00, 0x28, 0x32, 0xD1, 0xF2, 0x79, 0xD7, 0x48, 0x02, 0x70, 0x35, 0x7A, 0x77, 0x7A, 0x78, 0x1B, 0xFF, 0xFF, 0x56, 0x69, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x43, 0x1C, 0x93, 0x42, 0x1D, 0xD0, 0x16, 0x2A, 0x0C, 0xDB, 0x00, 0x2D, 0x0A, 0xD1, 0xD6, 0x48, 0x04, 0x70, 0x0A, 0x20 ,
|
||||
0x81, 0x19, 0xD0, 0x48, 0x1A, 0x1C, 0xA6, 0x46, 0xB8, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x74, 0xE0, 0xD2, 0x48, 0x04, 0x70, 0xCC, 0x48, 0x40, 0x19, 0x0A, 0x21, 0x89, 0x19, 0x7A, 0x1B, 0x52, 0x1C, 0xA6, 0x46, 0xB1, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x67, 0xE0, 0x8F, 0xC6, 0x03, 0x00, 0xC9, 0x48, 0x04, 0x70, 0xC9, 0x48, 0x04, 0x70, 0x0A, 0x20, 0x81, 0x19, 0xC2, 0x48, 0xA6, 0x46, 0xAA, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x59, 0xE0, 0xF0, 0x1C, 0x03, 0x21, 0x0A, 0x1C, 0xBC, 0xA1, 0xA6, 0x46, 0xC6, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x00, 0x28, 0x4F, 0xD1, 0xF1, 0x79, 0xBB, 0x48, 0x01, 0x70, 0xBB, 0x4D, 0xB2, 0x79, 0x2A, 0x70, 0x03, 0x20, 0x17, 0x49, 0xF4, 0x31, 0xA6, 0x46, 0xB8, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x28, 0x78, 0x00, 0x28, 0x0B, 0xD1, 0xFF, 0xE7, 0xB8, 0x49, 0x0C, 0x70, 0xB8, 0x49, 0xFF, 0xFF, 0xEC, 0x69, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x0C, 0x70, 0x03, 0x20, 0x0F, 0x49, 0xF5, 0x31, 0xA6, 0x46 ,
|
||||
0xB6, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x20, 0x1C, 0xF2, 0x79, 0x35, 0x7A, 0x77, 0x7A, 0x79, 0x1B, 0x4B, 0x1C, 0x93, 0x42, 0x20, 0xD0, 0xA9, 0x49, 0x09, 0x78, 0x16, 0x29, 0x0F, 0xDB, 0x00, 0x2D, 0x0D, 0xD1, 0xAB, 0x49, 0x08, 0x70, 0x0A, 0x20, 0x81, 0x19, 0xE9, 0x48, 0x1A, 0x1C, 0xA6, 0x46, 0x8B, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x1A, 0xE0, 0xC0, 0x46, 0xC7, 0x04, 0x00, 0x00, 0xA5, 0x49, 0x08, 0x70, 0xE3, 0x48, 0x40, 0x19, 0x0A, 0x21, 0x89, 0x19, 0x7A, 0x1B, 0x52, 0x1C, 0xA6, 0x46, 0x83, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x0A, 0xE0, 0x9E, 0x49, 0x08, 0x70, 0x9E, 0x49, 0x08, 0x70, 0x0A, 0x20, 0x81, 0x19, 0xDB, 0x48, 0xA6, 0x46, 0x7D, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x96, 0x48, 0x00, 0x78, 0x00, 0x28, 0x0A, 0xD0, 0x95, 0x48, 0x00, 0x78, 0x00, 0x28, 0x06, 0xD0, 0x94, 0x48, 0x00, 0x78, 0x00, 0x28, 0x02, 0xD0, 0x93, 0x48, 0x00, 0x78, 0x00, 0x28, 0xFF, 0xFF, 0x82, 0x6A, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00 ,
|
||||
0x00, 0xD1, 0x8C, 0xE0, 0x03, 0x20, 0x17, 0x21, 0x89, 0x01, 0xA6, 0x46, 0x90, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x87, 0x48, 0x01, 0x78, 0x87, 0x48, 0x07, 0x78, 0x84, 0x4E, 0x83, 0x4D, 0xE0, 0x48, 0x00, 0x68, 0x00, 0x28, 0x2E, 0xD1, 0x07, 0x98, 0x41, 0x61, 0x06, 0x62, 0xC6, 0x48, 0x06, 0x9A, 0x10, 0x64, 0x02, 0x2F, 0x01, 0xD0, 0x03, 0x2F, 0x01, 0xD1, 0x03, 0x22, 0x00, 0xE0, 0x3A, 0x1C, 0x06, 0x9B, 0xDA, 0x63, 0x2A, 0x78, 0x9A, 0x63, 0x01, 0x2F, 0x03, 0xD1, 0x05, 0x29, 0x04, 0xD0, 0x0D, 0x29, 0x02, 0xD0, 0xEC, 0x48, 0xDB, 0x30, 0x64, 0xE0, 0x00, 0x25, 0x00, 0x95, 0x01, 0x91, 0x02, 0x96, 0x03, 0x95, 0x04, 0x90, 0x2B, 0x1C, 0x20, 0x1C, 0x01, 0x1C, 0x8E, 0x46, 0xE6, 0x4E, 0xFE, 0x44, 0x30, 0x47, 0xE6, 0x48, 0x04, 0x60, 0x28, 0x1C, 0xA6, 0x46, 0xE5, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x4C, 0xE0, 0x0D, 0x27, 0x00, 0x20, 0x39, 0x1C, 0x05, 0xAA, 0xA6, 0x46, 0xE3, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x68, 0x46 ,
|
||||
0xFF, 0xFF, 0x18, 0x6B, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x80, 0x8A, 0x40, 0x08, 0x05, 0xD2, 0x38, 0x1C, 0x50, 0x21, 0xA6, 0x46, 0xDC, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x38, 0x1C, 0x21, 0x1C, 0x0B, 0x1C, 0x29, 0x1C, 0x00, 0x22, 0xA6, 0x46, 0xD9, 0x4F, 0xFE, 0x44, 0x38, 0x47, 0x2B, 0x78, 0x0D, 0x20, 0x31, 0x1C, 0x22, 0x1C, 0xA6, 0x46, 0xD5, 0x4E, 0xFE, 0x44, 0x30, 0x47, 0x28, 0x78, 0x01, 0x30, 0x02, 0x1C, 0x0D, 0x20, 0x57, 0x49, 0x23, 0x1C, 0xA6, 0x46, 0xD0, 0x4E, 0xFE, 0x44, 0x30, 0x47, 0x55, 0x4E, 0x28, 0x78, 0x02, 0x30, 0x02, 0x1C, 0x0D, 0x20, 0x31, 0x1C, 0x23, 0x1C, 0xA6, 0x46, 0xCA, 0x4F, 0xFE, 0x44, 0x38, 0x47, 0x30, 0x78, 0x00, 0x28, 0x0A, 0xD0, 0x28, 0x78, 0x03, 0x30, 0x02, 0x1C, 0x4C, 0x48, 0x03, 0x78, 0x0D, 0x20, 0x8F, 0x49, 0xA6, 0x46, 0xC3, 0x4D, 0xFE, 0x44, 0x28, 0x47, 0xBF, 0x48, 0x04, 0x60, 0x00, 0x20, 0xA6, 0x46, 0xBE, 0x49, 0xFE, 0x44, 0x08, 0x47, 0xB9, 0x48, 0xEC, 0x49 ,
|
||||
0x08, 0x18, 0x08, 0xB0, 0xF0, 0xBD, 0xC0, 0x46, 0x7B, 0xC0, 0xFF, 0xFF, 0xAE, 0x6B, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x1C, 0xE9, 0x48, 0x02, 0x68, 0xE9, 0x48, 0x00, 0x2A, 0x04, 0xD0, 0x00, 0x22, 0x0A, 0x62, 0x8A, 0x61, 0x1D, 0x30, 0xF7, 0x46, 0xD7, 0x30, 0xF7, 0x46, 0xC0, 0x46, 0x9F, 0x03, 0x00, 0x00, 0x7D, 0xB8, 0x03, 0x00, 0x01, 0x1C, 0xE2, 0x48, 0x02, 0x68, 0xE2, 0x48, 0x00, 0x2A, 0x02, 0xD0, 0xFF, 0x30, 0xB4, 0x30, 0xF7, 0x46, 0x00, 0x22, 0xCA, 0x61, 0x8A, 0x61, 0x4F, 0x30, 0xF7, 0x46, 0xC9, 0x21, 0x01, 0x00, 0x91, 0xE1, 0x00, 0x00, 0xDB, 0x48, 0x01, 0x68, 0x8A, 0x69, 0x01, 0x20, 0xC0, 0x03, 0x10, 0x43, 0x88, 0x61, 0x00, 0x20, 0x08, 0x61, 0xD8, 0x48, 0x23, 0x30, 0xF7, 0x46, 0x89, 0x17, 0x02, 0x00, 0x70, 0xB5, 0x05, 0x1C, 0xD5, 0x4E, 0x29, 0x6A, 0xEA, 0x69, 0x30, 0x1C, 0x01, 0x24, 0xA6, 0x46, 0x0B, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x68, 0x69, 0xA6, 0x46, 0xD1, 0x49 ,
|
||||
0xFE, 0x44, 0x08, 0x47, 0xA8, 0x69, 0x06, 0x30, 0xA8, 0x60, 0xCF, 0x48, 0x00, 0x68, 0x68, 0x60, 0xEE, 0x60, 0xCE, 0x48, 0xFF, 0xFF, 0x44, 0x6C, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x6D, 0x30, 0x70, 0xBD, 0x46, 0x17, 0x1B, 0x00, 0x30, 0x3F, 0x08, 0x00, 0x41, 0xEB, 0x00, 0x00, 0x09, 0xB4, 0x03, 0x00, 0x30, 0xB5, 0xEE, 0x48, 0x01, 0x6D, 0x80, 0x6C, 0x08, 0x43, 0x18, 0xD0, 0xEC, 0x49, 0x08, 0x1C, 0x07, 0x22, 0xFF, 0x23, 0x09, 0x33, 0x1B, 0x58, 0x00, 0x2B, 0x04, 0xD0, 0xFF, 0x30, 0x1D, 0x30, 0x01, 0x3A, 0xF6, 0xD1, 0x0B, 0xE0, 0x02, 0x20, 0xF0, 0x4A, 0xF1, 0x4B, 0x01, 0x24, 0xA6, 0x46, 0xF0, 0x4D, 0xFE, 0x44, 0x28, 0x47, 0xA6, 0x46, 0xEF, 0x48, 0xFE, 0x44, 0x00, 0x47, 0xEF, 0x48, 0xFF, 0x30, 0x5C, 0x30, 0x30, 0xBD, 0xC0, 0x46, 0x53, 0x53, 0x49, 0x44, 0x00, 0xC0, 0x46, 0xC0, 0x4B, 0x45, 0x59, 0x00, 0xEE, 0x62, 0x08, 0x00, 0xF0, 0x62, 0x08, 0x00, 0xEC, 0x62, 0x08, 0x00, 0xED, 0x62, 0x08, 0x00 ,
|
||||
0xE7, 0x7E, 0x03, 0x00, 0xE8, 0x62, 0x08, 0x00, 0xE9, 0x62, 0x08, 0x00, 0xEA, 0x62, 0x08, 0x00, 0xEB, 0x62, 0x08, 0x00, 0xDD, 0x7E, 0x03, 0x00, 0x8F, 0xC6, 0x03, 0x00, 0xF0, 0xB5, 0xFF, 0xFF, 0xDA, 0x6C, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x87, 0xB0, 0x00, 0x91, 0x01, 0x90, 0x6B, 0x48, 0x01, 0x68, 0xCC, 0x4A, 0x14, 0x1C, 0x02, 0x94, 0x07, 0x26, 0x00, 0x25, 0x03, 0x95, 0x04, 0x94, 0x05, 0x95, 0xDF, 0x48, 0x00, 0x68, 0x08, 0x43, 0x27, 0xD0, 0xE0, 0x68, 0x03, 0x99, 0x88, 0x42, 0x0A, 0xDD, 0x03, 0x90, 0x40, 0x1C, 0x00, 0x99, 0x88, 0x60, 0xC2, 0x49, 0xFF, 0x20, 0x1D, 0x30, 0x68, 0x43, 0x0C, 0x18, 0xE0, 0x68, 0x04, 0x91, 0x02, 0x99, 0xC9, 0x68, 0x88, 0x42, 0x10, 0xDB, 0x88, 0x42, 0x10, 0xD1, 0x02, 0x98, 0x01, 0x27, 0xBE, 0x46, 0xCE, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x06, 0x90, 0x20, 0x1C, 0xBE, 0x46, 0xCB, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x06, 0x99, 0x88, 0x42, 0x01, 0xDA, 0x05, 0x95, 0x02, 0x94 ,
|
||||
0x51, 0x48, 0x01, 0x68, 0xFF, 0x27, 0x09, 0x37, 0x38, 0x59, 0x00, 0x28, 0x06, 0xD0, 0xC7, 0x48, 0x00, 0x68, 0x07, 0x2E, 0x00, 0xD1, 0x2E, 0x1C, 0x08, 0x43, 0x04, 0xD0, 0xFF, 0x34, 0x1D, 0x34, 0x01, 0x35, 0x07, 0x2D, 0xC2, 0xDB, 0x07, 0x2E, 0xFF, 0xFF, 0x70, 0x6D, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x0A, 0xD1, 0xC0, 0x48, 0x00, 0x68, 0x08, 0x43, 0x06, 0xD0, 0x05, 0x9E, 0x30, 0x1C, 0x01, 0x21, 0x8E, 0x46, 0xBA, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x01, 0x98, 0x47, 0x61, 0x00, 0x21, 0x81, 0x61, 0xFF, 0x22, 0x1D, 0x32, 0x72, 0x43, 0x04, 0x99, 0x89, 0x18, 0xC1, 0x61, 0x06, 0x62, 0xB4, 0x48, 0x39, 0x30, 0x07, 0xB0, 0xF0, 0xBD, 0x10, 0xB5, 0x04, 0x1C, 0x00, 0x20, 0x01, 0x21, 0x8E, 0x46, 0xB1, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x40, 0x1E, 0x00, 0xD5, 0x00, 0x20, 0x60, 0x60, 0xE0, 0x61, 0xAE, 0x48, 0x21, 0x30, 0x10, 0xBD, 0xC0, 0x46, 0x10, 0x63, 0x08, 0x00, 0x70, 0xB5, 0x04, 0x1C, 0xE5, 0x69, 0x66, 0x69 ,
|
||||
0x00, 0x20, 0x01, 0x21, 0x8E, 0x46, 0xA7, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x60, 0x60, 0xAB, 0x19, 0xA6, 0x4A, 0xA5, 0x49, 0x93, 0x42, 0x02, 0xD3, 0x9A, 0x1A, 0x82, 0x42, 0x02, 0xD9, 0x08, 0x1C, 0x99, 0x30, 0x70, 0xBD, 0x08, 0x1C, 0xAB, 0x30, 0x70, 0xBD, 0x08, 0x6B, 0x41, 0x7D, 0x02, 0x88, 0x92, 0x00, 0xFF, 0xFF, 0x06, 0x6E, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x51, 0x1A, 0x3C, 0x39, 0xFF, 0x22, 0x5F, 0x32, 0x91, 0x42, 0x03, 0xD9, 0x65, 0x21, 0x01, 0x80, 0x02, 0x21, 0x81, 0x73, 0x9B, 0x48, 0x99, 0x49, 0x08, 0x18, 0xF7, 0x46, 0xC0, 0x46, 0x30, 0x63, 0x08, 0x00, 0xF8, 0xB5, 0x40, 0x68, 0x24, 0x21, 0x41, 0x43, 0x97, 0x48, 0x45, 0x18, 0x28, 0x1D, 0x0C, 0x21, 0x49, 0x19, 0x04, 0x22, 0x01, 0x23, 0x9E, 0x46, 0x94, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x91, 0x4C, 0x00, 0x28, 0x1B, 0xD0, 0x2B, 0x1C, 0x04, 0x22, 0x6E, 0x46, 0x91, 0x49, 0x1F, 0x7B, 0x08, 0x78, 0xC0, 0x43, 0x38, 0x43, 0x30, 0x70, 0x01, 0x33 ,
|
||||
0x01, 0x31, 0x01, 0x36, 0x01, 0x3A, 0xF5, 0xD1, 0x0C, 0x20, 0x41, 0x19, 0x68, 0x46, 0x04, 0x22, 0x01, 0x23, 0x9E, 0x46, 0x87, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x00, 0x28, 0x02, 0xD0, 0x20, 0x1C, 0x4A, 0x30, 0xF8, 0xBD, 0x20, 0x1C, 0xF8, 0xBD, 0xB1, 0xBD, 0x00, 0x00, 0x15, 0x95, 0x00, 0x00, 0x58, 0x3F, 0x08, 0x00, 0xF3, 0xF8, 0x00, 0x00, 0xE9, 0x09, 0x02, 0x00, 0xFF, 0xFF, 0x9C, 0x6E, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x2B, 0x09, 0x02, 0x00, 0xDD, 0x0A, 0x02, 0x00, 0xF8, 0xB5, 0x05, 0x1C, 0xAA, 0x69, 0x7D, 0x49, 0x00, 0x20, 0x08, 0x56, 0x24, 0x21, 0x41, 0x43, 0x76, 0x48, 0x43, 0x18, 0x04, 0x24, 0x6E, 0x46, 0x76, 0x49, 0x1F, 0x79, 0x08, 0x78, 0xC0, 0x43, 0x38, 0x43, 0x30, 0x70, 0x01, 0x33, 0x01, 0x31, 0x01, 0x36, 0x01, 0x3C, 0xF5, 0xD1, 0x11, 0x1D, 0x68, 0x46, 0x04, 0x22, 0x01, 0x24, 0xA6, 0x46, 0x6D, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x01, 0x1C, 0x6D, 0x48, 0x04, 0xD0, 0x6E, 0x49, 0x09, 0x78 ,
|
||||
0x69, 0x60, 0x45, 0x30, 0xF8, 0xBD, 0xEC, 0x61, 0xAF, 0x30, 0xF8, 0xBD, 0x70, 0xB5, 0xC5, 0x68, 0x81, 0x68, 0x0A, 0x89, 0x6D, 0x4E, 0x00, 0x2A, 0x22, 0xD0, 0x01, 0x24, 0xC2, 0x6D, 0xA2, 0x18, 0xC2, 0x65, 0x08, 0x89, 0x0D, 0x28, 0x1B, 0xD1, 0x68, 0x6B, 0x21, 0x1C, 0xA6, 0x46, 0x63, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x22, 0x1C, 0x28, 0x1C, 0x00, 0x21, 0xA6, 0x46, 0x60, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x2C, 0x60, 0xE9, 0x6B, 0xFF, 0xFF, 0x32, 0x6F, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x28, 0x1C, 0xA6, 0x46, 0x5E, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x28, 0x1C, 0xA6, 0x46, 0x5C, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x30, 0x1C, 0x3D, 0x30, 0x70, 0xBD, 0x30, 0x1C, 0x23, 0x30, 0x70, 0xBD, 0xC0, 0x46, 0xB1, 0x02, 0x00, 0x00, 0x74, 0x3F, 0x08, 0x00, 0x19, 0xC6, 0x00, 0x00, 0x5C, 0x3F, 0x08, 0x00, 0x1D, 0xC2, 0x00, 0x00, 0x68, 0x44, 0x08, 0x00, 0x43, 0x12, 0x03, 0x00, 0x34, 0x63, 0x08, 0x00, 0x2F, 0x7A, 0x02, 0x00 ,
|
||||
0xB4, 0x36, 0x08, 0x00, 0x8F, 0xF4, 0x01, 0x00, 0xF0, 0xB5, 0x05, 0x1C, 0xAB, 0x69, 0xEC, 0x69, 0x60, 0x68, 0x00, 0x68, 0x2A, 0x30, 0x01, 0x78, 0x0A, 0x06, 0x41, 0x78, 0x09, 0x04, 0x8A, 0x18, 0x81, 0x78, 0x09, 0x02, 0x8A, 0x18, 0xC1, 0x78, 0x8A, 0x18, 0x8E, 0x26, 0xF1, 0x5A, 0x09, 0x0A, 0x01, 0x70, 0xF0, 0x5C, 0x61, 0x68, 0x09, 0x68, 0x2B, 0x26, 0x70, 0x54, 0x8C, 0x20, 0xC0, 0x18, 0x61, 0x68, 0x0E, 0x68, 0x01, 0x88, 0x09, 0x0A, 0x2C, 0x27, 0xB9, 0x55, 0x61, 0x68, 0x09, 0x68, 0xFF, 0xFF, 0xC8, 0x6F, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x2D, 0x26, 0x00, 0x78, 0x70, 0x54, 0x60, 0x68, 0x01, 0x68, 0x32, 0x31, 0x08, 0x78, 0x00, 0x02, 0x49, 0x78, 0x08, 0x18, 0x00, 0x04, 0x00, 0x0C, 0x8C, 0x21, 0xCB, 0x58, 0x35, 0x49, 0x41, 0x40, 0x08, 0x04, 0x00, 0x0C, 0xC0, 0x18, 0x80, 0x1A, 0x01, 0x21, 0x8E, 0x46, 0x32, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x61, 0x68, 0x0A, 0x68, 0x32, 0x23, 0x01, 0x0A, 0x99, 0x54 ,
|
||||
0x61, 0x68, 0x09, 0x68, 0x33, 0x22, 0x50, 0x54, 0x60, 0x68, 0x68, 0x60, 0x2C, 0x48, 0xF0, 0xBD, 0x00, 0x00, 0x1B, 0x00, 0x34, 0x04, 0x1B, 0x00, 0x02, 0x6A, 0x8B, 0x69, 0xDB, 0x69, 0x1B, 0x68, 0x83, 0x60, 0x88, 0x69, 0xC0, 0x69, 0x41, 0x68, 0x8A, 0x42, 0x00, 0xDA, 0x42, 0x60, 0x25, 0x48, 0x79, 0x30, 0xF7, 0x46, 0x24, 0x48, 0x57, 0x30, 0xF7, 0x46, 0x24, 0x48, 0x91, 0x30, 0xF7, 0x46, 0x32, 0x04, 0x00, 0x00, 0xC4, 0x07, 0x00, 0x00, 0x15, 0x09, 0x02, 0x00, 0xC5, 0x93, 0x00, 0x00, 0x0D, 0x91, 0x00, 0x00, 0x40, 0x1E, 0x80, 0x00, 0x1E, 0x4B, 0xFF, 0xFF, 0x5E, 0x70, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x19, 0x50, 0x1C, 0x49, 0x0A, 0x50, 0xF7, 0x46, 0xC0, 0x46, 0xBD, 0xB5, 0x00, 0x00, 0x95, 0x92, 0x00, 0x00, 0xFD, 0x93, 0x00, 0x00, 0x54, 0x3F, 0x08, 0x00, 0x29, 0x4F, 0x03, 0x00, 0xDF, 0xE8, 0x02, 0x00, 0x36, 0x89, 0x41, 0x00, 0x81, 0x06, 0x00, 0x00, 0xB1, 0x78, 0x00, 0x00, 0x94, 0xEC, 0x01, 0x00 ,
|
||||
0x08, 0x19, 0x1B, 0x00, 0x8F, 0xC6, 0x03, 0x00, 0x1C, 0x17, 0x1B, 0x00, 0x67, 0x66, 0x03, 0x00, 0xA6, 0x44, 0x08, 0x00, 0x18, 0x17, 0x1B, 0x00, 0xA7, 0x2F, 0x02, 0x00, 0x91, 0x44, 0x03, 0x00, 0x91, 0x63, 0x03, 0x00, 0x5B, 0x44, 0x03, 0x00, 0xE7, 0x44, 0x03, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x61, 0xA2, 0x03, 0x00, 0x6A, 0x1E, 0x01, 0x00, 0x45, 0xDA, 0x00, 0x00, 0xD7, 0xE8, 0x01, 0x00, 0xE9, 0x78, 0x02, 0x00, 0x04, 0xF3, 0x1A, 0x00, 0x80, 0x7B, 0x08, 0x00, 0xFC, 0xB5, 0x04, 0x1C, 0xA5, 0x69, 0x60, 0x6A, 0x01, 0x90, 0x20, 0x69, 0x00, 0x28, 0x35, 0xD4, 0x08, 0x28, 0x33, 0xDA, 0xE1, 0x69, 0x09, 0x68, 0xFF, 0xFF, 0xF4, 0x70, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x10, 0x29, 0x2F, 0xD1, 0xAC, 0x21, 0x41, 0x43, 0x9E, 0x4A, 0x51, 0x5C, 0x49, 0x08, 0x27, 0xD3, 0x00, 0x06, 0x00, 0x16, 0xA2, 0x68, 0x69, 0x46, 0x01, 0x23, 0x9E, 0x46, 0x9A, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x06, 0x1C, 0x39, 0x30, 0x1F, 0xD0 ,
|
||||
0x00, 0x2E, 0x1D, 0xD0, 0x00, 0x98, 0x07, 0x68, 0x00, 0x99, 0x0C, 0x39, 0x01, 0x98, 0x01, 0x60, 0x28, 0x1D, 0x10, 0x21, 0x79, 0x1A, 0x04, 0x22, 0x01, 0x23, 0x9E, 0x46, 0x91, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x02, 0x22, 0x2A, 0x80, 0xA8, 0x1C, 0x08, 0x21, 0x79, 0x1A, 0x01, 0x23, 0x9E, 0x46, 0x8C, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x03, 0xE0, 0x38, 0x20, 0x00, 0xE0, 0x00, 0x20, 0xC6, 0x43, 0x26, 0x60, 0x89, 0x48, 0x7C, 0x30, 0x20, 0x62, 0xFC, 0xBD, 0x30, 0xB5, 0x05, 0x1C, 0x28, 0x69, 0xA9, 0x69, 0x90, 0x29, 0x1D, 0xD1, 0x69, 0x69, 0x09, 0x78, 0x04, 0x29, 0x19, 0xD0, 0x05, 0x29, 0x17, 0xD0, 0x0A, 0x29, 0x15, 0xD0, 0x06, 0x29, 0x13, 0xD0, 0x0C, 0x29, 0x01, 0xDB, 0xFF, 0xFF, 0x8A, 0x71, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x10, 0x29, 0x0F, 0xD1, 0x01, 0x24, 0xA6, 0x46, 0x7D, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x7C, 0x48, 0x7D, 0x49, 0x00, 0x22, 0xA6, 0x46, 0x7C, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x7C, 0x48 ,
|
||||
0xFF, 0x30, 0x5F, 0x30, 0x28, 0x62, 0x30, 0xBD, 0xF0, 0xB5, 0x89, 0xB0, 0x05, 0x90, 0x41, 0x69, 0x02, 0x69, 0x75, 0x48, 0x79, 0x4E, 0x82, 0x42, 0x3A, 0xD0, 0x04, 0x30, 0x82, 0x42, 0x25, 0xD0, 0x74, 0x4D, 0xAA, 0x42, 0x00, 0xD0, 0xCC, 0xE0, 0x08, 0x68, 0x06, 0x1C, 0x0C, 0x22, 0x8F, 0x1A, 0x4A, 0x68, 0x89, 0x18, 0x09, 0x1D, 0x10, 0x22, 0x01, 0x24, 0xA6, 0x46, 0x6E, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x01, 0x1C, 0x09, 0xD1, 0xAC, 0x22, 0x72, 0x43, 0xCB, 0x48, 0x80, 0x18, 0x46, 0x22, 0x12, 0x5C, 0x11, 0x2A, 0x01, 0xD1, 0x44, 0x22, 0x14, 0x54, 0x28, 0x1C, 0x3A, 0x1C, 0xA6, 0x46, 0x62, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x69, 0x48, 0xEC, 0x30, 0xAB, 0xE0, 0x08, 0x68, 0xC0, 0x00, 0x30, 0x18, 0x8A, 0x68, 0x02, 0x2A, 0x02, 0xD0, 0xFF, 0xFF, 0x20, 0x72, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0xE7, 0x20, 0x80, 0x00, 0xA2, 0xE0, 0xCA, 0x68, 0x89, 0x18, 0x09, 0x7B, 0x41, 0x60, 0x80, 0x21, 0x01, 0x60, 0x3B, 0x20 ,
|
||||
0x00, 0x01, 0x99, 0xE0, 0x08, 0x68, 0x06, 0x90, 0xC0, 0x00, 0x34, 0x58, 0x10, 0x20, 0x04, 0x90, 0x01, 0x25, 0xAE, 0x46, 0x57, 0x48, 0xFE, 0x44, 0x00, 0x47, 0x07, 0x90, 0x00, 0x28, 0x00, 0xD1, 0x89, 0xE0, 0x0C, 0x21, 0x07, 0x98, 0x0F, 0x18, 0xB0, 0x49, 0xAC, 0x20, 0x06, 0x9A, 0x50, 0x43, 0x08, 0x18, 0x48, 0x22, 0x13, 0x5C, 0x5B, 0x06, 0x5B, 0x0E, 0x13, 0x54, 0x06, 0x9A, 0xD2, 0x00, 0xB6, 0x18, 0x71, 0x68, 0x00, 0x29, 0x47, 0xD1, 0x00, 0x2C, 0x01, 0xDD, 0x08, 0x2C, 0x21, 0xDB, 0x00, 0x22, 0x69, 0x46, 0x0A, 0x70, 0x01, 0x92, 0x0A, 0x81, 0x8A, 0x72, 0xCD, 0x72, 0x0D, 0x73, 0x4D, 0x73, 0x01, 0x88, 0x44, 0x48, 0x06, 0x23, 0xAE, 0x46, 0x44, 0x4C, 0xFE, 0x44, 0x20, 0x47, 0x04, 0x1C, 0x02, 0xDC, 0x00, 0x20, 0xC0, 0x43, 0x36, 0xE0, 0x34, 0x60, 0xAC, 0x20, 0x60, 0x43, 0x9A, 0x49, 0xFF, 0xFF, 0xB6, 0x72, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x09, 0x18, 0x5C, 0x22, 0x28, 0x1C, 0x50, 0x54, 0x48, 0x20 ,
|
||||
0x42, 0x5C, 0x52, 0x06, 0x52, 0x0E, 0x42, 0x54, 0xAC, 0x20, 0x60, 0x43, 0x94, 0x49, 0x08, 0x18, 0x5C, 0x21, 0x09, 0x5C, 0x49, 0x1E, 0x02, 0x29, 0x16, 0xD9, 0x03, 0x39, 0x08, 0xD0, 0x00, 0x20, 0x30, 0x56, 0xAE, 0x46, 0xEA, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x80, 0x20, 0x30, 0x60, 0xDB, 0xE7, 0x08, 0x94, 0x80, 0x21, 0x31, 0x60, 0x48, 0x22, 0x13, 0x5C, 0x19, 0x43, 0x11, 0x54, 0xAE, 0x46, 0xE4, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x0A, 0xE0, 0x01, 0x20, 0xCE, 0xE7, 0x06, 0x98, 0x39, 0x1C, 0x04, 0xAA, 0xAE, 0x46, 0xE0, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x04, 0x1C, 0x08, 0x90, 0x06, 0x98, 0x38, 0x60, 0x08, 0x98, 0x78, 0x60, 0x00, 0x28, 0x15, 0xD0, 0xAC, 0x20, 0x60, 0x43, 0x7C, 0x49, 0x09, 0x18, 0x48, 0x88, 0x02, 0x04, 0x02, 0x20, 0x10, 0x43, 0xB8, 0x60, 0x48, 0x68, 0x02, 0x0E, 0x01, 0x02, 0x09, 0x0E, 0x09, 0x02, 0x11, 0x43, 0x02, 0x04, 0x12, 0x0E, 0xFF, 0xFF, 0x4C, 0x73, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00 ,
|
||||
0x12, 0x04, 0x0A, 0x43, 0x00, 0x06, 0x10, 0x43, 0xF8, 0x60, 0x07, 0x98, 0x0D, 0x49, 0x00, 0x22, 0x10, 0x23, 0xAE, 0x46, 0xCE, 0x4C, 0xFE, 0x44, 0x20, 0x47, 0x13, 0x48, 0x00, 0xE0, 0x16, 0x20, 0xCC, 0x49, 0x09, 0x18, 0x05, 0x98, 0x01, 0x62, 0x09, 0xB0, 0xF0, 0xBD, 0x5D, 0x0D, 0x1B, 0x00, 0x81, 0xE7, 0x02, 0x00, 0x09, 0xB4, 0x03, 0x00, 0x27, 0x1A, 0x02, 0x00, 0x2F, 0x7A, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x05, 0x10, 0x00, 0x00, 0xCF, 0xF6, 0x00, 0x00, 0xD5, 0xF4, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x91, 0x19, 0x02, 0x00, 0x50, 0x65, 0x08, 0x00, 0x71, 0xC0, 0x02, 0x00, 0x50, 0x19, 0x1B, 0x00, 0x29, 0x16, 0x01, 0x00, 0x2A, 0x03, 0x00, 0x00, 0xF0, 0xB5, 0x8B, 0xB0, 0x07, 0x90, 0x05, 0x69, 0x47, 0x69, 0x0C, 0x20, 0x38, 0x1A, 0x08, 0x90, 0xB6, 0x49, 0x8D, 0x42, 0x16, 0xD1, 0x78, 0x68, 0x0F, 0x30, 0x00, 0x11, 0x00, 0x01, 0x78, 0x60, 0x38, 0x68, 0x0B, 0x28, 0x0E, 0xD8, 0x00, 0x23, 0x68, 0x46 ,
|
||||
0xFF, 0xFF, 0xE2, 0x73, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x03, 0x70, 0x08, 0x98, 0x05, 0x22, 0x01, 0x24, 0xA6, 0x46, 0xAE, 0x4C, 0xFE, 0x44, 0x20, 0x47, 0xAE, 0x48, 0xFF, 0x30, 0x95, 0x30, 0x07, 0x99, 0x08, 0x62, 0xAC, 0x48, 0x85, 0x42, 0x23, 0xD1, 0xAC, 0x48, 0x02, 0x78, 0x6C, 0x46, 0x22, 0x72, 0x43, 0x78, 0x63, 0x72, 0x81, 0x78, 0xA1, 0x72, 0xC0, 0x78, 0xE0, 0x72, 0x00, 0x91, 0x01, 0x90, 0x03, 0x20, 0xA6, 0x49, 0x01, 0x39, 0x01, 0x26, 0xB6, 0x46, 0xF3, 0x4E, 0xFE, 0x44, 0x30, 0x47, 0x04, 0x20, 0x20, 0x70, 0x08, 0x98, 0x9F, 0x49, 0x00, 0x22, 0x02, 0xAB, 0x01, 0x24, 0xA6, 0x46, 0x9B, 0x4C, 0xFE, 0x44, 0x20, 0x47, 0x9A, 0x48, 0xFF, 0x30, 0x95, 0x30, 0x07, 0x99, 0x08, 0x62, 0xEB, 0x49, 0x8D, 0x42, 0x14, 0xD1, 0x02, 0x22, 0x68, 0x46, 0x02, 0x70, 0x3A, 0x68, 0xAC, 0x20, 0x42, 0x43, 0x30, 0x48, 0x68, 0x30, 0x83, 0x18, 0x08, 0x98, 0x00, 0x22, 0x01, 0x24, 0xA6, 0x46, 0x8F, 0x4C, 0xFE, 0x44 ,
|
||||
0x20, 0x47, 0x8E, 0x48, 0xFF, 0x30, 0x95, 0x30, 0x07, 0x99, 0xFF, 0xFF, 0x78, 0x74, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x08, 0x62, 0xEF, 0x48, 0x85, 0x42, 0x00, 0xD0, 0x04, 0xE1, 0x03, 0x20, 0x8C, 0x49, 0x01, 0x22, 0x96, 0x46, 0xEC, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x86, 0x48, 0xFF, 0x30, 0x95, 0x30, 0x09, 0x90, 0x38, 0x68, 0xEA, 0x4D, 0x00, 0x28, 0x00, 0xD1, 0xE2, 0xE0, 0x01, 0x24, 0xA6, 0x46, 0xE6, 0x48, 0xFE, 0x44, 0x00, 0x47, 0x00, 0x28, 0x00, 0xD1, 0xD6, 0xE0, 0xE4, 0x48, 0x02, 0x68, 0x03, 0x20, 0x7F, 0x49, 0x01, 0x31, 0xA6, 0x46, 0xE2, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xDF, 0x48, 0x00, 0x68, 0x00, 0x28, 0x5A, 0xD1, 0xDF, 0x4D, 0x2E, 0x20, 0x41, 0x19, 0xB8, 0x68, 0x03, 0x30, 0x08, 0x70, 0x38, 0x7A, 0x48, 0x70, 0x2E, 0x1C, 0x30, 0x36, 0xB8, 0x68, 0x28, 0x18, 0x30, 0x30, 0xDA, 0x49, 0x0A, 0x68, 0x30, 0x3A, 0x31, 0x1C, 0xA6, 0x46, 0xD8, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x78, 0x68, 0x38, 0x18 ,
|
||||
0x01, 0x1D, 0xBA, 0x68, 0x30, 0x1C, 0xA6, 0x46, 0xD9, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xB8, 0x68, 0x41, 0x19, 0x97, 0x22, 0xFF, 0xFF, 0x0E, 0x75, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x09, 0x30, 0x50, 0x54, 0xB8, 0x68, 0x46, 0x19, 0x9E, 0x36, 0x30, 0x70, 0x01, 0x36, 0xB8, 0x68, 0x01, 0xE0, 0x14, 0x0D, 0x1B, 0x00, 0x30, 0x18, 0xCA, 0x49, 0x0A, 0x68, 0x9E, 0x3A, 0x31, 0x1C, 0xA6, 0x46, 0xC8, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x78, 0x68, 0x38, 0x18, 0x01, 0x1D, 0xBA, 0x68, 0x30, 0x1C, 0xA6, 0x46, 0xC9, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xB8, 0x68, 0x40, 0x00, 0xC0, 0x49, 0x09, 0x68, 0x08, 0x18, 0x28, 0x18, 0xC0, 0x49, 0x0A, 0x79, 0x02, 0x70, 0x4A, 0x79, 0x42, 0x70, 0x8A, 0x79, 0x82, 0x70, 0xC9, 0x79, 0xC1, 0x70, 0x04, 0x30, 0x0F, 0x21, 0x41, 0x1A, 0x0A, 0x78, 0xBB, 0x68, 0x9A, 0x18, 0x0A, 0x70, 0x40, 0x1B, 0x00, 0x04, 0x00, 0x0C, 0xB5, 0x49, 0x08, 0x60, 0xB1, 0x48, 0x04, 0x60, 0x02, 0x20, 0x01, 0x1C ,
|
||||
0x11, 0x22, 0xA6, 0x46, 0xB4, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x06, 0x1C, 0x63, 0xD4, 0x03, 0x20, 0xA6, 0x46, 0xB1, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x0A, 0x90, 0x00, 0x25, 0x01, 0x1C, 0xFF, 0xFF, 0xA4, 0x75, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x8D, 0x42, 0x50, 0xD0, 0x29, 0x1C, 0x2B, 0x22, 0xA6, 0x46, 0xAD, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x0C, 0x20, 0x0A, 0x99, 0x40, 0x18, 0xAC, 0x22, 0x72, 0x43, 0xAB, 0x49, 0x8F, 0x18, 0x78, 0x63, 0x29, 0x1C, 0x18, 0x22, 0xA6, 0x46, 0xA6, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x9F, 0x48, 0x02, 0x68, 0x79, 0x6B, 0x4A, 0x60, 0x0A, 0x98, 0xAC, 0x30, 0x08, 0x60, 0x08, 0x68, 0x9A, 0x49, 0xA6, 0x46, 0xA0, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x29, 0x1C, 0x03, 0xA8, 0x10, 0x22, 0xA6, 0x46, 0x9C, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xE0, 0x21, 0x68, 0x46, 0x01, 0x74, 0x45, 0x74, 0x85, 0x74, 0xFB, 0x21, 0xC1, 0x74, 0xEE, 0x49, 0xC1, 0x81, 0x02, 0x21, 0x81, 0x81, 0x79, 0x6B, 0xCA, 0x68 ,
|
||||
0x01, 0x20, 0xC0, 0x03, 0x10, 0x43, 0xC8, 0x60, 0x48, 0x68, 0x00, 0x90, 0x2A, 0x1C, 0x30, 0x1C, 0x0A, 0x9D, 0x29, 0x1C, 0x03, 0xAB, 0xA6, 0x46, 0xE6, 0x4F, 0xFE, 0x44, 0x38, 0x47, 0x07, 0x1C, 0x30, 0x06, 0x00, 0x16, 0xA6, 0x46, 0xEF, 0x49, 0xFF, 0xFF, 0x3A, 0x76, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0xFE, 0x44, 0x08, 0x47, 0x28, 0x1C, 0xA6, 0x46, 0xEE, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x11, 0xE0, 0x30, 0x06, 0x00, 0x16, 0xA6, 0x46, 0xE9, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x01, 0x20, 0xC7, 0x43, 0x08, 0xE0, 0x07, 0x1C, 0x06, 0xE0, 0x00, 0x20, 0x00, 0x21, 0xCF, 0x43, 0x01, 0xE0, 0x00, 0x20, 0x07, 0x1C, 0x28, 0x60, 0x00, 0x23, 0x68, 0x46, 0x03, 0x70, 0x3A, 0x06, 0x12, 0x0E, 0x08, 0x98, 0x6F, 0x49, 0x01, 0x24, 0xA6, 0x46, 0x09, 0x4C, 0xFE, 0x44, 0x20, 0x47, 0x07, 0x98, 0x09, 0x99, 0x01, 0x62, 0x0B, 0xB0, 0xF0, 0xBD, 0xC1, 0x18, 0x01, 0x00, 0xF1, 0x1B, 0x01, 0x00, 0xF3, 0x1C, 0x02, 0x00, 0x7B, 0xC0 ,
|
||||
0x02, 0x00, 0x91, 0xF0, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0xA3, 0xC0, 0x02, 0x00, 0xA9, 0xE9, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0xE4, 0x62, 0x08, 0x00, 0xAC, 0x05, 0x00, 0x00, 0xFE, 0xB5, 0x07, 0x1C, 0x7D, 0x69, 0xBE, 0x69, 0x0C, 0x20, 0x30, 0x1A, 0x01, 0x90, 0xDF, 0x4C, 0x0A, 0x2D, 0x13, 0xD1, 0xFF, 0xFF, 0xD0, 0x76, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x30, 0x68, 0xDB, 0x49, 0x08, 0x60, 0x01, 0x20, 0x86, 0x46, 0xDA, 0x48, 0xFE, 0x44, 0x00, 0x47, 0x0A, 0x20, 0x00, 0x21, 0x01, 0x9A, 0x01, 0x23, 0x9E, 0x46, 0xE6, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xF5, 0x20, 0x80, 0x00, 0x00, 0x19, 0x38, 0x62, 0x03, 0x2D, 0x79, 0xD1, 0xF5, 0x20, 0x80, 0x00, 0x00, 0x19, 0x02, 0x90, 0x70, 0x68, 0x00, 0x28, 0x0C, 0xD1, 0x00, 0x21, 0xCF, 0x48, 0x01, 0x60, 0xCF, 0x48, 0x00, 0x68, 0x00, 0x28, 0x61, 0xD0, 0x01, 0x21, 0x8E, 0x46, 0xCD, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x5B, 0xE0, 0xCC, 0x48, 0xB1, 0x68, 0x01, 0x60 ,
|
||||
0xF1, 0x68, 0x41, 0x60, 0x31, 0x69, 0x81, 0x60, 0x71, 0x69, 0xC1, 0x60, 0xB1, 0x69, 0xC1, 0x63, 0xF1, 0x69, 0x01, 0x64, 0x31, 0x6A, 0xC1, 0x64, 0x01, 0x24, 0xA6, 0x46, 0xC5, 0x48, 0xFE, 0x44, 0x00, 0x47, 0xA6, 0x46, 0xC4, 0x48, 0xFE, 0x44, 0x00, 0x47, 0x70, 0x68, 0x7D, 0x25, 0xED, 0x00, 0xA8, 0x42, 0x21, 0xD8, 0x01, 0x28, 0x18, 0xD0, 0x02, 0x28, 0x05, 0xD0, 0xFF, 0xFF, 0x66, 0x77, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x28, 0x1C, 0xA6, 0x46, 0xBE, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x1C, 0xE0, 0xB9, 0x48, 0x00, 0x23, 0x19, 0x1C, 0x59, 0x43, 0x3E, 0x22, 0x4A, 0x43, 0x82, 0x83, 0x02, 0x30, 0x01, 0x33, 0x10, 0x2B, 0xF6, 0xDB, 0xA6, 0x46, 0xB4, 0x48, 0xFE, 0x44, 0x00, 0x47, 0xB5, 0x48, 0x0D, 0xE0, 0xB5, 0x4D, 0x28, 0x1C, 0xA6, 0x46, 0xB2, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x04, 0xE0, 0xA6, 0x46, 0xAF, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x75, 0x68, 0xAE, 0x48, 0x05, 0x60, 0x05, 0x1C, 0xA7, 0x4E, 0x30, 0x68 ,
|
||||
0x00, 0x28, 0x06, 0xD1, 0xAD, 0x48, 0x00, 0x68, 0xA6, 0x46, 0xAC, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x30, 0x60, 0x00, 0x94, 0x2B, 0x68, 0xAA, 0x49, 0xAB, 0x4A, 0xA6, 0x46, 0xAB, 0x4D, 0xFE, 0x44, 0x28, 0x47, 0x9C, 0x48, 0x04, 0x60, 0x03, 0x20, 0x00, 0x21, 0x01, 0x9A, 0x01, 0x23, 0x9E, 0x46, 0xA7, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x02, 0x98, 0x38, 0x62, 0xFE, 0xBD, 0xC0, 0x46, 0x13, 0x7F, 0x03, 0x00, 0x12, 0x10, 0x00, 0x00, 0xFF, 0xFF, 0xFC, 0x77, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x30, 0xB5, 0x05, 0x1C, 0x00, 0x20, 0x01, 0x24, 0xA6, 0x46, 0xA0, 0x49, 0xFE, 0x44, 0x08, 0x47, 0xA6, 0x46, 0x9F, 0x49, 0xFE, 0x44, 0x08, 0x47, 0xA6, 0x46, 0x9E, 0x48, 0xFE, 0x44, 0x00, 0x47, 0x7D, 0x21, 0xC9, 0x00, 0xA6, 0x46, 0x9E, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0x9B, 0x49, 0x08, 0x18, 0x99, 0x49, 0x08, 0x80, 0x9B, 0x48, 0x0A, 0x30, 0x28, 0x62, 0x30, 0xBD, 0x11, 0x10, 0x00, 0x00, 0xDD, 0x7E, 0x03, 0x00, 0xB9, 0x90 ,
|
||||
0x00, 0x00, 0x6C, 0x64, 0x08, 0x00, 0xE7, 0x7E, 0x03, 0x00, 0x74, 0x64, 0x08, 0x00, 0x70, 0x64, 0x08, 0x00, 0x6D, 0xC6, 0x03, 0x00, 0x08, 0x19, 0x1B, 0x00, 0x11, 0x18, 0x02, 0x00, 0xD1, 0x78, 0x02, 0x00, 0xC9, 0xBA, 0x03, 0x00, 0x09, 0xB4, 0x03, 0x00, 0x14, 0x0D, 0x1B, 0x00, 0xFE, 0xB5, 0x02, 0x90, 0x45, 0x69, 0x68, 0x46, 0x01, 0x21, 0x8E, 0x46, 0x89, 0x49, 0xFE, 0x44, 0x08, 0x47, 0x89, 0x48, 0x04, 0x1C, 0x68, 0x68, 0x01, 0x69, 0x4A, 0x78, 0x00, 0x27, 0x3E, 0x1C, 0x20, 0x88, 0xFF, 0xFF, 0x92, 0x78, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x40, 0x08, 0x22, 0xD3, 0x20, 0x1D, 0x89, 0x1C, 0x01, 0x23, 0x9E, 0x46, 0x83, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x00, 0x28, 0x07, 0xD1, 0x68, 0x68, 0x00, 0x69, 0x40, 0x78, 0x21, 0x88, 0x09, 0x04, 0x89, 0x16, 0x81, 0x42, 0x3D, 0xD0, 0x02, 0x20, 0x00, 0x5F, 0x00, 0x99, 0x08, 0x1A, 0x00, 0x04, 0x00, 0x14, 0x3C, 0x28, 0x03, 0xDD, 0x20, 0x88, 0x40, 0x10, 0x40, 0x00 ,
|
||||
0x20, 0x80, 0x78, 0x1C, 0x07, 0x06, 0x3F, 0x0E, 0x68, 0x68, 0x01, 0x69, 0x4A, 0x78, 0x2A, 0x34, 0x01, 0x36, 0x14, 0x2E, 0xD5, 0xDB, 0x00, 0x2A, 0x02, 0xD1, 0xAB, 0x20, 0x40, 0x00, 0x50, 0xE0, 0x00, 0x9B, 0x6D, 0x48, 0x14, 0x21, 0x00, 0x22, 0x04, 0x88, 0x64, 0x08, 0x03, 0xD3, 0x2A, 0x30, 0x01, 0x32, 0x01, 0x39, 0xF8, 0xD1, 0x12, 0x06, 0x12, 0x0E, 0x14, 0x2F, 0x16, 0xD1, 0x66, 0x48, 0x00, 0x88, 0x00, 0x06, 0x44, 0x16, 0x64, 0x49, 0x00, 0x22, 0x01, 0x20, 0x4E, 0x8D, 0x36, 0x06, 0x76, 0x16, 0xA6, 0x42, 0x02, 0xDD, 0x34, 0x1C, 0x02, 0x06, 0xFF, 0xFF, 0x28, 0x79, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0x12, 0x0E, 0x2A, 0x31, 0x01, 0x30, 0x14, 0x28, 0xF3, 0xDB, 0x02, 0xE0, 0x32, 0x06, 0x12, 0x0E, 0x00, 0x9B, 0x2A, 0x20, 0x42, 0x43, 0x5A, 0x48, 0x11, 0x18, 0x0C, 0x88, 0x01, 0x20, 0x20, 0x43, 0x00, 0x04, 0x00, 0x0C, 0x08, 0x80, 0xFE, 0x24, 0xA0, 0x43, 0x14, 0x24, 0x64, 0x57, 0x64, 0x06, 0x24, 0x0E ,
|
||||
0x04, 0x43, 0x52, 0x48, 0x14, 0x52, 0x14, 0x18, 0x63, 0x80, 0x08, 0x88, 0x80, 0x05, 0x82, 0x0D, 0x68, 0x68, 0x00, 0x69, 0x40, 0x78, 0x80, 0x02, 0x10, 0x43, 0x08, 0x80, 0x68, 0x68, 0x02, 0x69, 0x20, 0x1D, 0x91, 0x1C, 0x52, 0x78, 0x01, 0x23, 0x9E, 0x46, 0x4B, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x02, 0x98, 0x04, 0x61, 0xFE, 0x20, 0x47, 0x49, 0x09, 0x18, 0x02, 0x98, 0x01, 0x62, 0xFE, 0xBD, 0x82, 0x69, 0x41, 0x69, 0x03, 0x69, 0x02, 0x2B, 0x0A, 0xD1, 0x01, 0x2A, 0x01, 0xD1, 0x00, 0x29, 0x05, 0xD0, 0x02, 0x2A, 0x04, 0xD1, 0x00, 0x29, 0x02, 0xD1, 0x11, 0x21, 0x00, 0xE0, 0x06, 0x21, 0x41, 0x61, 0xF7, 0x46, 0xFF, 0xFF, 0xBE, 0x79, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0xC0, 0x46, 0x14, 0xE9, 0x00, 0x00, 0xC9, 0x18, 0x02, 0x00, 0x30, 0xB5, 0x05, 0x1C, 0x3A, 0x48, 0x00, 0x78, 0x00, 0x28, 0x04, 0xD0, 0x01, 0x20, 0x86, 0x46, 0x38, 0x48, 0xFE, 0x44, 0x00, 0x47, 0x01, 0x24, 0xA6, 0x46, 0x37, 0x48, 0xFE, 0x44 ,
|
||||
0x00, 0x47, 0xA6, 0x46, 0x36, 0x48, 0xFE, 0x44, 0x00, 0x47, 0x35, 0x48, 0x0E, 0x30, 0x28, 0x62, 0x30, 0xBD, 0x49, 0x19, 0x01, 0x00, 0x2F, 0x7A, 0x02, 0x00, 0x18, 0xB5, 0x43, 0x69, 0x81, 0x69, 0x31, 0x48, 0x81, 0x29, 0x00, 0xD1, 0x0B, 0x38, 0x00, 0x21, 0x00, 0x91, 0x1A, 0x68, 0x9B, 0x68, 0x01, 0x24, 0xA6, 0x46, 0x2D, 0x4C, 0xFE, 0x44, 0x20, 0x47, 0x18, 0xBD, 0x18, 0xB5, 0x40, 0x69, 0x00, 0x21, 0x00, 0x91, 0x02, 0x68, 0x83, 0x68, 0x27, 0x48, 0x01, 0x30, 0x01, 0x24, 0xA6, 0x46, 0x26, 0x4C, 0xFE, 0x44, 0x20, 0x47, 0x18, 0xBD, 0xC0, 0x46, 0x30, 0x63, 0x08, 0x00, 0x19, 0x9E, 0x00, 0x00, 0xB9, 0xEC, 0x00, 0x00, 0x74, 0x3F, 0x08, 0x00, 0x80, 0x3F, 0x08, 0x00, 0xFF, 0xFF, 0x54, 0x7A, 0x08, 0x00, 0x96, 0x00, 0x00, 0x00, 0xB7, 0x5D, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x00, 0xD3, 0x8E, 0x00, 0x00, 0xF7, 0xC6, 0x00, 0x00, 0xE5, 0x90, 0x00, 0x00, 0x68, 0x64, 0x08, 0x00, 0xC0, 0x27, 0x09, 0x00, 0xA0, 0x3B ,
|
||||
0x08, 0x00, 0x3D, 0x5D, 0x03, 0x00, 0x19, 0xC6, 0x00, 0x00, 0xE8, 0x3A, 0x08, 0x00, 0x81, 0x5D, 0x03, 0x00, 0xCF, 0xF6, 0x00, 0x00, 0x4B, 0x4F, 0x03, 0x00, 0x6B, 0xC0, 0x03, 0x00, 0x95, 0x1E, 0x01, 0x00, 0xDA, 0x40, 0x08, 0x00, 0xDC, 0x05, 0x00, 0x00, 0x55, 0xAA, 0x03, 0x00, 0x0D, 0x91, 0x00, 0x00, 0xD7, 0x56, 0x03, 0x00, 0x08, 0x51, 0x08, 0x00, 0x8F, 0xC6, 0x03, 0x00, 0x65, 0xB8, 0x00, 0x00, 0x09, 0xB4, 0x03, 0x00, 0x84, 0x17, 0x1B, 0x00, 0xB5, 0x86, 0x01, 0x00, 0x3D, 0x47, 0x02, 0x00, 0x73, 0x49, 0x02, 0x00, 0x5F, 0x90, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x00, 0xF7, 0xF6, 0x00, 0x00, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0x76, 0xFF, 0xFF, 0xBD, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0x5A, 0xFF, 0xFF, 0xBD, 0xFF, 0xB5, 0xFF, 0xFF, 0xEA, 0x7A, 0x08, 0x00, 0x58, 0x00, 0x00, 0x00, 0x68, 0x46, 0xFF, 0xF7, 0x99, 0xFF, 0xFF, 0xBD, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0x83, 0xFF, 0xFF, 0xBD, 0xFF, 0xB5 ,
|
||||
0x68, 0x46, 0xFF, 0xF7, 0xB6, 0xFE, 0xFF, 0xBD, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0x55, 0xFC, 0xFF, 0xBD, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0x27, 0xFB, 0xFF, 0xBD, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0xDD, 0xFA, 0xFF, 0xBD, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0x68, 0xFE, 0xFF, 0xBD, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0x3D, 0xFB, 0xFF, 0xBD, 0xFF, 0xB5, 0x68, 0x46, 0xFF, 0xF7, 0xBE, 0xFD, 0xFF, 0xBD, 0x78, 0x7B, 0x08, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0xB5, 0xF8, 0xF0, 0x43, 0xFA, 0x00, 0xBD, 0x35, 0x66, 0x08, 0x00, 0x67, 0x66, 0x08, 0x00, 0x71, 0x65, 0x08, 0x00, 0x4D, 0x66, 0x08, 0x00, 0x25, 0x64, 0x08, 0x00, 0x81, 0x66, 0x08, 0x00, 0x8D, 0x66, 0x08, 0x00, 0x99, 0x66, 0x08, 0x00, 0x87, 0x67, 0x08, 0x00, 0xA7, 0x67, 0x08, 0x00, 0xD1, 0x67, 0x08, 0x00, 0x1B, 0x68, 0x08, 0x00, 0x57, 0x68, 0x08, 0x00, 0x2D, 0x69, 0x08, 0x00, 0xB1, 0x6B, 0x08, 0x00, 0xD5, 0x6B, 0x08, 0x00, 0xF9, 0x6B ,
|
||||
0x08, 0x00, 0x15, 0x6C, 0x08, 0x00, 0xA1, 0x68, 0x08, 0x00, 0x59, 0x6C, 0x08, 0x00, 0xA7, 0x6D, 0x08, 0x00, 0xFF, 0x6D, 0x08, 0x00, 0x29, 0x6E, 0x08, 0x00, 0xF9, 0x6E, 0x08, 0x00, 0xD9, 0x6C, 0x08, 0x00, 0xA5, 0x6E, 0x08, 0x00, 0xCD, 0x6D, 0x08, 0x00, 0x81, 0x6F, 0x08, 0x00, 0x1D, 0x70, 0x08, 0x00, 0x31, 0x64, 0x08, 0x00, 0x39, 0x70, 0x08, 0x00, 0x3F, 0x70, 0x08, 0x00, 0x04, 0xF3, 0x1A, 0x00, 0x80, 0x00, 0x00, 0x00, 0xB2, 0x4E, 0x01, 0x00, 0x5A, 0xC1, 0x00, 0x00, 0x96, 0x1A, 0x01, 0x00, 0x22, 0x0B, 0x02, 0x00, 0x60, 0xD0, 0x01, 0x00, 0x06, 0x1A, 0x00, 0x00, 0xB8, 0xC6, 0x01, 0x00, 0xD8, 0x42, 0x03, 0x00, 0x16, 0x42, 0x03, 0x00, 0xEE, 0xDB, 0x00, 0x00, 0x62, 0xDC, 0x00, 0x00, 0xC8, 0xE1, 0x00, 0x00, 0x8A, 0x17, 0x02, 0x00, 0x38, 0xBE, 0x00, 0x00, 0x26, 0xC6, 0x00, 0x00, 0x56, 0xC2, 0x00, 0x00, 0x62, 0x12, 0x03, 0x00, 0xE4, 0xF4, 0x01, 0x00, 0x3A, 0xEC, 0x00, 0x00, 0x5E, 0x92, 0x00, 0x00 ,
|
||||
0xFE, 0xE8, 0x02, 0x00, 0x18, 0x7F, 0x00, 0x00, 0x64, 0xEC, 0x01, 0x00, 0xFE, 0x44, 0x03, 0x00, 0x1C, 0x94, 0x00, 0x00, 0xA8, 0x66, 0x03, 0x00, 0x74, 0xE9, 0x02, 0x00, 0x68, 0x1E, 0x01, 0x00, 0xBC, 0xDA, 0x00, 0x00, 0xEA, 0xE1, 0x00, 0x00, 0x24, 0xE9, 0x01, 0x00, 0x70, 0x79, 0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x1C, 0xF0, 0xB5, 0x88, 0xB0, 0xCA, 0x4C, 0x03, 0x20, 0x22, 0x78, 0x63, 0x78, 0xCA, 0x4E, 0x31, 0x1C, 0x01, 0x39, 0x01, 0x25, 0xAE, 0x46, 0xC7, 0x4F, 0xFE, 0x44, 0x38, 0x47, 0xA2, 0x78, 0xE3, 0x78, 0x03, 0x20, 0x31, 0x1C, 0xAE, 0x46, 0xC3, 0x4F, 0xFE, 0x44, 0x38, 0x47, 0x03, 0x20, 0x31, 0x1C, 0x01, 0x31, 0xAE, 0x46, 0xC1, 0x4A, 0xFE, 0x44, 0x10, 0x47, 0xC1, 0x48, 0x21, 0x78, 0x01, 0x70, 0x61, 0x78, 0x41, 0x70, 0xE1, 0x78, 0xC1, 0x70, 0xA1, 0x78, 0x81, 0x70, 0xBF, 0x48, 0x04, 0x1C, 0x33, 0x3C, 0x20, 0x1C, 0x00, 0x21, 0xDC, 0x22, 0xAE, 0x46 ,
|
||||
0xBA, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x84, 0x20, 0xA0, 0x70, 0x05, 0x27, 0xE7, 0x71, 0x0C, 0x26, 0x26, 0x73, 0x0D, 0x20, 0x00, 0x19, 0x98, 0xA1, 0x32, 0x1C, 0xAE, 0x46, 0xB4, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x04, 0x20, 0x60, 0x76, 0x1A, 0x20, 0x00, 0x19, 0x97, 0xA1, 0x06, 0x91, 0x04, 0x22, 0xAE, 0x46, 0xAE, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xFF, 0xFF, 0x96, 0x00, 0x18, 0x00, 0x96, 0x00, 0x00, 0x00, 0xA7, 0x77, 0x1F, 0x34, 0x95, 0xA1, 0x07, 0x91, 0x20, 0x1C, 0x3A, 0x1C, 0xAE, 0x46, 0xA9, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xE6, 0x71, 0x28, 0x1C, 0x60, 0x72, 0x11, 0x20, 0x20, 0x73, 0x94, 0x20, 0x60, 0x73, 0xC0, 0x25, 0x65, 0x74, 0xA6, 0x74, 0x09, 0x22, 0xE2, 0x74, 0xA3, 0x4C, 0x20, 0x1C, 0x8C, 0xA1, 0x01, 0x23, 0x9E, 0x46, 0x9F, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x07, 0x22, 0x62, 0x72, 0x9E, 0x4C, 0x0A, 0x34, 0x20, 0x1C, 0x89, 0xA1, 0x01, 0x23, 0x9E, 0x46, 0x9A, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x04, 0x20 ,
|
||||
0xE0, 0x71, 0x98, 0x4C, 0x12, 0x34, 0x20, 0x1C, 0x06, 0x99, 0x04, 0x22, 0x01, 0x23, 0x9E, 0x46, 0x94, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x27, 0x71, 0x93, 0x4C, 0x17, 0x34, 0x20, 0x1C, 0x07, 0x99, 0x3A, 0x1C, 0x01, 0x23, 0x9E, 0x46, 0x8E, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0xE6, 0x71, 0x01, 0x20, 0x60, 0x72, 0x11, 0x20, 0x20, 0x73, 0x94, 0x20, 0x60, 0x73, 0x02, 0x20, 0xE0, 0x73, 0x25, 0x74, 0x66, 0x74, 0xFF, 0xFF, 0x2C, 0x01, 0x18, 0x00, 0x96, 0x00, 0x00, 0x00, 0xA5, 0x74, 0x2F, 0x27, 0xE7, 0x74, 0x10, 0x20, 0x60, 0x75, 0x80, 0x26, 0xA6, 0x75, 0x01, 0x20, 0xE0, 0x75, 0x11, 0x20, 0xA0, 0x76, 0x94, 0x20, 0xE0, 0x76, 0x24, 0x20, 0x60, 0x77, 0x0A, 0x22, 0xA2, 0x77, 0x80, 0x4C, 0x36, 0x34, 0x20, 0x1C, 0x6D, 0xA1, 0x01, 0x23, 0x9E, 0x46, 0x7C, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x18, 0x22, 0xA2, 0x72, 0x7A, 0x4C, 0x41, 0x34, 0x20, 0x1C, 0x6B, 0xA1, 0x01, 0x23, 0x9E, 0x46, 0x76, 0x4B, 0xFE, 0x44, 0x18, 0x47 ,
|
||||
0x25, 0x76, 0x67, 0x76, 0x21, 0x20, 0xE0, 0x76, 0x26, 0x77, 0x01, 0x20, 0x60, 0x77, 0x72, 0x48, 0x61, 0x30, 0x11, 0x21, 0x01, 0x70, 0x94, 0x21, 0x41, 0x70, 0x04, 0x21, 0x01, 0x72, 0xD2, 0x21, 0x41, 0x72, 0xC5, 0x72, 0x1E, 0x21, 0x01, 0x73, 0x45, 0x73, 0x9E, 0x21, 0x81, 0x73, 0x01, 0x21, 0x01, 0x74, 0x46, 0x74, 0x81, 0x74, 0x11, 0x21, 0x41, 0x75, 0x94, 0x21, 0x81, 0x75, 0x04, 0x21, 0x01, 0x76, 0xAD, 0x20, 0x66, 0x49, 0x08, 0x60, 0x00, 0x24, 0x0F, 0x25, 0xFF, 0xFF, 0xC2, 0x01, 0x18, 0x00, 0x96, 0x00, 0x00, 0x00, 0x29, 0x06, 0x09, 0x0E, 0x00, 0x20, 0x6A, 0x46, 0x01, 0x23, 0x9E, 0x46, 0x62, 0x4B, 0xFE, 0x44, 0x18, 0x47, 0x6B, 0x46, 0x18, 0x88, 0x40, 0x08, 0x0E, 0xD3, 0xA0, 0x00, 0x0F, 0x21, 0xCA, 0x43, 0x69, 0x46, 0x0E, 0x88, 0x16, 0x40, 0x01, 0xAF, 0x3E, 0x52, 0x49, 0x88, 0x11, 0x40, 0x68, 0x44, 0xC1, 0x80, 0x60, 0x1C, 0x04, 0x04, 0x24, 0x0C, 0x01, 0x3D, 0x0B, 0x2D, 0xE0, 0xDA, 0x60, 0x1E ,
|
||||
0x00, 0x04, 0x00, 0x0C, 0x1D, 0xD0, 0x86, 0x46, 0x01, 0x1C, 0x01, 0xAD, 0x01, 0x22, 0xAE, 0x88, 0x90, 0x00, 0xC7, 0x5A, 0xB7, 0x42, 0x0A, 0xDA, 0xBC, 0x46, 0x07, 0x1C, 0x6F, 0x44, 0x7F, 0x88, 0x68, 0x44, 0x06, 0x80, 0xEE, 0x88, 0x46, 0x80, 0x60, 0x46, 0xA8, 0x80, 0xEF, 0x80, 0x04, 0x35, 0x50, 0x1C, 0x02, 0x04, 0x12, 0x0C, 0x01, 0x39, 0xE9, 0xD1, 0x70, 0x46, 0x01, 0x38, 0x86, 0x46, 0xE2, 0xD1, 0x99, 0x88, 0x68, 0x46, 0xC0, 0x88, 0x40, 0x18, 0x00, 0x04, 0x00, 0x0C, 0x42, 0x4B, 0x18, 0x80, 0x42, 0x49, 0x08, 0x1A, 0xFF, 0xFF, 0x58, 0x02, 0x18, 0x00, 0x96, 0x00, 0x00, 0x00, 0x58, 0x80, 0x02, 0x2C, 0x1E, 0xDB, 0x65, 0x1E, 0x01, 0xAA, 0x01, 0x20, 0x01, 0x1C, 0x8C, 0x00, 0x6B, 0x46, 0xE6, 0x5A, 0x93, 0x88, 0xD4, 0x88, 0xE7, 0x18, 0xB7, 0x42, 0x0C, 0xDA, 0x06, 0x24, 0x44, 0x43, 0x38, 0x4B, 0x1B, 0x19, 0x1F, 0x80, 0x1C, 0x88, 0x34, 0x1B, 0x5C, 0x80, 0x01, 0x24, 0x1C, 0x71, 0x40, 0x1C, 0x00, 0x04 ,
|
||||
0x00, 0x0C, 0x04, 0x32, 0x49, 0x1C, 0x09, 0x06, 0x09, 0x0E, 0x01, 0x3D, 0xE4, 0xD1, 0x00, 0x24, 0x31, 0x48, 0x04, 0x70, 0x31, 0x48, 0x04, 0x70, 0x31, 0x48, 0x04, 0x70, 0x31, 0x48, 0x04, 0x70, 0x01, 0x20, 0x86, 0x46, 0x30, 0x48, 0xFE, 0x44, 0x00, 0x47, 0x2F, 0x49, 0x22, 0x1C, 0x08, 0x68, 0x00, 0x28, 0x02, 0xD0, 0x01, 0x20, 0x90, 0x40, 0x04, 0x43, 0x04, 0x31, 0x01, 0x32, 0x20, 0x2A, 0xF5, 0xD3, 0x2A, 0x48, 0x04, 0x60, 0x08, 0xB0, 0xF0, 0xBD, 0x5F, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2D, 0x69, 0x6E, 0x66, 0x6F, 0x00, 0xC0, 0x46, 0xC0, 0x5F, 0x75, 0x64, 0x70, 0x00, 0xC0, 0xFF, 0xFF, 0xEE, 0x02, 0x18, 0x00, 0x96, 0x00, 0x00, 0x00, 0x46, 0xC0, 0x6C, 0x6F, 0x63, 0x61, 0x6C, 0x00, 0xC0, 0x46, 0x5F, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x00, 0xC0, 0x46, 0x5F, 0x64, 0x6E, 0x73, 0x2D, 0x73, 0x64, 0x00, 0x64, 0x65, 0x76, 0x3D, 0x43, 0x43, 0x33, 0x30, 0x30, 0x30, 0x00, 0xC0, 0x76, 0x65 ,
|
||||
0x6E, 0x64, 0x6F, 0x72, 0x3D, 0x54, 0x65, 0x78, 0x61, 0x73, 0x2D, 0x49, 0x6E, 0x73, 0x74, 0x72, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x73, 0x00, 0xC0, 0x46, 0xC0, 0x00, 0x00, 0x18, 0x00, 0xF3, 0x7E, 0x03, 0x00, 0xC6, 0x05, 0x00, 0x00, 0xDD, 0x7E, 0x03, 0x00, 0xE4, 0x62, 0x08, 0x00, 0xC9, 0xBA, 0x03, 0x00, 0x09, 0xB4, 0x03, 0x00, 0xA7, 0x64, 0x08, 0x00, 0x70, 0x64, 0x08, 0x00, 0xDD, 0x0A, 0x02, 0x00, 0x48, 0x32, 0x08, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xE8, 0x62, 0x08, 0x00, 0xE9, 0x62, 0x08, 0x00, 0xEA, 0x62, 0x08, 0x00, 0xEB, 0x62, 0x08, 0x00, 0x81, 0x03, 0x18, 0x00, 0x80, 0x7B, 0x08, 0x00, 0x84, 0xF3, 0x1A, 0x00, 0x0D, 0x49, 0x0E, 0x48, 0xFF, 0xFF, 0x84, 0x03, 0x18, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x88, 0x67, 0x0E, 0x48, 0x88, 0x64, 0x0E, 0x48, 0x48, 0x64, 0x0E, 0x48, 0xC8, 0x64, 0x0E, 0x48, 0x08, 0x65, 0x11, 0x48, 0x02, 0x1C, 0x04, 0x32, 0x0C, 0x4B, 0x13, 0x60, 0x0C, 0x4B, 0x93, 0x62, 0x0C, 0x4A ,
|
||||
0x8A, 0x66, 0x0D, 0x49, 0x01, 0x60, 0x0D, 0x48, 0x0E, 0x49, 0x01, 0x60, 0x0E, 0x49, 0x41, 0x60, 0xF7, 0x46, 0x1C, 0x21, 0x08, 0x00, 0x1B, 0x7B, 0x08, 0x00, 0x11, 0x7B, 0x08, 0x00, 0x07, 0x7B, 0x08, 0x00, 0x39, 0x7B, 0x08, 0x00, 0x2F, 0x7B, 0x08, 0x00, 0x25, 0x7B, 0x08, 0x00, 0xFD, 0x7A, 0x08, 0x00, 0xDF, 0x7A, 0x08, 0x00, 0x50, 0x23, 0x08, 0x00, 0xD5, 0x7A, 0x08, 0x00, 0x58, 0x26, 0x08, 0x00, 0xF3, 0x7A, 0x08, 0x00, 0xE9, 0x7A, 0x08, 0x00 };
|
||||
|
||||
uint16_t drv_length = 8024;
|
||||
|
||||
//Service Pack version P1.12.7.15.15 - FW patches
|
||||
unsigned char PROGMEM fw_patch[5700] = { 0x00, 0x01, 0x00, 0x00, 0x3C, 0x16, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x14, 0x03, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x68, 0x46, 0x25, 0xF0, 0x95, 0xFB, 0xE0, 0x6B, 0xD0, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x38, 0xFB, 0x2C, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x0A, 0xFB, 0x04, 0x15, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xB8, 0xF1, 0x90, 0x0F, 0xA4, 0x16, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x66, 0xE0, 0x04, 0xA8, 0x35, 0x1D, 0x21, 0xF0, 0x99, 0xFC, 0x68, 0x46, 0x23, 0xF0, 0x28, 0xFB, 0x9A, 0xF8, 0x00, 0x00, 0x01, 0x28, 0x07, 0xD1, 0x28, 0x46, 0x05, 0xF0, 0xC3, 0xFE, 0x01, 0x46, 0x01, 0xAA, 0x00, 0x20, 0x21, 0xF0, 0x50, 0xF9, 0x28, 0x46, 0x05, 0xF0, 0xBB, 0xFE, 0x01, 0xA9, 0x21, 0xF0, 0x2A, 0xFA, 0xE9, 0x79, 0x4F, 0xEA, 0xE0, 0x00, 0x40, 0xB2, 0x11, 0xB1, 0x00, 0xF1, 0x06, 0x00, 0x40, 0xB2, 0xA8, 0x71, 0x1F, 0x38, 0x40, 0x00, 0xE8, 0x71, 0x30, 0x46 ,
|
||||
0x01, 0xF0, 0x0D, 0xFF, 0x10, 0xF1, 0x00, 0x09, 0x4F, 0xF0, 0x00, 0x01, 0x09, 0xD0, 0x28, 0x68, 0x40, 0x0C, 0x09, 0xD3, 0xE8, 0x68, 0xC0, 0x0B, 0x03, 0xD2, 0x48, 0x46, 0xFF, 0xF7, 0xDD, 0xFE, 0x01, 0x21, 0x28, 0x68, 0x40, 0x0C, 0x0A, 0xD2, 0x38, 0x68, 0x40, 0x1C, 0x38, 0x60, 0x20, 0x68, 0x6F, 0xF3, 0x0F, 0x00, 0x20, 0x60, 0x22, 0x68, 0x38, 0x68, 0x10, 0x43, 0x20, 0x60, 0xE8, 0x68, 0xC0, 0x0B, 0x0F, 0xD3, 0xD8, 0xF8, 0x00, 0x00, 0x00, 0xF1, 0x01, 0x00, 0xC8, 0xF8, 0x00, 0x00, 0x20, 0x68, 0x6F, 0xF3, 0x1F, 0x40, 0x20, 0x60, 0xD8, 0xF8, 0x00, 0x20, 0x20, 0x68, 0x40, 0xEA, 0x02, 0x40, 0x20, 0x60, 0x49, 0xB9, 0xB9, 0xF1, 0x00, 0x0F, 0x03, 0xD1, 0x30, 0x46, 0x07, 0xF0, 0xBE, 0xF9, 0x02, 0xE0, 0x48, 0x46, 0x07, 0xF0, 0x06, 0xFA, 0x6C, 0x17, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x68, 0x46, 0x0E, 0xF0, 0x85, 0xFB, 0x00, 0x9E, 0x00, 0x2E, 0x96, 0xD1, 0x05, 0xB0, 0xBD, 0xE8, 0xF0, 0x87, 0xC0, 0x46 ,
|
||||
0x9C, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x23, 0xF0, 0x2A, 0xFE, 0x74, 0x47, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0B, 0x21, 0x21, 0xF0, 0x41, 0xFA, 0x20, 0x68, 0x18, 0x4B, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0xF0, 0x1C, 0xF9, 0x0A, 0xE0, 0x20, 0x68, 0x00, 0x68, 0x0C, 0x21, 0x40, 0xF0, 0x20, 0x00, 0x21, 0xF0, 0x14, 0xF9, 0x10, 0x57, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0xA8, 0x20, 0xF0, 0x97, 0xF9, 0x01, 0x98, 0x5C, 0x57, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0xA8, 0x20, 0xF0, 0x71, 0xF9, 0x03, 0x98, 0x00, 0x58, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0xF0, 0x20, 0xF9, 0x1C, 0x58, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0xF0, 0x12, 0xF9, 0x54, 0x58, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0xA8, 0x20, 0xF0, 0xF5, 0xF8, 0x04, 0xAB, 0x04, 0x62, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x79, 0x1F, 0xF0, 0x1B, 0xFD, 0x69, 0xE0, 0x60, 0x93, 0x00, 0x00, 0x40, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xA6, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x78, 0x1B, 0xF0, 0x39, 0xFB, 0x28, 0x46, 0x90, 0xA8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x78, 0x1B, 0xF0, 0x69, 0xF9, 0x1E, 0x48, 0x34, 0xAD, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x68, 0xFF, 0x29, 0x98, 0xAD, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0xD4, 0x21, 0xD4, 0xB2, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0xD0, 0x1A, 0xF0, 0x47, 0xFC, 0x20, 0x98, 0xAC, 0xC5, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x78, 0x19, 0xF0 ,
|
||||
0xDB, 0xFA, 0x09, 0x49, 0x28, 0xC6, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x19, 0xF0, 0x9E, 0xFA, 0xDC, 0xD3, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x18, 0xF0, 0xAB, 0xFC, 0x00, 0xF0, 0x03, 0xF8, 0x00, 0xBD, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xDF, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x17, 0xF0, 0xA8, 0xFD, 0xCC, 0xEB, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x38, 0x78, 0x17, 0xF0, 0x77, 0xF8, 0x38, 0x78, 0x16, 0xF0, 0xF0, 0xFF, 0xA8, 0xF7, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0E, 0x49, 0x09, 0x68, 0x23, 0x22, 0x41, 0x61, 0xC8, 0xF7, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x31, 0x2E, 0x31, 0x39, 0x2E, 0x33, 0x31, 0x34, 0x5F, 0x4E, 0x65, 0x77, 0x5F, 0x43, 0x43, 0x41, 0x5F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x69, 0x74, 0x68, 0x6D, 0x00, 0xC0, 0x74, 0x56, 0x30, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xF9, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0xA8, 0x16, 0xF0, 0x79, 0xF8 ,
|
||||
0x12, 0xE0, 0x38, 0xFA, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0xA8, 0x16, 0xF0, 0x03, 0xF8, 0x32, 0x20, 0x94, 0xFB, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x0C, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0xA8, 0x14, 0xF0, 0x05, 0xFF, 0x01, 0xF0, 0x10, 0x1B, 0x01, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x1E, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x13, 0xF0, 0x46, 0xBF, 0x18, 0x30, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x30, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0xF0, 0xD8, 0xFC, 0x9C, 0x31, 0x01, 0x00, 0x08, 0x00 ,
|
||||
0x00, 0x00, 0x68, 0x46, 0x12, 0xF0, 0x51, 0xFC, 0xFE, 0xF7, 0xF0, 0x35, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x68, 0x46, 0x12, 0xF0, 0x27, 0xFA, 0xFE, 0xF7, 0xF0, 0x3D, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0xA9, 0x11, 0xF0, 0x27, 0xFE, 0x20, 0x6F, 0xD0, 0x62, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0xB8, 0xFB, 0x80, 0x7E, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0xDF, 0xF8, 0x58, 0x82, 0xE0, 0x7E, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0D, 0xF0, 0x6A, 0xFE, 0x0B, 0xF0, 0x9A, 0xF9, 0x03, 0x20, 0xA8, 0xF5, 0x88, 0x71, 0x08, 0x60, 0xF2, 0xF7, 0x16, 0xF9, 0x7A, 0x48, 0x6B, 0x49, 0x9C, 0x7F, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x70, 0x51, 0x4D, 0xC4, 0x7F, 0x01, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x40, 0x49, 0x00, 0xF1, 0x52, 0x00, 0x3A, 0x4A, 0xA8, 0x81, 0x28, 0x83, 0xE8, 0x83, 0xE8, 0x84, 0xA8, 0x85, 0x2A, 0x60, 0x39, 0x48, 0x41, 0xF2, 0x11, 0x12, 0x2A, 0x85, 0x18, 0x90, 0x19, 0x91 ,
|
||||
0x39, 0x49, 0x1A, 0x91, 0x39, 0x49, 0x1B, 0x91, 0x39, 0x49, 0x20, 0x46, 0xDF, 0xF8, 0xC4, 0x90, 0x1C, 0x91, 0x38, 0x49, 0xDF, 0xF8, 0xC0, 0xB0, 0x31, 0x4E, 0x1D, 0x91, 0x48, 0x80, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0D, 0xF0, 0x7C, 0xFA, 0xB4, 0x80, 0x01, 0x00, 0x34, 0x00, 0x00, 0x00, 0x34, 0x12, 0x66, 0x09, 0x84, 0x6B, 0x00, 0x20, 0x94, 0x70, 0x00, 0x20, 0xB4, 0x70, 0x00, 0x20, 0xC4, 0x78, 0x00, 0x20, 0x50, 0x7A, 0x00, 0x20, 0xFE, 0xFF, 0x03, 0x00, 0xA4, 0x70, 0x00, 0x20, 0xB0, 0x70, 0x00, 0x20, 0xB8, 0x70, 0x00, 0x20, 0x60, 0x55, 0x30, 0x80, 0x3C, 0x5C, 0x00, 0x20, 0x04, 0x74, 0x00, 0x20, 0xB8, 0xE4, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x20, 0x78, 0x07, 0xF0, 0x01, 0xFC, 0x20, 0x78, 0x07, 0xF0, 0x7A, 0xFB, 0x04, 0x4D, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x2D, 0xE9, 0xF0, 0x4F, 0xAD, 0xF1, 0x8C, 0x0D, 0x04, 0x68, 0x0F, 0x30, 0x03, 0x94, 0xFE, 0xF7, 0xDB, 0xFA, 0x04, 0xF1, 0x14, 0x00 ,
|
||||
0x04, 0x90, 0x21, 0x7D, 0x00, 0x20, 0x21, 0xF0, 0x73, 0x01, 0x88, 0x29, 0x08, 0xBF, 0x01, 0x20, 0x05, 0x90, 0x03, 0x98, 0x00, 0x1D, 0x06, 0x90, 0x5D, 0x48, 0x00, 0x68, 0x01, 0x28, 0x40, 0xF0, 0xFA, 0x83, 0x5B, 0x4D, 0x5C, 0x48, 0xDF, 0xF8, 0x70, 0x91, 0x29, 0x68, 0xDF, 0xF8, 0x70, 0x81, 0xDF, 0xF8, 0x74, 0xA1, 0x88, 0x42, 0x21, 0xD1, 0x10, 0x22, 0x00, 0x21, 0x48, 0x46, 0x4F, 0x46, 0xFB, 0xF7, 0xB7, 0xFE, 0x10, 0x22, 0x00, 0x21, 0x40, 0x46, 0xFB, 0xF7, 0xB2, 0xFE, 0x54, 0x49, 0x08, 0x68, 0x40, 0xF4, 0x80, 0x10, 0x08, 0x60, 0x01, 0x20, 0x51, 0x46, 0x08, 0x60, 0x00, 0x21, 0x29, 0x60, 0x39, 0x78, 0x46, 0x46, 0x00, 0x91, 0x31, 0x78, 0x41, 0xF2, 0x11, 0x13, 0x04, 0x22, 0x01, 0x91, 0x07, 0x21, 0x02, 0x90, 0x03, 0x20, 0xF3, 0xF7, 0x41, 0xFC, 0x51, 0x46, 0x07, 0x91, 0x08, 0x68, 0x56, 0x49, 0xDF, 0xF8, 0x5C, 0xB1, 0x01, 0x28, 0x08, 0x91, 0x56, 0x49, 0xDF, 0xF8, 0x48, 0xA1, 0x09, 0x91, 0x55, 0x49 ,
|
||||
0x0A, 0x91, 0x44, 0x49, 0x0B, 0x91, 0x44, 0x49, 0x0C, 0x91, 0x44, 0x49, 0x0D, 0x91, 0x44, 0x49, 0x0E, 0x91, 0x44, 0x49, 0x0F, 0x91, 0x44, 0x49, 0x10, 0x91, 0x44, 0x49, 0xCC, 0x4D, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x11, 0x91, 0x44, 0x49, 0x12, 0x91, 0x44, 0x49, 0x13, 0x91, 0x44, 0x49, 0x14, 0x91, 0x44, 0x49, 0x15, 0x91, 0x44, 0x49, 0x16, 0x91, 0x9F, 0x49, 0x17, 0x91, 0x9F, 0x49, 0x18, 0x91, 0x9F, 0x49, 0x19, 0x91, 0x9F, 0x49, 0x1A, 0x91, 0x9F, 0x49, 0x1B, 0x91, 0x9F, 0x49, 0x1C, 0x91, 0x9F, 0x49, 0x1D, 0x91, 0x9F, 0x49, 0x1E, 0x91, 0x9F, 0x49, 0x1F, 0x91, 0x40, 0xF0, 0x00, 0x81, 0x04, 0x98, 0x40, 0x78, 0x00, 0xF0, 0x03, 0x01, 0x01, 0x29, 0x40, 0xF0, 0xF9, 0x80, 0x04, 0x99, 0x09, 0x78, 0x01, 0xF0, 0x0C, 0x01, 0x08, 0x29, 0x40, 0xF0, 0xF2, 0x80, 0x06, 0x99, 0x09, 0x88, 0xA1, 0xF1, 0x3C, 0x01, 0x0E, 0xB2, 0x05, 0x99, 0x11, 0xB1, 0xA6, 0xF1, 0x02, 0x06, 0x36, 0xB2, 0xC0, 0x09, 0x4F, 0xF0 ,
|
||||
0x00, 0x07, 0x15, 0xD3, 0x08, 0x3E, 0x36, 0xB2, 0x03, 0x2E, 0x10, 0xD0, 0x17, 0x2E, 0x0E, 0xD0, 0x08, 0x3E, 0x36, 0xB2, 0x03, 0x2E, 0x08, 0xD0, 0x17, 0x2E, 0x06, 0xD0, 0x36, 0x1F, 0x36, 0xB2, 0x03, 0x2E, 0x14, 0xBF, 0x17, 0x2E, 0x02, 0x27, 0x02, 0xE0, 0x03, 0x27, 0x00, 0xE0, 0x01, 0x27, 0x03, 0x2E, 0x18, 0xBF, 0x17, 0x2E, 0x04, 0x9A, 0x40, 0xF0, 0xC8, 0x80, 0x0A, 0x32, 0x12, 0xF8, 0x01, 0x1B, 0x05, 0x24, 0x12, 0xF8, 0x01, 0x3B, 0x4B, 0x40, 0x64, 0x1E, 0xD9, 0xB2, 0xF9, 0xD1, 0x81, 0xEA, 0x21, 0x11, 0x03, 0x2E, 0x94, 0x4E, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x0F, 0x01, 0x48, 0x46, 0x35, 0xD0, 0x43, 0x46, 0xCA, 0x5C, 0x52, 0x1C, 0xCA, 0x54, 0x0C, 0x18, 0x33, 0xE0, 0x50, 0x57, 0x02, 0x00, 0x04, 0x74, 0x00, 0x20, 0x34, 0x12, 0x66, 0x09, 0x60, 0x57, 0x02, 0x00, 0x70, 0x57, 0x02, 0x00, 0xC8, 0x48, 0x30, 0x80, 0x4C, 0x57, 0x02, 0x00, 0x88, 0x57, 0x02, 0x00, 0x80, 0x57, 0x02, 0x00 ,
|
||||
0x18, 0x58, 0x02, 0x00, 0x20, 0x58, 0x02, 0x00, 0x28, 0x58, 0x02, 0x00, 0x30, 0x58, 0x02, 0x00, 0x38, 0x58, 0x02, 0x00, 0x40, 0x58, 0x02, 0x00, 0xE4, 0x58, 0x02, 0x00, 0xE2, 0x58, 0x02, 0x00, 0x14, 0x58, 0x02, 0x00, 0xEF, 0x58, 0x02, 0x00, 0xE0, 0x58, 0x02, 0x00, 0xEE, 0x58, 0x02, 0x00, 0x5C, 0x57, 0x02, 0x00, 0xE6, 0x58, 0x02, 0x00, 0xE8, 0x58, 0x02, 0x00, 0x0C, 0x18, 0x20, 0x78, 0x40, 0x1C, 0x20, 0x70, 0x20, 0x78, 0x43, 0x46, 0x03, 0xEB, 0x01, 0x08, 0x0A, 0x28, 0x76, 0xDB, 0x98, 0xF8, 0x00, 0x00, 0x0A, 0x28, 0x72, 0xDB, 0x94, 0x48, 0x00, 0x25, 0x01, 0x60, 0x04, 0x98, 0x00, 0xF1, 0x0A, 0x09, 0x40, 0x78, 0x41, 0x08, 0x24, 0xBF, 0x04, 0x99, 0x09, 0x1D, 0x04, 0xD2, 0x80, 0x08, 0x2E, 0xBF, 0x49, 0x46, 0x04, 0x99, 0x10, 0x31, 0x0B, 0x98, 0x06, 0x22, 0xFA, 0xF7, 0xB9, 0xFC, 0x0C, 0x98, 0x06, 0x22, 0x49, 0x46, 0xFA, 0xF7, 0xB4, 0xFC, 0x9B, 0x48, 0x9A, 0x49, 0x5C, 0x4F, 0x02, 0x00, 0xC8, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x78, 0x08, 0x22, 0x08, 0x60, 0x58, 0x46, 0x07, 0x60, 0x0D, 0x98, 0x29, 0x46, 0xFB, 0xF7, 0xAF, 0xFD, 0x08, 0x22, 0x0E, 0x98, 0x29, 0x46, 0xFB, 0xF7, 0xAA, 0xFD, 0x08, 0x22, 0x0F, 0x98, 0x29, 0x46, 0xFB, 0xF7, 0xA5, 0xFD, 0x08, 0x22, 0x10, 0x98, 0x29, 0x46, 0xFB, 0xF7, 0xA0, 0xFD, 0x08, 0x22, 0x11, 0x98, 0x29, 0x46, 0xFB, 0xF7, 0x9B, 0xFD, 0x08, 0x22, 0x12, 0x98, 0x29, 0x46, 0xFB, 0xF7, 0x96, 0xFD, 0x07, 0x99, 0x02, 0x20, 0x08, 0x60, 0x13, 0x99, 0x28, 0x46, 0x08, 0x80, 0x08, 0x99, 0x08, 0x70, 0x14, 0x99, 0x08, 0x70, 0x15, 0x99, 0x08, 0x60, 0x16, 0x99, 0x08, 0x70, 0x17, 0x99, 0x08, 0x60, 0x18, 0x99, 0x08, 0x60, 0x19, 0x99, 0x08, 0x60, 0x09, 0x99, 0x08, 0x80, 0x0A, 0x99, 0x08, 0x80, 0x1A, 0x99, 0x08, 0x80, 0x7D, 0x49, 0x0D, 0x60, 0x1B, 0x99, 0x08, 0x70, 0x1C, 0x99, 0x08, 0x70, 0x1D, 0x99, 0x08, 0x70, 0x1E, 0x99, 0x08, 0x80, 0x1F, 0x99, 0x08, 0x80, 0x51, 0x46, 0x08, 0x80 ,
|
||||
0x20, 0x78, 0x00, 0x96, 0x04, 0x22, 0x01, 0x90, 0x98, 0xF8, 0x00, 0x00, 0x41, 0xF2, 0x14, 0x13, 0x07, 0x21, 0x02, 0x90, 0x03, 0x20, 0xF3, 0xF7, 0x07, 0xFB, 0x07, 0x98, 0xA2, 0x49, 0x00, 0x68, 0x20, 0x91, 0xA2, 0x49, 0x05, 0x28, 0x21, 0x91, 0x9E, 0x49, 0x22, 0x91, 0x40, 0xF0, 0x37, 0x82, 0x04, 0x98, 0x40, 0x78, 0x24, 0x50, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x41, 0x08, 0x24, 0xBF, 0x04, 0x99, 0x09, 0x1D, 0x05, 0xD2, 0x80, 0x08, 0x27, 0xBF, 0x04, 0x99, 0x0A, 0x31, 0x04, 0x99, 0x10, 0x31, 0x0B, 0x98, 0xF8, 0xF7, 0x2D, 0xFC, 0x01, 0x28, 0x04, 0x98, 0x40, 0xF0, 0x23, 0x82, 0x40, 0x78, 0x00, 0xF0, 0x03, 0x00, 0x03, 0x28, 0x18, 0xD0, 0x02, 0x28, 0x07, 0xBF, 0x04, 0x99, 0x10, 0x31, 0x04, 0x99, 0x0A, 0x31, 0x13, 0xE0, 0x48, 0x58, 0x02, 0x00, 0x4C, 0x58, 0x02, 0x00, 0x50, 0x58, 0x02, 0x00, 0xF0, 0x58, 0x02, 0x00, 0xF2, 0x58, 0x02, 0x00, 0xF3, 0x58, 0x02, 0x00, 0xF4, 0x58, 0x02, 0x00, 0xEA, 0x58 ,
|
||||
0x02, 0x00, 0xEC, 0x58, 0x02, 0x00, 0x04, 0x99, 0x18, 0x31, 0x0C, 0x98, 0xF8, 0xF7, 0x06, 0xFC, 0x04, 0x99, 0x01, 0x28, 0x40, 0xF0, 0xFC, 0x81, 0x49, 0x78, 0x01, 0xF0, 0x03, 0x01, 0x01, 0x29, 0x40, 0xF0, 0xF6, 0x81, 0x59, 0x46, 0x09, 0x68, 0x04, 0x9A, 0x8E, 0x46, 0x51, 0x46, 0xD2, 0x8A, 0x0B, 0x88, 0x12, 0x11, 0x93, 0x42, 0x00, 0xF0, 0x37, 0x82, 0x0A, 0x80, 0x06, 0x99, 0x09, 0x88, 0x3C, 0x39, 0x0B, 0xB2, 0x71, 0x46, 0x49, 0x1E, 0x09, 0xD0, 0x49, 0x1E, 0x04, 0xD0, 0x49, 0x1E, 0x08, 0xD1, 0xA3, 0xF1, 0x10, 0x03, 0x04, 0xE0, 0xA3, 0xF1, 0x14, 0x03, 0x01, 0xE0, 0xA3, 0xF1, 0x08, 0x03, 0x1B, 0xB2, 0x05, 0x98, 0x10, 0xB1, 0xA3, 0xF1, 0x02, 0x03, 0x1B, 0xB2, 0xEC, 0x50, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0xF1, 0xCE, 0x81, 0x16, 0x98, 0x40, 0xF2, 0x77, 0x51, 0x99, 0x42, 0x0B, 0x90, 0x14, 0x98, 0x05, 0x90, 0x00, 0xF0, 0xA3, 0x81, 0x08, 0x46, 0x00, 0xF1, 0x3C, 0x00, 0x98, 0x42 ,
|
||||
0x05, 0x9A, 0x00, 0xF0, 0x9A, 0x81, 0xDF, 0xF8, 0x48, 0x82, 0x14, 0x78, 0x0B, 0x9A, 0xBB, 0x2C, 0x12, 0x78, 0x0C, 0x92, 0x63, 0xD1, 0xDD, 0xF8, 0x68, 0xC0, 0xBC, 0xF9, 0x00, 0x20, 0x91, 0x42, 0x18, 0xBF, 0x90, 0x42, 0x5B, 0xD1, 0x1C, 0x2B, 0x4F, 0xF0, 0x00, 0x00, 0xC0, 0xF2, 0x82, 0x81, 0x3D, 0x2B, 0x13, 0x9D, 0x80, 0xF2, 0x7E, 0x81, 0xA3, 0xF1, 0x1C, 0x01, 0x09, 0xB2, 0x29, 0x80, 0x1E, 0x9A, 0xDD, 0xF8, 0x30, 0x90, 0xB2, 0xF9, 0x00, 0x60, 0xB9, 0xF1, 0x01, 0x0F, 0x15, 0xD1, 0xDD, 0xF8, 0x24, 0x90, 0x03, 0x2E, 0x0D, 0xDA, 0xB9, 0xF9, 0x00, 0x70, 0xB9, 0x42, 0x07, 0xD0, 0x01, 0x26, 0x16, 0x80, 0x4A, 0x46, 0x0E, 0x46, 0x03, 0xE0, 0xC0, 0x46, 0x90, 0x57, 0x02, 0x00, 0x76, 0x1C, 0x16, 0x80, 0x1B, 0x9A, 0x16, 0x78, 0x1D, 0x9A, 0x16, 0x70, 0x0C, 0x9A, 0x1F, 0x9E, 0x02, 0x2A, 0x28, 0xD1, 0xB6, 0xF9, 0x00, 0x20, 0xBE, 0xF1, 0x00, 0x0F, 0x1A, 0xD0, 0x03, 0x2A, 0x35, 0x46, 0x0B, 0xDA, 0x0A, 0x9E ,
|
||||
0xB6, 0xF9, 0x00, 0x70, 0xB9, 0x42, 0x04, 0xD0, 0x01, 0x22, 0x2A, 0x80, 0x0A, 0x46, 0x35, 0x46, 0x00, 0xE0, 0xB4, 0x51, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x52, 0x1C, 0x2A, 0x80, 0x1C, 0x99, 0x0A, 0x78, 0x1D, 0x99, 0x0A, 0x70, 0x0F, 0xE0, 0xC0, 0x46, 0x58, 0x57, 0x02, 0x00, 0xA6, 0x64, 0x00, 0x20, 0x54, 0x57, 0x02, 0x00, 0x28, 0x80, 0x05, 0x99, 0x08, 0x70, 0x08, 0x9A, 0x11, 0x78, 0x41, 0xF0, 0x04, 0x01, 0x11, 0x70, 0x04, 0x46, 0x45, 0x46, 0xAC, 0xF8, 0x00, 0x00, 0x28, 0x70, 0xCC, 0x2C, 0x09, 0x9A, 0x40, 0xF0, 0x00, 0x81, 0xDD, 0xF8, 0x7C, 0xC0, 0x0A, 0x99, 0x1E, 0x9F, 0x45, 0x46, 0xB1, 0xF9, 0x00, 0x60, 0xB2, 0xF9, 0x00, 0x90, 0x28, 0x78, 0xCD, 0xF8, 0x50, 0xC0, 0x16, 0x91, 0x0A, 0x97, 0x13, 0x92, 0x09, 0x95, 0x0C, 0x99, 0x01, 0x29, 0x05, 0xD1, 0x05, 0x9A, 0xB0, 0xEB, 0x49, 0x0F, 0x01, 0xD1, 0x00, 0x21, 0x11, 0x70, 0x0C, 0x99, 0x02, 0x29, 0x05, 0xD1, 0x05, 0x9A, 0xB0, 0xEB, 0x46, 0x0F ,
|
||||
0x01, 0xD1, 0x00, 0x21, 0x11, 0x70, 0xB3, 0xF5, 0x14, 0x7F, 0x40, 0xF3, 0xBA, 0x80, 0x40, 0xF2, 0x51, 0x31, 0x99, 0x42, 0x08, 0x99, 0x40, 0xF3, 0xB4, 0x80, 0x09, 0x78, 0x06, 0x29, 0x00, 0xF0, 0xB0, 0x80, 0xA3, 0xF2, 0x51, 0x21, 0x0B, 0xB2, 0x4F, 0xEA, 0xE3, 0x01, 0x03, 0xEB, 0x11, 0x71, 0x4F, 0xEA, 0x21, 0x11, 0xCA, 0xB2, 0x4F, 0xEA, 0xE3, 0x01, 0x03, 0xEB, 0x11, 0x71, 0x15, 0x9D, 0x21, 0xF0, 0x0F, 0x01, 0xA3, 0xEB, 0x01, 0x03, 0x1D, 0x99, 0x2E, 0x68, 0x7C, 0x52, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x91, 0xF8, 0x00, 0xE0, 0x5F, 0xFA, 0x83, 0xF8, 0x60, 0xB1, 0x31, 0x18, 0x11, 0xF8, 0x01, 0x1C, 0x51, 0x40, 0xCB, 0xB2, 0x07, 0xE0, 0xC0, 0x46, 0x58, 0x58, 0x02, 0x00, 0x54, 0x58, 0x02, 0x00, 0xDC, 0x58, 0x02, 0x00, 0x13, 0x46, 0x19, 0x99, 0xDD, 0xF8, 0x6C, 0xA0, 0xDD, 0xF8, 0x70, 0xB0, 0xD1, 0xF8, 0x00, 0xC0, 0x00, 0xF0, 0x0F, 0x01, 0x99, 0x42, 0x22, 0xD0, 0x0A, 0x9B, 0x86, 0x45, 0x9A, 0xF8 ,
|
||||
0x00, 0x10, 0xB3, 0xF9, 0x00, 0x30, 0x9B, 0xF8, 0x00, 0x50, 0x15, 0xDD, 0x37, 0x5C, 0x44, 0x1C, 0x82, 0xEA, 0x07, 0x0C, 0x04, 0xF0, 0x0F, 0x07, 0x67, 0x45, 0x0B, 0xD0, 0xA6, 0x45, 0x06, 0x44, 0x0A, 0xDD, 0x76, 0x78, 0x72, 0x40, 0x86, 0x1C, 0x06, 0xF0, 0x0F, 0x06, 0x96, 0x42, 0x03, 0xD1, 0xC0, 0x1C, 0x4D, 0xE0, 0x80, 0x1C, 0x4B, 0xE0, 0x05, 0x9E, 0x00, 0x22, 0x32, 0x70, 0x4A, 0xE0, 0x00, 0xF0, 0x1F, 0x01, 0x01, 0x22, 0x8A, 0x40, 0x17, 0x99, 0xC4, 0x10, 0x0B, 0x68, 0x24, 0xF0, 0x03, 0x01, 0x5C, 0xF8, 0x01, 0x70, 0x3A, 0x42, 0x32, 0xD1, 0x5F, 0x58, 0x3A, 0x42, 0x06, 0x44, 0x1F, 0xD0, 0x18, 0x9B, 0x37, 0x78, 0x1B, 0x68, 0xB8, 0x45, 0x04, 0xD1, 0x58, 0x58, 0x02, 0x42, 0x19, 0xD0, 0x63, 0x46, 0x15, 0xE0, 0xA1, 0x10, 0x8C, 0x00, 0x19, 0x59, 0x91, 0x43, 0x19, 0x51, 0x00, 0x90, 0x30, 0x78, 0x01, 0x90, 0x44, 0x53, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x03, 0x20, 0x06, 0x21, 0x02, 0x46, 0x4D, 0xF6 ,
|
||||
0x80, 0x53, 0xF3, 0xF7, 0x63, 0xF9, 0x09, 0x99, 0x28, 0x68, 0x0E, 0x78, 0x36, 0x18, 0x06, 0xE0, 0xE3, 0x58, 0x02, 0x00, 0xA0, 0x10, 0x81, 0x00, 0x58, 0x58, 0x02, 0x43, 0x5A, 0x50, 0x86, 0xF8, 0x00, 0x80, 0x0B, 0x98, 0x00, 0x78, 0x0C, 0x90, 0x13, 0x98, 0xB0, 0xF9, 0x00, 0x90, 0x09, 0x98, 0x00, 0x78, 0x0A, 0x9A, 0x40, 0x1C, 0x9B, 0xF8, 0x00, 0x50, 0x9A, 0xF8, 0x00, 0x10, 0xB2, 0xF9, 0x00, 0x30, 0x09, 0x9A, 0xC0, 0xB2, 0x10, 0x70, 0x0C, 0x9A, 0x01, 0x2A, 0x03, 0xD1, 0x88, 0x42, 0xC8, 0xBF, 0x8A, 0xF8, 0x00, 0x00, 0x0C, 0x99, 0x02, 0x29, 0x07, 0xD1, 0xA8, 0x42, 0xC8, 0xBF, 0x8B, 0xF8, 0x00, 0x00, 0x02, 0xE0, 0x0A, 0x98, 0xB0, 0xF9, 0x00, 0x30, 0xB9, 0xF1, 0x00, 0x0F, 0x06, 0xDD, 0x03, 0x2B, 0x04, 0xD1, 0x11, 0x98, 0x01, 0x22, 0x49, 0x46, 0x00, 0xF0, 0x72, 0xFB, 0x16, 0x98, 0xB0, 0xF9, 0x00, 0x10, 0x14, 0x98, 0x00, 0x29, 0xB0, 0xF9, 0x00, 0x00, 0x05, 0xDD, 0x03, 0x28, 0x03, 0xD1, 0x12, 0x98 ,
|
||||
0x02, 0x22, 0x00, 0xF0, 0x64, 0xFB, 0x05, 0x98, 0x04, 0x78, 0x0B, 0x98, 0x00, 0x78, 0x0C, 0x90, 0x08, 0x98, 0xBB, 0x2C, 0x01, 0x78, 0x02, 0xD0, 0xAA, 0x2C, 0x2F, 0xD0, 0x31, 0xE0, 0x0C, 0x98, 0x01, 0x28, 0x0B, 0xD1, 0x0D, 0x98, 0x17, 0x9A, 0x10, 0x60, 0x0C, 0x54, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x0F, 0x98, 0x18, 0x9A, 0x10, 0x60, 0x19, 0x9A, 0x11, 0x98, 0x10, 0x60, 0x47, 0x4A, 0x15, 0x98, 0x02, 0x60, 0x0C, 0x98, 0x02, 0x28, 0x0B, 0xD1, 0x0E, 0x98, 0x17, 0x9A, 0x10, 0x60, 0x10, 0x98, 0x18, 0x9A, 0x10, 0x60, 0x19, 0x9A, 0x12, 0x98, 0x10, 0x60, 0x41, 0x4A, 0x15, 0x98, 0x02, 0x60, 0xCC, 0x20, 0x0F, 0xE0, 0x08, 0x99, 0x09, 0x78, 0x0C, 0xE0, 0x02, 0x20, 0x00, 0xE0, 0x01, 0x20, 0x0B, 0x99, 0x08, 0x70, 0x1A, 0x99, 0x0B, 0x80, 0x13, 0x99, 0x00, 0x20, 0x08, 0x80, 0x08, 0x98, 0x01, 0x78, 0xBB, 0x20, 0x05, 0x9A, 0x10, 0x70, 0x06, 0x29, 0x07, 0x99, 0x11, 0xD1, 0x06, 0x20, 0x08, 0x60, 0x20, 0x98 ,
|
||||
0x00, 0x25, 0x05, 0x70, 0x21, 0x98, 0x29, 0x46, 0x04, 0x22, 0xFB, 0xF7, 0x27, 0xFB, 0x01, 0x20, 0x00, 0xF0, 0x3A, 0xFA, 0x02, 0x20, 0x00, 0xF0, 0x37, 0xFA, 0x22, 0x98, 0x05, 0x60, 0x07, 0x98, 0x04, 0x99, 0x00, 0x68, 0x07, 0x28, 0x44, 0xD1, 0x09, 0x78, 0x03, 0x9C, 0x80, 0x29, 0x40, 0xD1, 0x38, 0x34, 0x21, 0x78, 0x64, 0x1C, 0x22, 0x46, 0x00, 0x29, 0x3A, 0xD1, 0x20, 0x98, 0x90, 0xF8, 0x00, 0xA0, 0x22, 0x98, 0x05, 0x90, 0xD0, 0xF8, 0x00, 0x90, 0x51, 0x46, 0x48, 0x46, 0xFD, 0xF7, 0x79, 0xF9, 0x5F, 0xFA, 0x80, 0xF8, 0x21, 0x9F, 0x15, 0x78, 0x51, 0x46, 0x48, 0x46, 0x17, 0xF8, 0x08, 0x30, 0xFD, 0xF7, 0xD4, 0x54, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x6F, 0xF9, 0x1E, 0x46, 0x1B, 0x1D, 0xC0, 0xB2, 0x38, 0x5C, 0x00, 0x1D, 0xA8, 0x42, 0x28, 0x46, 0x07, 0xDD, 0x80, 0x18, 0x82, 0x1C, 0x10, 0x78, 0x2D, 0x18, 0xAD, 0x1C, 0xAD, 0xB2, 0xAB, 0x42, 0xF7, 0xDC, 0x04, 0xF8, 0x01, 0x6B, 0x11, 0x49, 0x32, 0x46 ,
|
||||
0x20, 0x46, 0x01, 0xEB, 0x48, 0x11, 0xFA, 0xF7, 0xDC, 0xF9, 0xAD, 0x1B, 0xFF, 0x20, 0x34, 0x19, 0xAD, 0x1E, 0x04, 0xF8, 0x01, 0x0B, 0x25, 0x70, 0x05, 0x98, 0x01, 0x68, 0x49, 0x1C, 0x01, 0x60, 0x07, 0x98, 0x00, 0x68, 0x07, 0x28, 0x04, 0xD0, 0x06, 0x99, 0x08, 0x68, 0x20, 0xF4, 0x80, 0x30, 0x08, 0x60, 0x23, 0xB0, 0xBD, 0xE8, 0xF0, 0x8F, 0xC0, 0x46, 0x94, 0x57, 0x02, 0x00, 0xD4, 0x57, 0x02, 0x00, 0x5C, 0x58, 0x02, 0x00, 0x6E, 0x48, 0x2D, 0xE9, 0xF0, 0x47, 0x6E, 0x4D, 0x82, 0x89, 0x4A, 0xF6, 0x55, 0x21, 0xAD, 0xF5, 0xFE, 0x7D, 0x91, 0x42, 0x4F, 0xF0, 0x00, 0x01, 0xAD, 0xF1, 0x38, 0x0D, 0x12, 0xD1, 0x29, 0x60, 0x68, 0x4A, 0x11, 0x70, 0x41, 0xF2, 0x10, 0x41, 0x81, 0x81, 0x4F, 0xF6, 0xFF, 0x70, 0x66, 0x49, 0x08, 0x60, 0x28, 0x68, 0x00, 0x90, 0x02, 0x22, 0x05, 0x21, 0x03, 0x20, 0x41, 0xF2, 0x34, 0x23, 0xF3, 0xF7, 0x48, 0xF8, 0x29, 0x68, 0x61, 0x4C, 0x01, 0x29, 0x20, 0x68, 0x40, 0xF0, 0xAF, 0x80 ,
|
||||
0x5F, 0x4D, 0x02, 0x28, 0x29, 0x68, 0x23, 0xD1, 0x9C, 0x55, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x5E, 0x48, 0x00, 0x68, 0x5F, 0x4A, 0x12, 0x5C, 0x00, 0x92, 0x01, 0x91, 0x5E, 0x49, 0x09, 0x68, 0x02, 0x91, 0x5B, 0x49, 0x0B, 0x5C, 0x03, 0x20, 0x07, 0x21, 0x04, 0x22, 0xF3, 0xF7, 0x2E, 0xF8, 0x5B, 0x49, 0x4A, 0x79, 0x59, 0x48, 0x00, 0x92, 0x02, 0x79, 0x01, 0x92, 0x40, 0x79, 0x04, 0x22, 0x02, 0x90, 0x03, 0x20, 0x0B, 0x79, 0x07, 0x21, 0xF3, 0xF7, 0x20, 0xF8, 0x03, 0x20, 0x20, 0x60, 0xEC, 0xF7, 0x1A, 0xFF, 0x20, 0x68, 0x29, 0x68, 0x04, 0x28, 0x15, 0xD1, 0x0D, 0x20, 0x8D, 0xF8, 0x10, 0x00, 0x00, 0x25, 0x8D, 0xF8, 0x14, 0x50, 0x8D, 0xF8, 0x15, 0x10, 0x28, 0x46, 0x63, 0x21, 0x00, 0xF0, 0xAA, 0xFB, 0x63, 0x21, 0x28, 0x46, 0x00, 0xF0, 0xFA, 0xFA, 0x03, 0xA9, 0x04, 0xA8, 0xE0, 0xF7, 0xCA, 0xFC, 0x05, 0x20, 0x20, 0x60, 0x46, 0x4D, 0x05, 0x28, 0x29, 0x68, 0x01, 0xF1, 0x01, 0x01, 0x29, 0x60, 0x1D, 0xD1 ,
|
||||
0x44, 0x4A, 0x8A, 0x42, 0x1A, 0xD1, 0x43, 0x48, 0x01, 0x68, 0x00, 0x91, 0x40, 0x68, 0x01, 0x90, 0x03, 0x20, 0x02, 0x46, 0x06, 0x21, 0x41, 0x4E, 0x33, 0x46, 0x22, 0x3B, 0xF2, 0xF7, 0xEB, 0xFF, 0x3E, 0x48, 0x01, 0x68, 0x00, 0x91, 0x40, 0x68, 0x33, 0x46, 0x06, 0x21, 0x01, 0x90, 0x03, 0x20, 0x02, 0x46, 0xF2, 0xF7, 0xE0, 0xFF, 0x00, 0x20, 0x28, 0x60, 0x20, 0x68, 0x06, 0x28, 0x47, 0xD1, 0x4F, 0xF0, 0x64, 0x56, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x07, 0x0A, 0xC4, 0xF8, 0x00, 0xA0, 0x03, 0x20, 0x48, 0xF2, 0x70, 0x53, 0x01, 0x22, 0x04, 0x21, 0xF2, 0xF7, 0xD0, 0xFF, 0xDF, 0xF8, 0xCC, 0x80, 0x31, 0x4F, 0x48, 0xF2, 0x70, 0x59, 0x01, 0x25, 0x49, 0xEA, 0x05, 0x03, 0x01, 0x22, 0x04, 0x21, 0x03, 0x20, 0xF2, 0xF7, 0xC3, 0xFF, 0x00, 0x24, 0x17, 0xF8, 0x02, 0x0F, 0x20, 0xE0, 0x69, 0x01, 0x04, 0xEB, 0x08, 0x02, 0x88, 0x18, 0xC6, 0x1C, 0x43, 0x78, 0x00, 0x93, 0x80, 0x78, 0x01, 0x90, 0x30, 0x78, 0x02, 0x90 ,
|
||||
0x53, 0x5C, 0x51, 0x46, 0x04, 0x22, 0x03, 0x20, 0xF2, 0xF7, 0xAE, 0xFF, 0x38, 0x78, 0x01, 0x1B, 0xB1, 0xF1, 0xFF, 0x3F, 0x08, 0xD1, 0xF0, 0x78, 0x00, 0x90, 0xB3, 0x78, 0x03, 0x20, 0x02, 0x22, 0x05, 0x21, 0xF2, 0xF7, 0xA1, 0xFF, 0x38, 0x78, 0x24, 0x1D, 0xE4, 0xB2, 0xA0, 0x42, 0xDC, 0xDC, 0xAD, 0x1C, 0xED, 0xB2, 0x04, 0x2D, 0xCD, 0xDB, 0x63, 0x21, 0x4F, 0xF4, 0x05, 0x70, 0xF1, 0xF7, 0xA3, 0xFC, 0xE1, 0xF7, 0x85, 0xFD, 0x7F, 0xB0, 0x0E, 0xB0, 0xBD, 0xE8, 0xF0, 0x87, 0xC0, 0x46, 0x04, 0x74, 0x00, 0x20, 0x50, 0x57, 0x02, 0x00, 0x6C, 0x5D, 0x02, 0x00, 0x40, 0x00, 0x3D, 0x80, 0x4C, 0x57, 0x02, 0x00, 0x58, 0x57, 0x02, 0x00, 0x90, 0x57, 0x02, 0x00, 0x60, 0x57, 0x02, 0x00, 0x70, 0x57, 0x02, 0x00, 0x5C, 0x57, 0x02, 0x00, 0x80, 0x57, 0x02, 0x00, 0x2C, 0x57, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x88, 0x57, 0x02, 0x00, 0x54, 0x57, 0x02, 0x00, 0xFF, 0xFF, 0x03, 0x00, 0x38, 0x58, 0x02, 0x00, 0x40, 0x58 ,
|
||||
0x02, 0x00, 0x66, 0x55, 0xDD, 0xEE, 0xDB, 0x58, 0x02, 0x00, 0x5C, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x57, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0x58, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xE9, 0xFE, 0x4F, 0x4A, 0x4A, 0x49, 0x4D, 0x00, 0x90, 0xB2, 0xF9, 0x00, 0x20, 0x43, 0xA3, 0x29, 0x78, 0x01, 0x93, 0x43, 0xA3, 0x01, 0x28, 0x02, 0x93, 0x47, 0x4E, 0xDF, 0xF8, 0x1C, 0x81, 0xDF, 0xF8, 0x1C, 0x91, 0x1E, 0xD0, 0x43, 0x48, 0x04, 0x78, 0x48, 0x01, 0x87, 0x19, 0x30, 0x18, 0x01, 0x99, 0x06, 0x22, 0xF9, 0xF7, 0xC8, 0xFF, 0x40, 0x46, 0x01, 0x78, 0x00, 0x68, 0x07, 0xF1, 0x06, 0x07, 0x07, 0xF8, 0x01, 0x1B, 0x07, 0xF8, 0x01, 0x4B, 0x4F, 0xF0, 0x00, 0x01, 0x07, 0xF8, 0x01, 0x1B, 0x20, 0xB9, 0x39, 0x70, 0x28, 0x78, 0x4E, 0x46, 0x0A, 0x21, 0x58, 0xE0, 0xDF, 0xF8, 0xE4, 0xB0, 0x0F, 0xE0, 0xD4, 0xB2, 0x48, 0x01, 0x87, 0x19, 0x30, 0x18, 0x02, 0x99, 0x07, 0x22, 0xF9, 0xF7, 0xAA, 0xFF, 0xFF, 0x1D, 0x00, 0x20, 0xDF, 0xF8, 0xCC, 0xB0, 0x07, 0xF8, 0x01, 0x4B, 0x07, 0xF8, 0x01, 0x0B, 0x16, 0x2C, 0xB2, 0x46, 0xAE, 0xBF, 0x14, 0x20, 0x84, 0x59 ,
|
||||
0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x60, 0x1E, 0xC0, 0xB2, 0x38, 0x70, 0x4E, 0x46, 0x7F, 0x1C, 0x40, 0x1C, 0xC2, 0xB2, 0x28, 0x78, 0x5B, 0x46, 0x00, 0x21, 0x32, 0x54, 0x38, 0x46, 0x00, 0xF0, 0xBC, 0xF9, 0x28, 0x78, 0x16, 0x2C, 0x31, 0x5C, 0x01, 0xF1, 0x0A, 0x01, 0x31, 0x54, 0x00, 0xF1, 0x01, 0x00, 0xC0, 0xB2, 0x28, 0x70, 0x2B, 0xDB, 0x00, 0x99, 0x0A, 0xEB, 0x40, 0x10, 0x07, 0x46, 0x01, 0x29, 0xA4, 0xF1, 0x01, 0x09, 0x09, 0xD0, 0x01, 0x99, 0x06, 0x22, 0xF9, 0xF7, 0x79, 0xFF, 0x40, 0x46, 0x00, 0x78, 0xBF, 0x1D, 0x07, 0xF8, 0x01, 0x0B, 0x04, 0xE0, 0x02, 0x99, 0x07, 0x22, 0xF9, 0xF7, 0x6F, 0xFF, 0xFF, 0x1D, 0x07, 0xF8, 0x01, 0x4B, 0x15, 0x3C, 0x15, 0x21, 0x28, 0x78, 0xE2, 0xB2, 0x5B, 0x46, 0x07, 0xF8, 0x01, 0x1B, 0x32, 0x54, 0x07, 0xF8, 0x01, 0x9B, 0x38, 0x46, 0x00, 0xF0, 0x8B, 0xF9, 0x28, 0x78, 0x31, 0x5C, 0x0A, 0x31, 0x31, 0x54, 0x40, 0x1C, 0x28, 0x70, 0xBD, 0xE8, 0xFE, 0x8F, 0xC0, 0x46 ,
|
||||
0x54, 0x54, 0x54, 0x4B, 0x45, 0x59, 0x00, 0xC0, 0x54, 0x54, 0x54, 0x53, 0x53, 0x49, 0x44, 0x00, 0x54, 0x58, 0x02, 0x00, 0xE6, 0x58, 0x02, 0x00, 0xE8, 0x58, 0x02, 0x00, 0x5C, 0x58, 0x02, 0x00, 0x5C, 0x57, 0x02, 0x00, 0xDC, 0x58, 0x02, 0x00, 0xD4, 0x57, 0x02, 0x00, 0x94, 0x57, 0x02, 0x00, 0xFF, 0xB5, 0x0C, 0x46, 0x06, 0x46, 0xF7, 0xF7, 0x4C, 0x5A, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xE3, 0xFE, 0x15, 0x49, 0x15, 0x4A, 0x0D, 0x68, 0x01, 0xA9, 0x92, 0xE8, 0x8C, 0x00, 0x81, 0xE8, 0x8C, 0x00, 0xF7, 0xF7, 0xFD, 0xFE, 0x01, 0x98, 0x11, 0x49, 0x28, 0x1A, 0x03, 0x9D, 0x25, 0x60, 0x02, 0x9A, 0x80, 0x18, 0x82, 0x42, 0x30, 0x60, 0x0E, 0xD8, 0x08, 0x46, 0x00, 0x68, 0x22, 0x68, 0x82, 0x42, 0x0E, 0xD2, 0x68, 0x46, 0xE8, 0xF7, 0xB9, 0xFF, 0x9D, 0xF8, 0x00, 0x00, 0x05, 0xF1, 0x01, 0x05, 0x30, 0xB9, 0x03, 0x95, 0x03, 0xE0, 0x25, 0x68, 0x6D, 0x1C, 0x25, 0x60, 0x0C, 0x46, 0x25, 0x60, 0x00, 0x20, 0x00, 0x90 ,
|
||||
0xFF, 0xBD, 0x60, 0x55, 0x30, 0x80, 0x24, 0x5D, 0x00, 0x20, 0x6C, 0x5D, 0x02, 0x00, 0x70, 0xB5, 0x4D, 0x00, 0x20, 0x2D, 0x4F, 0xF0, 0x00, 0x01, 0x0C, 0x46, 0x4F, 0xEA, 0x55, 0x13, 0x09, 0xD3, 0x50, 0xF8, 0x21, 0x60, 0xB6, 0xF1, 0xFF, 0x3F, 0x04, 0xD1, 0x49, 0x1C, 0xC9, 0xB2, 0x20, 0x3D, 0x5B, 0x1E, 0xF5, 0xD1, 0x4D, 0xB1, 0x20, 0x2D, 0x09, 0xD2, 0x01, 0x23, 0xAB, 0x40, 0x5B, 0x1E, 0x50, 0xF8, 0x21, 0x00, 0x18, 0x40, 0x83, 0x42, 0x01, 0xD1, 0x4F, 0xF0, 0x01, 0x04, 0x07, 0x48, 0x03, 0x78, 0x2C, 0xB9, 0x01, 0x21, 0x91, 0x40, 0xC9, 0x43, 0xC9, 0xB2, 0x0B, 0x40, 0x03, 0xE0, 0x01, 0x21, 0x91, 0x40, 0xC9, 0xB2, 0x0B, 0x43, 0x03, 0x70, 0x70, 0xBD, 0xC0, 0x46, 0xEE, 0x58, 0x02, 0x00, 0x14, 0x5B, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x7E, 0xB5, 0x05, 0x46, 0x95, 0xF8, 0x36, 0x20, 0x0E, 0x46, 0x0F, 0x49, 0x07, 0x2A, 0x12, 0xBF, 0x08, 0x68, 0x01, 0x20, 0x08, 0x60, 0x0D, 0x4C, 0x00, 0x92, 0x21, 0x68 ,
|
||||
0x41, 0xF2, 0x12, 0x13, 0x04, 0x22, 0x01, 0x91, 0x07, 0x21, 0x02, 0x90, 0x03, 0x20, 0xF2, 0xF7, 0x6B, 0xFD, 0x31, 0x46, 0x28, 0x46, 0xE7, 0xF7, 0x21, 0xFC, 0x21, 0x68, 0x00, 0x22, 0x05, 0x29, 0x02, 0xD1, 0x04, 0x49, 0x08, 0x31, 0x0A, 0x60, 0x7E, 0xBD, 0xC0, 0x46, 0x50, 0x57, 0x02, 0x00, 0x4C, 0x57, 0x02, 0x00, 0x00, 0x7C, 0x00, 0x20, 0x0E, 0x49, 0x09, 0x68, 0x49, 0x08, 0x15, 0xD2, 0x0D, 0x49, 0x09, 0x78, 0x91, 0xB1, 0x44, 0xF2, 0xE9, 0x21, 0x68, 0xB9, 0x0B, 0x48, 0x01, 0x78, 0x07, 0x48, 0x01, 0x29, 0x03, 0xD1, 0x0A, 0x49, 0x09, 0x78, 0x0E, 0x29, 0x02, 0xD0, 0x44, 0xF2, 0xDE, 0x21, 0x41, 0x60, 0x01, 0x21, 0x00, 0xE0, 0x06, 0x48, 0x01, 0x60, 0x70, 0x47, 0xC0, 0x46, 0x00, 0x97, 0x3C, 0x80, 0x10, 0x0C, 0x30, 0x80, 0xDD, 0x6A, 0x00, 0x20, 0xE0, 0x7C, 0x00, 0x20, 0xA6, 0x64, 0x00, 0x20, 0x04, 0x97, 0x3C, 0x80, 0x00, 0xB5, 0xAD, 0xF1, 0x18, 0x0D, 0x4F, 0xF0, 0x09, 0x00, 0x00, 0x90, 0x4F, 0xF4 ,
|
||||
0x0C, 0x60, 0x03, 0x90, 0x4F, 0xF0, 0x00, 0x00, 0x01, 0x90, 0x02, 0x90, 0x08, 0x48, 0x08, 0x49, 0x05, 0x90, 0x08, 0x68, 0x20, 0xB9, 0xDC, 0x5B, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0x68, 0x46, 0x03, 0x22, 0xED, 0xF7, 0x3A, 0xFA, 0x03, 0xE0, 0x68, 0x46, 0x03, 0x22, 0xED, 0xF7, 0xC1, 0xFC, 0x06, 0xB0, 0x00, 0xBD, 0xC0, 0x46, 0x81, 0x5C, 0x02, 0x00, 0xDC, 0x7C, 0x00, 0x20, 0x1C, 0xB5, 0x0F, 0x4C, 0x22, 0x68, 0x01, 0x2A, 0x15, 0xD1, 0x0C, 0x48, 0x00, 0x68, 0x07, 0x28, 0x14, 0xBF, 0x40, 0x20, 0x4F, 0xF4, 0x05, 0x70, 0x63, 0x21, 0xF1, 0xF7, 0x0F, 0xFA, 0x20, 0x68, 0x00, 0x90, 0x43, 0xF2, 0x33, 0x33, 0x06, 0x21, 0x40, 0x20, 0x01, 0x90, 0x03, 0x20, 0x02, 0x46, 0xF2, 0xF7, 0xF4, 0xFC, 0x1C, 0xBD, 0xF1, 0xF7, 0x01, 0xFA, 0x1C, 0xBD, 0x4C, 0x57, 0x02, 0x00, 0x50, 0x57, 0x02, 0x00, 0x1E, 0xB5, 0x04, 0x46, 0x0A, 0x49, 0x00, 0x20, 0x0A, 0x4A, 0x08, 0x60, 0x0A, 0x49, 0x00, 0x90, 0x01, 0x90, 0x11, 0x60 ,
|
||||
0x09, 0x4A, 0x45, 0xF2, 0x55, 0x53, 0x02, 0x91, 0x10, 0x60, 0x07, 0x21, 0x04, 0x22, 0x03, 0x20, 0xF2, 0xF7, 0xD8, 0xFC, 0x20, 0x46, 0xE7, 0xF7, 0x59, 0xFD, 0x1E, 0xBD, 0x50, 0x57, 0x02, 0x00, 0x04, 0x74, 0x00, 0x20, 0x34, 0x12, 0x66, 0x09, 0x4C, 0x57, 0x02, 0x00, 0x00, 0xB5, 0x0B, 0x49, 0x00, 0x20, 0x08, 0x60, 0xE0, 0x20, 0xF7, 0xF7, 0xAA, 0xFD, 0x09, 0x49, 0x09, 0x78, 0x49, 0xB1, 0x08, 0x49, 0x0A, 0x78, 0x08, 0x49, 0x00, 0x2A, 0x06, 0xBF, 0x01, 0x22, 0x09, 0x1F, 0x44, 0xF2, 0xA4, 0x5C, 0x02, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xE9, 0x22, 0x0A, 0x60, 0xF7, 0xF7, 0xA1, 0xFD, 0x00, 0xBD, 0xC0, 0x46, 0xDC, 0x7C, 0x00, 0x20, 0xDD, 0x6A, 0x00, 0x20, 0xA7, 0x64, 0x00, 0x20, 0x04, 0x97, 0x3C, 0x80, 0x50, 0xB9, 0x09, 0x48, 0x00, 0x78, 0x01, 0x28, 0x06, 0xD1, 0x08, 0x48, 0x00, 0x78, 0x0E, 0x28, 0x08, 0xBF, 0x44, 0xF2, 0xCB, 0x20, 0x01, 0xD0, 0x44, 0xF2, 0xDE, 0x20, 0x04, 0x49, 0x08, 0x60, 0x01, 0x20 ,
|
||||
0x41, 0xF8, 0x04, 0x0C, 0x70, 0x47, 0xE0, 0x7C, 0x00, 0x20, 0xA6, 0x64, 0x00, 0x20, 0x04, 0x97, 0x3C, 0x80, 0x30, 0xB5, 0x0D, 0x46, 0x84, 0x69, 0xDC, 0xF7, 0x97, 0xFB, 0x24, 0x1D, 0x01, 0x28, 0x04, 0xEB, 0x45, 0x01, 0x06, 0xD1, 0x89, 0x8E, 0x04, 0xEB, 0x85, 0x04, 0x11, 0xB9, 0x21, 0x69, 0x01, 0xB9, 0x00, 0x20, 0x30, 0xBD, 0x30, 0xB5, 0x05, 0x46, 0x5A, 0xB1, 0x03, 0xEB, 0x41, 0x03, 0x1C, 0x78, 0x59, 0x78, 0x41, 0xEA, 0x04, 0x11, 0x52, 0x1E, 0x03, 0xF1, 0x02, 0x03, 0x05, 0xF8, 0x01, 0x1B, 0xF5, 0xD1, 0x30, 0xBD, 0x00, 0xB5, 0x00, 0x20, 0xE7, 0xF7, 0xD6, 0xFE, 0x03, 0x48, 0x01, 0x68, 0x03, 0x29, 0x04, 0xBF, 0x04, 0x21, 0x01, 0x60, 0x00, 0xBD, 0xC0, 0x46, 0x4C, 0x57, 0x02, 0x00, 0x03, 0x4A, 0x12, 0x68, 0x01, 0x2A, 0x04, 0xBF, 0x02, 0x48, 0x63, 0x21, 0xF1, 0xF7, 0x76, 0xB9, 0x50, 0x57, 0x02, 0x00, 0x02, 0x20, 0x01, 0x00, 0x6C, 0x5D, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
|
||||
uint16_t fw_length = 5700;
|
||||
@@ -1,217 +0,0 @@
|
||||
/***************************************************
|
||||
This is an example for the Adafruit CC3000 Wifi Breakout & Shield
|
||||
|
||||
Designed specifically to work with the Adafruit WiFi products:
|
||||
----> https://www.adafruit.com/products/1469
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Kevin Townsend & Limor Fried & Rick Lesniak for Adafruit Industries.
|
||||
BSD license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
|
||||
/*
|
||||
|
||||
This example does a test of the SNTP (Simple Network Time Protocol) client:
|
||||
* Initialization
|
||||
* SSID Scan
|
||||
* AP connection
|
||||
* DHCP printout
|
||||
* SNTP time synchronization
|
||||
* Extract and print current time and date information
|
||||
|
||||
*/
|
||||
|
||||
#include <Adafruit_CC3000.h>
|
||||
#include <ccspi.h>
|
||||
#include <SPI.h>
|
||||
//#include "utility/NetTime.h"
|
||||
#include <string.h>
|
||||
#include "utility/debug.h"
|
||||
#include "utility/sntp.h"
|
||||
|
||||
// These are the interrupt and control pins
|
||||
#define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin!
|
||||
// These can be any two pins
|
||||
#define ADAFRUIT_CC3000_VBAT 5
|
||||
#define ADAFRUIT_CC3000_CS 10
|
||||
// Use hardware SPI for the remaining pins
|
||||
// On an UNO, SCK = 13, MISO = 12, and MOSI = 11
|
||||
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,
|
||||
SPI_CLOCK_DIVIDER); // you can change this clock speed but DI
|
||||
|
||||
#define WLAN_SSID "myNetwork" // cannot be longer than 32 characters!
|
||||
#define WLAN_PASS "myPassword"
|
||||
// Security can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2
|
||||
#define WLAN_SECURITY WLAN_SEC_WPA2
|
||||
|
||||
//Arguments to SNTP client constructor:
|
||||
// 1 - Primary Network Time Server URL (can be NULL)
|
||||
// 2 - Secondary Network Time Server URL (also can be NULL)
|
||||
// 3 - Local UTC offset in minutes (US Eastern Time is UTC - 5:00
|
||||
// 4 - Local UTC offset in minutes for Daylight Savings Time (US Eastern DST is UTC - 4:00
|
||||
// 5 - Enable Daylight Savings Time adjustment (not implemented yet)
|
||||
//
|
||||
sntp mysntp = sntp(NULL, "time.nist.gov", (short)(-5 * 60), (short)(-4 * 60), true);
|
||||
|
||||
// Type SNTP_Timestamp is 64-bit NTP time. High-order 32-bits is seconds since 1/1/1900
|
||||
// Low order 32-bits is fractional seconds
|
||||
SNTP_Timestamp_t now;
|
||||
|
||||
// Type NetTime_t contains NTP time broken out to human-oriented values:
|
||||
// uint16_t millis; ///< Milliseconds after the second (0..999)
|
||||
// uint8_t sec; ///< Seconds after the minute (0..59)
|
||||
// uint8_t min; ///< Minutes after the hour (0..59)
|
||||
// uint8_t hour; ///< Hours since midnight (0..23)
|
||||
// uint8_t mday; ///< Day of the month (1..31)
|
||||
// uint8_t mon; ///< Months since January (0..11)
|
||||
// uint16_t year; ///< Year.
|
||||
// uint8_t wday; ///< Days since Sunday (0..6)
|
||||
// uint8_t yday; ///< Days since January 1 (0..365)
|
||||
// bool isdst; ///< Daylight savings time flag, currently not supported
|
||||
NetTime_t timeExtract;
|
||||
|
||||
#define pF(string_pointer) (reinterpret_cast<const __FlashStringHelper *>(pgm_read_word(string_pointer)))
|
||||
|
||||
const prog_char janStr[] PROGMEM = "January";
|
||||
const prog_char febStr[] PROGMEM = "February";
|
||||
const prog_char marStr[] PROGMEM = "March";
|
||||
const prog_char aprStr[] PROGMEM = "April";
|
||||
const prog_char mayStr[] PROGMEM = "May";
|
||||
const prog_char junStr[] PROGMEM = "June";
|
||||
const prog_char julStr[] PROGMEM = "July";
|
||||
const prog_char augStr[] PROGMEM = "August";
|
||||
const prog_char sepStr[] PROGMEM = "September";
|
||||
const prog_char octStr[] PROGMEM = "October";
|
||||
const prog_char novStr[] PROGMEM = "November";
|
||||
const prog_char decStr[] PROGMEM = "December";
|
||||
|
||||
PROGMEM const char* const monthStrs[] = { janStr, febStr, marStr, aprStr, mayStr, junStr,
|
||||
julStr, augStr, sepStr, octStr, novStr, decStr};
|
||||
|
||||
const prog_char sunStr[] PROGMEM = "Sunday";
|
||||
const prog_char monStr[] PROGMEM = "Monday";
|
||||
const prog_char tueStr[] PROGMEM = "Tuesday";
|
||||
const prog_char wedStr[] PROGMEM = "Wednesday";
|
||||
const prog_char thuStr[] PROGMEM = "Thursday";
|
||||
const prog_char friStr[] PROGMEM = "Friday";
|
||||
const prog_char satStr[] PROGMEM = "Saturday";
|
||||
|
||||
PROGMEM const char* const dayStrs[] = { sunStr, monStr, tueStr, wedStr,
|
||||
thuStr, friStr, satStr};
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Sets up the HW and the CC3000 module (called automatically
|
||||
on startup)
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("Hello, CC3000!\n"));
|
||||
|
||||
Serial.print("Free RAM: "); Serial.println(getFreeRam(), DEC);
|
||||
|
||||
|
||||
/* Initialise the module */
|
||||
Serial.println(F("\nInitialising the CC3000 ..."));
|
||||
if (!cc3000.begin())
|
||||
{
|
||||
Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
/* Optional: Update the Mac Address to a known value */
|
||||
/*
|
||||
uint8_t macAddress[6] = { 0x08, 0x00, 0x28, 0x01, 0x79, 0xB7 };
|
||||
if (!cc3000.setMacAddress(macAddress))
|
||||
{
|
||||
Serial.println(F("Failed trying to update the MAC address"));
|
||||
while(1);
|
||||
}
|
||||
*/
|
||||
|
||||
uint16_t firmware = checkFirmwareVersion();
|
||||
if (firmware < 0x113) {
|
||||
Serial.println(F("Wrong firmware version!"));
|
||||
for(;;);
|
||||
}
|
||||
|
||||
/* Delete any old connection data on the module */
|
||||
Serial.println(F("\nDeleting old connection profiles"));
|
||||
if (!cc3000.deleteProfiles()) {
|
||||
Serial.println(F("Failed!"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
/* Attempt to connect to an access point */
|
||||
char *ssid = WLAN_SSID; /* Max 32 chars */
|
||||
Serial.print(F("\nAttempting to connect to ")); Serial.println(ssid);
|
||||
|
||||
/* NOTE: Secure connections are not available in 'Tiny' mode! */
|
||||
if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
|
||||
Serial.println(F("Failed!"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
Serial.println(F("Connected!"));
|
||||
|
||||
/* Wait for DHCP to complete */
|
||||
Serial.println(F("Request DHCP"));
|
||||
while (!cc3000.checkDHCP())
|
||||
{
|
||||
delay(100); // ToDo: Insert a DHCP timeout!
|
||||
}
|
||||
|
||||
Serial.println(F("UpdateNTPTime"));
|
||||
mysntp.UpdateNTPTime();
|
||||
|
||||
Serial.println(F("Current local time is:"));
|
||||
mysntp.ExtractNTPTime(mysntp.NTPGetTime(&now, true), &timeExtract);
|
||||
|
||||
Serial.print(timeExtract.hour); Serial.print(F(":")); Serial.print(timeExtract.min); Serial.print(F(":"));Serial.print(timeExtract.sec); Serial.print(F("."));Serial.println(timeExtract.millis);
|
||||
Serial.print(pF(&dayStrs[timeExtract.wday])); Serial.print(F(", ")); Serial.print(pF(&monthStrs[timeExtract.mon])); Serial.print(F(" ")); Serial.print(timeExtract.mday); Serial.print(F(", "));Serial.println(timeExtract.year);
|
||||
Serial.print(F("Day of year: ")); Serial.println(timeExtract.yday + 1);
|
||||
|
||||
/* You need to make sure to clean up after yourself or the CC3000 can freak out */
|
||||
/* the next time you try to connect ... */
|
||||
Serial.println(F("\n\nClosing the connection"));
|
||||
cc3000.disconnect();
|
||||
}
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the CC3000's internal firmware patch ID
|
||||
*/
|
||||
/**************************************************************************/
|
||||
uint16_t checkFirmwareVersion(void)
|
||||
{
|
||||
uint8_t major, minor;
|
||||
uint16_t version;
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
if(!cc3000.getFirmwareVersion(&major, &minor))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve the firmware version!\r\n"));
|
||||
version = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("Firmware V. : "));
|
||||
Serial.print(major); Serial.print(F(".")); Serial.println(minor);
|
||||
version = major; version <<= 8; version |= minor;
|
||||
}
|
||||
#endif
|
||||
return version;
|
||||
}
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
=====
|
||||
|
||||
Copyright (c) 2013-2014
|
||||
Limor Fried, Kevin Townsend for Adafruit Industries & Tony DiCola (tony@tonydicola.com)
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
All rights reserved.
|
||||
|
||||
=====
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
@@ -1,199 +0,0 @@
|
||||
/***************************************************
|
||||
Client_fastrprint test
|
||||
|
||||
Designed specifically to work with the Adafruit WiFi products:
|
||||
----> https://www.adafruit.com/products/1469
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Tony DiCola, based on code example code written by
|
||||
Limor Fried & Kevin Townsend for Adafruit Industries.
|
||||
BSD license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
|
||||
#include <Adafruit_CC3000.h>
|
||||
#include <ccspi.h>
|
||||
#include <SPI.h>
|
||||
#include <string.h>
|
||||
#include "utility/debug.h"
|
||||
|
||||
// These are the interrupt and control pins
|
||||
#define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin!
|
||||
// These can be any two pins
|
||||
#define ADAFRUIT_CC3000_VBAT 5
|
||||
#define ADAFRUIT_CC3000_CS 10
|
||||
// Use hardware SPI for the remaining pins
|
||||
// On an UNO, SCK = 13, MISO = 12, and MOSI = 11
|
||||
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,
|
||||
SPI_CLOCK_DIV2); // you can change this clock speed
|
||||
|
||||
#define WLAN_SSID "myNetwork" // cannot be longer than 32 characters!
|
||||
#define WLAN_PASS "myPassword"
|
||||
|
||||
// Security can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2
|
||||
#define WLAN_SECURITY WLAN_SEC_WPA2
|
||||
|
||||
// Test server configuration
|
||||
const uint8_t SERVER_IP[4] = { 192, 168, 1, 101 };
|
||||
const uint16_t SERVER_PORT = 9000;
|
||||
|
||||
#define ASSERT_EQ(expected, actual) { \
|
||||
if (actual != expected) { \
|
||||
Serial.print("FAILURE: Expected "); \
|
||||
Serial.print(actual); \
|
||||
Serial.print(" to equal "); \
|
||||
Serial.println(expected); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define TEST_FASTRPRINT(message, client) { \
|
||||
Serial.print("Testing fastrprint with char* input: "); \
|
||||
Serial.println(message); \
|
||||
unsigned long n = client.fastrprint(message); \
|
||||
ASSERT_EQ(sizeof(message)-1, n); \
|
||||
}
|
||||
|
||||
#define TEST_FASTRPRINTLN(message, client) { \
|
||||
Serial.print("Testing fastrprintln with char* input: "); \
|
||||
Serial.println(message); \
|
||||
unsigned long n = client.fastrprintln(message); \
|
||||
ASSERT_EQ(sizeof(message)+1, n); \
|
||||
}
|
||||
|
||||
#define TEST_FASTRPRINT_F(message, client) { \
|
||||
Serial.print("Testing fastrprint with flash string input: "); \
|
||||
Serial.println(F(message)); \
|
||||
unsigned long n = client.fastrprint(F(message)); \
|
||||
ASSERT_EQ(sizeof(message)-1, n); \
|
||||
}
|
||||
|
||||
#define TEST_FASTRPRINTLN_F(message, client) { \
|
||||
Serial.print("Testing fastrprintln with flash string input: "); \
|
||||
Serial.println(F(message)); \
|
||||
unsigned long n = client.fastrprintln(F(message)); \
|
||||
ASSERT_EQ(sizeof(message)+1, n); \
|
||||
}
|
||||
|
||||
// Run the test
|
||||
void runTest(void) {
|
||||
// Make two connections to the server running listener.py
|
||||
Serial.println(F("Connecting to server..."));
|
||||
Adafruit_CC3000_Client client1 = cc3000.connectTCP(cc3000.IP2U32(SERVER_IP[0], SERVER_IP[1], SERVER_IP[2], SERVER_IP[3]),
|
||||
SERVER_PORT);
|
||||
if (!client1.connected()) {
|
||||
Serial.println(F("Couldn't connect to server! Make sure listener.py is running on the server."));
|
||||
while(1);
|
||||
}
|
||||
Adafruit_CC3000_Client client2 = cc3000.connectTCP(cc3000.IP2U32(SERVER_IP[0], SERVER_IP[1], SERVER_IP[2], SERVER_IP[3]),
|
||||
SERVER_PORT);
|
||||
if (!client2.connected()) {
|
||||
Serial.println(F("Couldn't connect to server! Make sure listener.py is running on the server."));
|
||||
while(1);
|
||||
}
|
||||
Serial.println(F("Connected!"));
|
||||
|
||||
// Start the test
|
||||
Serial.print(F("Free RAM: ")); Serial.println(getFreeRam(), DEC);
|
||||
Serial.println(F("Starting tests..."));
|
||||
unsigned long start = millis();
|
||||
|
||||
// Test character strings
|
||||
TEST_FASTRPRINT("Fastrprint string.", client1);
|
||||
TEST_FASTRPRINT("Fastrprint with a large (>32 character) character string!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", client1);
|
||||
TEST_FASTRPRINTLN("Fastrprintln string.", client1);
|
||||
TEST_FASTRPRINTLN("Fastrprintln with a large (>32 character) character string!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", client1);
|
||||
|
||||
// Test flash strings
|
||||
TEST_FASTRPRINT_F("Fastrprint flash.", client1);
|
||||
TEST_FASTRPRINT_F("Fastrprint with a large (>32 character) flash string!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", client1);
|
||||
TEST_FASTRPRINTLN_F("Fastrprintln flash.", client1);
|
||||
TEST_FASTRPRINTLN_F("Fastrprintln with a large (>32 character) flash string!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", client1);
|
||||
|
||||
// Test empty strings
|
||||
TEST_FASTRPRINT("", client1);
|
||||
TEST_FASTRPRINTLN("", client1);
|
||||
TEST_FASTRPRINT_F("", client1);
|
||||
TEST_FASTRPRINTLN_F("", client1);
|
||||
|
||||
// Test printing to multiple clients
|
||||
TEST_FASTRPRINT("This is a message for client 1.", client1);
|
||||
TEST_FASTRPRINT("This is a message for client 2.", client2);
|
||||
TEST_FASTRPRINT_F("This is a flash message for client 1.", client1);
|
||||
TEST_FASTRPRINT_F("This is a flash message for client 2.", client2);
|
||||
TEST_FASTRPRINT_F("This is a large (>32 character) flash message for client 1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", client1);
|
||||
TEST_FASTRPRINT_F("This is a large (>32 character) flash message for client 2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", client2);
|
||||
|
||||
unsigned long finish = millis();
|
||||
Serial.println(F("Tests finished!"));
|
||||
Serial.print(F("Free RAM: ")); Serial.println(getFreeRam(), DEC);
|
||||
Serial.print(F("Time taken to run test (MS): ")); Serial.println(finish - start, DEC);
|
||||
|
||||
client1.close();
|
||||
client2.close();
|
||||
cc3000.disconnect();
|
||||
}
|
||||
|
||||
// Set up the HW and the CC3000 module (called automatically on startup)
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("Hello, CC3000!\n"));
|
||||
|
||||
/* Initialise the module */
|
||||
Serial.println(F("\nInitializing..."));
|
||||
if (!cc3000.begin())
|
||||
{
|
||||
Serial.println(F("Couldn't begin()! Check your wiring?"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
|
||||
Serial.println(F("Failed!"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
Serial.println(F("Connected!"));
|
||||
|
||||
/* Wait for DHCP to complete */
|
||||
Serial.println(F("Request DHCP"));
|
||||
while (!cc3000.checkDHCP())
|
||||
{
|
||||
delay(100); // ToDo: Insert a DHCP timeout!
|
||||
}
|
||||
|
||||
/* Display the IP address DNS, Gateway, etc. */
|
||||
while (! displayConnectionDetails()) {
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
runTest();
|
||||
}
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
// Tries to read the IP address and other connection details
|
||||
bool displayConnectionDetails(void)
|
||||
{
|
||||
uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;
|
||||
|
||||
if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve the IP Address!\r\n"));
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
|
||||
Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask);
|
||||
Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway);
|
||||
Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
|
||||
Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
|
||||
Serial.println();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
Adafruit CC3000 Library Tests
|
||||
=============================
|
||||
|
||||
This folder is meant to contain tests that are written to verify the CC3000 library. Consumers
|
||||
of the library probably want to ignore the contents of this folder.
|
||||
|
||||
Files:
|
||||
------
|
||||
|
||||
- listener.py
|
||||
|
||||
Python script to run a TCP socket server which listens by default on port 9000 (but can be
|
||||
changed by specifying a different port in the first command line parameter), accepts any
|
||||
connections and echos all received data to standard output. This is required for running some
|
||||
of the tests. In general you'll want to run listener.py with stdout directed to a file and then
|
||||
run the test sketch on the CC3000 to capture what is output. Compare the output of test runs
|
||||
before and after making a change/bugfix to the library and diff the results to ensure no
|
||||
unexpected changes in functionality.
|
||||
|
||||
Tests:
|
||||
------
|
||||
|
||||
- Client\_fastrprint
|
||||
|
||||
Manual test to verify the fastrprint and fastrprintln functions of the client library. Must
|
||||
update the sketch to connect to your wireless network and set the SERVER_IP value to the IP
|
||||
of a server running listener.py.
|
||||
@@ -1,45 +0,0 @@
|
||||
# Adafruit CC3000 Library Test Listener
|
||||
# Created by Tony DiCola (tony@tonydicola.com)
|
||||
# Released with the same license as the Adafruit CC3000 library (BSD)
|
||||
|
||||
# Create a simple server to listen by default on port 9000 (or on the port specified in
|
||||
# the first command line parameter), accept any connections and print all data received
|
||||
# to standard output. Must be terminated by hitting ctrl-c to kill the process!
|
||||
|
||||
from socket import *
|
||||
import sys
|
||||
import threading
|
||||
|
||||
SERVER_PORT = 9000
|
||||
if len(sys.argv) > 1:
|
||||
SERVER_PORT = sys.argv[1]
|
||||
|
||||
# Create listening socket
|
||||
server = socket(AF_INET, SOCK_STREAM)
|
||||
|
||||
# Ignore waiting for the socket to close if it's already open. See the python socket
|
||||
# doc for more info (very bottom of http://docs.python.org/2/library/socket.html).
|
||||
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
|
||||
|
||||
# Listen on any network interface for the specified port
|
||||
server.bind(('', SERVER_PORT))
|
||||
server.listen(5)
|
||||
|
||||
# Worker process to print all data received to standard output.
|
||||
def process_connection(client):
|
||||
while True:
|
||||
data = client.recv(1024)
|
||||
sys.stdout.write(data) # Don't use print because it appends spaces and newlines
|
||||
sys.stdout.flush()
|
||||
if not data:
|
||||
break
|
||||
client.close()
|
||||
|
||||
try:
|
||||
# Wait for connections and spawn worker threads to process them.
|
||||
while True:
|
||||
client, address = server.accept()
|
||||
thread = threading.Thread(target=process_connection, args=(client,))
|
||||
thread.start()
|
||||
except:
|
||||
server.close()
|
||||
@@ -1,195 +0,0 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* cc3000_common.c.c - CC3000 Host Driver Implementation.
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* Adapted for use with the Arduino/AVR by KTOWN (Kevin Townsend)
|
||||
* & Limor Fried for Adafruit Industries
|
||||
* This library works with the Adafruit CC3000 breakout
|
||||
* ----> https://www.adafruit.com/products/1469
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! \addtogroup common_api
|
||||
//! @{
|
||||
//
|
||||
//*****************************************************************************
|
||||
/******************************************************************************
|
||||
*
|
||||
* Include files
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include "cc3000_common.h"
|
||||
#include "socket.h"
|
||||
#include "wlan.h"
|
||||
#include "evnt_handler.h"
|
||||
#include "debug.h"
|
||||
#include <Arduino.h>
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! __error__
|
||||
//!
|
||||
//! @param pcFilename - file name, where error occurred
|
||||
//! @param ulLine - line number, where error occurred
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief stub function for ASSERT macro
|
||||
//
|
||||
//*****************************************************************************
|
||||
void
|
||||
__error__(char *pcFilename, unsigned long ulLine)
|
||||
{
|
||||
//TODO full up function
|
||||
}
|
||||
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! UINT32_TO_STREAM_f
|
||||
//!
|
||||
//! @param p pointer to the new stream
|
||||
//! @param u32 pointer to the 32 bit
|
||||
//!
|
||||
//! @return pointer to the new stream
|
||||
//!
|
||||
//! @brief This function is used for copying 32 bit to stream
|
||||
//! while converting to little endian format.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
uint8_t* UINT32_TO_STREAM_f (uint8_t *p, uint32_t u32)
|
||||
{
|
||||
*(p)++ = (uint8_t)(u32);
|
||||
*(p)++ = (uint8_t)((u32) >> 8);
|
||||
*(p)++ = (uint8_t)((u32) >> 16);
|
||||
*(p)++ = (uint8_t)((u32) >> 24);
|
||||
return p;
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! UINT16_TO_STREAM_f
|
||||
//!
|
||||
//! @param p pointer to the new stream
|
||||
//! @param u32 pointer to the 16 bit
|
||||
//!
|
||||
//! @return pointer to the new stream
|
||||
//!
|
||||
//! @brief This function is used for copying 16 bit to stream
|
||||
//! while converting to little endian format.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
uint8_t* UINT16_TO_STREAM_f (uint8_t *p, uint16_t u16)
|
||||
{
|
||||
*(p)++ = (uint8_t)(u16);
|
||||
*(p)++ = (uint8_t)((u16) >> 8);
|
||||
return p;
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! STREAM_TO_UINT16_f
|
||||
//!
|
||||
//! @param p pointer to the stream
|
||||
//! @param offset offset in the stream
|
||||
//!
|
||||
//! @return pointer to the new 16 bit
|
||||
//!
|
||||
//! @brief This function is used for copying received stream to
|
||||
//! 16 bit in little endian format.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
uint16_t STREAM_TO_UINT16_f(char* cp, uint16_t offset)
|
||||
{
|
||||
uint8_t *p = (uint8_t *)cp;
|
||||
/*
|
||||
DEBUGPRINT_F("Stream2u16: ");
|
||||
DEBUGPRINT_HEX(cp[offset+1]);
|
||||
DEBUGPRINT_F(" + ");
|
||||
DEBUGPRINT_HEX(cp[offset]);
|
||||
DEBUGPRINT_F("\n\r");
|
||||
*/
|
||||
|
||||
return (uint16_t)((uint16_t)
|
||||
((uint16_t)(*(p + offset + 1)) << 8) +
|
||||
(uint16_t)(*(p + offset)));
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! STREAM_TO_UINT32_f
|
||||
//!
|
||||
//! @param p pointer to the stream
|
||||
//! @param offset offset in the stream
|
||||
//!
|
||||
//! @return pointer to the new 32 bit
|
||||
//!
|
||||
//! @brief This function is used for copying received stream to
|
||||
//! 32 bit in little endian format.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
uint32_t STREAM_TO_UINT32_f(char * cp, uint16_t offset)
|
||||
{
|
||||
uint8_t *p = (uint8_t *)cp;
|
||||
|
||||
/*
|
||||
DEBUGPRINT_F("\tStream2u32: ");
|
||||
DEBUGPRINT_HEX(cp[offset+3]); DEBUGPRINT_F(" + ");
|
||||
DEBUGPRINT_HEX(cp[offset+2]); DEBUGPRINT_F(" + ");
|
||||
DEBUGPRINT_HEX(cp[offset+1]); DEBUGPRINT_F(" + ");
|
||||
DEBUGPRINT_HEX(cp[offset]);
|
||||
DEBUGPRINT_F("\n\r");
|
||||
*/
|
||||
|
||||
return (uint32_t)((uint32_t)((uint32_t)
|
||||
(*(p + offset + 3)) << 24) + (uint32_t)((uint32_t)
|
||||
(*(p + offset + 2)) << 16) + (uint32_t)((uint32_t)
|
||||
(*(p + offset + 1)) << 8) + (uint32_t)(*(p + offset)));
|
||||
}
|
||||
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Close the Doxygen group.
|
||||
//! @}
|
||||
//
|
||||
//*****************************************************************************
|
||||
@@ -1,385 +0,0 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* cc3000_common.h - CC3000 Host Driver Implementation.
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* Adapted for use with the Arduino/AVR by KTOWN (Kevin Townsend)
|
||||
* & Limor Fried for Adafruit Industries
|
||||
* This library works with the Adafruit CC3000 breakout
|
||||
* ----> https://www.adafruit.com/products/1469
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __COMMON_H__
|
||||
#define __COMMON_H__
|
||||
|
||||
//******************************************************************************
|
||||
// Include files
|
||||
//******************************************************************************
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <stdint.h>
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// If building with a C++ compiler, make all of the definitions in this header
|
||||
// have a C binding.
|
||||
//
|
||||
//*****************************************************************************
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
//*****************************************************************************
|
||||
// ERROR CODES
|
||||
//*****************************************************************************
|
||||
#define ESUCCESS 0
|
||||
#define EFAIL -1
|
||||
#define EERROR EFAIL
|
||||
|
||||
//*****************************************************************************
|
||||
// COMMON DEFINES
|
||||
//*****************************************************************************
|
||||
#define ERROR_SOCKET_INACTIVE -57
|
||||
|
||||
#define WLAN_ENABLE (1)
|
||||
#define WLAN_DISABLE (0)
|
||||
|
||||
#define MAC_ADDR_LEN (6)
|
||||
|
||||
#define SP_PORTION_SIZE (32)
|
||||
|
||||
// #define CC3000_TINY_DRIVER
|
||||
|
||||
/*Defines for minimal and maximal RX buffer size. This size includes the spi
|
||||
header and hci header.
|
||||
The maximal buffer size derives from:
|
||||
MTU + HCI header + SPI header + sendto() agrs size
|
||||
The minimum buffer size derives from:
|
||||
HCI header + SPI header + max args size
|
||||
|
||||
This buffer is used for receiving events and data.
|
||||
The packet can not be longer than MTU size and CC3000 does not support
|
||||
fragmentation. Note that the same buffer is used for reception of the data
|
||||
and events from CC3000. That is why the minimum is defined.
|
||||
The calculation for the actual size of buffer for reception is:
|
||||
Given the maximal data size MAX_DATA that is expected to be received by
|
||||
application, the required buffer is:
|
||||
Using recv() or recvfrom():
|
||||
|
||||
max(CC3000_MINIMAL_RX_SIZE, MAX_DATA + HEADERS_SIZE_DATA + fromlen
|
||||
+ ucArgsize + 1)
|
||||
|
||||
Using gethostbyname() with minimal buffer size will limit the host name
|
||||
returned to 99 bytes only.
|
||||
The 1 is used for the overrun detection
|
||||
|
||||
Buffer size increased to 130 following the add_profile() with WEP security
|
||||
which requires TX buffer size of 130 bytes:
|
||||
HEADERS_SIZE_EVNT + WLAN_ADD_PROFILE_WEP_PARAM_LEN + MAX SSID LEN + 4 * MAX KEY LEN = 130
|
||||
MAX SSID LEN = 32
|
||||
MAX SSID LEN = 13 (with add_profile only ascii key setting is supported,
|
||||
therfore maximum key size is 13)
|
||||
*/
|
||||
|
||||
#define CC3000_MINIMAL_RX_SIZE (130 + 1)
|
||||
#define CC3000_MAXIMAL_RX_SIZE (1519 + 1)
|
||||
|
||||
/*Defines for minimal and maximal TX buffer size.
|
||||
This buffer is used for sending events and data.
|
||||
The packet can not be longer than MTU size and CC3000 does not support
|
||||
fragmentation. Note that the same buffer is used for transmission of the data
|
||||
and commands. That is why the minimum is defined.
|
||||
The calculation for the actual size of buffer for transmission is:
|
||||
Given the maximal data size MAX_DATA, the required buffer is:
|
||||
Using Sendto():
|
||||
|
||||
max(CC3000_MINIMAL_TX_SIZE, MAX_DATA + SPI_HEADER_SIZE
|
||||
+ SOCKET_SENDTO_PARAMS_LEN + SIMPLE_LINK_HCI_DATA_HEADER_SIZE + 1)
|
||||
|
||||
Using Send():
|
||||
|
||||
max(CC3000_MINIMAL_TX_SIZE, MAX_DATA + SPI_HEADER_SIZE
|
||||
+ HCI_CMND_SEND_ARG_LENGTH + SIMPLE_LINK_HCI_DATA_HEADER_SIZE + 1)
|
||||
|
||||
The 1 is used for the overrun detection */
|
||||
|
||||
#define CC3000_MINIMAL_TX_SIZE (130 + 1)
|
||||
#define CC3000_MAXIMAL_TX_SIZE (1519 + 1)
|
||||
|
||||
//TX and RX buffer sizes, allow to receive and transmit maximum data at length 8.
|
||||
#ifdef CC3000_TINY_DRIVER
|
||||
#define TINY_CC3000_MAXIMAL_RX_SIZE 44
|
||||
#define TINY_CC3000_MAXIMAL_TX_SIZE 59
|
||||
#endif
|
||||
|
||||
/*In order to determine your preferred buffer size,
|
||||
change CC3000_MAXIMAL_RX_SIZE and CC3000_MAXIMAL_TX_SIZE to a value between
|
||||
the minimal and maximal specified above.
|
||||
Note that the buffers are allocated by SPI.
|
||||
In case you change the size of those buffers, you might need also to change
|
||||
the linker file, since for example on MSP430 FRAM devices the buffers are
|
||||
allocated in the FRAM section that is allocated manually and not by IDE.
|
||||
*/
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
|
||||
#define CC3000_RX_BUFFER_SIZE (CC3000_MINIMAL_RX_SIZE)
|
||||
#define CC3000_TX_BUFFER_SIZE (CC3000_MINIMAL_TX_SIZE)
|
||||
|
||||
//if defined TINY DRIVER we use smaller RX and TX buffer in order to minimize RAM consumption
|
||||
#else
|
||||
#define CC3000_RX_BUFFER_SIZE (TINY_CC3000_MAXIMAL_RX_SIZE)
|
||||
#define CC3000_TX_BUFFER_SIZE (TINY_CC3000_MAXIMAL_TX_SIZE)
|
||||
|
||||
#endif
|
||||
|
||||
//*****************************************************************************
|
||||
// Compound Types
|
||||
//*****************************************************************************
|
||||
#ifdef __AVR__
|
||||
typedef unsigned long time_t; /* KTown: Updated to be compatible with Arduino Time.h */
|
||||
#else
|
||||
typedef long time_t;
|
||||
#endif
|
||||
typedef unsigned long clock_t;
|
||||
typedef long suseconds_t;
|
||||
|
||||
typedef struct timeval timeval;
|
||||
|
||||
struct timeval
|
||||
{
|
||||
time_t tv_sec; /* seconds */
|
||||
suseconds_t tv_usec; /* microseconds */
|
||||
};
|
||||
|
||||
typedef char *(*tFWPatches)(unsigned long *usLength);
|
||||
|
||||
typedef char *(*tDriverPatches)(unsigned long *usLength);
|
||||
|
||||
typedef char *(*tBootLoaderPatches)(unsigned long *usLength);
|
||||
|
||||
typedef void (*tWlanCB)(long event_type, char * data, unsigned char length );
|
||||
|
||||
typedef long (*tWlanReadInteruptPin)(void);
|
||||
|
||||
typedef void (*tWlanInterruptEnable)(void);
|
||||
|
||||
typedef void (*tWlanInterruptDisable)(void);
|
||||
|
||||
typedef void (*tWriteWlanPin)(unsigned char val);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned short usRxEventOpcode;
|
||||
unsigned short usEventOrDataReceived;
|
||||
unsigned char *pucReceivedData;
|
||||
unsigned char *pucTxCommandBuffer;
|
||||
|
||||
tFWPatches sFWPatches;
|
||||
tDriverPatches sDriverPatches;
|
||||
tBootLoaderPatches sBootLoaderPatches;
|
||||
tWlanCB sWlanCB;
|
||||
tWlanReadInteruptPin ReadWlanInterruptPin;
|
||||
tWlanInterruptEnable WlanInterruptEnable;
|
||||
tWlanInterruptDisable WlanInterruptDisable;
|
||||
tWriteWlanPin WriteWlanPin;
|
||||
|
||||
signed long slTransmitDataError;
|
||||
unsigned short usNumberOfFreeBuffers;
|
||||
unsigned short usSlBufferLength;
|
||||
unsigned short usBufferSize;
|
||||
unsigned short usRxDataPending;
|
||||
|
||||
unsigned long NumberOfSentPackets;
|
||||
unsigned long NumberOfReleasedPackets;
|
||||
|
||||
unsigned char InformHostOnTxComplete;
|
||||
}sSimplLinkInformation;
|
||||
|
||||
extern volatile sSimplLinkInformation tSLInformation;
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
// Prototypes for the APIs.
|
||||
//*****************************************************************************
|
||||
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! SimpleLinkWaitEvent
|
||||
//!
|
||||
//! @param usOpcode command operation code
|
||||
//! @param pRetParams command return parameters
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Wait for event, pass it to the hci_event_handler and
|
||||
//! update the event opcode in a global variable.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
extern void SimpleLinkWaitEvent(unsigned short usOpcode, void *pRetParams);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! SimpleLinkWaitData
|
||||
//!
|
||||
//! @param pBuf data buffer
|
||||
//! @param from from information
|
||||
//! @param fromlen from information length
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Wait for data, pass it to the hci_event_handler
|
||||
//! and update in a global variable that there is
|
||||
//! data to read.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
extern void SimpleLinkWaitData(uint8_t *pBuf, uint8_t *from, uint8_t *fromlen);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! UINT32_TO_STREAM_f
|
||||
//!
|
||||
//! \param p pointer to the new stream
|
||||
//! \param u32 pointer to the 32 bit
|
||||
//!
|
||||
//! \return pointer to the new stream
|
||||
//!
|
||||
//! \brief This function is used for copying 32 bit to stream
|
||||
//! while converting to little endian format.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
extern uint8_t* UINT32_TO_STREAM_f (uint8_t *p, uint32_t u32);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! UINT16_TO_STREAM_f
|
||||
//!
|
||||
//! \param p pointer to the new stream
|
||||
//! \param u32 pointer to the 16 bit
|
||||
//!
|
||||
//! \return pointer to the new stream
|
||||
//!
|
||||
//! \brief This function is used for copying 16 bit to stream
|
||||
//! while converting to little endian format.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
extern uint8_t* UINT16_TO_STREAM_f (uint8_t *p, uint16_t u16);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! STREAM_TO_UINT16_f
|
||||
//!
|
||||
//! \param p pointer to the stream
|
||||
//! \param offset offset in the stream
|
||||
//!
|
||||
//! \return pointer to the new 16 bit
|
||||
//!
|
||||
//! \brief This function is used for copying received stream to
|
||||
//! 16 bit in little endian format.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
extern uint16_t STREAM_TO_UINT16_f(char* p, uint16_t offset);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! STREAM_TO_UINT32_f
|
||||
//!
|
||||
//! \param p pointer to the stream
|
||||
//! \param offset offset in the stream
|
||||
//!
|
||||
//! \return pointer to the new 32 bit
|
||||
//!
|
||||
//! \brief This function is used for copying received stream to
|
||||
//! 32 bit in little endian format.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
extern uint32_t STREAM_TO_UINT32_f(char* p, uint16_t offset);
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! cc3k_int_poll
|
||||
//!
|
||||
//! \brief checks if the interrupt pin is low
|
||||
//! just in case the hardware missed a falling edge
|
||||
//! function is in ccspi.cpp
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
extern void cc3k_int_poll();
|
||||
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
// COMMON MACROs
|
||||
//*****************************************************************************
|
||||
|
||||
|
||||
//This macro is used for copying 8 bit to stream while converting to little endian format.
|
||||
#define UINT8_TO_STREAM(_p, _val) {*(_p)++ = (_val);}
|
||||
//This macro is used for copying 16 bit to stream while converting to little endian format.
|
||||
#define UINT16_TO_STREAM(_p, _u16) (UINT16_TO_STREAM_f(_p, _u16))
|
||||
//This macro is used for copying 32 bit to stream while converting to little endian format.
|
||||
#define UINT32_TO_STREAM(_p, _u32) (UINT32_TO_STREAM_f(_p, _u32))
|
||||
//This macro is used for copying a specified value length bits (l) to stream while converting to little endian format.
|
||||
#define ARRAY_TO_STREAM(p, a, l) {register short _i; for (_i = 0; _i < l; _i++) *(p)++ = ((uint8_t *) a)[_i];}
|
||||
//This macro is used for copying received stream to 8 bit in little endian format.
|
||||
#define STREAM_TO_UINT8(_p, _offset, _u8) {_u8 = (uint8_t)(*(_p + _offset));}
|
||||
//This macro is used for copying received stream to 16 bit in little endian format.
|
||||
#define STREAM_TO_UINT16(_p, _offset, _u16) {_u16 = STREAM_TO_UINT16_f(_p, _offset);}
|
||||
//This macro is used for copying received stream to 32 bit in little endian format.
|
||||
#define STREAM_TO_UINT32(_p, _offset, _u32) {_u32 = STREAM_TO_UINT32_f(_p, _offset);}
|
||||
#define STREAM_TO_STREAM(p, a, l) {register short _i; for (_i = 0; _i < l; _i++) *(a)++= ((uint8_t *) p)[_i];}
|
||||
|
||||
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Mark the end of the C bindings section for C++ compilers.
|
||||
//
|
||||
//*****************************************************************************
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
||||
#endif // __COMMON_H__
|
||||
@@ -1,124 +0,0 @@
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@file Adafruit_CC3000.cpp
|
||||
@author KTOWN (Kevin Townsend Adafruit Industries)
|
||||
@license BSD (see license.txt)
|
||||
|
||||
This is a library for the Adafruit CC3000 WiFi breakout board
|
||||
This library works with the Adafruit CC3000 breakout
|
||||
----> https://www.adafruit.com/products/1469
|
||||
|
||||
Check out the links above for our tutorials and wiring diagrams
|
||||
These chips use SPI to communicate.
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
@section HISTORY
|
||||
|
||||
v1.0 - Initial release
|
||||
*/
|
||||
/**************************************************************************/
|
||||
|
||||
#include "debug.h"
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief This function will display the number of bytes currently free
|
||||
in RAM ... useful for debugging!
|
||||
*/
|
||||
/**************************************************************************/
|
||||
|
||||
#if defined (__arm__) && defined (__SAM3X8E__) // Arduino Due
|
||||
// should use uinstd.h to define sbrk but on Arduino Due this causes a conflict
|
||||
extern "C" char* sbrk(int incr);
|
||||
int getFreeRam(void) {
|
||||
char top;
|
||||
return &top - reinterpret_cast<char*>(sbrk(0));
|
||||
}
|
||||
#else // AVR
|
||||
int getFreeRam(void)
|
||||
{
|
||||
extern int __bss_end;
|
||||
extern int *__brkval;
|
||||
int free_memory;
|
||||
if((int)__brkval == 0) {
|
||||
free_memory = ((int)&free_memory) - ((int)&__bss_end);
|
||||
}
|
||||
else {
|
||||
free_memory = ((int)&free_memory) - ((int)__brkval);
|
||||
}
|
||||
|
||||
return free_memory;
|
||||
}
|
||||
#endif
|
||||
|
||||
void displayFreeRam(void)
|
||||
{
|
||||
if (CC3KPrinter == 0) {
|
||||
return;
|
||||
}
|
||||
CC3KPrinter->print(F("Free RAM: "));
|
||||
CC3KPrinter->print(getFreeRam());
|
||||
CC3KPrinter->println(F(" bytes"));
|
||||
}
|
||||
|
||||
void uart_putchar(char c) {
|
||||
if (CC3KPrinter != 0) {
|
||||
CC3KPrinter->write(c);
|
||||
}
|
||||
}
|
||||
|
||||
void printDec(uint8_t h) {
|
||||
uart_putchar((h / 100) + '0');
|
||||
h %= 100;
|
||||
uart_putchar((h / 10) + '0');
|
||||
h %= 10;
|
||||
uart_putchar(h + '0');
|
||||
}
|
||||
|
||||
|
||||
void printHex(uint8_t h) {
|
||||
uint8_t d = h >> 4;
|
||||
if (d >= 10) {
|
||||
uart_putchar(d - 10 + 'A');
|
||||
} else {
|
||||
uart_putchar(d + '0');
|
||||
}
|
||||
h &= 0xF;
|
||||
if (h >= 10) {
|
||||
uart_putchar(h - 10 + 'A');
|
||||
} else {
|
||||
uart_putchar(h + '0');
|
||||
}
|
||||
}
|
||||
|
||||
void printHex16(uint16_t h) {
|
||||
uart_putchar('0');
|
||||
uart_putchar('x');
|
||||
DEBUGPRINT_HEX(h >> 8);
|
||||
DEBUGPRINT_HEX(h);
|
||||
}
|
||||
|
||||
|
||||
void printDec16(uint16_t h) {
|
||||
uart_putchar((h / 10000) + '0');
|
||||
h %= 10000;
|
||||
uart_putchar((h / 1000) + '0');
|
||||
h %= 1000;
|
||||
uart_putchar((h / 100) + '0');
|
||||
h %= 100;
|
||||
uart_putchar((h / 10) + '0');
|
||||
h %= 10;
|
||||
uart_putchar(h + '0');
|
||||
}
|
||||
|
||||
|
||||
void DEBUGPRINT(const prog_char *fstr)
|
||||
{
|
||||
char c;
|
||||
if(!fstr) return;
|
||||
while((c = pgm_read_byte(fstr++)))
|
||||
uart_putchar(c);
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@file Adafruit_CC3000.cpp
|
||||
@author KTOWN (Kevin Townsend for Adafruit Industries)
|
||||
@license BSD (see license.txt)
|
||||
|
||||
This is a library for the Adafruit CC3000 WiFi breakout board
|
||||
This library works with the Adafruit CC3000 breakout
|
||||
----> https://www.adafruit.com/products/1469
|
||||
|
||||
Check out the links above for our tutorials and wiring diagrams
|
||||
These chips use SPI to communicate.
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
@section HISTORY
|
||||
|
||||
v1.0 - Initial release
|
||||
*/
|
||||
/**************************************************************************/
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
|
||||
#if (GCC_VERSION >= 40702) || !defined(prog_char)
|
||||
typedef char PROGMEM prog_char;
|
||||
#endif
|
||||
|
||||
#ifndef _CC3000_DEBUG
|
||||
#define _CC3000_DEBUG
|
||||
|
||||
#define DEBUG_MODE (0)
|
||||
|
||||
int getFreeRam(void);
|
||||
void displayFreeRam(void);
|
||||
void uart_putchar(char c);
|
||||
void printHex(uint8_t h);
|
||||
void printHex16(uint16_t h);
|
||||
void DEBUGPRINT(const prog_char *fstr);
|
||||
void printDec(uint8_t h);
|
||||
void printDec16(uint16_t h);
|
||||
|
||||
#ifndef FLASHIFY
|
||||
#define FLASHIFY(s) ({static const char c[] __attribute__ ((progmem)) = s;c;})
|
||||
#endif
|
||||
|
||||
#define PRINT_F(__s) DEBUGPRINT(FLASHIFY(__s))
|
||||
|
||||
#if (DEBUG_MODE != 0)
|
||||
#define DEBUGPRINT_F(__s) DEBUGPRINT(FLASHIFY(__s))
|
||||
#define DEBUGPRINT_DEC(x) printDec(x)
|
||||
#define DEBUGPRINT_DEC16(x) printDec16(x)
|
||||
#define DEBUGPRINT_HEX(x) printHex(x)
|
||||
#define DEBUGPRINT_HEX16(x) printHex16(x)
|
||||
#else
|
||||
#define DEBUGPRINT_F(__s) /* do nothing! */
|
||||
#define DEBUGPRINT_DEC(x)
|
||||
#define DEBUGPRINT_DEC16(x)
|
||||
#define DEBUGPRINT_HEX(x)
|
||||
#define DEBUGPRINT_HEX16(x)
|
||||
#endif
|
||||
|
||||
extern Print* CC3KPrinter;
|
||||
|
||||
#endif
|
||||
@@ -1,871 +0,0 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* evnt_handler.c - CC3000 Host Driver Implementation.
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* Adapted for use with the Arduino/AVR by KTOWN (Kevin Townsend)
|
||||
* & Limor Fried for Adafruit Industries
|
||||
* This library works with the Adafruit CC3000 breakout
|
||||
* ----> https://www.adafruit.com/products/1469
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! \addtogroup evnt_handler_api
|
||||
//! @{
|
||||
//
|
||||
//******************************************************************************
|
||||
|
||||
//******************************************************************************
|
||||
// INCLUDE FILES
|
||||
//******************************************************************************
|
||||
|
||||
#include "cc3000_common.h"
|
||||
#include "string.h"
|
||||
#include "hci.h"
|
||||
#include "evnt_handler.h"
|
||||
#include "wlan.h"
|
||||
#include "socket.h"
|
||||
#include "netapp.h"
|
||||
#include "../ccspi.h"
|
||||
#include "debug.h"
|
||||
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
// COMMON DEFINES
|
||||
//*****************************************************************************
|
||||
|
||||
#define FLOW_CONTROL_EVENT_HANDLE_OFFSET (0)
|
||||
#define FLOW_CONTROL_EVENT_BLOCK_MODE_OFFSET (1)
|
||||
#define FLOW_CONTROL_EVENT_FREE_BUFFS_OFFSET (2)
|
||||
#define FLOW_CONTROL_EVENT_SIZE (4)
|
||||
|
||||
#define BSD_RSP_PARAMS_SOCKET_OFFSET (0)
|
||||
#define BSD_RSP_PARAMS_STATUS_OFFSET (4)
|
||||
|
||||
#define GET_HOST_BY_NAME_RETVAL_OFFSET (0)
|
||||
#define GET_HOST_BY_NAME_ADDR_OFFSET (4)
|
||||
|
||||
#define ACCEPT_SD_OFFSET (0)
|
||||
#define ACCEPT_RETURN_STATUS_OFFSET (4)
|
||||
#define ACCEPT_ADDRESS__OFFSET (8)
|
||||
|
||||
#define SL_RECEIVE_SD_OFFSET (0)
|
||||
#define SL_RECEIVE_NUM_BYTES_OFFSET (4)
|
||||
#define SL_RECEIVE__FLAGS__OFFSET (8)
|
||||
|
||||
|
||||
#define SELECT_STATUS_OFFSET (0)
|
||||
#define SELECT_READFD_OFFSET (4)
|
||||
#define SELECT_WRITEFD_OFFSET (8)
|
||||
#define SELECT_EXFD_OFFSET (12)
|
||||
|
||||
|
||||
#define NETAPP_IPCONFIG_IP_OFFSET (0)
|
||||
#define NETAPP_IPCONFIG_SUBNET_OFFSET (4)
|
||||
#define NETAPP_IPCONFIG_GW_OFFSET (8)
|
||||
#define NETAPP_IPCONFIG_DHCP_OFFSET (12)
|
||||
#define NETAPP_IPCONFIG_DNS_OFFSET (16)
|
||||
#define NETAPP_IPCONFIG_MAC_OFFSET (20)
|
||||
#define NETAPP_IPCONFIG_SSID_OFFSET (26)
|
||||
|
||||
#define NETAPP_IPCONFIG_IP_LENGTH (4)
|
||||
#define NETAPP_IPCONFIG_MAC_LENGTH (6)
|
||||
#define NETAPP_IPCONFIG_SSID_LENGTH (32)
|
||||
|
||||
|
||||
#define NETAPP_PING_PACKETS_SENT_OFFSET (0)
|
||||
#define NETAPP_PING_PACKETS_RCVD_OFFSET (4)
|
||||
#define NETAPP_PING_MIN_RTT_OFFSET (8)
|
||||
#define NETAPP_PING_MAX_RTT_OFFSET (12)
|
||||
#define NETAPP_PING_AVG_RTT_OFFSET (16)
|
||||
|
||||
#define GET_SCAN_RESULTS_TABlE_COUNT_OFFSET (0)
|
||||
#define GET_SCAN_RESULTS_SCANRESULT_STATUS_OFFSET (4)
|
||||
#define GET_SCAN_RESULTS_ISVALID_TO_SSIDLEN_OFFSET (8)
|
||||
#define GET_SCAN_RESULTS_FRAME_TIME_OFFSET (10)
|
||||
#define GET_SCAN_RESULTS_SSID_MAC_LENGTH (38)
|
||||
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
// GLOBAL VARAIABLES
|
||||
//*****************************************************************************
|
||||
|
||||
unsigned long socket_active_status = SOCKET_STATUS_INIT_VAL;
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
// Prototypes for the static functions
|
||||
//*****************************************************************************
|
||||
|
||||
static long hci_event_unsol_flowcontrol_handler(char *pEvent);
|
||||
|
||||
static void update_socket_active_status(char *resp_params);
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! hci_unsol_handle_patch_request
|
||||
//!
|
||||
//! @param event_hdr event header
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Handle unsolicited event from type patch request
|
||||
//
|
||||
//*****************************************************************************
|
||||
void hci_unsol_handle_patch_request(char *event_hdr)
|
||||
{
|
||||
char *params = (char *)(event_hdr) + HCI_EVENT_HEADER_SIZE;
|
||||
unsigned long ucLength = 0;
|
||||
char *patch;
|
||||
|
||||
switch (*params)
|
||||
{
|
||||
case HCI_EVENT_PATCHES_DRV_REQ:
|
||||
|
||||
if (tSLInformation.sDriverPatches)
|
||||
{
|
||||
patch = tSLInformation.sDriverPatches(&ucLength);
|
||||
|
||||
if (patch)
|
||||
{
|
||||
hci_patch_send(HCI_EVENT_PATCHES_DRV_REQ,
|
||||
tSLInformation.pucTxCommandBuffer, patch, ucLength);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Send 0 length Patches response event
|
||||
hci_patch_send(HCI_EVENT_PATCHES_DRV_REQ,
|
||||
tSLInformation.pucTxCommandBuffer, 0, 0);
|
||||
break;
|
||||
|
||||
case HCI_EVENT_PATCHES_FW_REQ:
|
||||
|
||||
if (tSLInformation.sFWPatches)
|
||||
{
|
||||
patch = tSLInformation.sFWPatches(&ucLength);
|
||||
|
||||
// Build and send a patch
|
||||
if (patch)
|
||||
{
|
||||
hci_patch_send(HCI_EVENT_PATCHES_FW_REQ,
|
||||
tSLInformation.pucTxCommandBuffer, patch, ucLength);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Send 0 length Patches response event
|
||||
hci_patch_send(HCI_EVENT_PATCHES_FW_REQ,
|
||||
tSLInformation.pucTxCommandBuffer, 0, 0);
|
||||
break;
|
||||
|
||||
case HCI_EVENT_PATCHES_BOOTLOAD_REQ:
|
||||
|
||||
if (tSLInformation.sBootLoaderPatches)
|
||||
{
|
||||
patch = tSLInformation.sBootLoaderPatches(&ucLength);
|
||||
|
||||
if (patch)
|
||||
{
|
||||
hci_patch_send(HCI_EVENT_PATCHES_BOOTLOAD_REQ,
|
||||
tSLInformation.pucTxCommandBuffer, patch, ucLength);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Send 0 length Patches response event
|
||||
hci_patch_send(HCI_EVENT_PATCHES_BOOTLOAD_REQ,
|
||||
tSLInformation.pucTxCommandBuffer, 0, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! hci_event_handler
|
||||
//!
|
||||
//! @param pRetParams incoming data buffer
|
||||
//! @param from from information (in case of data received)
|
||||
//! @param fromlen from information length (in case of data received)
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Parse the incoming events packets and issues corresponding
|
||||
//! event handler from global array of handlers pointers
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
|
||||
unsigned char *
|
||||
hci_event_handler(void *pRetParams, unsigned char *from, unsigned char *fromlen)
|
||||
{
|
||||
unsigned char *pucReceivedData, ucArgsize;
|
||||
unsigned short usLength;
|
||||
unsigned char *pucReceivedParams;
|
||||
unsigned short usReceivedEventOpcode = 0;
|
||||
unsigned long retValue32;
|
||||
unsigned char * RecvParams;
|
||||
unsigned char *RetParams;
|
||||
|
||||
while (1)
|
||||
{
|
||||
cc3k_int_poll();
|
||||
|
||||
if (tSLInformation.usEventOrDataReceived != 0)
|
||||
{
|
||||
|
||||
pucReceivedData = (tSLInformation.pucReceivedData);
|
||||
|
||||
if (*pucReceivedData == HCI_TYPE_EVNT)
|
||||
{
|
||||
// Event Received
|
||||
STREAM_TO_UINT16((char *)pucReceivedData,
|
||||
HCI_EVENT_OPCODE_OFFSET,
|
||||
usReceivedEventOpcode);
|
||||
pucReceivedParams = pucReceivedData + HCI_EVENT_HEADER_SIZE;
|
||||
RecvParams = pucReceivedParams;
|
||||
RetParams = (unsigned char *)pRetParams;
|
||||
|
||||
// In case unsolicited event received - here the handling finished
|
||||
if (hci_unsol_event_handler((char *)pucReceivedData) == 0)
|
||||
{
|
||||
STREAM_TO_UINT8(pucReceivedData, HCI_DATA_LENGTH_OFFSET, usLength);
|
||||
|
||||
switch(usReceivedEventOpcode)
|
||||
{
|
||||
case HCI_CMND_READ_BUFFER_SIZE:
|
||||
{
|
||||
STREAM_TO_UINT8((char *)pucReceivedParams, 0,
|
||||
tSLInformation.usNumberOfFreeBuffers);
|
||||
STREAM_TO_UINT16((char *)pucReceivedParams, 1,
|
||||
tSLInformation.usSlBufferLength);
|
||||
}
|
||||
break;
|
||||
|
||||
case HCI_CMND_WLAN_CONFIGURE_PATCH:
|
||||
case HCI_NETAPP_DHCP:
|
||||
case HCI_NETAPP_PING_SEND:
|
||||
case HCI_NETAPP_PING_STOP:
|
||||
case HCI_NETAPP_ARP_FLUSH:
|
||||
case HCI_NETAPP_SET_DEBUG_LEVEL:
|
||||
case HCI_NETAPP_SET_TIMERS:
|
||||
case HCI_EVNT_NVMEM_READ:
|
||||
case HCI_EVNT_NVMEM_CREATE_ENTRY:
|
||||
case HCI_CMND_NVMEM_WRITE_PATCH:
|
||||
case HCI_NETAPP_PING_REPORT:
|
||||
case HCI_EVNT_MDNS_ADVERTISE:
|
||||
|
||||
STREAM_TO_UINT8(pucReceivedData, HCI_EVENT_STATUS_OFFSET
|
||||
,*(unsigned char *)pRetParams);
|
||||
break;
|
||||
|
||||
case HCI_CMND_SETSOCKOPT:
|
||||
case HCI_CMND_WLAN_CONNECT:
|
||||
case HCI_CMND_WLAN_IOCTL_STATUSGET:
|
||||
case HCI_EVNT_WLAN_IOCTL_ADD_PROFILE:
|
||||
case HCI_CMND_WLAN_IOCTL_DEL_PROFILE:
|
||||
case HCI_CMND_WLAN_IOCTL_SET_CONNECTION_POLICY:
|
||||
case HCI_CMND_WLAN_IOCTL_SET_SCANPARAM:
|
||||
case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_START:
|
||||
case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_STOP:
|
||||
case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_SET_PREFIX:
|
||||
case HCI_CMND_EVENT_MASK:
|
||||
case HCI_EVNT_WLAN_DISCONNECT:
|
||||
case HCI_EVNT_SOCKET:
|
||||
case HCI_EVNT_BIND:
|
||||
case HCI_CMND_LISTEN:
|
||||
case HCI_EVNT_CLOSE_SOCKET:
|
||||
case HCI_EVNT_CONNECT:
|
||||
case HCI_EVNT_NVMEM_WRITE:
|
||||
|
||||
STREAM_TO_UINT32((char *)pucReceivedParams,0
|
||||
,*(unsigned long *)pRetParams);
|
||||
break;
|
||||
|
||||
case HCI_EVNT_READ_SP_VERSION:
|
||||
|
||||
STREAM_TO_UINT8(pucReceivedData, HCI_EVENT_STATUS_OFFSET
|
||||
,*(unsigned char *)pRetParams);
|
||||
pRetParams = ((char *)pRetParams) + 1;
|
||||
STREAM_TO_UINT32((char *)pucReceivedParams, 0, retValue32);
|
||||
UINT32_TO_STREAM((unsigned char *)pRetParams, retValue32);
|
||||
break;
|
||||
|
||||
case HCI_EVNT_BSD_GETHOSTBYNAME:
|
||||
|
||||
STREAM_TO_UINT32((char *)pucReceivedParams
|
||||
,GET_HOST_BY_NAME_RETVAL_OFFSET,*(unsigned long *)pRetParams);
|
||||
pRetParams = ((char *)pRetParams) + 4;
|
||||
STREAM_TO_UINT32((char *)pucReceivedParams
|
||||
,GET_HOST_BY_NAME_ADDR_OFFSET,*(unsigned long *)pRetParams);
|
||||
break;
|
||||
|
||||
case HCI_EVNT_ACCEPT:
|
||||
{
|
||||
STREAM_TO_UINT32((char *)pucReceivedParams,ACCEPT_SD_OFFSET
|
||||
,*(unsigned long *)pRetParams);
|
||||
pRetParams = ((char *)pRetParams) + 4;
|
||||
STREAM_TO_UINT32((char *)pucReceivedParams
|
||||
,ACCEPT_RETURN_STATUS_OFFSET,*(unsigned long *)pRetParams);
|
||||
pRetParams = ((char *)pRetParams) + 4;
|
||||
|
||||
//This argument returns in network order
|
||||
memcpy((unsigned char *)pRetParams,
|
||||
pucReceivedParams + ACCEPT_ADDRESS__OFFSET, sizeof(sockaddr));
|
||||
break;
|
||||
}
|
||||
|
||||
case HCI_EVNT_RECV:
|
||||
case HCI_EVNT_RECVFROM:
|
||||
{
|
||||
STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_SD_OFFSET ,*(unsigned long *)pRetParams);
|
||||
pRetParams = ((char *)pRetParams) + 4;
|
||||
STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_NUM_BYTES_OFFSET,*(unsigned long *)pRetParams);
|
||||
pRetParams = ((char *)pRetParams) + 4;
|
||||
STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE__FLAGS__OFFSET,*(unsigned long *)pRetParams);
|
||||
tBsdReadReturnParams *tread = (tBsdReadReturnParams *)pRetParams;
|
||||
if(((tBsdReadReturnParams *)pRetParams)->iNumberOfBytes == ERROR_SOCKET_INACTIVE)
|
||||
{
|
||||
set_socket_active_status(((tBsdReadReturnParams *)pRetParams)->iSocketDescriptor,SOCKET_STATUS_INACTIVE);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case HCI_EVNT_SEND:
|
||||
case HCI_EVNT_SENDTO:
|
||||
{
|
||||
STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_SD_OFFSET ,*(unsigned long *)pRetParams);
|
||||
pRetParams = ((char *)pRetParams) + 4;
|
||||
STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_NUM_BYTES_OFFSET,*(unsigned long *)pRetParams);
|
||||
pRetParams = ((char *)pRetParams) + 4;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case HCI_EVNT_SELECT:
|
||||
{
|
||||
STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_STATUS_OFFSET,*(unsigned long *)pRetParams);
|
||||
pRetParams = ((char *)pRetParams) + 4;
|
||||
STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_READFD_OFFSET,*(unsigned long *)pRetParams);
|
||||
pRetParams = ((char *)pRetParams) + 4;
|
||||
STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_WRITEFD_OFFSET,*(unsigned long *)pRetParams);
|
||||
pRetParams = ((char *)pRetParams) + 4;
|
||||
STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_EXFD_OFFSET,*(unsigned long *)pRetParams);
|
||||
break;
|
||||
}
|
||||
|
||||
case HCI_CMND_GETSOCKOPT:
|
||||
|
||||
STREAM_TO_UINT8(pucReceivedData, HCI_EVENT_STATUS_OFFSET,((tBsdGetSockOptReturnParams *)pRetParams)->iStatus);
|
||||
//This argument returns in network order
|
||||
memcpy((unsigned char *)pRetParams, pucReceivedParams, 4);
|
||||
break;
|
||||
|
||||
case HCI_CMND_WLAN_IOCTL_GET_SCAN_RESULTS:
|
||||
|
||||
STREAM_TO_UINT32((char *)pucReceivedParams,GET_SCAN_RESULTS_TABlE_COUNT_OFFSET,*(unsigned long *)pRetParams);
|
||||
pRetParams = ((char *)pRetParams) + 4;
|
||||
STREAM_TO_UINT32((char *)pucReceivedParams,GET_SCAN_RESULTS_SCANRESULT_STATUS_OFFSET,*(unsigned long *)pRetParams);
|
||||
pRetParams = ((char *)pRetParams) + 4;
|
||||
STREAM_TO_UINT16((char *)pucReceivedParams,GET_SCAN_RESULTS_ISVALID_TO_SSIDLEN_OFFSET,*(unsigned long *)pRetParams);
|
||||
pRetParams = ((char *)pRetParams) + 2;
|
||||
STREAM_TO_UINT16((char *)pucReceivedParams,GET_SCAN_RESULTS_FRAME_TIME_OFFSET,*(unsigned long *)pRetParams);
|
||||
pRetParams = ((char *)pRetParams) + 2;
|
||||
memcpy((unsigned char *)pRetParams, (char *)(pucReceivedParams + GET_SCAN_RESULTS_FRAME_TIME_OFFSET + 2), GET_SCAN_RESULTS_SSID_MAC_LENGTH);
|
||||
break;
|
||||
|
||||
case HCI_CMND_SIMPLE_LINK_START:
|
||||
break;
|
||||
|
||||
case HCI_NETAPP_IPCONFIG:
|
||||
|
||||
//Read IP address
|
||||
STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
|
||||
RecvParams += 4;
|
||||
|
||||
//Read subnet
|
||||
STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
|
||||
RecvParams += 4;
|
||||
|
||||
//Read default GW
|
||||
STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
|
||||
RecvParams += 4;
|
||||
|
||||
//Read DHCP server
|
||||
STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
|
||||
RecvParams += 4;
|
||||
|
||||
//Read DNS server
|
||||
STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
|
||||
RecvParams += 4;
|
||||
|
||||
//Read Mac address
|
||||
STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_MAC_LENGTH);
|
||||
RecvParams += 6;
|
||||
|
||||
//Read SSID
|
||||
STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_SSID_LENGTH);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (usReceivedEventOpcode == tSLInformation.usRxEventOpcode)
|
||||
{
|
||||
tSLInformation.usRxEventOpcode = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pucReceivedParams = pucReceivedData;
|
||||
STREAM_TO_UINT8((char *)pucReceivedData, HCI_PACKET_ARGSIZE_OFFSET, ucArgsize);
|
||||
|
||||
STREAM_TO_UINT16((char *)pucReceivedData, HCI_PACKET_LENGTH_OFFSET, usLength);
|
||||
|
||||
// Data received: note that the only case where from and from length
|
||||
// are not null is in recv from, so fill the args accordingly
|
||||
if (from)
|
||||
{
|
||||
STREAM_TO_UINT32((char *)(pucReceivedData + HCI_DATA_HEADER_SIZE), BSD_RECV_FROM_FROMLEN_OFFSET, *(unsigned long *)fromlen);
|
||||
memcpy(from, (pucReceivedData + HCI_DATA_HEADER_SIZE + BSD_RECV_FROM_FROM_OFFSET) ,*fromlen);
|
||||
}
|
||||
|
||||
memcpy(pRetParams, pucReceivedParams + HCI_DATA_HEADER_SIZE + ucArgsize,
|
||||
usLength - ucArgsize);
|
||||
|
||||
tSLInformation.usRxDataPending = 0;
|
||||
}
|
||||
|
||||
tSLInformation.usEventOrDataReceived = 0;
|
||||
|
||||
SpiResumeSpi();
|
||||
|
||||
// Since we are going to TX - we need to handle this event after the
|
||||
// ResumeSPi since we need interrupts
|
||||
if ((*pucReceivedData == HCI_TYPE_EVNT) &&
|
||||
(usReceivedEventOpcode == HCI_EVNT_PATCHES_REQ))
|
||||
{
|
||||
hci_unsol_handle_patch_request((char *)pucReceivedData);
|
||||
}
|
||||
|
||||
if ((tSLInformation.usRxEventOpcode == 0) && (tSLInformation.usRxDataPending == 0))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! hci_unsol_event_handler
|
||||
//!
|
||||
//! @param event_hdr event header
|
||||
//!
|
||||
//! @return 1 if event supported and handled
|
||||
//! 0 if event is not supported
|
||||
//!
|
||||
//! @brief Handle unsolicited events
|
||||
//
|
||||
//*****************************************************************************
|
||||
long
|
||||
hci_unsol_event_handler(char *event_hdr)
|
||||
{
|
||||
char * data = NULL;
|
||||
long event_type;
|
||||
unsigned long NumberOfReleasedPackets;
|
||||
unsigned long NumberOfSentPackets;
|
||||
|
||||
STREAM_TO_UINT16(event_hdr, HCI_EVENT_OPCODE_OFFSET,event_type);
|
||||
|
||||
DEBUGPRINT_F("\tHCI_UNSOL_EVT: ");
|
||||
DEBUGPRINT_HEX16(event_type);
|
||||
|
||||
if (event_type & HCI_EVNT_UNSOL_BASE)
|
||||
{
|
||||
switch(event_type)
|
||||
{
|
||||
|
||||
case HCI_EVNT_DATA_UNSOL_FREE_BUFF:
|
||||
{
|
||||
hci_event_unsol_flowcontrol_handler(event_hdr);
|
||||
|
||||
NumberOfReleasedPackets = tSLInformation.NumberOfReleasedPackets;
|
||||
NumberOfSentPackets = tSLInformation.NumberOfSentPackets;
|
||||
|
||||
if (NumberOfReleasedPackets == NumberOfSentPackets)
|
||||
{
|
||||
if (tSLInformation.InformHostOnTxComplete)
|
||||
{
|
||||
tSLInformation.sWlanCB(HCI_EVENT_CC3000_CAN_SHUT_DOWN, NULL, 0);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(event_type & HCI_EVNT_WLAN_UNSOL_BASE)
|
||||
{
|
||||
switch(event_type)
|
||||
{
|
||||
case HCI_EVNT_WLAN_KEEPALIVE:
|
||||
case HCI_EVNT_WLAN_UNSOL_CONNECT:
|
||||
case HCI_EVNT_WLAN_UNSOL_DISCONNECT:
|
||||
case HCI_EVNT_WLAN_UNSOL_INIT:
|
||||
case HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE:
|
||||
|
||||
if( tSLInformation.sWlanCB )
|
||||
{
|
||||
tSLInformation.sWlanCB(event_type, 0, 0);
|
||||
}
|
||||
break;
|
||||
|
||||
case HCI_EVNT_WLAN_UNSOL_DHCP:
|
||||
{
|
||||
unsigned char params[NETAPP_IPCONFIG_MAC_OFFSET + 1]; // extra byte is for the status
|
||||
unsigned char *recParams = params;
|
||||
|
||||
data = (char*)(event_hdr) + HCI_EVENT_HEADER_SIZE;
|
||||
|
||||
//Read IP address
|
||||
STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
|
||||
data += 4;
|
||||
//Read subnet
|
||||
STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
|
||||
data += 4;
|
||||
//Read default GW
|
||||
STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
|
||||
data += 4;
|
||||
//Read DHCP server
|
||||
STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
|
||||
data += 4;
|
||||
//Read DNS server
|
||||
STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
|
||||
// read the status
|
||||
STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, *recParams);
|
||||
|
||||
|
||||
if( tSLInformation.sWlanCB )
|
||||
{
|
||||
tSLInformation.sWlanCB(event_type, (char *)params, sizeof(params));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case HCI_EVNT_WLAN_ASYNC_PING_REPORT:
|
||||
{
|
||||
netapp_pingreport_args_t params;
|
||||
data = (char*)(event_hdr) + HCI_EVENT_HEADER_SIZE;
|
||||
STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_SENT_OFFSET, params.packets_sent);
|
||||
STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_RCVD_OFFSET, params.packets_received);
|
||||
STREAM_TO_UINT32(data, NETAPP_PING_MIN_RTT_OFFSET, params.min_round_time);
|
||||
STREAM_TO_UINT32(data, NETAPP_PING_MAX_RTT_OFFSET, params.max_round_time);
|
||||
STREAM_TO_UINT32(data, NETAPP_PING_AVG_RTT_OFFSET, params.avg_round_time);
|
||||
|
||||
if( tSLInformation.sWlanCB )
|
||||
{
|
||||
tSLInformation.sWlanCB(event_type, (char *)¶ms, sizeof(params));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case HCI_EVNT_BSD_TCP_CLOSE_WAIT:
|
||||
{
|
||||
DEBUGPRINT_F("\tTCP Close Wait\n\r");
|
||||
uint8_t socketnum;
|
||||
data = (char*)(event_hdr) + HCI_EVENT_HEADER_SIZE;
|
||||
/*
|
||||
printHex(data[0]); PRINT_F("\t");
|
||||
printHex(data[1]); PRINT_F("\t");
|
||||
printHex(data[2]); PRINT_F("\t");
|
||||
printHex(data[3]); PRINT_F("\t");
|
||||
printHex(data[4]); PRINT_F("\t");
|
||||
printHex(data[5]); PRINT_F("\t");
|
||||
*/
|
||||
socketnum = data[0];
|
||||
//STREAM_TO_UINT16(data, 0, socketnum);
|
||||
if( tSLInformation.sWlanCB )
|
||||
{
|
||||
tSLInformation.sWlanCB(event_type, (char *)&socketnum, 1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
//'default' case which means "event not supported"
|
||||
default:
|
||||
return (0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
if ((event_type == HCI_EVNT_SEND) || (event_type == HCI_EVNT_SENDTO)
|
||||
|| (event_type == HCI_EVNT_WRITE))
|
||||
{
|
||||
char *pArg;
|
||||
long status;
|
||||
|
||||
DEBUGPRINT_F("\tSEND event response\n\r");
|
||||
|
||||
pArg = M_BSD_RESP_PARAMS_OFFSET(event_hdr);
|
||||
STREAM_TO_UINT32(pArg, BSD_RSP_PARAMS_STATUS_OFFSET,status);
|
||||
|
||||
if (ERROR_SOCKET_INACTIVE == status)
|
||||
{
|
||||
// The only synchronous event that can come from SL device in form of
|
||||
// command complete is "Command Complete" on data sent, in case SL device
|
||||
// was unable to transmit
|
||||
STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, tSLInformation.slTransmitDataError);
|
||||
update_socket_active_status(M_BSD_RESP_PARAMS_OFFSET(event_hdr));
|
||||
|
||||
return (1);
|
||||
}
|
||||
else
|
||||
return (0);
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! hci_unsolicited_event_handler
|
||||
//!
|
||||
//! @param None
|
||||
//!
|
||||
//! @return ESUCCESS if successful, EFAIL if an error occurred
|
||||
//!
|
||||
//! @brief Parse the incoming unsolicited event packets and issues
|
||||
//! corresponding event handler.
|
||||
//
|
||||
//*****************************************************************************
|
||||
long
|
||||
hci_unsolicited_event_handler(void)
|
||||
{
|
||||
unsigned long res = 0;
|
||||
unsigned char *pucReceivedData;
|
||||
|
||||
if (tSLInformation.usEventOrDataReceived != 0)
|
||||
{
|
||||
pucReceivedData = (tSLInformation.pucReceivedData);
|
||||
|
||||
if (*pucReceivedData == HCI_TYPE_EVNT)
|
||||
{
|
||||
|
||||
// In case unsolicited event received - here the handling finished
|
||||
if (hci_unsol_event_handler((char *)pucReceivedData) == 1)
|
||||
{
|
||||
|
||||
// There was an unsolicited event received - we can release the buffer
|
||||
// and clean the event received
|
||||
tSLInformation.usEventOrDataReceived = 0;
|
||||
|
||||
res = 1;
|
||||
SpiResumeSpi();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! set_socket_active_status
|
||||
//!
|
||||
//! @param Sd
|
||||
//! @param Status
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Check if the socket ID and status are valid and set
|
||||
//! accordingly the global socket status
|
||||
//
|
||||
//*****************************************************************************
|
||||
void set_socket_active_status(long Sd, long Status)
|
||||
{
|
||||
if(M_IS_VALID_SD(Sd) && M_IS_VALID_STATUS(Status))
|
||||
{
|
||||
socket_active_status &= ~(1 << Sd); /* clean socket's mask */
|
||||
socket_active_status |= (Status << Sd); /* set new socket's mask */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! hci_event_unsol_flowcontrol_handler
|
||||
//!
|
||||
//! @param pEvent pointer to the string contains parameters for IPERF
|
||||
//! @return ESUCCESS if successful, EFAIL if an error occurred
|
||||
//!
|
||||
//! @brief Called in case unsolicited event from type
|
||||
//! HCI_EVNT_DATA_UNSOL_FREE_BUFF has received.
|
||||
//! Keep track on the number of packets transmitted and update the
|
||||
//! number of free buffer in the SL device.
|
||||
//
|
||||
//*****************************************************************************
|
||||
long
|
||||
hci_event_unsol_flowcontrol_handler(char *pEvent)
|
||||
{
|
||||
|
||||
long temp, value;
|
||||
unsigned short i;
|
||||
unsigned short pusNumberOfHandles=0;
|
||||
char *pReadPayload;
|
||||
|
||||
STREAM_TO_UINT16((char *)pEvent,HCI_EVENT_HEADER_SIZE,pusNumberOfHandles);
|
||||
pReadPayload = ((char *)pEvent +
|
||||
HCI_EVENT_HEADER_SIZE + sizeof(pusNumberOfHandles));
|
||||
temp = 0;
|
||||
|
||||
for(i = 0; i < pusNumberOfHandles ; i++)
|
||||
{
|
||||
STREAM_TO_UINT16(pReadPayload, FLOW_CONTROL_EVENT_FREE_BUFFS_OFFSET, value);
|
||||
temp += value;
|
||||
pReadPayload += FLOW_CONTROL_EVENT_SIZE;
|
||||
}
|
||||
|
||||
tSLInformation.usNumberOfFreeBuffers += temp;
|
||||
tSLInformation.NumberOfReleasedPackets += temp;
|
||||
|
||||
return(ESUCCESS);
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! get_socket_active_status
|
||||
//!
|
||||
//! @param Sd Socket IS
|
||||
//! @return Current status of the socket.
|
||||
//!
|
||||
//! @brief Retrieve socket status
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
long
|
||||
get_socket_active_status(long Sd)
|
||||
{
|
||||
if(M_IS_VALID_SD(Sd))
|
||||
{
|
||||
return (socket_active_status & (1 << Sd)) ? SOCKET_STATUS_INACTIVE : SOCKET_STATUS_ACTIVE;
|
||||
}
|
||||
return SOCKET_STATUS_INACTIVE;
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! update_socket_active_status
|
||||
//!
|
||||
//! @param resp_params Socket IS
|
||||
//! @return Current status of the socket.
|
||||
//!
|
||||
//! @brief Retrieve socket status
|
||||
//
|
||||
//*****************************************************************************
|
||||
void
|
||||
update_socket_active_status(char *resp_params)
|
||||
{
|
||||
long status, sd;
|
||||
|
||||
STREAM_TO_UINT32(resp_params, BSD_RSP_PARAMS_SOCKET_OFFSET,sd);
|
||||
STREAM_TO_UINT32(resp_params, BSD_RSP_PARAMS_STATUS_OFFSET,status);
|
||||
|
||||
if(ERROR_SOCKET_INACTIVE == status)
|
||||
{
|
||||
set_socket_active_status(sd, SOCKET_STATUS_INACTIVE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! SimpleLinkWaitEvent
|
||||
//!
|
||||
//! @param usOpcode command operation code
|
||||
//! @param pRetParams command return parameters
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Wait for event, pass it to the hci_event_handler and
|
||||
//! update the event opcode in a global variable.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
void
|
||||
SimpleLinkWaitEvent(unsigned short usOpcode, void *pRetParams)
|
||||
{
|
||||
// In the blocking implementation the control to caller will be returned only
|
||||
// after the end of current transaction
|
||||
tSLInformation.usRxEventOpcode = usOpcode;
|
||||
hci_event_handler(pRetParams, 0, 0);
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! SimpleLinkWaitData
|
||||
//!
|
||||
//! @param pBuf data buffer
|
||||
//! @param from from information
|
||||
//! @param fromlen from information length
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Wait for data, pass it to the hci_event_handler
|
||||
//! and update in a global variable that there is
|
||||
//! data to read.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
void
|
||||
SimpleLinkWaitData(unsigned char *pBuf, unsigned char *from,
|
||||
unsigned char *fromlen)
|
||||
{
|
||||
// In the blocking implementation the control to caller will be returned only
|
||||
// after the end of current transaction, i.e. only after data will be received
|
||||
tSLInformation.usRxDataPending = 1;
|
||||
hci_event_handler(pBuf, from, fromlen);
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Close the Doxygen group.
|
||||
//! @}
|
||||
//
|
||||
//*****************************************************************************
|
||||
@@ -1,175 +0,0 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* evnt_handler.h - CC3000 Host Driver Implementation.
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* Adapted for use with the Arduino/AVR by KTOWN (Kevin Townsend)
|
||||
* & Limor Fried for Adafruit Industries
|
||||
* This library works with the Adafruit CC3000 breakout
|
||||
* ----> https://www.adafruit.com/products/1469
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __EVENT_HANDLER_H__
|
||||
#define __EVENT_HANDLER_H__
|
||||
|
||||
#include "hci.h"
|
||||
#include "socket.h"
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// If building with a C++ compiler, make all of the definitions in this header
|
||||
// have a C binding.
|
||||
//
|
||||
//*****************************************************************************
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Prototypes for the APIs.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! hci_event_handler
|
||||
//!
|
||||
//! @param pRetParams incoming data buffer
|
||||
//! @param from from information (in case of data received)
|
||||
//! @param fromlen from information length (in case of data received)
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Parse the incoming events packets and issues corresponding
|
||||
//! event handler from global array of handlers pointers
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern unsigned char *hci_event_handler(void *pRetParams, unsigned char *from, unsigned char *fromlen);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! hci_unsol_event_handler
|
||||
//!
|
||||
//! @param event_hdr event header
|
||||
//!
|
||||
//! @return 1 if event supported and handled
|
||||
//! 0 if event is not supported
|
||||
//!
|
||||
//! @brief Handle unsolicited events
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern long hci_unsol_event_handler(char *event_hdr);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! hci_unsolicited_event_handler
|
||||
//!
|
||||
//! @param None
|
||||
//!
|
||||
//! @return ESUCCESS if successful, EFAIL if an error occurred
|
||||
//!
|
||||
//! @brief Parse the incoming unsolicited event packets and issues
|
||||
//! corresponding event handler.
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern long hci_unsolicited_event_handler(void);
|
||||
|
||||
#define M_BSD_RESP_PARAMS_OFFSET(hci_event_hdr)((char *)(hci_event_hdr) + HCI_EVENT_HEADER_SIZE)
|
||||
|
||||
#define SOCKET_STATUS_ACTIVE 0
|
||||
#define SOCKET_STATUS_INACTIVE 1
|
||||
/* Init socket_active_status = 'all ones': init all sockets with SOCKET_STATUS_INACTIVE.
|
||||
Will be changed by 'set_socket_active_status' upon 'connect' and 'accept' calls */
|
||||
#define SOCKET_STATUS_INIT_VAL 0xFFFF
|
||||
#define M_IS_VALID_SD(sd) ((0 <= (sd)) && ((sd) <= 7))
|
||||
#define M_IS_VALID_STATUS(status) (((status) == SOCKET_STATUS_ACTIVE)||((status) == SOCKET_STATUS_INACTIVE))
|
||||
|
||||
extern unsigned long socket_active_status;
|
||||
|
||||
extern void set_socket_active_status(long Sd, long Status);
|
||||
extern long get_socket_active_status(long Sd);
|
||||
|
||||
typedef struct _bsd_accept_return_t
|
||||
{
|
||||
long iSocketDescriptor;
|
||||
long iStatus;
|
||||
sockaddr tSocketAddress;
|
||||
|
||||
} tBsdReturnParams;
|
||||
|
||||
|
||||
typedef struct _bsd_read_return_t
|
||||
{
|
||||
long iSocketDescriptor;
|
||||
long iNumberOfBytes;
|
||||
unsigned long uiFlags;
|
||||
} tBsdReadReturnParams;
|
||||
|
||||
#define BSD_RECV_FROM_FROMLEN_OFFSET (4)
|
||||
#define BSD_RECV_FROM_FROM_OFFSET (16)
|
||||
|
||||
|
||||
typedef struct _bsd_select_return_t
|
||||
{
|
||||
long iStatus;
|
||||
unsigned long uiRdfd;
|
||||
unsigned long uiWrfd;
|
||||
unsigned long uiExfd;
|
||||
} tBsdSelectRecvParams;
|
||||
|
||||
|
||||
typedef struct _bsd_getsockopt_return_t
|
||||
{
|
||||
unsigned char ucOptValue[4];
|
||||
char iStatus;
|
||||
} tBsdGetSockOptReturnParams;
|
||||
|
||||
typedef struct _bsd_gethostbyname_return_t
|
||||
{
|
||||
long retVal;
|
||||
long outputAddress;
|
||||
} tBsdGethostbynameParams;
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Mark the end of the C bindings section for C++ compilers.
|
||||
//
|
||||
//*****************************************************************************
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
||||
#endif // __EVENT_HANDLER_H__
|
||||
|
||||
@@ -1,239 +0,0 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* hci.c - CC3000 Host Driver Implementation.
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* Adapted for use with the Arduino/AVR by KTOWN (Kevin Townsend)
|
||||
* & Limor Fried for Adafruit Industries
|
||||
* This library works with the Adafruit CC3000 breakout
|
||||
* ----> https://www.adafruit.com/products/1469
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! \addtogroup hci_app
|
||||
//! @{
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
#include "cc3000_common.h"
|
||||
#include "hci.h"
|
||||
#include "../ccspi.h"
|
||||
#include "evnt_handler.h"
|
||||
#include "wlan.h"
|
||||
|
||||
#define SL_PATCH_PORTION_SIZE (1000)
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! hci_command_send
|
||||
//!
|
||||
//! @param usOpcode command operation code
|
||||
//! @param pucBuff pointer to the command's arguments buffer
|
||||
//! @param ucArgsLength length of the arguments
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Initiate an HCI command.
|
||||
//
|
||||
//*****************************************************************************
|
||||
unsigned short
|
||||
hci_command_send(unsigned short usOpcode, unsigned char *pucBuff,
|
||||
unsigned char ucArgsLength)
|
||||
{
|
||||
unsigned char *stream;
|
||||
|
||||
stream = (pucBuff + SPI_HEADER_SIZE);
|
||||
|
||||
UINT8_TO_STREAM(stream, HCI_TYPE_CMND);
|
||||
stream = UINT16_TO_STREAM(stream, usOpcode);
|
||||
UINT8_TO_STREAM(stream, ucArgsLength);
|
||||
|
||||
//Update the opcode of the event we will be waiting for
|
||||
SpiWrite(pucBuff, ucArgsLength + SIMPLE_LINK_HCI_CMND_HEADER_SIZE);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! hci_data_send
|
||||
//!
|
||||
//! @param usOpcode command operation code
|
||||
//! @param ucArgs pointer to the command's arguments buffer
|
||||
//! @param usArgsLength length of the arguments
|
||||
//! @param ucTail pointer to the data buffer
|
||||
//! @param usTailLength buffer length
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Initiate an HCI data write operation
|
||||
//
|
||||
//*****************************************************************************
|
||||
long
|
||||
hci_data_send(unsigned char ucOpcode,
|
||||
unsigned char *ucArgs,
|
||||
unsigned short usArgsLength,
|
||||
unsigned short usDataLength,
|
||||
const unsigned char *ucTail,
|
||||
unsigned short usTailLength)
|
||||
{
|
||||
unsigned char *stream;
|
||||
|
||||
stream = ((ucArgs) + SPI_HEADER_SIZE);
|
||||
|
||||
UINT8_TO_STREAM(stream, HCI_TYPE_DATA);
|
||||
UINT8_TO_STREAM(stream, ucOpcode);
|
||||
UINT8_TO_STREAM(stream, usArgsLength);
|
||||
stream = UINT16_TO_STREAM(stream, usArgsLength + usDataLength + usTailLength);
|
||||
|
||||
// Send the packet over the SPI
|
||||
SpiWrite(ucArgs, SIMPLE_LINK_HCI_DATA_HEADER_SIZE + usArgsLength + usDataLength + usTailLength);
|
||||
|
||||
return(ESUCCESS);
|
||||
}
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! hci_data_command_send
|
||||
//!
|
||||
//! @param usOpcode command operation code
|
||||
//! @param pucBuff pointer to the data buffer
|
||||
//! @param ucArgsLength arguments length
|
||||
//! @param ucDataLength data length
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Prepeare HCI header and initiate an HCI data write operation
|
||||
//
|
||||
//*****************************************************************************
|
||||
void hci_data_command_send(unsigned short usOpcode, unsigned char *pucBuff,
|
||||
unsigned char ucArgsLength,unsigned short ucDataLength)
|
||||
{
|
||||
unsigned char *stream = (pucBuff + SPI_HEADER_SIZE);
|
||||
|
||||
UINT8_TO_STREAM(stream, HCI_TYPE_DATA);
|
||||
UINT8_TO_STREAM(stream, usOpcode);
|
||||
UINT8_TO_STREAM(stream, ucArgsLength);
|
||||
stream = UINT16_TO_STREAM(stream, ucArgsLength + ucDataLength);
|
||||
|
||||
// Send the command over SPI on data channel
|
||||
SpiWrite(pucBuff, ucArgsLength + ucDataLength + SIMPLE_LINK_HCI_DATA_CMND_HEADER_SIZE);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! hci_patch_send
|
||||
//!
|
||||
//! @param usOpcode command operation code
|
||||
//! @param pucBuff pointer to the command's arguments buffer
|
||||
//! @param patch pointer to patch content buffer
|
||||
//! @param usDataLength data length
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Prepeare HCI header and initiate an HCI patch write operation
|
||||
//
|
||||
//*****************************************************************************
|
||||
void
|
||||
hci_patch_send(unsigned char ucOpcode, unsigned char *pucBuff, char *patch, unsigned short usDataLength)
|
||||
{
|
||||
unsigned char *data_ptr = (pucBuff + SPI_HEADER_SIZE);
|
||||
unsigned short usTransLength;
|
||||
unsigned char *stream = (pucBuff + SPI_HEADER_SIZE);
|
||||
|
||||
UINT8_TO_STREAM(stream, HCI_TYPE_PATCH);
|
||||
UINT8_TO_STREAM(stream, ucOpcode);
|
||||
stream = UINT16_TO_STREAM(stream, usDataLength + SIMPLE_LINK_HCI_PATCH_HEADER_SIZE);
|
||||
|
||||
if (usDataLength <= SL_PATCH_PORTION_SIZE)
|
||||
{
|
||||
UINT16_TO_STREAM(stream, usDataLength);
|
||||
stream = UINT16_TO_STREAM(stream, usDataLength);
|
||||
memcpy((pucBuff + SPI_HEADER_SIZE) + HCI_PATCH_HEADER_SIZE, patch, usDataLength);
|
||||
|
||||
// Update the opcode of the event we will be waiting for
|
||||
SpiWrite(pucBuff, usDataLength + HCI_PATCH_HEADER_SIZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
usTransLength = (usDataLength/SL_PATCH_PORTION_SIZE);
|
||||
UINT16_TO_STREAM(stream, usDataLength + SIMPLE_LINK_HCI_PATCH_HEADER_SIZE + usTransLength*SIMPLE_LINK_HCI_PATCH_HEADER_SIZE);
|
||||
stream = UINT16_TO_STREAM(stream, SL_PATCH_PORTION_SIZE);
|
||||
memcpy(pucBuff + SPI_HEADER_SIZE + HCI_PATCH_HEADER_SIZE, patch, SL_PATCH_PORTION_SIZE);
|
||||
usDataLength -= SL_PATCH_PORTION_SIZE;
|
||||
patch += SL_PATCH_PORTION_SIZE;
|
||||
|
||||
// Update the opcode of the event we will be waiting for
|
||||
SpiWrite(pucBuff, SL_PATCH_PORTION_SIZE + HCI_PATCH_HEADER_SIZE);
|
||||
|
||||
while (usDataLength)
|
||||
{
|
||||
cc3k_int_poll();
|
||||
|
||||
if (usDataLength <= SL_PATCH_PORTION_SIZE)
|
||||
{
|
||||
usTransLength = usDataLength;
|
||||
usDataLength = 0;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
usTransLength = SL_PATCH_PORTION_SIZE;
|
||||
usDataLength -= usTransLength;
|
||||
}
|
||||
|
||||
*(unsigned short *)data_ptr = usTransLength;
|
||||
memcpy(data_ptr + SIMPLE_LINK_HCI_PATCH_HEADER_SIZE, patch, usTransLength);
|
||||
patch += usTransLength;
|
||||
|
||||
// Update the opcode of the event we will be waiting for
|
||||
SpiWrite((unsigned char *)data_ptr, usTransLength + sizeof(usTransLength));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Close the Doxygen group.
|
||||
//! @}
|
||||
//
|
||||
//
|
||||
//*****************************************************************************
|
||||
@@ -1,336 +0,0 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* hci.h - CC3000 Host Driver Implementation.
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* Adapted for use with the Arduino/AVR by KTOWN (Kevin Townsend)
|
||||
* & Limor Fried for Adafruit Industries
|
||||
* This library works with the Adafruit CC3000 breakout
|
||||
* ----> https://www.adafruit.com/products/1469
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __HCI_H__
|
||||
#define __HCI_H__
|
||||
|
||||
#include "cc3000_common.h"
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// If building with a C++ compiler, make all of the definitions in this header
|
||||
// have a C binding.
|
||||
//
|
||||
//*****************************************************************************
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#define SPI_HEADER_SIZE (5)
|
||||
#define SIMPLE_LINK_HCI_CMND_HEADER_SIZE (4)
|
||||
#define HEADERS_SIZE_CMD (SPI_HEADER_SIZE + SIMPLE_LINK_HCI_CMND_HEADER_SIZE)
|
||||
#define SIMPLE_LINK_HCI_DATA_CMND_HEADER_SIZE (5)
|
||||
#define SIMPLE_LINK_HCI_DATA_HEADER_SIZE (5)
|
||||
#define SIMPLE_LINK_HCI_PATCH_HEADER_SIZE (2)
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Values that can be used as HCI Commands and HCI Packet header defines
|
||||
//
|
||||
//*****************************************************************************
|
||||
#define HCI_TYPE_CMND 0x1
|
||||
#define HCI_TYPE_DATA 0x2
|
||||
#define HCI_TYPE_PATCH 0x3
|
||||
#define HCI_TYPE_EVNT 0x4
|
||||
|
||||
|
||||
#define HCI_EVENT_PATCHES_DRV_REQ (1)
|
||||
#define HCI_EVENT_PATCHES_FW_REQ (2)
|
||||
#define HCI_EVENT_PATCHES_BOOTLOAD_REQ (3)
|
||||
|
||||
|
||||
#define HCI_CMND_WLAN_BASE (0x0000)
|
||||
#define HCI_CMND_WLAN_CONNECT 0x0001
|
||||
#define HCI_CMND_WLAN_DISCONNECT 0x0002
|
||||
#define HCI_CMND_WLAN_IOCTL_SET_SCANPARAM 0x0003
|
||||
#define HCI_CMND_WLAN_IOCTL_SET_CONNECTION_POLICY 0x0004
|
||||
#define HCI_CMND_WLAN_IOCTL_ADD_PROFILE 0x0005
|
||||
#define HCI_CMND_WLAN_IOCTL_DEL_PROFILE 0x0006
|
||||
#define HCI_CMND_WLAN_IOCTL_GET_SCAN_RESULTS 0x0007
|
||||
#define HCI_CMND_EVENT_MASK 0x0008
|
||||
#define HCI_CMND_WLAN_IOCTL_STATUSGET 0x0009
|
||||
#define HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_START 0x000A
|
||||
#define HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_STOP 0x000B
|
||||
#define HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_SET_PREFIX 0x000C
|
||||
#define HCI_CMND_WLAN_CONFIGURE_PATCH 0x000D
|
||||
|
||||
|
||||
#define HCI_CMND_SOCKET_BASE 0x1000
|
||||
#define HCI_CMND_SOCKET 0x1001
|
||||
#define HCI_CMND_BIND 0x1002
|
||||
#define HCI_CMND_RECV 0x1004
|
||||
#define HCI_CMND_ACCEPT 0x1005
|
||||
#define HCI_CMND_LISTEN 0x1006
|
||||
#define HCI_CMND_CONNECT 0x1007
|
||||
#define HCI_CMND_BSD_SELECT 0x1008
|
||||
#define HCI_CMND_SETSOCKOPT 0x1009
|
||||
#define HCI_CMND_GETSOCKOPT 0x100A
|
||||
#define HCI_CMND_CLOSE_SOCKET 0x100B
|
||||
#define HCI_CMND_RECVFROM 0x100D
|
||||
#define HCI_CMND_GETHOSTNAME 0x1010
|
||||
#define HCI_CMND_MDNS_ADVERTISE 0x1011
|
||||
|
||||
|
||||
#define HCI_DATA_BASE 0x80
|
||||
|
||||
#define HCI_CMND_SEND (0x01 + HCI_DATA_BASE)
|
||||
#define HCI_CMND_SENDTO (0x03 + HCI_DATA_BASE)
|
||||
#define HCI_DATA_BSD_RECVFROM (0x04 + HCI_DATA_BASE)
|
||||
#define HCI_DATA_BSD_RECV (0x05 + HCI_DATA_BASE)
|
||||
|
||||
|
||||
#define HCI_CMND_NVMEM_CBASE (0x0200)
|
||||
|
||||
|
||||
#define HCI_CMND_NVMEM_CREATE_ENTRY (0x0203)
|
||||
#define HCI_CMND_NVMEM_SWAP_ENTRY (0x0205)
|
||||
#define HCI_CMND_NVMEM_READ (0x0201)
|
||||
#define HCI_CMND_NVMEM_WRITE (0x0090)
|
||||
#define HCI_CMND_NVMEM_WRITE_PATCH (0x0204)
|
||||
#define HCI_CMND_READ_SP_VERSION (0x0207)
|
||||
|
||||
#define HCI_CMND_READ_BUFFER_SIZE 0x400B
|
||||
#define HCI_CMND_SIMPLE_LINK_START 0x4000
|
||||
|
||||
#define HCI_CMND_NETAPP_BASE 0x2000
|
||||
|
||||
#define HCI_NETAPP_DHCP (0x0001 + HCI_CMND_NETAPP_BASE)
|
||||
#define HCI_NETAPP_PING_SEND (0x0002 + HCI_CMND_NETAPP_BASE)
|
||||
#define HCI_NETAPP_PING_REPORT (0x0003 + HCI_CMND_NETAPP_BASE)
|
||||
#define HCI_NETAPP_PING_STOP (0x0004 + HCI_CMND_NETAPP_BASE)
|
||||
#define HCI_NETAPP_IPCONFIG (0x0005 + HCI_CMND_NETAPP_BASE)
|
||||
#define HCI_NETAPP_ARP_FLUSH (0x0006 + HCI_CMND_NETAPP_BASE)
|
||||
#define HCI_NETAPP_SET_DEBUG_LEVEL (0x0008 + HCI_CMND_NETAPP_BASE)
|
||||
#define HCI_NETAPP_SET_TIMERS (0x0009 + HCI_CMND_NETAPP_BASE)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Values that can be used as HCI Events defines
|
||||
//
|
||||
//*****************************************************************************
|
||||
#define HCI_EVNT_WLAN_BASE 0x0000
|
||||
#define HCI_EVNT_WLAN_CONNECT 0x0001
|
||||
#define HCI_EVNT_WLAN_DISCONNECT \
|
||||
0x0002
|
||||
#define HCI_EVNT_WLAN_IOCTL_ADD_PROFILE \
|
||||
0x0005
|
||||
|
||||
|
||||
#define HCI_EVNT_SOCKET HCI_CMND_SOCKET
|
||||
#define HCI_EVNT_BIND HCI_CMND_BIND
|
||||
#define HCI_EVNT_RECV HCI_CMND_RECV
|
||||
#define HCI_EVNT_ACCEPT HCI_CMND_ACCEPT
|
||||
#define HCI_EVNT_LISTEN HCI_CMND_LISTEN
|
||||
#define HCI_EVNT_CONNECT HCI_CMND_CONNECT
|
||||
#define HCI_EVNT_SELECT HCI_CMND_BSD_SELECT
|
||||
#define HCI_EVNT_CLOSE_SOCKET HCI_CMND_CLOSE_SOCKET
|
||||
#define HCI_EVNT_RECVFROM HCI_CMND_RECVFROM
|
||||
#define HCI_EVNT_SETSOCKOPT HCI_CMND_SETSOCKOPT
|
||||
#define HCI_EVNT_GETSOCKOPT HCI_CMND_GETSOCKOPT
|
||||
#define HCI_EVNT_BSD_GETHOSTBYNAME HCI_CMND_GETHOSTNAME
|
||||
#define HCI_EVNT_MDNS_ADVERTISE HCI_CMND_MDNS_ADVERTISE
|
||||
|
||||
#define HCI_EVNT_SEND 0x1003
|
||||
#define HCI_EVNT_WRITE 0x100E
|
||||
#define HCI_EVNT_SENDTO 0x100F
|
||||
|
||||
#define HCI_EVNT_PATCHES_REQ 0x1000
|
||||
|
||||
#define HCI_EVNT_UNSOL_BASE 0x4000
|
||||
|
||||
#define HCI_EVNT_WLAN_UNSOL_BASE (0x8000)
|
||||
|
||||
#define HCI_EVNT_WLAN_UNSOL_CONNECT (0x0001 + HCI_EVNT_WLAN_UNSOL_BASE)
|
||||
#define HCI_EVNT_WLAN_UNSOL_DISCONNECT (0x0002 + HCI_EVNT_WLAN_UNSOL_BASE)
|
||||
#define HCI_EVNT_WLAN_UNSOL_INIT (0x0004 + HCI_EVNT_WLAN_UNSOL_BASE)
|
||||
#define HCI_EVNT_WLAN_TX_COMPLETE (0x0008 + HCI_EVNT_WLAN_UNSOL_BASE)
|
||||
#define HCI_EVNT_WLAN_UNSOL_DHCP (0x0010 + HCI_EVNT_WLAN_UNSOL_BASE)
|
||||
#define HCI_EVNT_WLAN_ASYNC_PING_REPORT (0x0040 + HCI_EVNT_WLAN_UNSOL_BASE)
|
||||
#define HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE (0x0080 + HCI_EVNT_WLAN_UNSOL_BASE)
|
||||
#define HCI_EVNT_WLAN_KEEPALIVE (0x0200 + HCI_EVNT_WLAN_UNSOL_BASE)
|
||||
#define HCI_EVNT_BSD_TCP_CLOSE_WAIT (0x0800 + HCI_EVNT_WLAN_UNSOL_BASE)
|
||||
|
||||
#define HCI_EVNT_DATA_UNSOL_FREE_BUFF \
|
||||
0x4100
|
||||
|
||||
#define HCI_EVNT_NVMEM_CREATE_ENTRY \
|
||||
HCI_CMND_NVMEM_CREATE_ENTRY
|
||||
#define HCI_EVNT_NVMEM_SWAP_ENTRY HCI_CMND_NVMEM_SWAP_ENTRY
|
||||
|
||||
#define HCI_EVNT_NVMEM_READ HCI_CMND_NVMEM_READ
|
||||
#define HCI_EVNT_NVMEM_WRITE (0x0202)
|
||||
|
||||
#define HCI_EVNT_READ_SP_VERSION \
|
||||
HCI_CMND_READ_SP_VERSION
|
||||
|
||||
#define HCI_EVNT_INPROGRESS 0xFFFF
|
||||
|
||||
|
||||
#define HCI_DATA_RECVFROM 0x84
|
||||
#define HCI_DATA_RECV 0x85
|
||||
#define HCI_DATA_NVMEM 0x91
|
||||
|
||||
#define HCI_EVENT_CC3000_CAN_SHUT_DOWN 0x99
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Prototypes for the structures for APIs.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
#define HCI_DATA_HEADER_SIZE (5)
|
||||
#define HCI_EVENT_HEADER_SIZE (5)
|
||||
#define HCI_DATA_CMD_HEADER_SIZE (5)
|
||||
#define HCI_PATCH_HEADER_SIZE (6)
|
||||
|
||||
#define HCI_PACKET_TYPE_OFFSET (0)
|
||||
#define HCI_PACKET_ARGSIZE_OFFSET (2)
|
||||
#define HCI_PACKET_LENGTH_OFFSET (3)
|
||||
|
||||
|
||||
#define HCI_EVENT_OPCODE_OFFSET (1)
|
||||
#define HCI_EVENT_LENGTH_OFFSET (3)
|
||||
#define HCI_EVENT_STATUS_OFFSET (4)
|
||||
#define HCI_DATA_LENGTH_OFFSET (3)
|
||||
|
||||
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Prototypes for the APIs.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! hci_command_send
|
||||
//!
|
||||
//! @param usOpcode command operation code
|
||||
//! @param pucBuff pointer to the command's arguments buffer
|
||||
//! @param ucArgsLength length of the arguments
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Initiate an HCI command.
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern unsigned short hci_command_send(unsigned short usOpcode,
|
||||
unsigned char *ucArgs,
|
||||
unsigned char ucArgsLength);
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! hci_data_send
|
||||
//!
|
||||
//! @param usOpcode command operation code
|
||||
//! @param ucArgs pointer to the command's arguments buffer
|
||||
//! @param usArgsLength length of the arguments
|
||||
//! @param ucTail pointer to the data buffer
|
||||
//! @param usTailLength buffer length
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Initiate an HCI data write operation
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern long hci_data_send(unsigned char ucOpcode,
|
||||
unsigned char *ucArgs,
|
||||
unsigned short usArgsLength,
|
||||
unsigned short usDataLength,
|
||||
const unsigned char *ucTail,
|
||||
unsigned short usTailLength);
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! hci_data_command_send
|
||||
//!
|
||||
//! @param usOpcode command operation code
|
||||
//! @param pucBuff pointer to the data buffer
|
||||
//! @param ucArgsLength arguments length
|
||||
//! @param ucDataLength data length
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Prepare HCI header and initiate an HCI data write operation
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern void hci_data_command_send(unsigned short usOpcode, unsigned char *pucBuff,
|
||||
unsigned char ucArgsLength, unsigned short ucDataLength);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! hci_patch_send
|
||||
//!
|
||||
//! @param usOpcode command operation code
|
||||
//! @param pucBuff pointer to the command's arguments buffer
|
||||
//! @param patch pointer to patch content buffer
|
||||
//! @param usDataLength data length
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Prepare HCI header and initiate an HCI patch write operation
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern void hci_patch_send(unsigned char ucOpcode, unsigned char *pucBuff, char *patch, unsigned short usDataLength);
|
||||
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Mark the end of the C bindings section for C++ compilers.
|
||||
//
|
||||
//*****************************************************************************
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
||||
#endif // __HCI_H__
|
||||
@@ -1,55 +0,0 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* host_driver_version.h - CC3000 Host Driver Implementation.
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __HOST_DRIVER_VERSION_H__
|
||||
#define __HOST_DRIVER_VERSION_H__
|
||||
|
||||
#define DRIVER_VERSION_NUMBER 13
|
||||
|
||||
|
||||
|
||||
#endif // __VERSION_H__
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,476 +0,0 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* netapp.c - CC3000 Host Driver Implementation.
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* Adapted for use with the Arduino/AVR by KTOWN (Kevin Townsend)
|
||||
* & Limor Fried for Adafruit Industries
|
||||
* This library works with the Adafruit CC3000 breakout
|
||||
* ----> https://www.adafruit.com/products/1469
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#include <string.h>
|
||||
#include "netapp.h"
|
||||
#include "hci.h"
|
||||
#include "socket.h"
|
||||
#include "evnt_handler.h"
|
||||
#include "nvmem.h"
|
||||
|
||||
#define MIN_TIMER_VAL_SECONDS 20
|
||||
#define MIN_TIMER_SET(t) if ((0 != t) && (t < MIN_TIMER_VAL_SECONDS)) \
|
||||
{ \
|
||||
t = MIN_TIMER_VAL_SECONDS; \
|
||||
}
|
||||
|
||||
|
||||
#define NETAPP_DHCP_PARAMS_LEN (20)
|
||||
#define NETAPP_SET_TIMER_PARAMS_LEN (20)
|
||||
#define NETAPP_SET_DEBUG_LEVEL_PARAMS_LEN (4)
|
||||
#define NETAPP_PING_SEND_PARAMS_LEN (16)
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! netapp_config_mac_adrress
|
||||
//!
|
||||
//! @param mac device mac address, 6 bytes. Saved: yes
|
||||
//!
|
||||
//! @return return on success 0, otherwise error.
|
||||
//!
|
||||
//! @brief Configure device MAC address and store it in NVMEM.
|
||||
//! The value of the MAC address configured through the API will
|
||||
//! be stored in CC3000 non volatile memory, thus preserved
|
||||
//! over resets.
|
||||
//
|
||||
//*****************************************************************************
|
||||
long netapp_config_mac_adrress(unsigned char * mac)
|
||||
{
|
||||
return nvmem_set_mac_address(mac);
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! netapp_dhcp
|
||||
//!
|
||||
//! @param aucIP device mac address, 6 bytes. Saved: yes
|
||||
//! @param aucSubnetMask device mac address, 6 bytes. Saved: yes
|
||||
//! @param aucDefaultGateway device mac address, 6 bytes. Saved: yes
|
||||
//! @param aucDNSServer device mac address, 6 bytes. Saved: yes
|
||||
//!
|
||||
//! @return return on success 0, otherwise error.
|
||||
//!
|
||||
//! @brief netapp_dhcp is used to configure the network interface,
|
||||
//! static or dynamic (DHCP).\n In order to activate DHCP mode,
|
||||
//! aucIP, aucSubnetMask, aucDefaultGateway must be 0.
|
||||
//! The default mode of CC3000 is DHCP mode.
|
||||
//! Note that the configuration is saved in non volatile memory
|
||||
//! and thus preserved over resets.
|
||||
//!
|
||||
//! @note If the mode is altered a reset of CC3000 device is required
|
||||
//! in order to apply changes.\nAlso note that asynchronous event
|
||||
//! of DHCP_EVENT, which is generated when an IP address is
|
||||
//! allocated either by the DHCP server or due to static
|
||||
//! allocation is generated only upon a connection to the
|
||||
//! AP was established.
|
||||
//!
|
||||
//*****************************************************************************
|
||||
long netapp_dhcp(unsigned long *aucIP, unsigned long *aucSubnetMask,unsigned long *aucDefaultGateway, unsigned long *aucDNSServer)
|
||||
{
|
||||
signed char scRet;
|
||||
unsigned char *ptr;
|
||||
unsigned char *args;
|
||||
|
||||
scRet = EFAIL;
|
||||
ptr = tSLInformation.pucTxCommandBuffer;
|
||||
args = (ptr + HEADERS_SIZE_CMD);
|
||||
|
||||
// Fill in temporary command buffer
|
||||
ARRAY_TO_STREAM(args,aucIP,4);
|
||||
ARRAY_TO_STREAM(args,aucSubnetMask,4);
|
||||
ARRAY_TO_STREAM(args,aucDefaultGateway,4);
|
||||
args = UINT32_TO_STREAM(args, 0);
|
||||
ARRAY_TO_STREAM(args,aucDNSServer,4);
|
||||
|
||||
// Initiate a HCI command
|
||||
hci_command_send(HCI_NETAPP_DHCP, ptr, NETAPP_DHCP_PARAMS_LEN);
|
||||
|
||||
// Wait for command complete event
|
||||
SimpleLinkWaitEvent(HCI_NETAPP_DHCP, &scRet);
|
||||
|
||||
return(scRet);
|
||||
}
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! netapp_timeout_values
|
||||
//!
|
||||
//! @param aucDHCP DHCP lease time request, also impact
|
||||
//! the DHCP renew timeout. Range: [0-0xffffffff] seconds,
|
||||
//! 0 or 0xffffffff == infinity lease timeout.
|
||||
//! Resolution:10 seconds. Influence: only after
|
||||
//! reconnecting to the AP.
|
||||
//! Minimal bound value: MIN_TIMER_VAL_SECONDS - 20 seconds.
|
||||
//! The parameter is saved into the CC3000 NVMEM.
|
||||
//! The default value on CC3000 is 14400 seconds.
|
||||
//!
|
||||
//! @param aucARP ARP refresh timeout, if ARP entry is not updated by
|
||||
//! incoming packet, the ARP entry will be deleted by
|
||||
//! the end of the timeout.
|
||||
//! Range: [0-0xffffffff] seconds, 0 == infinity ARP timeout
|
||||
//! Resolution: 10 seconds. Influence: on runtime.
|
||||
//! Minimal bound value: MIN_TIMER_VAL_SECONDS - 20 seconds
|
||||
//! The parameter is saved into the CC3000 NVMEM.
|
||||
//! The default value on CC3000 is 3600 seconds.
|
||||
//!
|
||||
//! @param aucKeepalive Keepalive event sent by the end of keepalive timeout
|
||||
//! Range: [0-0xffffffff] seconds, 0 == infinity timeout
|
||||
//! Resolution: 10 seconds.
|
||||
//! Influence: on runtime.
|
||||
//! Minimal bound value: MIN_TIMER_VAL_SECONDS - 20 sec
|
||||
//! The parameter is saved into the CC3000 NVMEM.
|
||||
//! The default value on CC3000 is 10 seconds.
|
||||
//!
|
||||
//! @param aucInactivity Socket inactivity timeout, socket timeout is
|
||||
//! refreshed by incoming or outgoing packet, by the
|
||||
//! end of the socket timeout the socket will be closed
|
||||
//! Range: [0-0xffffffff] sec, 0 == infinity timeout.
|
||||
//! Resolution: 10 seconds. Influence: on runtime.
|
||||
//! Minimal bound value: MIN_TIMER_VAL_SECONDS - 20 sec
|
||||
//! The parameter is saved into the CC3000 NVMEM.
|
||||
//! The default value on CC3000 is 60 seconds.
|
||||
//!
|
||||
//! @return return on success 0, otherwise error.
|
||||
//!
|
||||
//! @brief Set new timeout values. Function set new timeout values for:
|
||||
//! DHCP lease timeout, ARP refresh timeout, keepalive event
|
||||
//! timeout and socket inactivity timeout
|
||||
//!
|
||||
//! @note If a parameter set to non zero value which is less than 20s,
|
||||
//! it will be set automatically to 20s.
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
long
|
||||
netapp_timeout_values(unsigned long *aucDHCP, unsigned long *aucARP,unsigned long *aucKeepalive, unsigned long *aucInactivity)
|
||||
{
|
||||
signed char scRet;
|
||||
unsigned char *ptr;
|
||||
unsigned char *args;
|
||||
|
||||
scRet = EFAIL;
|
||||
ptr = tSLInformation.pucTxCommandBuffer;
|
||||
args = (ptr + HEADERS_SIZE_CMD);
|
||||
|
||||
// Set minimal values of timers
|
||||
MIN_TIMER_SET(*aucDHCP)
|
||||
MIN_TIMER_SET(*aucARP)
|
||||
MIN_TIMER_SET(*aucKeepalive)
|
||||
MIN_TIMER_SET(*aucInactivity)
|
||||
|
||||
// Fill in temporary command buffer
|
||||
args = UINT32_TO_STREAM(args, *aucDHCP);
|
||||
args = UINT32_TO_STREAM(args, *aucARP);
|
||||
args = UINT32_TO_STREAM(args, *aucKeepalive);
|
||||
args = UINT32_TO_STREAM(args, *aucInactivity);
|
||||
|
||||
// Initiate a HCI command
|
||||
hci_command_send(HCI_NETAPP_SET_TIMERS, ptr, NETAPP_SET_TIMER_PARAMS_LEN);
|
||||
|
||||
// Wait for command complete event
|
||||
SimpleLinkWaitEvent(HCI_NETAPP_SET_TIMERS, &scRet);
|
||||
|
||||
return(scRet);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! netapp_ping_send
|
||||
//!
|
||||
//! @param ip destination IP address
|
||||
//! @param pingAttempts number of echo requests to send
|
||||
//! @param pingSize send buffer size which may be up to 1400 bytes
|
||||
//! @param pingTimeout Time to wait for a response,in milliseconds.
|
||||
//!
|
||||
//! @return return on success 0, otherwise error.
|
||||
//!
|
||||
//! @brief send ICMP ECHO_REQUEST to network hosts
|
||||
//!
|
||||
//! @note If an operation finished successfully asynchronous ping report
|
||||
//! event will be generated. The report structure is as defined
|
||||
//! by structure netapp_pingreport_args_t.
|
||||
//!
|
||||
//! @warning Calling this function while a previous Ping Requests are in
|
||||
//! progress will stop the previous ping request.
|
||||
//*****************************************************************************
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
long
|
||||
netapp_ping_send(uint32_t *ip, uint32_t ulPingAttempts, uint32_t ulPingSize, uint32_t ulPingTimeout)
|
||||
{
|
||||
signed char scRet;
|
||||
unsigned char *ptr, *args;
|
||||
|
||||
scRet = EFAIL;
|
||||
ptr = tSLInformation.pucTxCommandBuffer;
|
||||
args = (ptr + HEADERS_SIZE_CMD);
|
||||
|
||||
// Fill in temporary command buffer
|
||||
args = UINT32_TO_STREAM(args, *ip);
|
||||
args = UINT32_TO_STREAM(args, ulPingAttempts);
|
||||
args = UINT32_TO_STREAM(args, ulPingSize);
|
||||
args = UINT32_TO_STREAM(args, ulPingTimeout);
|
||||
|
||||
/*
|
||||
if (CC3KPrinter != 0)
|
||||
{
|
||||
for(uint8_t i=0; i<4+4+4+4; i++) {
|
||||
CC3KPrinter->print(" 0x"); CC3KPrinter->( (ptr + HEADERS_SIZE_CMD)[i], HEX);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
// Initiate a HCI command
|
||||
hci_command_send(HCI_NETAPP_PING_SEND, ptr, NETAPP_PING_SEND_PARAMS_LEN);
|
||||
|
||||
// Wait for command complete event
|
||||
SimpleLinkWaitEvent(HCI_NETAPP_PING_SEND, &scRet);
|
||||
|
||||
return(scRet);
|
||||
}
|
||||
#endif
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! netapp_ping_report
|
||||
//!
|
||||
//! @param none
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Request for ping status. This API triggers the CC3000 to send
|
||||
//! asynchronous events: HCI_EVNT_WLAN_ASYNC_PING_REPORT.
|
||||
//! This event will carry the report structure:
|
||||
//! netapp_pingreport_args_t. This structure is filled in with ping
|
||||
//! results up till point of triggering API.
|
||||
//! netapp_pingreport_args_t:\n packets_sent - echo sent,
|
||||
//! packets_received - echo reply, min_round_time - minimum
|
||||
//! round time, max_round_time - max round time,
|
||||
//! avg_round_time - average round time
|
||||
//!
|
||||
//! @note When a ping operation is not active, the returned structure
|
||||
//! fields are 0.
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
void netapp_ping_report()
|
||||
{
|
||||
unsigned char *ptr;
|
||||
ptr = tSLInformation.pucTxCommandBuffer;
|
||||
signed char scRet;
|
||||
|
||||
scRet = EFAIL;
|
||||
|
||||
// Initiate a HCI command
|
||||
hci_command_send(HCI_NETAPP_PING_REPORT, ptr, 0);
|
||||
|
||||
// Wait for command complete event
|
||||
SimpleLinkWaitEvent(HCI_NETAPP_PING_REPORT, &scRet);
|
||||
}
|
||||
#endif
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! netapp_ping_stop
|
||||
//!
|
||||
//! @param none
|
||||
//!
|
||||
//! @return On success, zero is returned. On error, -1 is returned.
|
||||
//!
|
||||
//! @brief Stop any ping request.
|
||||
//!
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
long netapp_ping_stop()
|
||||
{
|
||||
signed char scRet;
|
||||
unsigned char *ptr;
|
||||
|
||||
scRet = EFAIL;
|
||||
ptr = tSLInformation.pucTxCommandBuffer;
|
||||
|
||||
// Initiate a HCI command
|
||||
hci_command_send(HCI_NETAPP_PING_STOP, ptr, 0);
|
||||
|
||||
// Wait for command complete event
|
||||
SimpleLinkWaitEvent(HCI_NETAPP_PING_STOP, &scRet);
|
||||
|
||||
return(scRet);
|
||||
}
|
||||
#endif
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! netapp_ipconfig
|
||||
//!
|
||||
//! @param[out] ipconfig This argument is a pointer to a
|
||||
//! tNetappIpconfigRetArgs structure. This structure is
|
||||
//! filled in with the network interface configuration.
|
||||
//! tNetappIpconfigRetArgs:\n aucIP - ip address,
|
||||
//! aucSubnetMask - mask, aucDefaultGateway - default
|
||||
//! gateway address, aucDHCPServer - dhcp server address
|
||||
//! aucDNSServer - dns server address, uaMacAddr - mac
|
||||
//! address, uaSSID - connected AP ssid
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Obtain the CC3000 Network interface information.
|
||||
//! Note that the information is available only after the WLAN
|
||||
//! connection was established. Calling this function before
|
||||
//! associated, will cause non-defined values to be returned.
|
||||
//!
|
||||
//! @note The function is useful for figuring out the IP Configuration of
|
||||
//! the device when DHCP is used and for figuring out the SSID of
|
||||
//! the Wireless network the device is associated with.
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
void netapp_ipconfig( tNetappIpconfigRetArgs * ipconfig )
|
||||
{
|
||||
unsigned char *ptr;
|
||||
|
||||
ptr = tSLInformation.pucTxCommandBuffer;
|
||||
|
||||
// Initiate a HCI command
|
||||
hci_command_send(HCI_NETAPP_IPCONFIG, ptr, 0);
|
||||
|
||||
// Wait for command complete event
|
||||
SimpleLinkWaitEvent(HCI_NETAPP_IPCONFIG, ipconfig );
|
||||
|
||||
}
|
||||
#else
|
||||
void netapp_ipconfig( tNetappIpconfigRetArgs * ipconfig )
|
||||
{
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! netapp_arp_flush
|
||||
//!
|
||||
//! @param none
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Flushes ARP table
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
long netapp_arp_flush(void)
|
||||
{
|
||||
signed char scRet;
|
||||
unsigned char *ptr;
|
||||
|
||||
scRet = EFAIL;
|
||||
ptr = tSLInformation.pucTxCommandBuffer;
|
||||
|
||||
// Initiate a HCI command
|
||||
hci_command_send(HCI_NETAPP_ARP_FLUSH, ptr, 0);
|
||||
|
||||
// Wait for command complete event
|
||||
SimpleLinkWaitEvent(HCI_NETAPP_ARP_FLUSH, &scRet);
|
||||
|
||||
return(scRet);
|
||||
}
|
||||
#endif
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! netapp_set_debug_level
|
||||
//!
|
||||
//! @param[in] level debug level. Bitwise [0-8],
|
||||
//! 0(disable)or 1(enable).\n Bitwise map: 0 - Critical
|
||||
//! message, 1 information message, 2 - core messages, 3 -
|
||||
//! HCI messages, 4 - Network stack messages, 5 - wlan
|
||||
//! messages, 6 - wlan driver messages, 7 - epprom messages,
|
||||
//! 8 - general messages. Default: 0x13f. Saved: no
|
||||
//!
|
||||
//! @return On success, zero is returned. On error, -1 is returned
|
||||
//!
|
||||
//! @brief Debug messages sent via the UART debug channel, this function
|
||||
//! enable/disable the debug level
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
long netapp_set_debug_level(unsigned long ulLevel)
|
||||
{
|
||||
signed char scRet;
|
||||
unsigned char *ptr, *args;
|
||||
|
||||
scRet = EFAIL;
|
||||
ptr = tSLInformation.pucTxCommandBuffer;
|
||||
args = (ptr + HEADERS_SIZE_CMD);
|
||||
|
||||
//
|
||||
// Fill in temporary command buffer
|
||||
//
|
||||
args = UINT32_TO_STREAM(args, ulLevel);
|
||||
|
||||
|
||||
//
|
||||
// Initiate a HCI command
|
||||
//
|
||||
hci_command_send(HCI_NETAPP_SET_DEBUG_LEVEL, ptr, NETAPP_SET_DEBUG_LEVEL_PARAMS_LEN);
|
||||
|
||||
//
|
||||
// Wait for command complete event
|
||||
//
|
||||
SimpleLinkWaitEvent(HCI_NETAPP_SET_DEBUG_LEVEL, &scRet);
|
||||
|
||||
return(scRet);
|
||||
|
||||
}
|
||||
#endif
|
||||
@@ -1,353 +0,0 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* netapp.h - CC3000 Host Driver Implementation.
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* Adapted for use with the Arduino/AVR by KTOWN (Kevin Townsend)
|
||||
* & Limor Fried for Adafruit Industries
|
||||
* This library works with the Adafruit CC3000 breakout
|
||||
* ----> https://www.adafruit.com/products/1469
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __NETAPP_H__
|
||||
#define __NETAPP_H__
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// If building with a C++ compiler, make all of the definitions in this header
|
||||
// have a C binding.
|
||||
//
|
||||
//*****************************************************************************
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! \addtogroup netapp_api
|
||||
//! @{
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
typedef struct _netapp_dhcp_ret_args_t
|
||||
{
|
||||
unsigned char aucIP[4];
|
||||
unsigned char aucSubnetMask[4];
|
||||
unsigned char aucDefaultGateway[4];
|
||||
unsigned char aucDHCPServer[4];
|
||||
unsigned char aucDNSServer[4];
|
||||
}tNetappDhcpParams;
|
||||
|
||||
typedef struct _netapp_ipconfig_ret_args_t
|
||||
{
|
||||
unsigned char aucIP[4];
|
||||
unsigned char aucSubnetMask[4];
|
||||
unsigned char aucDefaultGateway[4];
|
||||
unsigned char aucDHCPServer[4];
|
||||
unsigned char aucDNSServer[4];
|
||||
unsigned char uaMacAddr[6];
|
||||
unsigned char uaSSID[32];
|
||||
}tNetappIpconfigRetArgs;
|
||||
|
||||
|
||||
/*Ping send report parameters*/
|
||||
typedef struct _netapp_pingreport_args
|
||||
{
|
||||
unsigned long packets_sent;
|
||||
unsigned long packets_received;
|
||||
unsigned long min_round_time;
|
||||
unsigned long max_round_time;
|
||||
unsigned long avg_round_time;
|
||||
} netapp_pingreport_args_t;
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! netapp_config_mac_adrress
|
||||
//!
|
||||
//! @param mac device mac address, 6 bytes. Saved: yes
|
||||
//!
|
||||
//! @return return on success 0, otherwise error.
|
||||
//!
|
||||
//! @brief Configure device MAC address and store it in NVMEM.
|
||||
//! The value of the MAC address configured through the API will
|
||||
//! be stored in CC3000 non volatile memory, thus preserved
|
||||
//! over resets.
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern long netapp_config_mac_adrress( unsigned char *mac );
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! netapp_dhcp
|
||||
//!
|
||||
//! @param aucIP device mac address, 6 bytes. Saved: yes
|
||||
//! @param aucSubnetMask device mac address, 6 bytes. Saved: yes
|
||||
//! @param aucDefaultGateway device mac address, 6 bytes. Saved: yes
|
||||
//! @param aucDNSServer device mac address, 6 bytes. Saved: yes
|
||||
//!
|
||||
//! @return return on success 0, otherwise error.
|
||||
//!
|
||||
//! @brief netapp_dhcp is used to configure the network interface,
|
||||
//! static or dynamic (DHCP).\n In order to activate DHCP mode,
|
||||
//! aucIP, aucSubnetMask, aucDefaultGateway must be 0.
|
||||
//! The default mode of CC3000 is DHCP mode.
|
||||
//! Note that the configuration is saved in non volatile memory
|
||||
//! and thus preserved over resets.
|
||||
//!
|
||||
//! @note If the mode is altered a reset of CC3000 device is required
|
||||
//! in order to apply changes.\nAlso note that asynchronous event
|
||||
//! of DHCP_EVENT, which is generated when an IP address is
|
||||
//! allocated either by the DHCP server or due to static
|
||||
//! allocation is generated only upon a connection to the
|
||||
//! AP was established.
|
||||
//!
|
||||
//*****************************************************************************
|
||||
extern long netapp_dhcp(unsigned long *aucIP, unsigned long *aucSubnetMask,unsigned long *aucDefaultGateway, unsigned long *aucDNSServer);
|
||||
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! netapp_timeout_values
|
||||
//!
|
||||
//! @param aucDHCP DHCP lease time request, also impact
|
||||
//! the DHCP renew timeout. Range: [0-0xffffffff] seconds,
|
||||
//! 0 or 0xffffffff == infinity lease timeout.
|
||||
//! Resolution:10 seconds. Influence: only after
|
||||
//! reconnecting to the AP.
|
||||
//! Minimal bound value: MIN_TIMER_VAL_SECONDS - 20 seconds.
|
||||
//! The parameter is saved into the CC3000 NVMEM.
|
||||
//! The default value on CC3000 is 14400 seconds.
|
||||
//!
|
||||
//! @param aucARP ARP refresh timeout, if ARP entry is not updated by
|
||||
//! incoming packet, the ARP entry will be deleted by
|
||||
//! the end of the timeout.
|
||||
//! Range: [0-0xffffffff] seconds, 0 == infinity ARP timeout
|
||||
//! Resolution: 10 seconds. Influence: on runtime.
|
||||
//! Minimal bound value: MIN_TIMER_VAL_SECONDS - 20 seconds
|
||||
//! The parameter is saved into the CC3000 NVMEM.
|
||||
//! The default value on CC3000 is 3600 seconds.
|
||||
//!
|
||||
//! @param aucKeepalive Keepalive event sent by the end of keepalive timeout
|
||||
//! Range: [0-0xffffffff] seconds, 0 == infinity timeout
|
||||
//! Resolution: 10 seconds.
|
||||
//! Influence: on runtime.
|
||||
//! Minimal bound value: MIN_TIMER_VAL_SECONDS - 20 sec
|
||||
//! The parameter is saved into the CC3000 NVMEM.
|
||||
//! The default value on CC3000 is 10 seconds.
|
||||
//!
|
||||
//! @param aucInactivity Socket inactivity timeout, socket timeout is
|
||||
//! refreshed by incoming or outgoing packet, by the
|
||||
//! end of the socket timeout the socket will be closed
|
||||
//! Range: [0-0xffffffff] sec, 0 == infinity timeout.
|
||||
//! Resolution: 10 seconds. Influence: on runtime.
|
||||
//! Minimal bound value: MIN_TIMER_VAL_SECONDS - 20 sec
|
||||
//! The parameter is saved into the CC3000 NVMEM.
|
||||
//! The default value on CC3000 is 60 seconds.
|
||||
//!
|
||||
//! @return return on success 0, otherwise error.
|
||||
//!
|
||||
//! @brief Set new timeout values. Function set new timeout values for:
|
||||
//! DHCP lease timeout, ARP refresh timeout, keepalive event
|
||||
//! timeout and socket inactivity timeout
|
||||
//!
|
||||
//! @note If a parameter set to non zero value which is less than 20s,
|
||||
//! it will be set automatically to 20s.
|
||||
//!
|
||||
//*****************************************************************************
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
extern long netapp_timeout_values(unsigned long *aucDHCP, unsigned long *aucARP,unsigned long *aucKeepalive, unsigned long *aucInactivity);
|
||||
#endif
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! netapp_ping_send
|
||||
//!
|
||||
//! @param ip destination IP address
|
||||
//! @param pingAttempts number of echo requests to send
|
||||
//! @param pingSize send buffer size which may be up to 1400 bytes
|
||||
//! @param pingTimeout Time to wait for a response,in milliseconds.
|
||||
//!
|
||||
//! @return return on success 0, otherwise error.
|
||||
//!
|
||||
//! @brief send ICMP ECHO_REQUEST to network hosts
|
||||
//!
|
||||
//! @note If an operation finished successfully asynchronous ping report
|
||||
//! event will be generated. The report structure is as defined
|
||||
//! by structure netapp_pingreport_args_t.
|
||||
//!
|
||||
//! @warning Calling this function while a previous Ping Requests are in
|
||||
//! progress will stop the previous ping request.
|
||||
//*****************************************************************************
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
extern long netapp_ping_send(uint32_t *ip, uint32_t ulPingAttempts, uint32_t ulPingSize, uint32_t ulPingTimeout);
|
||||
#endif
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! netapp_ping_stop
|
||||
//!
|
||||
//! @param none
|
||||
//!
|
||||
//! @return On success, zero is returned. On error, -1 is returned.
|
||||
//!
|
||||
//! @brief Stop any ping request.
|
||||
//!
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
extern long netapp_ping_stop();
|
||||
#endif
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! netapp_ping_report
|
||||
//!
|
||||
//! @param none
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Request for ping status. This API triggers the CC3000 to send
|
||||
//! asynchronous events: HCI_EVNT_WLAN_ASYNC_PING_REPORT.
|
||||
//! This event will carry the report structure:
|
||||
//! netapp_pingreport_args_t. This structure is filled in with ping
|
||||
//! results up till point of triggering API.
|
||||
//! netapp_pingreport_args_t:\n packets_sent - echo sent,
|
||||
//! packets_received - echo reply, min_round_time - minimum
|
||||
//! round time, max_round_time - max round time,
|
||||
//! avg_round_time - average round time
|
||||
//!
|
||||
//! @note When a ping operation is not active, the returned structure
|
||||
//! fields are 0.
|
||||
//!
|
||||
//*****************************************************************************
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
extern void netapp_ping_report();
|
||||
#endif
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! netapp_ipconfig
|
||||
//!
|
||||
//! @param[out] ipconfig This argument is a pointer to a
|
||||
//! tNetappIpconfigRetArgs structure. This structure is
|
||||
//! filled in with the network interface configuration.
|
||||
//! tNetappIpconfigRetArgs:\n aucIP - ip address,
|
||||
//! aucSubnetMask - mask, aucDefaultGateway - default
|
||||
//! gateway address, aucDHCPServer - dhcp server address
|
||||
//! aucDNSServer - dns server address, uaMacAddr - mac
|
||||
//! address, uaSSID - connected AP ssid
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Obtain the CC3000 Network interface information.
|
||||
//! Note that the information is available only after the WLAN
|
||||
//! connection was established. Calling this function before
|
||||
//! associated, will cause non-defined values to be returned.
|
||||
//!
|
||||
//! @note The function is useful for figuring out the IP Configuration of
|
||||
//! the device when DHCP is used and for figuring out the SSID of
|
||||
//! the Wireless network the device is associated with.
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
extern void netapp_ipconfig( tNetappIpconfigRetArgs * ipconfig );
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! netapp_arp_flush
|
||||
//!
|
||||
//! @param none
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Flushes ARP table
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
extern long netapp_arp_flush();
|
||||
#endif
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! netapp_set_debug_level
|
||||
//!
|
||||
//! @param[in] level debug level. Bitwise [0-8],
|
||||
//! 0(disable)or 1(enable).\n Bitwise map: 0 - Critical
|
||||
//! message, 1 information message, 2 - core messages, 3 -
|
||||
//! HCI messages, 4 - Network stack messages, 5 - wlan
|
||||
//! messages, 6 - wlan driver messages, 7 - epprom messages,
|
||||
//! 8 - general messages. Default: 0x13f. Saved: no
|
||||
//!
|
||||
//! @return On success, zero is returned. On error, -1 is returned
|
||||
//!
|
||||
//! @brief Debug messages sent via the UART debug channel, this function
|
||||
//! enable/disable the debug level
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
long netapp_set_debug_level(unsigned long ulLevel);
|
||||
#endif
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Close the Doxygen group.
|
||||
//! @}
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Mark the end of the C bindings section for C++ compilers.
|
||||
//
|
||||
//*****************************************************************************
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
||||
extern Print* CC3KPrinter;
|
||||
|
||||
#endif // __NETAPP_H__
|
||||
|
||||
@@ -1,376 +0,0 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* nvmem.c - CC3000 Host Driver Implementation.
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* Adapted for use with the Arduino/AVR by KTOWN (Kevin Townsend)
|
||||
* & Limor Fried for Adafruit Industries
|
||||
* This library works with the Adafruit CC3000 breakout
|
||||
* ----> https://www.adafruit.com/products/1469
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! \addtogroup nvmem_api
|
||||
//! @{
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <avr/pgmspace.h>
|
||||
|
||||
#ifdef __AVR__
|
||||
#include <avr/io.h>
|
||||
#endif
|
||||
|
||||
#include "nvmem.h"
|
||||
#include "hci.h"
|
||||
#include "socket.h"
|
||||
#include "evnt_handler.h"
|
||||
#include "debug.h"
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Prototypes for the structures for APIs.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
#define NVMEM_READ_PARAMS_LEN (12)
|
||||
#define NVMEM_CREATE_PARAMS_LEN (8)
|
||||
#define NVMEM_WRITE_PARAMS_LEN (16)
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! nvmem_read
|
||||
//!
|
||||
//! @param ulFileId nvmem file id:\n
|
||||
//! NVMEM_NVS_FILEID, NVMEM_NVS_SHADOW_FILEID,
|
||||
//! NVMEM_WLAN_CONFIG_FILEID, NVMEM_WLAN_CONFIG_SHADOW_FILEID,
|
||||
//! NVMEM_WLAN_DRIVER_SP_FILEID, NVMEM_WLAN_FW_SP_FILEID,
|
||||
//! NVMEM_MAC_FILEID, NVMEM_FRONTEND_VARS_FILEID,
|
||||
//! NVMEM_IP_CONFIG_FILEID, NVMEM_IP_CONFIG_SHADOW_FILEID,
|
||||
//! NVMEM_BOOTLOADER_SP_FILEID, NVMEM_RM_FILEID,
|
||||
//! and user files 12-15.
|
||||
//! @param ulLength number of bytes to read
|
||||
//! @param ulOffset ulOffset in file from where to read
|
||||
//! @param buff output buffer pointer
|
||||
//!
|
||||
//! @return number of bytes read, otherwise error.
|
||||
//!
|
||||
//! @brief Reads data from the file referred by the ulFileId parameter.
|
||||
//! Reads data from file ulOffset till length. Err if the file can't
|
||||
//! be used, is invalid, or if the read is out of bounds.
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
signed long
|
||||
nvmem_read(unsigned long ulFileId, unsigned long ulLength, unsigned long ulOffset, unsigned char *buff)
|
||||
{
|
||||
unsigned char ucStatus = 0xFF;
|
||||
unsigned char *ptr;
|
||||
unsigned char *args;
|
||||
|
||||
ptr = tSLInformation.pucTxCommandBuffer;
|
||||
args = (ptr + HEADERS_SIZE_CMD);
|
||||
|
||||
// Fill in HCI packet structure
|
||||
args = UINT32_TO_STREAM(args, ulFileId);
|
||||
args = UINT32_TO_STREAM(args, ulLength);
|
||||
args = UINT32_TO_STREAM(args, ulOffset);
|
||||
|
||||
// Initiate a HCI command
|
||||
hci_command_send(HCI_CMND_NVMEM_READ, ptr, NVMEM_READ_PARAMS_LEN);
|
||||
SimpleLinkWaitEvent(HCI_CMND_NVMEM_READ, &ucStatus);
|
||||
|
||||
// In case there is data - read it - even if an error code is returned
|
||||
// Note: It is the user responsibility to ignore the data in case of an error code
|
||||
|
||||
// Wait for the data in a synchronous way. Here we assume that the buffer is
|
||||
// big enough to store also parameters of nvmem
|
||||
|
||||
SimpleLinkWaitData(buff, 0, 0);
|
||||
|
||||
return(ucStatus);
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! nvmem_write
|
||||
//!
|
||||
//! @param ulFileId nvmem file id:\n
|
||||
//! NVMEM_WLAN_DRIVER_SP_FILEID, NVMEM_WLAN_FW_SP_FILEID,
|
||||
//! NVMEM_MAC_FILEID, NVMEM_BOOTLOADER_SP_FILEID,
|
||||
//! and user files 12-15.
|
||||
//! @param ulLength number of bytes to write
|
||||
//! @param ulEntryOffset offset in file to start write operation from
|
||||
//! @param buff data to write
|
||||
//!
|
||||
//! @return on success 0, error otherwise.
|
||||
//!
|
||||
//! @brief Write data to nvmem.
|
||||
//! writes data to file referred by the ulFileId parameter.
|
||||
//! Writes data to file ulOffset till ulLength.The file id will be
|
||||
//! marked invalid till the write is done. The file entry doesn't
|
||||
//! need to be valid - only allocated.
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
signed long
|
||||
nvmem_write(unsigned long ulFileId, unsigned long ulLength, unsigned long
|
||||
ulEntryOffset, unsigned char *buff)
|
||||
{
|
||||
long iRes;
|
||||
unsigned char *ptr;
|
||||
unsigned char *args;
|
||||
|
||||
iRes = EFAIL;
|
||||
|
||||
ptr = tSLInformation.pucTxCommandBuffer;
|
||||
args = (ptr + SPI_HEADER_SIZE + HCI_DATA_CMD_HEADER_SIZE);
|
||||
|
||||
// Fill in HCI packet structure
|
||||
args = UINT32_TO_STREAM(args, ulFileId);
|
||||
args = UINT32_TO_STREAM(args, 12);
|
||||
args = UINT32_TO_STREAM(args, ulLength);
|
||||
args = UINT32_TO_STREAM(args, ulEntryOffset);
|
||||
|
||||
memcpy((ptr + SPI_HEADER_SIZE + HCI_DATA_CMD_HEADER_SIZE +
|
||||
NVMEM_WRITE_PARAMS_LEN),buff,ulLength);
|
||||
#if (DEBUG_MODE == 1)
|
||||
PRINT_F("Writing:\t");
|
||||
for (uint8_t i=0; i<ulLength; i++) {
|
||||
PRINT_F("0x");
|
||||
printHex(buff[i]);
|
||||
PRINT_F(", ");
|
||||
}
|
||||
PRINT_F("\n\r");
|
||||
#endif
|
||||
// Initiate a HCI command but it will come on data channel
|
||||
hci_data_command_send(HCI_CMND_NVMEM_WRITE, ptr, NVMEM_WRITE_PARAMS_LEN,
|
||||
ulLength);
|
||||
|
||||
SimpleLinkWaitEvent(HCI_EVNT_NVMEM_WRITE, &iRes);
|
||||
|
||||
return(iRes);
|
||||
}
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! nvmem_set_mac_address
|
||||
//!
|
||||
//! @param mac mac address to be set
|
||||
//!
|
||||
//! @return on success 0, error otherwise.
|
||||
//!
|
||||
//! @brief Write MAC address to EEPROM.
|
||||
//! mac address as appears over the air (OUI first)
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
unsigned char nvmem_set_mac_address(unsigned char *mac)
|
||||
{
|
||||
return nvmem_write(NVMEM_MAC_FILEID, MAC_ADDR_LEN, 0, mac);
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! nvmem_get_mac_address
|
||||
//!
|
||||
//! @param[out] mac mac address
|
||||
//!
|
||||
//! @return on success 0, error otherwise.
|
||||
//!
|
||||
//! @brief Read MAC address from EEPROM.
|
||||
//! mac address as appears over the air (OUI first)
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
unsigned char nvmem_get_mac_address(unsigned char *mac)
|
||||
{
|
||||
return nvmem_read(NVMEM_MAC_FILEID, MAC_ADDR_LEN, 0, mac);
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! nvmem_write_patch
|
||||
//!
|
||||
//! @param ulFileId nvmem file id:\n
|
||||
//! NVMEM_WLAN_DRIVER_SP_FILEID, NVMEM_WLAN_FW_SP_FILEID,
|
||||
//! @param spLength number of bytes to write
|
||||
//! @param spData SP data to write
|
||||
//!
|
||||
//! @return on success 0, error otherwise.
|
||||
//!
|
||||
//! @brief program a patch to a specific file ID.
|
||||
//! The SP data is assumed to be organized in 2-dimensional.
|
||||
//! Each line is SP_PORTION_SIZE bytes long. Actual programming is
|
||||
//! applied in SP_PORTION_SIZE bytes portions.
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
unsigned char nvmem_write_patch(unsigned long ulFileId, unsigned long spLength, const uint8_t *spData)
|
||||
{
|
||||
unsigned char status = 0;
|
||||
unsigned short offset = 0;
|
||||
unsigned char* spDataPtr = (unsigned char*)spData;
|
||||
uint8_t rambuffer[SP_PORTION_SIZE];
|
||||
|
||||
while ((status == 0) && (spLength >= SP_PORTION_SIZE))
|
||||
{
|
||||
for (uint8_t i=0; i<SP_PORTION_SIZE; i++) {
|
||||
rambuffer[i] = pgm_read_byte(spData + i + offset);
|
||||
}
|
||||
#if (DEBUG_MODE == 1)
|
||||
PRINT_F("Writing: "); printDec16(offset); PRINT_F("\t");
|
||||
for (uint8_t i=0; i<SP_PORTION_SIZE; i++) {
|
||||
PRINT_F("0x");
|
||||
printHex(rambuffer[i]);
|
||||
PRINT_F(", ");
|
||||
}
|
||||
PRINT_F("\n\r");
|
||||
#endif
|
||||
status = nvmem_write(ulFileId, SP_PORTION_SIZE, offset, rambuffer);
|
||||
offset += SP_PORTION_SIZE;
|
||||
spLength -= SP_PORTION_SIZE;
|
||||
spDataPtr += SP_PORTION_SIZE;
|
||||
}
|
||||
|
||||
if (status !=0)
|
||||
{
|
||||
// NVMEM error occurred
|
||||
return status;
|
||||
}
|
||||
|
||||
if (spLength != 0)
|
||||
{
|
||||
memcpy_P(rambuffer, spDataPtr, SP_PORTION_SIZE);
|
||||
// if reached here, a reminder is left
|
||||
status = nvmem_write(ulFileId, spLength, offset, rambuffer);
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! nvmem_read_sp_version
|
||||
//!
|
||||
//! @param[out] patchVer first number indicates package ID and the second
|
||||
//! number indicates package build number
|
||||
//!
|
||||
//! @return on success 0, error otherwise.
|
||||
//!
|
||||
//! @brief Read patch version. read package version (WiFi FW patch,
|
||||
//! driver-supplicant-NS patch, bootloader patch)
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
uint8_t nvmem_read_sp_version(uint8_t* patchVer)
|
||||
{
|
||||
uint8_t *ptr;
|
||||
// 1st byte is the status and the rest is the SP version
|
||||
uint8_t retBuf[5];
|
||||
|
||||
ptr = tSLInformation.pucTxCommandBuffer;
|
||||
|
||||
// Initiate a HCI command, no args are required
|
||||
hci_command_send(HCI_CMND_READ_SP_VERSION, ptr, 0);
|
||||
SimpleLinkWaitEvent(HCI_CMND_READ_SP_VERSION, retBuf);
|
||||
|
||||
// package ID
|
||||
*patchVer = retBuf[3];
|
||||
// package build number
|
||||
*(patchVer+1) = retBuf[4];
|
||||
|
||||
return(retBuf[0]);
|
||||
}
|
||||
#endif
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! nvmem_create_entry
|
||||
//!
|
||||
//! @param ulFileId nvmem file Id:\n
|
||||
//! * NVMEM_AES128_KEY_FILEID: 12
|
||||
//! * NVMEM_SHARED_MEM_FILEID: 13
|
||||
//! * and fileIDs 14 and 15
|
||||
//! @param ulNewLen entry ulLength
|
||||
//!
|
||||
//! @return on success 0, error otherwise.
|
||||
//!
|
||||
//! @brief Create new file entry and allocate space on the NVMEM.
|
||||
//! Applies only to user files.
|
||||
//! Modify the size of file.
|
||||
//! If the entry is unallocated - allocate it to size
|
||||
//! ulNewLen (marked invalid).
|
||||
//! If it is allocated then deallocate it first.
|
||||
//! To just mark the file as invalid without resizing -
|
||||
//! set ulNewLen=0.
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
int8_t
|
||||
nvmem_create_entry(unsigned long ulFileId, unsigned long ulNewLen)
|
||||
{
|
||||
unsigned char *ptr;
|
||||
unsigned char *args;
|
||||
int8_t retval;
|
||||
|
||||
ptr = tSLInformation.pucTxCommandBuffer;
|
||||
args = (ptr + HEADERS_SIZE_CMD);
|
||||
|
||||
// Fill in HCI packet structure
|
||||
args = UINT32_TO_STREAM(args, ulFileId);
|
||||
args = UINT32_TO_STREAM(args, ulNewLen);
|
||||
|
||||
// Initiate a HCI command
|
||||
hci_command_send(HCI_CMND_NVMEM_CREATE_ENTRY,ptr, NVMEM_CREATE_PARAMS_LEN);
|
||||
|
||||
SimpleLinkWaitEvent(HCI_CMND_NVMEM_CREATE_ENTRY, &retval);
|
||||
return(retval);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Close the Doxygen group.
|
||||
//! @}
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
@@ -1,256 +0,0 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* nvmem.h - CC3000 Host Driver Implementation.
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* Adapted for use with the Arduino/AVR by KTOWN (Kevin Townsend)
|
||||
* & Limor Fried for Adafruit Industries
|
||||
* This library works with the Adafruit CC3000 breakout
|
||||
* ----> https://www.adafruit.com/products/1469
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __NVRAM_H__
|
||||
#define __NVRAM_H__
|
||||
|
||||
#include "cc3000_common.h"
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// If building with a C++ compiler, make all of the definitions in this header
|
||||
// have a C binding.
|
||||
//
|
||||
//*****************************************************************************
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! \addtogroup nvmem_api
|
||||
//! @{
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
/****************************************************************************
|
||||
**
|
||||
** Definitions for File IDs
|
||||
**
|
||||
****************************************************************************/
|
||||
/* NVMEM file ID - system files*/
|
||||
#define NVMEM_NVS_FILEID (0)
|
||||
#define NVMEM_NVS_SHADOW_FILEID (1)
|
||||
#define NVMEM_WLAN_CONFIG_FILEID (2)
|
||||
#define NVMEM_WLAN_CONFIG_SHADOW_FILEID (3)
|
||||
#define NVMEM_WLAN_DRIVER_SP_FILEID (4)
|
||||
#define NVMEM_WLAN_FW_SP_FILEID (5)
|
||||
#define NVMEM_MAC_FILEID (6)
|
||||
#define NVMEM_FRONTEND_VARS_FILEID (7)
|
||||
#define NVMEM_IP_CONFIG_FILEID (8)
|
||||
#define NVMEM_IP_CONFIG_SHADOW_FILEID (9)
|
||||
#define NVMEM_BOOTLOADER_SP_FILEID (10)
|
||||
#define NVMEM_RM_FILEID (11)
|
||||
|
||||
/* NVMEM file ID - user files*/
|
||||
#define NVMEM_AES128_KEY_FILEID (12)
|
||||
#define NVMEM_SHARED_MEM_FILEID (13)
|
||||
|
||||
/* max entry in order to invalid nvmem */
|
||||
#define NVMEM_MAX_ENTRY (16)
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! nvmem_read
|
||||
//!
|
||||
//! @param ulFileId nvmem file id:\n
|
||||
//! NVMEM_NVS_FILEID, NVMEM_NVS_SHADOW_FILEID,
|
||||
//! NVMEM_WLAN_CONFIG_FILEID, NVMEM_WLAN_CONFIG_SHADOW_FILEID,
|
||||
//! NVMEM_WLAN_DRIVER_SP_FILEID, NVMEM_WLAN_FW_SP_FILEID,
|
||||
//! NVMEM_MAC_FILEID, NVMEM_FRONTEND_VARS_FILEID,
|
||||
//! NVMEM_IP_CONFIG_FILEID, NVMEM_IP_CONFIG_SHADOW_FILEID,
|
||||
//! NVMEM_BOOTLOADER_SP_FILEID, NVMEM_RM_FILEID,
|
||||
//! and user files 12-15.
|
||||
//! @param ulLength number of bytes to read
|
||||
//! @param ulOffset ulOffset in file from where to read
|
||||
//! @param buff output buffer pointer
|
||||
//!
|
||||
//! @return number of bytes read, otherwise error.
|
||||
//!
|
||||
//! @brief Reads data from the file referred by the ulFileId parameter.
|
||||
//! Reads data from file ulOffset till length. Err if the file can't
|
||||
//! be used, is invalid, or if the read is out of bounds.
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
extern signed long nvmem_read(unsigned long file_id, unsigned long length, unsigned long offset, unsigned char *buff);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! nvmem_write
|
||||
//!
|
||||
//! @param ulFileId nvmem file id:\n
|
||||
//! NVMEM_WLAN_DRIVER_SP_FILEID, NVMEM_WLAN_FW_SP_FILEID,
|
||||
//! NVMEM_MAC_FILEID, NVMEM_BOOTLOADER_SP_FILEID,
|
||||
//! and user files 12-15.
|
||||
//! @param ulLength number of bytes to write
|
||||
//! @param ulEntryOffset offset in file to start write operation from
|
||||
//! @param buff data to write
|
||||
//!
|
||||
//! @return on success 0, error otherwise.
|
||||
//!
|
||||
//! @brief Write data to nvmem.
|
||||
//! writes data to file referred by the ulFileId parameter.
|
||||
//! Writes data to file ulOffset till ulLength.The file id will be
|
||||
//! marked invalid till the write is done. The file entry doesn't
|
||||
//! need to be valid - only allocated.
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
extern signed long nvmem_write(unsigned long ulFileId, unsigned long ulLength, unsigned long ulEntryOffset, unsigned char *buff);
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! nvmem_set_mac_address
|
||||
//!
|
||||
//! @param mac mac address to be set
|
||||
//!
|
||||
//! @return on success 0, error otherwise.
|
||||
//!
|
||||
//! @brief Write MAC address to EEPROM.
|
||||
//! mac address as appears over the air (OUI first)
|
||||
//!
|
||||
//*****************************************************************************
|
||||
extern unsigned char nvmem_set_mac_address(unsigned char *mac);
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! nvmem_get_mac_address
|
||||
//!
|
||||
//! @param[out] mac mac address
|
||||
//!
|
||||
//! @return on success 0, error otherwise.
|
||||
//!
|
||||
//! @brief Read MAC address from EEPROM.
|
||||
//! mac address as appears over the air (OUI first)
|
||||
//!
|
||||
//*****************************************************************************
|
||||
extern unsigned char nvmem_get_mac_address(unsigned char *mac);
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! nvmem_write_patch
|
||||
//!
|
||||
//! @param ulFileId nvmem file id:\n
|
||||
//! NVMEM_WLAN_DRIVER_SP_FILEID, NVMEM_WLAN_FW_SP_FILEID,
|
||||
//! @param spLength number of bytes to write
|
||||
//! @param spData SP data to write
|
||||
//!
|
||||
//! @return on success 0, error otherwise.
|
||||
//!
|
||||
//! @brief program a patch to a specific file ID.
|
||||
//! The SP data is assumed to be organized in 2-dimensional.
|
||||
//! Each line is SP_PORTION_SIZE bytes long. Actual programming is
|
||||
//! applied in SP_PORTION_SIZE bytes portions.
|
||||
//!
|
||||
//*****************************************************************************
|
||||
extern unsigned char nvmem_write_patch(unsigned long ulFileId, unsigned long spLength, const unsigned char *spData);
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! nvmem_read_sp_version
|
||||
//!
|
||||
//! @param[out] patchVer first number indicates package ID and the second
|
||||
//! number indicates package build number
|
||||
//!
|
||||
//! @return on success 0, error otherwise.
|
||||
//!
|
||||
//! @brief Read patch version. read package version (WiFi FW patch,
|
||||
//! driver-supplicant-NS patch, bootloader patch)
|
||||
//!
|
||||
//*****************************************************************************
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
extern unsigned char nvmem_read_sp_version(unsigned char* patchVer);
|
||||
#endif
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! nvmem_create_entry
|
||||
//!
|
||||
//! @param ulFileId nvmem file Id:\n
|
||||
//! * NVMEM_AES128_KEY_FILEID: 12
|
||||
//! * NVMEM_SHARED_MEM_FILEID: 13
|
||||
//! * and fileIDs 14 and 15
|
||||
//! @param ulNewLen entry ulLength
|
||||
//!
|
||||
//! @return on success 0, error otherwise.
|
||||
//!
|
||||
//! @brief Create new file entry and allocate space on the NVMEM.
|
||||
//! Applies only to user files.
|
||||
//! Modify the size of file.
|
||||
//! If the entry is unallocated - allocate it to size
|
||||
//! ulNewLen (marked invalid).
|
||||
//! If it is allocated then deallocate it first.
|
||||
//! To just mark the file as invalid without resizing -
|
||||
//! set ulNewLen=0.
|
||||
//!
|
||||
//*****************************************************************************
|
||||
extern int8_t nvmem_create_entry(unsigned long file_id, unsigned long newlen);
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Mark the end of the C bindings section for C++ compilers.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Close the Doxygen group.
|
||||
//! @}
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
||||
#endif // __NVRAM_H__
|
||||
@@ -1,533 +0,0 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* security.c - CC3000 Host Driver Implementation.
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! \addtogroup security_api
|
||||
//! @{
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
#include "security.h"
|
||||
|
||||
#ifndef CC3000_UNENCRYPTED_SMART_CONFIG
|
||||
// foreward sbox
|
||||
const unsigned char sbox[256] = {
|
||||
//0 1 2 3 4 5 6 7 8 9 A B C D E F
|
||||
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, //0
|
||||
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, //1
|
||||
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, //2
|
||||
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, //3
|
||||
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, //4
|
||||
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, //5
|
||||
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, //6
|
||||
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, //7
|
||||
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, //8
|
||||
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, //9
|
||||
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, //A
|
||||
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, //B
|
||||
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, //C
|
||||
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, //D
|
||||
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, //E
|
||||
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 }; //F
|
||||
// inverse sbox
|
||||
const unsigned char rsbox[256] =
|
||||
{ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
|
||||
, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
|
||||
, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
|
||||
, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
|
||||
, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
|
||||
, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
|
||||
, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
|
||||
, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
|
||||
, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
|
||||
, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
|
||||
, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
|
||||
, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
|
||||
, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
|
||||
, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
|
||||
, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
|
||||
, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d };
|
||||
// round constant
|
||||
const unsigned char Rcon[11] = {
|
||||
0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36};
|
||||
|
||||
|
||||
unsigned char expandedKey[176];
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! expandKey
|
||||
//!
|
||||
//! @param key AES128 key - 16 bytes
|
||||
//! @param expandedKey expanded AES128 key
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief expend a 16 bytes key for AES128 implementation
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
void expandKey(unsigned char *expandedKey,
|
||||
unsigned char *key)
|
||||
{
|
||||
unsigned short ii, buf1;
|
||||
for (ii=0;ii<16;ii++)
|
||||
expandedKey[ii] = key[ii];
|
||||
for (ii=1;ii<11;ii++){
|
||||
buf1 = expandedKey[ii*16 - 4];
|
||||
expandedKey[ii*16 + 0] = sbox[expandedKey[ii*16 - 3]]^expandedKey[(ii-1)*16 + 0]^Rcon[ii];
|
||||
expandedKey[ii*16 + 1] = sbox[expandedKey[ii*16 - 2]]^expandedKey[(ii-1)*16 + 1];
|
||||
expandedKey[ii*16 + 2] = sbox[expandedKey[ii*16 - 1]]^expandedKey[(ii-1)*16 + 2];
|
||||
expandedKey[ii*16 + 3] = sbox[buf1 ]^expandedKey[(ii-1)*16 + 3];
|
||||
expandedKey[ii*16 + 4] = expandedKey[(ii-1)*16 + 4]^expandedKey[ii*16 + 0];
|
||||
expandedKey[ii*16 + 5] = expandedKey[(ii-1)*16 + 5]^expandedKey[ii*16 + 1];
|
||||
expandedKey[ii*16 + 6] = expandedKey[(ii-1)*16 + 6]^expandedKey[ii*16 + 2];
|
||||
expandedKey[ii*16 + 7] = expandedKey[(ii-1)*16 + 7]^expandedKey[ii*16 + 3];
|
||||
expandedKey[ii*16 + 8] = expandedKey[(ii-1)*16 + 8]^expandedKey[ii*16 + 4];
|
||||
expandedKey[ii*16 + 9] = expandedKey[(ii-1)*16 + 9]^expandedKey[ii*16 + 5];
|
||||
expandedKey[ii*16 +10] = expandedKey[(ii-1)*16 +10]^expandedKey[ii*16 + 6];
|
||||
expandedKey[ii*16 +11] = expandedKey[(ii-1)*16 +11]^expandedKey[ii*16 + 7];
|
||||
expandedKey[ii*16 +12] = expandedKey[(ii-1)*16 +12]^expandedKey[ii*16 + 8];
|
||||
expandedKey[ii*16 +13] = expandedKey[(ii-1)*16 +13]^expandedKey[ii*16 + 9];
|
||||
expandedKey[ii*16 +14] = expandedKey[(ii-1)*16 +14]^expandedKey[ii*16 +10];
|
||||
expandedKey[ii*16 +15] = expandedKey[(ii-1)*16 +15]^expandedKey[ii*16 +11];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! galois_mul2
|
||||
//!
|
||||
//! @param value argument to multiply
|
||||
//!
|
||||
//! @return multiplied argument
|
||||
//!
|
||||
//! @brief multiply by 2 in the galois field
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
unsigned char galois_mul2(unsigned char value)
|
||||
{
|
||||
if (value>>7)
|
||||
{
|
||||
value = value << 1;
|
||||
return (value^0x1b);
|
||||
} else
|
||||
return value<<1;
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! aes_encr
|
||||
//!
|
||||
//! @param[in] expandedKey expanded AES128 key
|
||||
//! @param[in/out] state 16 bytes of plain text and cipher text
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief internal implementation of AES128 encryption.
|
||||
//! straight forward aes encryption implementation
|
||||
//! first the group of operations
|
||||
//! - addRoundKey
|
||||
//! - subbytes
|
||||
//! - shiftrows
|
||||
//! - mixcolums
|
||||
//! is executed 9 times, after this addroundkey to finish the 9th
|
||||
//! round, after that the 10th round without mixcolums
|
||||
//! no further subfunctions to save cycles for function calls
|
||||
//! no structuring with "for (....)" to save cycles.
|
||||
//!
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
void aes_encr(unsigned char *state, unsigned char *expandedKey)
|
||||
{
|
||||
unsigned char buf1, buf2, buf3, round;
|
||||
|
||||
for (round = 0; round < 9; round ++){
|
||||
// addroundkey, sbox and shiftrows
|
||||
// row 0
|
||||
state[ 0] = sbox[(state[ 0] ^ expandedKey[(round*16) ])];
|
||||
state[ 4] = sbox[(state[ 4] ^ expandedKey[(round*16) + 4])];
|
||||
state[ 8] = sbox[(state[ 8] ^ expandedKey[(round*16) + 8])];
|
||||
state[12] = sbox[(state[12] ^ expandedKey[(round*16) + 12])];
|
||||
// row 1
|
||||
buf1 = state[1] ^ expandedKey[(round*16) + 1];
|
||||
state[ 1] = sbox[(state[ 5] ^ expandedKey[(round*16) + 5])];
|
||||
state[ 5] = sbox[(state[ 9] ^ expandedKey[(round*16) + 9])];
|
||||
state[ 9] = sbox[(state[13] ^ expandedKey[(round*16) + 13])];
|
||||
state[13] = sbox[buf1];
|
||||
// row 2
|
||||
buf1 = state[2] ^ expandedKey[(round*16) + 2];
|
||||
buf2 = state[6] ^ expandedKey[(round*16) + 6];
|
||||
state[ 2] = sbox[(state[10] ^ expandedKey[(round*16) + 10])];
|
||||
state[ 6] = sbox[(state[14] ^ expandedKey[(round*16) + 14])];
|
||||
state[10] = sbox[buf1];
|
||||
state[14] = sbox[buf2];
|
||||
// row 3
|
||||
buf1 = state[15] ^ expandedKey[(round*16) + 15];
|
||||
state[15] = sbox[(state[11] ^ expandedKey[(round*16) + 11])];
|
||||
state[11] = sbox[(state[ 7] ^ expandedKey[(round*16) + 7])];
|
||||
state[ 7] = sbox[(state[ 3] ^ expandedKey[(round*16) + 3])];
|
||||
state[ 3] = sbox[buf1];
|
||||
|
||||
// mixcolums //////////
|
||||
// col1
|
||||
buf1 = state[0] ^ state[1] ^ state[2] ^ state[3];
|
||||
buf2 = state[0];
|
||||
buf3 = state[0]^state[1]; buf3=galois_mul2(buf3); state[0] = state[0] ^ buf3 ^ buf1;
|
||||
buf3 = state[1]^state[2]; buf3=galois_mul2(buf3); state[1] = state[1] ^ buf3 ^ buf1;
|
||||
buf3 = state[2]^state[3]; buf3=galois_mul2(buf3); state[2] = state[2] ^ buf3 ^ buf1;
|
||||
buf3 = state[3]^buf2; buf3=galois_mul2(buf3); state[3] = state[3] ^ buf3 ^ buf1;
|
||||
// col2
|
||||
buf1 = state[4] ^ state[5] ^ state[6] ^ state[7];
|
||||
buf2 = state[4];
|
||||
buf3 = state[4]^state[5]; buf3=galois_mul2(buf3); state[4] = state[4] ^ buf3 ^ buf1;
|
||||
buf3 = state[5]^state[6]; buf3=galois_mul2(buf3); state[5] = state[5] ^ buf3 ^ buf1;
|
||||
buf3 = state[6]^state[7]; buf3=galois_mul2(buf3); state[6] = state[6] ^ buf3 ^ buf1;
|
||||
buf3 = state[7]^buf2; buf3=galois_mul2(buf3); state[7] = state[7] ^ buf3 ^ buf1;
|
||||
// col3
|
||||
buf1 = state[8] ^ state[9] ^ state[10] ^ state[11];
|
||||
buf2 = state[8];
|
||||
buf3 = state[8]^state[9]; buf3=galois_mul2(buf3); state[8] = state[8] ^ buf3 ^ buf1;
|
||||
buf3 = state[9]^state[10]; buf3=galois_mul2(buf3); state[9] = state[9] ^ buf3 ^ buf1;
|
||||
buf3 = state[10]^state[11]; buf3=galois_mul2(buf3); state[10] = state[10] ^ buf3 ^ buf1;
|
||||
buf3 = state[11]^buf2; buf3=galois_mul2(buf3); state[11] = state[11] ^ buf3 ^ buf1;
|
||||
// col4
|
||||
buf1 = state[12] ^ state[13] ^ state[14] ^ state[15];
|
||||
buf2 = state[12];
|
||||
buf3 = state[12]^state[13]; buf3=galois_mul2(buf3); state[12] = state[12] ^ buf3 ^ buf1;
|
||||
buf3 = state[13]^state[14]; buf3=galois_mul2(buf3); state[13] = state[13] ^ buf3 ^ buf1;
|
||||
buf3 = state[14]^state[15]; buf3=galois_mul2(buf3); state[14] = state[14] ^ buf3 ^ buf1;
|
||||
buf3 = state[15]^buf2; buf3=galois_mul2(buf3); state[15] = state[15] ^ buf3 ^ buf1;
|
||||
|
||||
}
|
||||
// 10th round without mixcols
|
||||
state[ 0] = sbox[(state[ 0] ^ expandedKey[(round*16) ])];
|
||||
state[ 4] = sbox[(state[ 4] ^ expandedKey[(round*16) + 4])];
|
||||
state[ 8] = sbox[(state[ 8] ^ expandedKey[(round*16) + 8])];
|
||||
state[12] = sbox[(state[12] ^ expandedKey[(round*16) + 12])];
|
||||
// row 1
|
||||
buf1 = state[1] ^ expandedKey[(round*16) + 1];
|
||||
state[ 1] = sbox[(state[ 5] ^ expandedKey[(round*16) + 5])];
|
||||
state[ 5] = sbox[(state[ 9] ^ expandedKey[(round*16) + 9])];
|
||||
state[ 9] = sbox[(state[13] ^ expandedKey[(round*16) + 13])];
|
||||
state[13] = sbox[buf1];
|
||||
// row 2
|
||||
buf1 = state[2] ^ expandedKey[(round*16) + 2];
|
||||
buf2 = state[6] ^ expandedKey[(round*16) + 6];
|
||||
state[ 2] = sbox[(state[10] ^ expandedKey[(round*16) + 10])];
|
||||
state[ 6] = sbox[(state[14] ^ expandedKey[(round*16) + 14])];
|
||||
state[10] = sbox[buf1];
|
||||
state[14] = sbox[buf2];
|
||||
// row 3
|
||||
buf1 = state[15] ^ expandedKey[(round*16) + 15];
|
||||
state[15] = sbox[(state[11] ^ expandedKey[(round*16) + 11])];
|
||||
state[11] = sbox[(state[ 7] ^ expandedKey[(round*16) + 7])];
|
||||
state[ 7] = sbox[(state[ 3] ^ expandedKey[(round*16) + 3])];
|
||||
state[ 3] = sbox[buf1];
|
||||
// last addroundkey
|
||||
state[ 0]^=expandedKey[160];
|
||||
state[ 1]^=expandedKey[161];
|
||||
state[ 2]^=expandedKey[162];
|
||||
state[ 3]^=expandedKey[163];
|
||||
state[ 4]^=expandedKey[164];
|
||||
state[ 5]^=expandedKey[165];
|
||||
state[ 6]^=expandedKey[166];
|
||||
state[ 7]^=expandedKey[167];
|
||||
state[ 8]^=expandedKey[168];
|
||||
state[ 9]^=expandedKey[169];
|
||||
state[10]^=expandedKey[170];
|
||||
state[11]^=expandedKey[171];
|
||||
state[12]^=expandedKey[172];
|
||||
state[13]^=expandedKey[173];
|
||||
state[14]^=expandedKey[174];
|
||||
state[15]^=expandedKey[175];
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! aes_decr
|
||||
//!
|
||||
//! @param[in] expandedKey expanded AES128 key
|
||||
//! @param[in\out] state 16 bytes of cipher text and plain text
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief internal implementation of AES128 decryption.
|
||||
//! straight forward aes decryption implementation
|
||||
//! the order of substeps is the exact reverse of decryption
|
||||
//! inverse functions:
|
||||
//! - addRoundKey is its own inverse
|
||||
//! - rsbox is inverse of sbox
|
||||
//! - rightshift instead of leftshift
|
||||
//! - invMixColumns = barreto + mixColumns
|
||||
//! no further subfunctions to save cycles for function calls
|
||||
//! no structuring with "for (....)" to save cycles
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
void aes_decr(unsigned char *state, unsigned char *expandedKey)
|
||||
{
|
||||
unsigned char buf1, buf2, buf3;
|
||||
signed char round;
|
||||
round = 9;
|
||||
|
||||
// initial addroundkey
|
||||
state[ 0]^=expandedKey[160];
|
||||
state[ 1]^=expandedKey[161];
|
||||
state[ 2]^=expandedKey[162];
|
||||
state[ 3]^=expandedKey[163];
|
||||
state[ 4]^=expandedKey[164];
|
||||
state[ 5]^=expandedKey[165];
|
||||
state[ 6]^=expandedKey[166];
|
||||
state[ 7]^=expandedKey[167];
|
||||
state[ 8]^=expandedKey[168];
|
||||
state[ 9]^=expandedKey[169];
|
||||
state[10]^=expandedKey[170];
|
||||
state[11]^=expandedKey[171];
|
||||
state[12]^=expandedKey[172];
|
||||
state[13]^=expandedKey[173];
|
||||
state[14]^=expandedKey[174];
|
||||
state[15]^=expandedKey[175];
|
||||
|
||||
// 10th round without mixcols
|
||||
state[ 0] = rsbox[state[ 0]] ^ expandedKey[(round*16) ];
|
||||
state[ 4] = rsbox[state[ 4]] ^ expandedKey[(round*16) + 4];
|
||||
state[ 8] = rsbox[state[ 8]] ^ expandedKey[(round*16) + 8];
|
||||
state[12] = rsbox[state[12]] ^ expandedKey[(round*16) + 12];
|
||||
// row 1
|
||||
buf1 = rsbox[state[13]] ^ expandedKey[(round*16) + 1];
|
||||
state[13] = rsbox[state[ 9]] ^ expandedKey[(round*16) + 13];
|
||||
state[ 9] = rsbox[state[ 5]] ^ expandedKey[(round*16) + 9];
|
||||
state[ 5] = rsbox[state[ 1]] ^ expandedKey[(round*16) + 5];
|
||||
state[ 1] = buf1;
|
||||
// row 2
|
||||
buf1 = rsbox[state[ 2]] ^ expandedKey[(round*16) + 10];
|
||||
buf2 = rsbox[state[ 6]] ^ expandedKey[(round*16) + 14];
|
||||
state[ 2] = rsbox[state[10]] ^ expandedKey[(round*16) + 2];
|
||||
state[ 6] = rsbox[state[14]] ^ expandedKey[(round*16) + 6];
|
||||
state[10] = buf1;
|
||||
state[14] = buf2;
|
||||
// row 3
|
||||
buf1 = rsbox[state[ 3]] ^ expandedKey[(round*16) + 15];
|
||||
state[ 3] = rsbox[state[ 7]] ^ expandedKey[(round*16) + 3];
|
||||
state[ 7] = rsbox[state[11]] ^ expandedKey[(round*16) + 7];
|
||||
state[11] = rsbox[state[15]] ^ expandedKey[(round*16) + 11];
|
||||
state[15] = buf1;
|
||||
|
||||
for (round = 8; round >= 0; round--){
|
||||
// barreto
|
||||
//col1
|
||||
buf1 = galois_mul2(galois_mul2(state[0]^state[2]));
|
||||
buf2 = galois_mul2(galois_mul2(state[1]^state[3]));
|
||||
state[0] ^= buf1; state[1] ^= buf2; state[2] ^= buf1; state[3] ^= buf2;
|
||||
//col2
|
||||
buf1 = galois_mul2(galois_mul2(state[4]^state[6]));
|
||||
buf2 = galois_mul2(galois_mul2(state[5]^state[7]));
|
||||
state[4] ^= buf1; state[5] ^= buf2; state[6] ^= buf1; state[7] ^= buf2;
|
||||
//col3
|
||||
buf1 = galois_mul2(galois_mul2(state[8]^state[10]));
|
||||
buf2 = galois_mul2(galois_mul2(state[9]^state[11]));
|
||||
state[8] ^= buf1; state[9] ^= buf2; state[10] ^= buf1; state[11] ^= buf2;
|
||||
//col4
|
||||
buf1 = galois_mul2(galois_mul2(state[12]^state[14]));
|
||||
buf2 = galois_mul2(galois_mul2(state[13]^state[15]));
|
||||
state[12] ^= buf1; state[13] ^= buf2; state[14] ^= buf1; state[15] ^= buf2;
|
||||
// mixcolums //////////
|
||||
// col1
|
||||
buf1 = state[0] ^ state[1] ^ state[2] ^ state[3];
|
||||
buf2 = state[0];
|
||||
buf3 = state[0]^state[1]; buf3=galois_mul2(buf3); state[0] = state[0] ^ buf3 ^ buf1;
|
||||
buf3 = state[1]^state[2]; buf3=galois_mul2(buf3); state[1] = state[1] ^ buf3 ^ buf1;
|
||||
buf3 = state[2]^state[3]; buf3=galois_mul2(buf3); state[2] = state[2] ^ buf3 ^ buf1;
|
||||
buf3 = state[3]^buf2; buf3=galois_mul2(buf3); state[3] = state[3] ^ buf3 ^ buf1;
|
||||
// col2
|
||||
buf1 = state[4] ^ state[5] ^ state[6] ^ state[7];
|
||||
buf2 = state[4];
|
||||
buf3 = state[4]^state[5]; buf3=galois_mul2(buf3); state[4] = state[4] ^ buf3 ^ buf1;
|
||||
buf3 = state[5]^state[6]; buf3=galois_mul2(buf3); state[5] = state[5] ^ buf3 ^ buf1;
|
||||
buf3 = state[6]^state[7]; buf3=galois_mul2(buf3); state[6] = state[6] ^ buf3 ^ buf1;
|
||||
buf3 = state[7]^buf2; buf3=galois_mul2(buf3); state[7] = state[7] ^ buf3 ^ buf1;
|
||||
// col3
|
||||
buf1 = state[8] ^ state[9] ^ state[10] ^ state[11];
|
||||
buf2 = state[8];
|
||||
buf3 = state[8]^state[9]; buf3=galois_mul2(buf3); state[8] = state[8] ^ buf3 ^ buf1;
|
||||
buf3 = state[9]^state[10]; buf3=galois_mul2(buf3); state[9] = state[9] ^ buf3 ^ buf1;
|
||||
buf3 = state[10]^state[11]; buf3=galois_mul2(buf3); state[10] = state[10] ^ buf3 ^ buf1;
|
||||
buf3 = state[11]^buf2; buf3=galois_mul2(buf3); state[11] = state[11] ^ buf3 ^ buf1;
|
||||
// col4
|
||||
buf1 = state[12] ^ state[13] ^ state[14] ^ state[15];
|
||||
buf2 = state[12];
|
||||
buf3 = state[12]^state[13]; buf3=galois_mul2(buf3); state[12] = state[12] ^ buf3 ^ buf1;
|
||||
buf3 = state[13]^state[14]; buf3=galois_mul2(buf3); state[13] = state[13] ^ buf3 ^ buf1;
|
||||
buf3 = state[14]^state[15]; buf3=galois_mul2(buf3); state[14] = state[14] ^ buf3 ^ buf1;
|
||||
buf3 = state[15]^buf2; buf3=galois_mul2(buf3); state[15] = state[15] ^ buf3 ^ buf1;
|
||||
|
||||
// addroundkey, rsbox and shiftrows
|
||||
// row 0
|
||||
state[ 0] = rsbox[state[ 0]] ^ expandedKey[(round*16) ];
|
||||
state[ 4] = rsbox[state[ 4]] ^ expandedKey[(round*16) + 4];
|
||||
state[ 8] = rsbox[state[ 8]] ^ expandedKey[(round*16) + 8];
|
||||
state[12] = rsbox[state[12]] ^ expandedKey[(round*16) + 12];
|
||||
// row 1
|
||||
buf1 = rsbox[state[13]] ^ expandedKey[(round*16) + 1];
|
||||
state[13] = rsbox[state[ 9]] ^ expandedKey[(round*16) + 13];
|
||||
state[ 9] = rsbox[state[ 5]] ^ expandedKey[(round*16) + 9];
|
||||
state[ 5] = rsbox[state[ 1]] ^ expandedKey[(round*16) + 5];
|
||||
state[ 1] = buf1;
|
||||
// row 2
|
||||
buf1 = rsbox[state[ 2]] ^ expandedKey[(round*16) + 10];
|
||||
buf2 = rsbox[state[ 6]] ^ expandedKey[(round*16) + 14];
|
||||
state[ 2] = rsbox[state[10]] ^ expandedKey[(round*16) + 2];
|
||||
state[ 6] = rsbox[state[14]] ^ expandedKey[(round*16) + 6];
|
||||
state[10] = buf1;
|
||||
state[14] = buf2;
|
||||
// row 3
|
||||
buf1 = rsbox[state[ 3]] ^ expandedKey[(round*16) + 15];
|
||||
state[ 3] = rsbox[state[ 7]] ^ expandedKey[(round*16) + 3];
|
||||
state[ 7] = rsbox[state[11]] ^ expandedKey[(round*16) + 7];
|
||||
state[11] = rsbox[state[15]] ^ expandedKey[(round*16) + 11];
|
||||
state[15] = buf1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! aes_encrypt
|
||||
//!
|
||||
//! @param[in] key AES128 key of size 16 bytes
|
||||
//! @param[in\out] state 16 bytes of plain text and cipher text
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief AES128 encryption:
|
||||
//! Given AES128 key and 16 bytes plain text, cipher text of 16 bytes
|
||||
//! is computed. The AES implementation is in mode ECB (Electronic
|
||||
//! Code Book).
|
||||
//!
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
void aes_encrypt(unsigned char *state,
|
||||
unsigned char *key)
|
||||
{
|
||||
// expand the key into 176 bytes
|
||||
expandKey(expandedKey, key);
|
||||
aes_encr(state, expandedKey);
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! aes_decrypt
|
||||
//!
|
||||
//! @param[in] key AES128 key of size 16 bytes
|
||||
//! @param[in\out] state 16 bytes of cipher text and plain text
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief AES128 decryption:
|
||||
//! Given AES128 key and 16 bytes cipher text, plain text of 16 bytes
|
||||
//! is computed The AES implementation is in mode ECB
|
||||
//! (Electronic Code Book).
|
||||
//!
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
void aes_decrypt(unsigned char *state,
|
||||
unsigned char *key)
|
||||
{
|
||||
expandKey(expandedKey, key); // expand the key into 176 bytes
|
||||
aes_decr(state, expandedKey);
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! aes_read_key
|
||||
//!
|
||||
//! @param[out] key AES128 key of size 16 bytes
|
||||
//!
|
||||
//! @return on success 0, error otherwise.
|
||||
//!
|
||||
//! @brief Reads AES128 key from EEPROM
|
||||
//! Reads the AES128 key from fileID #12 in EEPROM
|
||||
//! returns an error if the key does not exist.
|
||||
//!
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
signed long aes_read_key(unsigned char *key)
|
||||
{
|
||||
signed long returnValue;
|
||||
|
||||
returnValue = nvmem_read(NVMEM_AES128_KEY_FILEID, AES128_KEY_SIZE, 0, key);
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! aes_write_key
|
||||
//!
|
||||
//! @param[out] key AES128 key of size 16 bytes
|
||||
//!
|
||||
//! @return on success 0, error otherwise.
|
||||
//!
|
||||
//! @brief writes AES128 key from EEPROM
|
||||
//! Writes the AES128 key to fileID #12 in EEPROM
|
||||
//!
|
||||
//!
|
||||
//*****************************************************************************
|
||||
|
||||
signed long aes_write_key(unsigned char *key)
|
||||
{
|
||||
signed long returnValue;
|
||||
|
||||
returnValue = nvmem_write(NVMEM_AES128_KEY_FILEID, AES128_KEY_SIZE, 0, key);
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
#endif //CC3000_UNENCRYPTED_SMART_CONFIG
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Close the Doxygen group.
|
||||
//! @}
|
||||
//
|
||||
//*****************************************************************************
|
||||
@@ -1,135 +0,0 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* security.h - CC3000 Host Driver Implementation.
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __SECURITY__
|
||||
#define __SECURITY__
|
||||
|
||||
#include "nvmem.h"
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// If building with a C++ compiler, make all of the definitions in this header
|
||||
// have a C binding.
|
||||
//
|
||||
//*****************************************************************************
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#define AES128_KEY_SIZE 16
|
||||
|
||||
#ifndef CC3000_UNENCRYPTED_SMART_CONFIG
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! aes_encrypt
|
||||
//!
|
||||
//! @param[in] key AES128 key of size 16 bytes
|
||||
//! @param[in\out] state 16 bytes of plain text and cipher text
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief AES128 encryption:
|
||||
//! Given AES128 key and 16 bytes plain text, cipher text of 16 bytes
|
||||
//! is computed. The AES implementation is in mode ECB (Electronic
|
||||
//! Code Book).
|
||||
//!
|
||||
//!
|
||||
//*****************************************************************************
|
||||
extern void aes_encrypt(unsigned char *state, unsigned char *key);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! aes_decrypt
|
||||
//!
|
||||
//! @param[in] key AES128 key of size 16 bytes
|
||||
//! @param[in\out] state 16 bytes of cipher text and plain text
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief AES128 decryption:
|
||||
//! Given AES128 key and 16 bytes cipher text, plain text of 16 bytes
|
||||
//! is computed The AES implementation is in mode ECB
|
||||
//! (Electronic Code Book).
|
||||
//!
|
||||
//!
|
||||
//*****************************************************************************
|
||||
extern void aes_decrypt(unsigned char *state, unsigned char *key);
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! aes_read_key
|
||||
//!
|
||||
//! @param[out] key AES128 key of size 16 bytes
|
||||
//!
|
||||
//! @return on success 0, error otherwise.
|
||||
//!
|
||||
//! @brief Reads AES128 key from EEPROM
|
||||
//! Reads the AES128 key from fileID #12 in EEPROM
|
||||
//! returns an error if the key does not exist.
|
||||
//!
|
||||
//!
|
||||
//*****************************************************************************
|
||||
extern signed long aes_read_key(unsigned char *key);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! aes_write_key
|
||||
//!
|
||||
//! @param[out] key AES128 key of size 16 bytes
|
||||
//!
|
||||
//! @return on success 0, error otherwise.
|
||||
//!
|
||||
//! @brief writes AES128 key from EEPROM
|
||||
//! Writes the AES128 key to fileID #12 in EEPROM
|
||||
//!
|
||||
//!
|
||||
//*****************************************************************************
|
||||
extern signed long aes_write_key(unsigned char *key);
|
||||
|
||||
#endif //CC3000_UNENCRYPTED_SMART_CONFIG
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Mark the end of the C bindings section for C++ compilers.
|
||||
//
|
||||
//*****************************************************************************
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
||||
#endif
|
||||
@@ -1,673 +0,0 @@
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
#include "sntp.h"
|
||||
|
||||
//Lists of pool servers
|
||||
|
||||
|
||||
const char* ntp_us_pool_list[] = { "0.us.pool.ntp.org",
|
||||
"1.us.pool.ntp.org",
|
||||
"2.us.pool.ntp.org",
|
||||
"3.us.pool.ntp.org",
|
||||
"0.north-america.pool.ntp.org",
|
||||
"1.north-america.pool.ntp.org",
|
||||
"2.north-america.pool.ntp.org",
|
||||
"3.north-america.pool.ntp.org",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char* ntp_global_pool_list[] = { "0.pool.ntp.org",
|
||||
"1.pool.ntp.org",
|
||||
"2.pool.ntp.org",
|
||||
"pool.ntp.org",
|
||||
NULL
|
||||
};
|
||||
|
||||
// ExtractNTPTime - convert ntp seconds into calendar time
|
||||
// Notes:
|
||||
// - 1900 was NOT a leap-year.
|
||||
// - This routine deals with the overflow of the 32-bit seconds value,
|
||||
// which will happen on 02/07/2036 at 06:28:16.
|
||||
//
|
||||
|
||||
#define SECS_DAY (24L * 60 * 60) /* number of seconds in a day */
|
||||
#define BASE_YEAR (1900) /* NTP time starts at 1/1/1900 00:00:00 */
|
||||
|
||||
#define FIX_PT_DAYS_YEAR ((365L * 256) + (256 / 4))
|
||||
// It may not look that way, but this is (365.25 * 256)
|
||||
// That is, it's (365 * 256) + (0.25 * 256) = (365.25 * 256). Why are we doing this?
|
||||
// There are 365 days in a year. After you factor out seconds in the current day,
|
||||
// you're left with days since 1/1/1900. Dividing by 365 would therefore give you
|
||||
// the number of years since 1900, if it wasn't for leap years. If you include
|
||||
// leap-years, you get 365.25 days per year. So, we have to divide ntp days by 365.25
|
||||
// to get the proper year. Instead of doing a floating point divide by 365.25, we do
|
||||
// fixed point arithmetic, placing the binary-point at 8 bits (i.e., 256 decimal).
|
||||
//There's only one small fly in this ointment - 1900 was not a leap year.
|
||||
// Fortunately, we can compensate by adding 1 to the NTP days, as if 1900 WAS a
|
||||
// leap-year. When we divide days down to years, the extra day is lost in
|
||||
// the roundoff. Problem solved.
|
||||
|
||||
// days in each month: {jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec};
|
||||
char monthDays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
||||
|
||||
|
||||
#ifdef CLOCK_DEBUG
|
||||
void dumpBlock1(char* buf, short len) /*rdl 2/16/2008*/
|
||||
{
|
||||
uint8_t* offset = (uint8_t*)buf;
|
||||
int16_t count = 0;
|
||||
int lineCount = 0;
|
||||
char ascii[17] = "";
|
||||
char* pAscii = ascii;
|
||||
|
||||
delay(10);
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F("Block: (addr ")); CC3KPrinter->print((uint16_t)buf, HEX); CC3KPrinter->print(F(", length ")); CC3KPrinter->print(len, HEX); }
|
||||
// traceFn("Block: (addr %p, length 0x%04x)", buf, len);
|
||||
|
||||
while (count < len)
|
||||
{
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->println(); CC3KPrinter->print((uint16_t)offset,HEX); CC3KPrinter->print(F(": ")); }
|
||||
// traceFn("\r\n %p: ", offset);
|
||||
lineCount = 0;
|
||||
pAscii = (char*)&ascii;
|
||||
memset(ascii,' ',16);
|
||||
while ((count < len) && (lineCount < 8))
|
||||
{
|
||||
if ((*offset <= ' ') || (*offset == 0xFF)) *pAscii++ = '.'; else *pAscii++ = *offset; *pAscii++ = ' ';
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print((*offset)>>4,HEX); CC3KPrinter->print((*offset++)&0x0F,HEX); CC3KPrinter->print(F(" ")); }
|
||||
// traceFn("0x%02bx ", *offset++);
|
||||
count++;
|
||||
lineCount++;
|
||||
}
|
||||
while (lineCount++ < 8)
|
||||
{
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F(" ")); }
|
||||
// traceFn(" ");
|
||||
}
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F(" | ")); CC3KPrinter->print(ascii); CC3KPrinter->print(F("|")); }
|
||||
// traceFn(" | %s|", ascii);
|
||||
delay(10);
|
||||
}
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->println(); }
|
||||
// traceFn("\r\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
//Calculates (time / 2) for NTP timestamp values (64-bit fixed point, normalized to 32-bit)
|
||||
// ORIGINAL VALUE OF time IS DESTROYED, and replaced with result of calculation.
|
||||
// performs a signed divide
|
||||
void NTPdiv2(SNTP_Timestamp_t* time)
|
||||
{
|
||||
uint32_t carry = time->seconds & 1; //this bit will shift from 'seconds' to 'fraction'
|
||||
time->fraction >>= 1; //divide 'fraction' by 2
|
||||
time->fraction |= carry << 31; //OR in the low bit of 'seconds' as the high bit of 'fraction
|
||||
time->seconds >>= 1; //signed divide of 'seconds' by 2
|
||||
}
|
||||
|
||||
//Calculates (time1 + time2) for NTP timestamp values (64-bit fixed point, normalized to 32-bit)
|
||||
// ORIGINAL VALUE OF time2 IS DESTROYED, and replaced with result of calculation.
|
||||
// Returns overflow
|
||||
uint8_t AddNTPtime(SNTP_Timestamp_t* time1, SNTP_Timestamp_t* time2)
|
||||
{
|
||||
uint8_t carry = ((time2->fraction>>1)+(time1->fraction>>1) & 0x80000000)>>31;
|
||||
time2->fraction += time1->fraction;
|
||||
time2->seconds += carry;
|
||||
carry = ((time2->seconds>>1)+(time1->seconds>>1) & 0x80000000)>>31;
|
||||
time2->seconds += time1->seconds;
|
||||
return carry; //if there's still a carry, then we have an overflow.
|
||||
}
|
||||
|
||||
//Calculates (time2 - time1) for NTP timestamp values (64-bit fixed point, normalized to 32-bit)
|
||||
// ORIGINAL VALUE OF time2 IS DESTROYED, and replaced with result of calculation.
|
||||
// Returns underflow
|
||||
uint8_t DiffNTPtime(SNTP_Timestamp_t* time1, SNTP_Timestamp_t* time2)
|
||||
{
|
||||
uint8_t borrow = ((time2->fraction>>1)-(time1->fraction>>1) & 0x80000000)>>31;
|
||||
time2->fraction -= time1->fraction;
|
||||
time2->seconds -= borrow;
|
||||
borrow = ((time2->seconds>>1)-(time1->seconds>>1) & 0x80000000)>>31;
|
||||
time2->seconds -= time1->seconds;
|
||||
return borrow; //if there's still a borrow, then we have an underflow.
|
||||
}
|
||||
|
||||
int sntp::GetSystemClockAsNTPTime(SNTP_Timestamp_t* ntpSystemTime)
|
||||
{
|
||||
long systemMillis;
|
||||
|
||||
if (ntpSystemTime)
|
||||
{
|
||||
ntpSystemTime->seconds = millis() / 1000;
|
||||
systemMillis = millis() - (ntpSystemTime->seconds * 1000);
|
||||
systemMillis = (systemMillis << 10) / 1000;
|
||||
ntpSystemTime->fraction = systemMillis << 22;
|
||||
}
|
||||
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F(" GetSystemClockAsNTPTime: ")); CC3KPrinter->print(ntpSystemTime->seconds,HEX); CC3KPrinter->print(F(".")); CC3KPrinter->println(ntpSystemTime->fraction,HEX); }
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
SNTP_Timestamp_t* sntp::NTPGetTime(SNTP_Timestamp_t* ntpTime, bool local)
|
||||
{
|
||||
SNTP_Timestamp_t ntpSystemTime;
|
||||
|
||||
if (ntpTime)
|
||||
{
|
||||
GetSystemClockAsNTPTime(&ntpSystemTime);
|
||||
|
||||
*ntpTime = m_NTPReferenceTime;
|
||||
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F(" NTPGetTime m_NTPReferenceTime: ")); CC3KPrinter->print(ntpTime->seconds,HEX); CC3KPrinter->print(F(".")); CC3KPrinter->println(ntpTime->fraction,HEX); }
|
||||
#endif
|
||||
|
||||
AddNTPtime(&ntpSystemTime, ntpTime);
|
||||
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F(" NTPGetTime NTP Current UTC: ")); CC3KPrinter->print(ntpTime->seconds,HEX); CC3KPrinter->print(F(".")); CC3KPrinter->println(ntpTime->fraction,HEX); }
|
||||
#endif
|
||||
|
||||
if (local) //if true, add in local offset from UTC
|
||||
{
|
||||
AddNTPtime(m_cur_UTC_offset, ntpTime);
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F(" NTPGetTime NTP Current Local: ")); CC3KPrinter->print(ntpTime->seconds,HEX); CC3KPrinter->print(F(".")); CC3KPrinter->println(ntpTime->fraction,HEX); }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
return ntpTime;
|
||||
}
|
||||
|
||||
SNTP_Timestamp_t* sntp::NTPSetTime(SNTP_Timestamp_t* ntpTime, bool local)
|
||||
{
|
||||
SNTP_Timestamp_t ntpSystemTime;
|
||||
|
||||
if (ntpTime)
|
||||
{
|
||||
if (local)
|
||||
{
|
||||
DiffNTPtime(m_cur_UTC_offset, ntpTime); //take out local offset to set clock as UTC
|
||||
}
|
||||
|
||||
GetSystemClockAsNTPTime(&ntpSystemTime);
|
||||
|
||||
m_NTPReferenceTime = *ntpTime;
|
||||
DiffNTPtime(&ntpSystemTime, &m_NTPReferenceTime);
|
||||
|
||||
m_timeIsSet = true;
|
||||
}
|
||||
return ntpTime;
|
||||
}
|
||||
|
||||
NetTime_t *sntp::ExtractNTPTime(/*in*/ SNTP_Timestamp_t *ntpTime, /*out*/ NetTime_t *extractedTime)
|
||||
{
|
||||
|
||||
uint32_t time = ntpTime->seconds;
|
||||
uint32_t dayclock, dayno;
|
||||
int year;
|
||||
char month;
|
||||
int day;
|
||||
bool dateOverflow = (0 == (time & 0x80000000)); //32-bit counter overflowed?
|
||||
|
||||
extractedTime->millis = ((ntpTime->fraction >>22) * 1000) >>10;
|
||||
|
||||
dayclock = time % SECS_DAY; //seconds since midnight
|
||||
dayno = time / SECS_DAY; //days since 1/1/1900 (or since 2/7/2036)
|
||||
|
||||
#ifdef CLOCK_DEEP_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F("dayclock = ")); CC3KPrinter->print(dayclock); CC3KPrinter->print(F("dayno = ")); CC3KPrinter->println(dayno); }
|
||||
#endif
|
||||
|
||||
if (dateOverflow) //if the date overflowed, we'll effectively add the overflowed bit
|
||||
{ // back into dayno and dayclock. They've got plenty of room for it now
|
||||
dayclock = (dayclock + 23296); //new zero-point for dayclock is 06:28:16
|
||||
dayno += 49710; //new zero-point for dayno is 02/07/2036
|
||||
dayno += (dayclock / SECS_DAY); // PLUS 6:28:16, or 49710 days, 23296 seconds since 1/1/1900 00:00:00
|
||||
dayclock %= SECS_DAY; // get rid of any overflow (we already added it to dayno in previous line)
|
||||
|
||||
#ifdef CLOCK_DEEP_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F(" date overflow: dayclock =")); CC3KPrinter->print(dayclock); CC3KPrinter->print(F("dayno = ")); CC3KPrinter->println(dayno); }
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
extractedTime->sec = dayclock % 60; //seconds in current minute
|
||||
extractedTime->min = (dayclock % 3600) / 60; //minutes in current hour
|
||||
extractedTime->hour = dayclock / 3600; //hours in current day
|
||||
extractedTime->wday = (dayno + 1) % 7; //days since Sunday (0..6). Biased since 1/1/1900 was a thursday
|
||||
|
||||
dayno += 1; //No leap-year in 1900, as there should have been. This throws off the
|
||||
// calculation of year = dayno / 365.25. So we add one to line things back
|
||||
// up again, just for the year calculation.
|
||||
|
||||
dayno <<= 8; //fixed point arithmetic - multiply by 256 so we can do an integer divide by
|
||||
year = (dayno / FIX_PT_DAYS_YEAR) + BASE_YEAR; // (365.25 * 256)instead of doing a floating-point divide by 365.25
|
||||
|
||||
#ifdef CLOCK_DEEP_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(year); CC3KPrinter->print(F(" = (")); CC3KPrinter->print(dayno); CC3KPrinter->print(F(" // ")); CC3KPrinter->print(FIX_PT_DAYS_YEAR); CC3KPrinter->print(F(") + ")); CC3KPrinter->println(BASE_YEAR); }
|
||||
#endif
|
||||
|
||||
extractedTime->year = year;
|
||||
dayno = (dayno % FIX_PT_DAYS_YEAR) >> 8;
|
||||
|
||||
extractedTime->yday = dayno;
|
||||
|
||||
//if year is evenly divisible by 4, it's a leap-year, except for 1900. Change February days in table accordingly
|
||||
monthDays[1] = ((0 == (year & 3)) && (1900 != year))? 29 : 28;
|
||||
|
||||
//Now, we're going to loop through the month table, subtracting days from dayno until dayno goes negative
|
||||
// that will give us the current month
|
||||
day = (int)dayno;
|
||||
month = 0;
|
||||
while (0 <= day)
|
||||
day-= monthDays[month++];
|
||||
|
||||
month -= 1; //we need to return month as zero-based. Phooey!
|
||||
extractedTime->mon = month;
|
||||
extractedTime->mday = day + monthDays[month] + 1; //Since we looped until days went negative, we need add back in days in current month
|
||||
|
||||
extractedTime->isdst = 0; //currently ignored.
|
||||
|
||||
#ifdef CLOCK_DEEP_DEBUG
|
||||
dumpBlock1((char*)extractedTime, sizeof(NetTime_t));
|
||||
#endif
|
||||
|
||||
return extractedTime;
|
||||
}
|
||||
|
||||
//bool GetGatewayAddress(char* gatewayAddr)
|
||||
//{
|
||||
//bool success = false;
|
||||
//tNetappIpconfigRetArgs ipconfig;
|
||||
//netapp_ipconfig(&ipconfig);
|
||||
//
|
||||
///* If byte 1 is 0 we don't have a valid address */
|
||||
//if (ipconfig.aucIP[3] != 0)
|
||||
//{
|
||||
//snprintf(gatewayAddr, MAX_URL_NAME, "%d.%d.%d.%d",ipconfig.aucIP+11,ipconfig.aucIP+10,ipconfig.aucIP+9,ipconfig.aucIP+8);
|
||||
//success = true;
|
||||
//}
|
||||
//return success;
|
||||
//}
|
||||
|
||||
sntp::sntp()
|
||||
{
|
||||
m_localPool = ntp_us_pool_list;
|
||||
m_globalPool = ntp_global_pool_list;
|
||||
|
||||
m_NTPReferenceTime.seconds = 0X80000000; //initial base time for real-time clock (1/20/1968 03:14:08)
|
||||
m_NTPReferenceTime.fraction = 0;
|
||||
|
||||
m_std_UTC_offset.seconds = 0; //Local standard-time offset from UTC. Example: Eastern Standard is UTC - 5 hours
|
||||
m_std_UTC_offset.fraction = 0;
|
||||
m_dst_UTC_offset.seconds = 0; //Local daylight-savings-time offset from UTC. Ex: Eastern Daylght is UTC - 4 hours
|
||||
m_dst_UTC_offset.fraction = 0;
|
||||
m_cur_UTC_offset = &m_std_UTC_offset; //Current offset from UTC. Pointer to either std_UTC_offset or dst_UTC_offset
|
||||
m_twelveHour = false; //use 12-hour time when true, 24-hour time when false
|
||||
m_enable_dst = false; //enable daylight savings time
|
||||
|
||||
//GetGatewayAddress((char*)&m_userServerStrings[1]);
|
||||
//m_userServers[0] = (char*)&m_userServerStrings[1];
|
||||
}
|
||||
|
||||
sntp::sntp(char* ntp_server_url1, char* ntp_server_url2, short local_utc_offset, short dst_utc_offset, bool enable_dst)
|
||||
{
|
||||
int user_server_count = 0;
|
||||
|
||||
sntp();
|
||||
|
||||
m_std_UTC_offset.seconds = (uint32_t)(60L * local_utc_offset);
|
||||
m_dst_UTC_offset.seconds = (uint32_t)(60L * dst_utc_offset);
|
||||
m_cur_UTC_offset = &m_dst_UTC_offset;
|
||||
m_enable_dst = enable_dst;
|
||||
if (ntp_server_url1)
|
||||
{
|
||||
strncpy((char*)&m_userServerStrings[user_server_count], ntp_server_url1, MAX_URL_NAME);
|
||||
m_userServers[user_server_count] = (char*)&m_userServerStrings[user_server_count];
|
||||
user_server_count++;
|
||||
}
|
||||
if (ntp_server_url2)
|
||||
{
|
||||
strncpy((char*)&m_userServerStrings[user_server_count], ntp_server_url2, MAX_URL_NAME);
|
||||
m_userServers[user_server_count] = (char*)&m_userServerStrings[user_server_count];
|
||||
user_server_count++;
|
||||
}
|
||||
}
|
||||
sntp::sntp(char* ntp_server_url1, short local_utc_offset)
|
||||
{
|
||||
sntp(ntp_server_url1, NULL, local_utc_offset, 0, false);
|
||||
}
|
||||
sntp::sntp(char* ntp_server_url1, char* ntp_server_url2, short local_utc_offset)
|
||||
{
|
||||
sntp(ntp_server_url1, ntp_server_url2, local_utc_offset, 0, false);
|
||||
}
|
||||
sntp::sntp(char* ntp_server_url1, short local_utc_offset, short dst_utc_offset, bool enable_dst)
|
||||
{
|
||||
sntp(ntp_server_url1, NULL, local_utc_offset, dst_utc_offset, enable_dst);
|
||||
}
|
||||
|
||||
//To spread the load of NTP client request, ntp.org maintains DNS servers that will return a list of
|
||||
// available NTP servers from a pool. This routine gets a list of servers from the specified pool
|
||||
// and returns it, along with a count of the servers in the list.
|
||||
char sntp::GetNTPServerList(const char** ntp_pool_list, uint32_t* addrBuffer, int maxServerCount)
|
||||
{
|
||||
uint32_t ntpServer= NULL;
|
||||
const char **ntpPoolName;
|
||||
uint8_t serverCount = 0;
|
||||
|
||||
if ((ntp_pool_list) && (addrBuffer))
|
||||
{
|
||||
ntpPoolName = ntp_pool_list;
|
||||
while ((*ntpPoolName) && (!ntpServer))
|
||||
{
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F("Checking NTP server/pool address ")); CC3KPrinter->println(*ntpPoolName); }
|
||||
#endif
|
||||
|
||||
gethostbyname(*ntpPoolName, strlen(*ntpPoolName), &ntpServer);
|
||||
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F(" returns ntpServer: ")); CC3KPrinter->println(ntpServer,HEX); }
|
||||
#endif
|
||||
|
||||
ntpPoolName++;
|
||||
}
|
||||
if (ntpServer)
|
||||
{
|
||||
*addrBuffer = ntpServer;
|
||||
serverCount += 1;
|
||||
}
|
||||
|
||||
}
|
||||
return serverCount;
|
||||
}
|
||||
|
||||
|
||||
//Called by task to poll specific NTP server for current time.
|
||||
bool sntp::SNTP_GetTime(int sntpSocket, uint32_t *ntpServerAddr)
|
||||
{
|
||||
sockaddr_in socketAddr;
|
||||
socklen_t sockLen;
|
||||
int32_t recvTimeout = 30000;
|
||||
int8_t byteCount;
|
||||
SNTP_Timestamp_t tsDestination;
|
||||
bool result = false;
|
||||
SNTP_Message_t sntp_message; // sntp message buffer
|
||||
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->println(F("SNTP_GetTime")); }
|
||||
#endif
|
||||
|
||||
// set the ntp server address and port
|
||||
memset(&socketAddr, 0, sizeof(sockaddr_in));
|
||||
socketAddr.sin_family = AF_INET;
|
||||
memcpy(&(socketAddr.sin_addr), ntpServerAddr, 4);
|
||||
socketAddr.sin_port = htons(SNTP_PORT);
|
||||
|
||||
//Prepare the outgoing ntp request packet
|
||||
memset(&sntp_message, 0, sizeof(SNTP_Message_t)); //zero the outgoing message
|
||||
sntp_message.mode = client; // NTP client request
|
||||
sntp_message.VN = 3; // NTP version 3
|
||||
NTPGetTime(&sntp_message.tsTransmit, false); //transmitting at current UTC time
|
||||
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F("SNTP sendto server ")); CC3KPrinter->println(socketAddr.sin_addr.s_addr,HEX); }
|
||||
dumpBlock1((char*)&sntp_message, sizeof(SNTP_Message_t));
|
||||
#endif
|
||||
|
||||
sockLen = sizeof(sockaddr_in);
|
||||
byteCount = sendto(sntpSocket, &sntp_message, sizeof(SNTP_Message_t), 0, (sockaddr*)&socketAddr, sockLen);
|
||||
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F("sendto transmitted ")); CC3KPrinter->print(byteCount,HEX); CC3KPrinter->println(F(" bytes")); }
|
||||
#endif
|
||||
|
||||
if (sizeof(SNTP_Message_t) == byteCount)
|
||||
{
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->println(F("Waiting for response")); }
|
||||
#endif
|
||||
|
||||
setsockopt(sntpSocket, SOL_SOCKET, SOCKOPT_RECV_TIMEOUT, &recvTimeout, (socklen_t)sizeof(recvTimeout));
|
||||
sockLen = sizeof(sockaddr_in);
|
||||
byteCount = recvfrom(sntpSocket, &sntp_message, sizeof(SNTP_Message_t), 0, (sockaddr*)&socketAddr, &sockLen);
|
||||
|
||||
//tsDestination = UTC time when we received reply
|
||||
NTPGetTime(&tsDestination, false);
|
||||
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F("SNTP received ")); CC3KPrinter->print(byteCount); CC3KPrinter->println(F(" bytes")); }
|
||||
#endif
|
||||
|
||||
//If we got a good response packet, go ahead and calculate the current time.
|
||||
// This is done according the the following equation:
|
||||
// ((Receive time - Originate Time) + (Transmit Time - Destination Time)) / 2
|
||||
if (sizeof(SNTP_Message_t) == byteCount)
|
||||
{
|
||||
//Change the byte order of the received timestamps to big-endian
|
||||
sntp_message.tsReceive.seconds = htonl(sntp_message.tsReceive.seconds);
|
||||
sntp_message.tsReceive.fraction = htonl(sntp_message.tsReceive.fraction);
|
||||
sntp_message.tsTransmit.seconds = htonl(sntp_message.tsTransmit.seconds);
|
||||
sntp_message.tsTransmit.fraction = htonl(sntp_message.tsTransmit.fraction);
|
||||
//we don't use tsReference for anything, so don't bother swapping it.
|
||||
// sntp_message.tsReference.seconds = htonl(sntp_message.tsReference.seconds);
|
||||
// sntp_message.tsReference.fraction = htonl(sntp_message.tsReference.fraction);
|
||||
|
||||
|
||||
#ifdef CLOCK_DEBUG
|
||||
dumpBlock1((char*)&sntp_message, sizeof(SNTP_Message_t));
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->println(F("Received at ")); }
|
||||
dumpBlock1((char*)&tsDestination, sizeof(tsDestination));
|
||||
#endif
|
||||
|
||||
//Formula is: correction = ((tsReceive-tsOriginate)/2) + ((tsTransmit-tsDestination)/2)
|
||||
//
|
||||
//Server received request at tsReceive, we sent request at tsOriginate
|
||||
DiffNTPtime(&sntp_message.tsOriginate, &sntp_message.tsReceive);
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F(" (R - O): ")); CC3KPrinter->print(sntp_message.tsReceive.seconds,HEX); CC3KPrinter->print(F(".")); CC3KPrinter->println(sntp_message.tsReceive.fraction,HEX); }
|
||||
#endif
|
||||
NTPdiv2(&sntp_message.tsReceive);
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F(" (R - O)/2: ")); CC3KPrinter->print(sntp_message.tsReceive.seconds,HEX); CC3KPrinter->print(F(".")); CC3KPrinter->println(sntp_message.tsReceive.fraction,HEX); }
|
||||
#endif
|
||||
|
||||
//Server sent reply at tsTransmit, we received reply at tsDestination
|
||||
DiffNTPtime(&tsDestination, &sntp_message.tsTransmit);
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F(" (T - D): ")); CC3KPrinter->print(sntp_message.tsTransmit.seconds,HEX); CC3KPrinter->print(F(".")); CC3KPrinter->println(sntp_message.tsTransmit.fraction,HEX); }
|
||||
#endif
|
||||
NTPdiv2(&sntp_message.tsTransmit);
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F(" (T - D)/2: ")); CC3KPrinter->print(sntp_message.tsTransmit.seconds,HEX); CC3KPrinter->print(F(".")); CC3KPrinter->println(sntp_message.tsTransmit.fraction,HEX); }
|
||||
#endif
|
||||
|
||||
//Correction is returned in tsTransmit
|
||||
AddNTPtime(&sntp_message.tsReceive, &sntp_message.tsTransmit);
|
||||
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F(" Offset: ")); CC3KPrinter->print(sntp_message.tsTransmit.seconds,HEX); CC3KPrinter->print(F(".")); CC3KPrinter->println(sntp_message.tsTransmit.fraction,HEX); }
|
||||
#endif
|
||||
|
||||
//Add correction to current ntp reference time
|
||||
AddNTPtime(&sntp_message.tsTransmit, &m_NTPReferenceTime); //adjust NTP reference time
|
||||
m_timeIsSet = true;
|
||||
|
||||
#ifdef CLOCK_DEBUG
|
||||
NTPGetTime(&tsDestination, false); //we'll display local time
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F(" time is ")); CC3KPrinter->print(tsDestination.seconds,HEX); CC3KPrinter->print(F(".")); CC3KPrinter->println(tsDestination.fraction,HEX); }
|
||||
#endif
|
||||
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
bool sntp::UpdateNTPTime()
|
||||
{
|
||||
bool portIsBound = false;
|
||||
int sntpSocket;
|
||||
sockaddr_in socketAddr;
|
||||
uint16_t localPort;
|
||||
NTP_Pool_t ntp_pool_list; // list of NTP server pools
|
||||
NTP_Server_List_t *pServerList; // pointer to list of ntp servers returned by a server pool
|
||||
NTP_Server_List_t ntp_server_list; // local buffer for list of ntp servers returned by a server pool
|
||||
uint8_t ntp_server_count; // number of ntp servers in ntp_server_list
|
||||
bool checkLocal; // true if we haven't searched the local NTP server list.
|
||||
bool checkGlobal; // true if we haven't searched the global NTP server list.
|
||||
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->println(F("sntp.update")); }
|
||||
#endif
|
||||
|
||||
sntpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
if (sntpSocket >= 0) //got one?
|
||||
{
|
||||
while (!portIsBound)
|
||||
{ //set up the sockAddr
|
||||
|
||||
memset(&socketAddr, 0, sizeof(sockaddr_in)); //zero it
|
||||
localPort = (uint16_t)random(0xC000, 0xFFFF); //generate random port number in range C000-FFFF
|
||||
socketAddr.sin_family = AF_INET; //IP version 4
|
||||
socketAddr.sin_addr.s_addr = 0; //local socket address
|
||||
socketAddr.sin_port = htons(localPort); //well-known NTP port number, assigned by IANA
|
||||
// bind the socket to the local port
|
||||
portIsBound = (0 == bind(sntpSocket, (sockaddr*)&socketAddr, sizeof(sockaddr_in)));
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F("local: ")); CC3KPrinter->print(socketAddr.sin_addr.s_addr, HEX); CC3KPrinter->print(F(": ")); CC3KPrinter->println(socketAddr.sin_port, HEX); }
|
||||
#endif
|
||||
}
|
||||
|
||||
if (portIsBound)
|
||||
{
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F("Init SNTP bind socket ")); CC3KPrinter->print(sntpSocket); CC3KPrinter->print(F("to port ")); CC3KPrinter->print(socketAddr.sin_port); CC3KPrinter->println(F(" succeeded")); }
|
||||
#endif
|
||||
|
||||
m_change_DST = 0;
|
||||
m_timeIsSet = false;
|
||||
|
||||
while (!m_timeIsSet) //stay here until we either get a time, or run out of servers
|
||||
{
|
||||
//start with user's NTP servers. These may not be pool servers, so they'll only get one IP address from DNS
|
||||
ntp_pool_list = m_userServers; //start with user's ntp server list
|
||||
m_localPool = ntp_us_pool_list;
|
||||
m_globalPool = ntp_global_pool_list;
|
||||
checkLocal = (NULL != m_localPool); // if that craps out, we'll try the local server-pool list
|
||||
checkGlobal = (NULL != m_globalPool); //if that craps out, we'll try the global server-pool list
|
||||
#ifdef CLOCK_DEEP_DEBUG
|
||||
if (CC3KPrinter != 0)
|
||||
{
|
||||
CC3KPrinter->print(F("m_localPool: ")); CC3KPrinter->print(*m_localPool); CC3KPrinter->print(F("checkLocal: ")); CC3KPrinter->println(checkLocal);
|
||||
CC3KPrinter->print(F("m_globalPool: ")); CC3KPrinter->print(*m_globalPool); CC3KPrinter->print(F("checkGlobal: ")); CC3KPrinter->println(checkGlobal);
|
||||
}
|
||||
#endif
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F("try user's ntp server list: ")); CC3KPrinter->println((uint32_t)*ntp_pool_list); }
|
||||
#endif
|
||||
|
||||
memset(&ntp_server_list, 0, sizeof(NTP_Server_List_t));
|
||||
pServerList = &ntp_server_list; //server ip addresses returned here
|
||||
|
||||
while ((!m_timeIsSet) && (pServerList))
|
||||
{
|
||||
//try to get a server list.
|
||||
ntp_server_count = GetNTPServerList(ntp_pool_list, (uint32_t*)pServerList, MAX_NTP_SERVERS); // Just returns if pServerList is NULL
|
||||
#ifdef CLOCK_DEEP_DEBUG
|
||||
dumpBlock1((char*)pServerList, ntp_server_count * sizeof(uint32_t));
|
||||
#endif
|
||||
|
||||
int i = 0;
|
||||
while ((!m_timeIsSet) && (i++ < ntp_server_count) && (pServerList))
|
||||
{
|
||||
uint32_t serverAddr = htonl(*(uint32_t*)pServerList++);
|
||||
m_timeIsSet = SNTP_GetTime(sntpSocket, &serverAddr);
|
||||
}
|
||||
|
||||
if (!m_timeIsSet)
|
||||
{
|
||||
pServerList = &ntp_server_list; //reset pServerList pointer
|
||||
|
||||
if (checkLocal)
|
||||
{
|
||||
ntp_pool_list = m_localPool; //try local ntp server pool list ('local' means 'regional', e.g., US, North America, etc)
|
||||
checkLocal = false;
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F("try local ntp_pool_list: ")); CC3KPrinter->println((uint32_t)*ntp_pool_list); }
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
if (checkGlobal)
|
||||
{
|
||||
ntp_pool_list = m_globalPool; //now try global (i.e., default) ntp server pool list
|
||||
checkGlobal = false;
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F("try global ntp_pool_list: ")); CC3KPrinter->println((uint32_t)*ntp_pool_list); }
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
pServerList = NULL; //rats. came up empty. This will get us out of the loop
|
||||
ntp_server_count = 0;
|
||||
|
||||
} //else not checkGlobal
|
||||
} //else not checkLocal
|
||||
} //if (!m_timeIsSet)
|
||||
} //while ((!m_timeIsSet) && (pServerList))
|
||||
|
||||
if (m_timeIsSet)
|
||||
{
|
||||
// //If necessary, make change to/from Daylight Savings Time
|
||||
// // NOTE: m_change_DST will have been set on the previous iteration of the loop, so that
|
||||
// // we update the time AFTER we wake up. This is because the timer will have been adjusted
|
||||
// // to wake up when the time-change happens
|
||||
// // 'm_change_DST' is tri-state: 0 or no change, +1 for spring change, -1 for fall change.
|
||||
// UpdateDST(m_change_DST);
|
||||
//
|
||||
// //Now, see if the time change will happen before the next scheduled wake-up.
|
||||
// // If so, shorten sleep-time so we wake up at the time-change
|
||||
// TaskLock(&Clock.lock);
|
||||
// m_change_DST = Check_DST(NTPGetTime(&m_tempTS, false), &m_sleepTime); //if necessary, shortens m_sleepTime so we wake up at the time-change
|
||||
// TaskUnlock(&Clock.lock); // Also makes sure current DST settings are correct.
|
||||
//
|
||||
// strBufLen = 32;
|
||||
// Trace("The time is now %s\r\n", FormatFullNTPtime(NTPGetTime(&m_tempTS, true), strBuf, &strBufLen, true));
|
||||
//
|
||||
//
|
||||
}
|
||||
} // while (!m_timeIsSet)
|
||||
closesocket(sntpSocket);
|
||||
sntpSocket = -1;
|
||||
} //if (portIsBound)
|
||||
else //socket bind failed
|
||||
{
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->print(F("Init SNTP bind socket ")); CC3KPrinter->print(sntpSocket); CC3KPrinter->print(F("to port ")); CC3KPrinter->print(SNTP_PORT); CC3KPrinter->println(F("failed")); }
|
||||
closesocket(sntpSocket);
|
||||
sntpSocket = -1;
|
||||
}
|
||||
} //if (sntpSocket >= 0)
|
||||
else // didn't get a socket
|
||||
{
|
||||
if (CC3KPrinter != 0) { CC3KPrinter->println(F("Failed to get a socket")); }
|
||||
}
|
||||
#ifdef CLOCK_DEBUG
|
||||
if (CC3KPrinter != 0)
|
||||
{
|
||||
CC3KPrinter->println(F("exit sntp.update"));
|
||||
CC3KPrinter->print(F("m_std_UTC_offset.seconds: ")); CC3KPrinter->println(m_std_UTC_offset.seconds, HEX);
|
||||
CC3KPrinter->print(F("m_dst_UTC_offset.seconds: ")); CC3KPrinter->println(m_dst_UTC_offset.seconds, HEX);
|
||||
}
|
||||
#endif
|
||||
return m_timeIsSet;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//sntp SNTP;
|
||||
|
||||
@@ -1,409 +0,0 @@
|
||||
// sntp.h
|
||||
|
||||
#ifndef _SNTP_h
|
||||
#define _SNTP_h
|
||||
// Notes on NTP packet format from IETF RFC-2030, SNTP Specification (http://www.ietf.org/rfc/rfc2030.txt?number=2030) :
|
||||
//
|
||||
//NTP Timestamp Format
|
||||
//
|
||||
// SNTP uses the standard NTP timestamp format described in RFC-1305 and
|
||||
// previous versions of that document. In conformance with standard
|
||||
// Internet practice, NTP data are specified as integer or fixed-point
|
||||
// quantities, with bits numbered in big-endian fashion from 0 starting
|
||||
// at the left, or high-order, position. Unless specified otherwise, all
|
||||
// quantities are unsigned and may occupy the full field width with an
|
||||
// implied 0 preceding bit 0.
|
||||
//
|
||||
// Since NTP timestamps are cherished data and, in fact, represent the
|
||||
// main product of the protocol, a special timestamp format has been
|
||||
// established. NTP timestamps are represented as a 64-bit unsigned
|
||||
// fixed-point number, in seconds relative to 0h on 1 January 1900. The
|
||||
// integer part is in the first 32 bits and the fraction part in the
|
||||
// last 32 bits. In the fraction part, the non-significant low order can
|
||||
// be set to 0.
|
||||
//
|
||||
// It is advisable to fill the non-significant low order bits of the
|
||||
// timestamp with a random, unbiased bitstring, both to avoid
|
||||
// systematic roundoff errors and as a means of loop detection and
|
||||
// replay detection (see below). One way of doing this is to generate
|
||||
// a random bitstring in a 64-bit word, then perform an arithmetic
|
||||
// right shift a number of bits equal to the number of significant
|
||||
// bits of the timestamp, then add the result to the original
|
||||
// timestamp.
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//Mills Informational [Page 6]
|
||||
//
|
||||
//RFC 2030 SNTPv4 for IPv4, IPv6 and OSI October 1996
|
||||
//
|
||||
//
|
||||
// This format allows convenient multiple-precision arithmetic and
|
||||
// conversion to UDP/TIME representation (seconds), but does complicate
|
||||
// the conversion to ICMP Timestamp message representation, which is in
|
||||
// milliseconds. The maximum number that can be represented is
|
||||
// 4,294,967,295 seconds with a precision of about 200 picoseconds,
|
||||
// which should be adequate for even the most exotic requirements.
|
||||
//
|
||||
// 1 2 3
|
||||
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | Seconds |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | Seconds Fraction (0-padded) |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
//
|
||||
// Note that, since some time in 1968 (second 2,147,483,648) the most
|
||||
// significant bit (bit 0 of the integer part) has been set and that the
|
||||
// 64-bit field will overflow some time in 2036 (second 4,294,967,296).
|
||||
// Should NTP or SNTP be in use in 2036, some external means will be
|
||||
// necessary to qualify time relative to 1900 and time relative to 2036
|
||||
// (and other multiples of 136 years). There will exist a 200-picosecond
|
||||
// interval, henceforth ignored, every 136 years when the 64-bit field
|
||||
// will be 0, which by convention is interpreted as an invalid or
|
||||
// unavailable timestamp.
|
||||
//
|
||||
// As the NTP timestamp format has been in use for the last 17 years,
|
||||
// it remains a possibility that it will be in use 40 years from now
|
||||
// when the seconds field overflows. As it is probably inappropriate
|
||||
// to archive NTP timestamps before bit 0 was set in 1968, a
|
||||
// convenient way to extend the useful life of NTP timestamps is the
|
||||
// following convention: If bit 0 is set, the UTC time is in the
|
||||
// range 1968-2036 and UTC time is reckoned from 0h 0m 0s UTC on 1
|
||||
// January 1900. If bit 0 is not set, the time is in the range 2036-
|
||||
// 2104 and UTC time is reckoned from 6h 28m 16s UTC on 7 February
|
||||
// 2036. Note that when calculating the correspondence, 2000 is not a
|
||||
// leap year. Note also that leap seconds are not counted in the
|
||||
// reckoning.
|
||||
//
|
||||
//4. NTP Message Format
|
||||
//
|
||||
// Both NTP and SNTP are clients of the User Datagram Protocol (UDP)
|
||||
// [POS80], which itself is a client of the Internet Protocol (IP)
|
||||
// [DAR81]. The structure of the IP and UDP headers is described in the
|
||||
// cited specification documents and will not be detailed further here.
|
||||
// The UDP port number assigned to NTP is 123, which should be used in
|
||||
// both the Source Port and Destination Port fields in the UDP header.
|
||||
// The remaining UDP header fields should be set as described in the
|
||||
// specification.
|
||||
//
|
||||
//
|
||||
//
|
||||
//Mills Informational [Page 7]
|
||||
//
|
||||
//RFC 2030 SNTPv4 for IPv4, IPv6 and OSI October 1996
|
||||
//
|
||||
//
|
||||
// Below is a description of the NTP/SNTP Version 4 message format,
|
||||
// which follows the IP and UDP headers. This format is identical to
|
||||
// that described in RFC-1305, with the exception of the contents of the
|
||||
// reference identifier field. The header fields are defined as follows:
|
||||
//
|
||||
// 1 2 3
|
||||
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// |LI | VN |Mode | Stratum | Poll | Precision |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | Root Delay |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | Root Dispersion |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | Reference Identifier |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | |
|
||||
// | Reference Timestamp (64) |
|
||||
// | |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | |
|
||||
// | Originate Timestamp (64) |
|
||||
// | |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | |
|
||||
// | Receive Timestamp (64) |
|
||||
// | |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | |
|
||||
// | Transmit Timestamp (64) |
|
||||
// | |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | Key Identifier (optional) (32) |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | |
|
||||
// | |
|
||||
// | Message Digest (optional) (128) |
|
||||
// | |
|
||||
// | |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
//
|
||||
// As described in the next section, in SNTP most of these fields are
|
||||
// initialized with pre-specified data. For completeness, the function
|
||||
// of each field is briefly summarized below.
|
||||
//
|
||||
//
|
||||
// Leap Indicator (LI): This is a two-bit code warning of an impending
|
||||
// leap second to be inserted/deleted in the last minute of the current
|
||||
// day, with bit 0 and bit 1, respectively, coded as follows:
|
||||
//
|
||||
// LI Value Meaning
|
||||
// -------------------------------------------------------
|
||||
// 00 0 no warning
|
||||
// 01 1 last minute has 61 seconds
|
||||
// 10 2 last minute has 59 seconds)
|
||||
// 11 3 alarm condition (clock not synchronized)
|
||||
//
|
||||
// Version Number (VN): This is a three-bit integer indicating the
|
||||
// NTP/SNTP version number. The version number is 3 for Version 3 (IPv4
|
||||
// only) and 4 for Version 4 (IPv4, IPv6 and OSI). If necessary to
|
||||
// distinguish between IPv4, IPv6 and OSI, the encapsulating context
|
||||
// must be inspected.
|
||||
//
|
||||
// Mode: This is a three-bit integer indicating the mode, with values
|
||||
// defined as follows:
|
||||
//
|
||||
// Mode Meaning
|
||||
// ------------------------------------
|
||||
// 0 reserved
|
||||
// 1 symmetric active
|
||||
// 2 symmetric passive
|
||||
// 3 client
|
||||
// 4 server
|
||||
// 5 broadcast
|
||||
// 6 reserved for NTP control message
|
||||
// 7 reserved for private use
|
||||
//
|
||||
// In unicast and anycast modes, the client sets this field to 3
|
||||
// (client) in the request and the server sets it to 4 (server) in the
|
||||
// reply. In multicast mode, the server sets this field to 5
|
||||
// (broadcast).
|
||||
//
|
||||
// Stratum: This is a eight-bit unsigned integer indicating the stratum
|
||||
// level of the local clock, with values defined as follows:
|
||||
//
|
||||
// Stratum Meaning
|
||||
// ----------------------------------------------
|
||||
// 0 unspecified or unavailable
|
||||
// 1 primary reference (e.g., radio clock)
|
||||
// 2-15 secondary reference (via NTP or SNTP)
|
||||
// 16-255 reserved
|
||||
//
|
||||
//
|
||||
// Poll Interval: This is an eight-bit signed integer indicating the
|
||||
// maximum interval between successive messages, in seconds to the
|
||||
// nearest power of two. The values that can appear in this field
|
||||
// presently range from 4 (16 s) to 14 (16284 s); however, most
|
||||
// applications use only the sub-range 6 (64 s) to 10 (1024 s).
|
||||
//
|
||||
// Precision: This is an eight-bit signed integer indicating the
|
||||
// precision of the local clock, in seconds to the nearest power of two.
|
||||
// The values that normally appear in this field range from -6 for
|
||||
// mains-frequency clocks to -20 for microsecond clocks found in some
|
||||
// workstations.
|
||||
//
|
||||
// Root Delay: This is a 32-bit signed fixed-point number indicating the
|
||||
// total roundtrip delay to the primary reference source, in seconds
|
||||
// with fraction point between bits 15 and 16. Note that this variable
|
||||
// can take on both positive and negative values, depending on the
|
||||
// relative time and frequency offsets. The values that normally appear
|
||||
// in this field range from negative values of a few milliseconds to
|
||||
// positive values of several hundred milliseconds.
|
||||
//
|
||||
// Root Dispersion: This is a 32-bit unsigned fixed-point number
|
||||
// indicating the nominal error relative to the primary reference
|
||||
// source, in seconds with fraction point between bits 15 and 16. The
|
||||
// values that normally appear in this field range from 0 to several
|
||||
// hundred milliseconds.
|
||||
//
|
||||
// Reference Identifier: This is a 32-bit bitstring identifying the
|
||||
// particular reference source. In the case of NTP Version 3 or Version
|
||||
// 4 stratum-0 (unspecified) or stratum-1 (primary) servers, this is a
|
||||
// four-character ASCII string, left justified and zero padded to 32
|
||||
// bits. In NTP Version 3 secondary servers, this is the 32-bit IPv4
|
||||
// address of the reference source. In NTP Version 4 secondary servers,
|
||||
// this is the low order 32 bits of the latest transmit timestamp of the
|
||||
// reference source. NTP primary (stratum 1) servers should set this
|
||||
// field to a code identifying the external reference source according
|
||||
// to the following list. If the external reference is one of those
|
||||
// listed, the associated code should be used. Codes for sources not
|
||||
// listed can be contrived as appropriate.
|
||||
//
|
||||
//
|
||||
// Code External Reference Source
|
||||
// ----------------------------------------------------------------
|
||||
// LOCL uncalibrated local clock used as a primary reference for
|
||||
// a subnet without external means of synchronization
|
||||
// PPS atomic clock or other pulse-per-second source
|
||||
// individually calibrated to national standards
|
||||
// ACTS NIST dialup modem service
|
||||
// USNO USNO modem service
|
||||
// PTB PTB (Germany) modem service
|
||||
// TDF Allouis (France) Radio 164 kHz
|
||||
// DCF Mainflingen (Germany) Radio 77.5 kHz
|
||||
// MSF Rugby (UK) Radio 60 kHz
|
||||
// WWV Ft. Collins (US) Radio 2.5, 5, 10, 15, 20 MHz
|
||||
// WWVB Boulder (US) Radio 60 kHz
|
||||
// WWVH Kaui Hawaii (US) Radio 2.5, 5, 10, 15 MHz
|
||||
// CHU Ottawa (Canada) Radio 3330, 7335, 14670 kHz
|
||||
// LORC LORAN-C radionavigation system
|
||||
// OMEG OMEGA radionavigation system
|
||||
// GPS Global Positioning Service
|
||||
// GOES Geostationary Orbit Environment Satellite
|
||||
//
|
||||
// Reference Timestamp: This is the time at which the local clock was
|
||||
// last set or corrected, in 64-bit timestamp format.
|
||||
//
|
||||
// Originate Timestamp: This is the time at which the request departed
|
||||
// the client for the server, in 64-bit timestamp format.
|
||||
//
|
||||
// Receive Timestamp: This is the time at which the request arrived at
|
||||
// the server, in 64-bit timestamp format.
|
||||
//
|
||||
// Transmit Timestamp: This is the time at which the reply departed the
|
||||
// server for the client, in 64-bit timestamp format.
|
||||
//
|
||||
// Authenticator (optional): When the NTP authentication scheme is
|
||||
// implemented, the Key Identifier and Message Digest fields contain the
|
||||
// message authentication code (MAC) information defined in Appendix C
|
||||
// of RFC-1305.
|
||||
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
#include "Arduino.h"
|
||||
#else
|
||||
#include "WProgram.h"
|
||||
#endif
|
||||
|
||||
#include "utility/socket.h"
|
||||
#include "utility/netapp.h"
|
||||
|
||||
//#define CLOCK_DEBUG
|
||||
//#define CLOCK_DEEP_DEBUG
|
||||
//
|
||||
#define SNTP_PORT ((uint16_t)123) /* well-known NTP port number, assigned by IANA */
|
||||
|
||||
#define MAX_URL_NAME 31
|
||||
|
||||
#define MAX_NTP_SERVERS 2
|
||||
|
||||
#define NUMBER_OF_TIME_ZONES 34
|
||||
|
||||
|
||||
typedef enum SNTP_LI_t { no_warning = 0,
|
||||
sixty_One,
|
||||
fifty_Nine,
|
||||
alarm
|
||||
} SNTP_LI_t;
|
||||
|
||||
typedef enum SNTP_Mode_t { reserved = 0,
|
||||
sym_active,
|
||||
sym_passive,
|
||||
client,
|
||||
server,
|
||||
broadcast,
|
||||
reserved_control,
|
||||
reserved_private
|
||||
} SNTP_Mode_t;
|
||||
|
||||
typedef struct SNTP_Stratum_t
|
||||
{
|
||||
uint8_t primary : 1;
|
||||
uint8_t secondary : 3;
|
||||
uint8_t reserved : 4;
|
||||
}SNTP_Stratum_t;
|
||||
|
||||
typedef struct SNTP_Timestamp_t
|
||||
{
|
||||
uint32_t seconds;
|
||||
int32_t fraction;
|
||||
}SNTP_Timestamp_t;
|
||||
|
||||
typedef struct SNTP_Message_t
|
||||
{
|
||||
SNTP_Mode_t mode : 3;
|
||||
uint8_t VN : 3;
|
||||
SNTP_LI_t LI : 2;
|
||||
SNTP_Stratum_t stratum;
|
||||
char poll;
|
||||
char precision;
|
||||
long delay;
|
||||
uint32_t dispersion;
|
||||
uint32_t referenceID;
|
||||
SNTP_Timestamp_t tsReference;
|
||||
SNTP_Timestamp_t tsOriginate;
|
||||
SNTP_Timestamp_t tsReceive;
|
||||
SNTP_Timestamp_t tsTransmit;
|
||||
// uint32_t key; //optional field - ignore
|
||||
// uint8_t messageDigest[128]; //optional field - ignore
|
||||
}SNTP_Message_t;
|
||||
|
||||
typedef const char** NTP_Pool_t; //Name of NTP server pool
|
||||
typedef uint32_t NTP_Server_List_t[MAX_NTP_SERVERS]; //list of ntp server addresses (as returned by NTP server pool)
|
||||
|
||||
/**
|
||||
* Structure for NTP calendar time.
|
||||
*
|
||||
*/
|
||||
typedef struct NetTime_t
|
||||
{
|
||||
uint16_t millis; ///< Milliseconds after the second (0..999)
|
||||
uint8_t sec; ///< Seconds after the minute (0..59)
|
||||
uint8_t min; ///< Minutes after the hour (0..59)
|
||||
uint8_t hour; ///< Hours since midnight (0..23)
|
||||
uint8_t mday; ///< Day of the month (1..31)
|
||||
uint8_t mon; ///< Months since January (0..11)
|
||||
uint16_t year; ///< Year.
|
||||
uint8_t wday; ///< Days since Sunday (0..6)
|
||||
uint16_t yday; ///< Days since January 1 (0..365)
|
||||
bool isdst; ///< Daylight savings time flag, currently not supported
|
||||
}NetTime_t;
|
||||
|
||||
|
||||
class sntp
|
||||
{
|
||||
public:
|
||||
sntp();
|
||||
sntp(char* ntp_server_url1, short local_utc_offset);
|
||||
sntp(char* ntp_server_url1, char* ntp_server_url2, short local_utc_offset);
|
||||
sntp(char* ntp_server_url1, short local_utc_offset, short dst_utc_offset, bool enable_dst);
|
||||
sntp(char* ntp_server_url1, char* ntp_server_url2, short local_utc_offset, short dst_utc_offset, bool enable_dst);
|
||||
|
||||
virtual ~sntp() {};
|
||||
|
||||
NetTime_t *ExtractNTPTime(/*in*/ SNTP_Timestamp_t *ntpTime, /*out*/ NetTime_t *extractedTime);
|
||||
|
||||
bool UpdateNTPTime();
|
||||
SNTP_Timestamp_t* NTPGetTime(SNTP_Timestamp_t* ntpTime, bool local);
|
||||
SNTP_Timestamp_t* NTPSetTime(SNTP_Timestamp_t* ntpTime, bool local);
|
||||
int GetSystemClockAsNTPTime(SNTP_Timestamp_t* ntpSystemTime);
|
||||
|
||||
private:
|
||||
char GetNTPServerList(const char** ntp_pool_list, uint32_t* addrBuffer, int maxServerCount);
|
||||
bool SNTP_GetTime(int sntpSocket, uint32_t *ntpServerAddr);
|
||||
|
||||
NetTime_t m_timeStruct;
|
||||
|
||||
uint8_t m_change_DST; // 0 if no daylight savings time change, +1 if spring change, -1 if fall change
|
||||
|
||||
SNTP_Timestamp_t m_NTPReferenceTime; //base time for real-time clock real time = this + millisecond ticker
|
||||
SNTP_Timestamp_t m_std_UTC_offset; //Local standard-time offset from UTC. Example: Eastern Standard is UTC - 5 hours
|
||||
SNTP_Timestamp_t m_dst_UTC_offset; //Local daylight-savings-time offset from UTC. Ex: Eastern Daylght is UTC - 4 hours
|
||||
SNTP_Timestamp_t* m_cur_UTC_offset; //Current offset from UTC. Pointer to either std_UTC_offset or dst_UTC_offset
|
||||
bool m_twelveHour; //use 12-hour time when true, 24-hour time when false
|
||||
bool m_enable_dst; //enable daylight savings time
|
||||
SNTP_Timestamp_t m_dst_start; // next date when DST starts
|
||||
SNTP_Timestamp_t m_dst_end; // next date when DST ends
|
||||
uint32_t m_pollTime; // in seconds, how often to poll NTP to update clock
|
||||
NTP_Pool_t m_localPool; //list of pool servers for current geographical location
|
||||
NTP_Pool_t m_globalPool; //list of global pool servers if no local servers respond
|
||||
uint8_t m_userServerCount; //number of NTP servers provded by user (not pool servers)
|
||||
const char* m_userServers[MAX_NTP_SERVERS]; //list of NTP or NTP pool servers provided by user (pointers to userServerStrings)
|
||||
char m_userServerStrings[MAX_NTP_SERVERS][MAX_URL_NAME+1]; //storage for user's NTP server URL strings
|
||||
|
||||
bool m_timeIsSet; //false = current time is not set
|
||||
|
||||
};
|
||||
|
||||
//extern sntp SNTP;
|
||||
extern Print* CC3KPrinter;
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,691 +0,0 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* socket.h - CC3000 Host Driver Implementation.
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* Adapted for use with the Arduino/AVR by KTOWN (Kevin Townsend)
|
||||
* & Limor Fried for Adafruit Industries
|
||||
* This library works with the Adafruit CC3000 breakout
|
||||
* ----> https://www.adafruit.com/products/1469
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __SOCKET_H__
|
||||
#define __SOCKET_H__
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! \addtogroup socket_api
|
||||
//! @{
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// If building with a C++ compiler, make all of the definitions in this header
|
||||
// have a C binding.
|
||||
//
|
||||
//*****************************************************************************
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define HOSTNAME_MAX_LENGTH (230) // 230 bytes + header shouldn't exceed 8 bit value
|
||||
|
||||
//--------- Address Families --------
|
||||
|
||||
#define AF_INET 2
|
||||
#define AF_INET6 23
|
||||
|
||||
//------------ Socket Types ------------
|
||||
|
||||
#define SOCK_STREAM 1
|
||||
#define SOCK_DGRAM 2
|
||||
#define SOCK_RAW 3 // Raw sockets allow new IPv4 protocols to be implemented in user space. A raw socket receives or sends the raw datagram not including link level headers
|
||||
#define SOCK_RDM 4
|
||||
#define SOCK_SEQPACKET 5
|
||||
|
||||
//----------- Socket Protocol ----------
|
||||
|
||||
#define IPPROTO_IP 0 // dummy for IP
|
||||
#define IPPROTO_ICMP 1 // control message protocol
|
||||
#define IPPROTO_IPV4 IPPROTO_IP // IP inside IP
|
||||
#define IPPROTO_TCP 6 // tcp
|
||||
#define IPPROTO_UDP 17 // user datagram protocol
|
||||
#define IPPROTO_IPV6 41 // IPv6 in IPv6
|
||||
#define IPPROTO_NONE 59 // No next header
|
||||
#define IPPROTO_RAW 255 // raw IP packet
|
||||
#define IPPROTO_MAX 256
|
||||
|
||||
//----------- Socket retunr codes -----------
|
||||
|
||||
#define SOC_ERROR (-1) // error
|
||||
#define SOC_IN_PROGRESS (-2) // socket in progress
|
||||
|
||||
//----------- Socket Options -----------
|
||||
#define SOL_SOCKET 0xffff // socket level
|
||||
#define SOCKOPT_RECV_NONBLOCK 0 // recv non block mode, set SOCK_ON or SOCK_OFF (default block mode)
|
||||
#define SOCKOPT_RECV_TIMEOUT 1 // optname to configure recv and recvfromtimeout
|
||||
#define SOCKOPT_ACCEPT_NONBLOCK 2 // accept non block mode, set SOCK_ON or SOCK_OFF (default block mode)
|
||||
#define SOCK_ON 0 // socket non-blocking mode is enabled
|
||||
#define SOCK_OFF 1 // socket blocking mode is enabled
|
||||
|
||||
#define TCP_NODELAY 0x0001
|
||||
#define TCP_BSDURGENT 0x7000
|
||||
|
||||
#define MAX_PACKET_SIZE 1500
|
||||
#define MAX_LISTEN_QUEUE 4
|
||||
|
||||
#define IOCTL_SOCKET_EVENTMASK
|
||||
|
||||
#ifdef ENOBUFS
|
||||
#undef ENOBUFS
|
||||
#endif
|
||||
#define ENOBUFS 55 // No buffer space available
|
||||
|
||||
#define __FD_SETSIZE 32
|
||||
|
||||
#define ASIC_ADDR_LEN 8
|
||||
|
||||
#define NO_QUERY_RECIVED -3
|
||||
|
||||
|
||||
typedef struct _in_addr_t
|
||||
{
|
||||
unsigned long s_addr; // load with inet_aton()
|
||||
} in_addr;
|
||||
|
||||
typedef struct _sockaddr_t
|
||||
{
|
||||
unsigned short int sa_family;
|
||||
unsigned char sa_data[14];
|
||||
} sockaddr;
|
||||
|
||||
typedef struct _sockaddr_in_t
|
||||
{
|
||||
short sin_family; // e.g. AF_INET
|
||||
unsigned short sin_port; // e.g. htons(3490)
|
||||
in_addr sin_addr; // see struct in_addr, below
|
||||
char sin_zero[8]; // zero this if you want to
|
||||
} sockaddr_in;
|
||||
|
||||
typedef unsigned long socklen_t;
|
||||
|
||||
// The fd_set member is required to be an array of longs.
|
||||
typedef long int __fd_mask;
|
||||
|
||||
// It's easier to assume 8-bit bytes than to get CHAR_BIT.
|
||||
#define __NFDBITS (8 * sizeof (__fd_mask))
|
||||
#define __FDELT(d) ((d) / __NFDBITS)
|
||||
#define __FDMASK(d) ((__fd_mask) 1 << ((d) % __NFDBITS))
|
||||
|
||||
#ifdef fd_set
|
||||
#undef fd_set // for compatibility with newlib, which defines fd_set
|
||||
#endif
|
||||
|
||||
// fd_set for select and pselect.
|
||||
typedef struct
|
||||
{
|
||||
__fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];
|
||||
#define __FDS_BITS(set) ((set)->fds_bits)
|
||||
} fd_set;
|
||||
|
||||
// We don't use `memset' because this would require a prototype and
|
||||
// the array isn't too big.
|
||||
#define __FD_ZERO(set) \
|
||||
do { \
|
||||
unsigned int __i; \
|
||||
fd_set *__arr = (set); \
|
||||
for (__i = 0; __i < sizeof (fd_set) / sizeof (__fd_mask); ++__i) \
|
||||
__FDS_BITS (__arr)[__i] = 0; \
|
||||
} while (0)
|
||||
#define __FD_SET(d, set) (__FDS_BITS (set)[__FDELT (d)] |= __FDMASK (d))
|
||||
#define __FD_CLR(d, set) (__FDS_BITS (set)[__FDELT (d)] &= ~__FDMASK (d))
|
||||
#define __FD_ISSET(d, set) (__FDS_BITS (set)[__FDELT (d)] & __FDMASK (d))
|
||||
|
||||
// Access macros for 'fd_set'.
|
||||
#ifdef FD_SET
|
||||
#undef FD_SET
|
||||
#endif
|
||||
#ifdef FD_CLR
|
||||
#undef FD_CLR
|
||||
#endif
|
||||
#ifdef FD_ISSET
|
||||
#undef FD_ISSET
|
||||
#endif
|
||||
#ifdef FD_ZERO
|
||||
#undef FD_ZERO
|
||||
#endif
|
||||
#define FD_SET(fd, fdsetp) __FD_SET (fd, fdsetp)
|
||||
#define FD_CLR(fd, fdsetp) __FD_CLR (fd, fdsetp)
|
||||
#define FD_ISSET(fd, fdsetp) __FD_ISSET (fd, fdsetp)
|
||||
#define FD_ZERO(fdsetp) __FD_ZERO (fdsetp)
|
||||
|
||||
//Use in case of Big Endian only
|
||||
|
||||
#define htonl(A) ((((unsigned long)(A) & 0xff000000) >> 24) | \
|
||||
(((unsigned long)(A) & 0x00ff0000) >> 8) | \
|
||||
(((unsigned long)(A) & 0x0000ff00) << 8) | \
|
||||
(((unsigned long)(A) & 0x000000ff) << 24))
|
||||
|
||||
#define ntohl htonl
|
||||
|
||||
//Use in case of Big Endian only
|
||||
#define htons(A) ((((unsigned long)(A) & 0xff00) >> 8) | \
|
||||
(((unsigned long)(A) & 0x00ff) << 8))
|
||||
|
||||
|
||||
#define ntohs htons
|
||||
|
||||
// mDNS port - 5353 mDNS multicast address - 224.0.0.251
|
||||
#define SET_mDNS_ADD(sockaddr) sockaddr.sa_data[0] = 0x14; \
|
||||
sockaddr.sa_data[1] = 0xe9; \
|
||||
sockaddr.sa_data[2] = 0xe0; \
|
||||
sockaddr.sa_data[3] = 0x0; \
|
||||
sockaddr.sa_data[4] = 0x0; \
|
||||
sockaddr.sa_data[5] = 0xfb;
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Prototypes for the APIs.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! socket
|
||||
//!
|
||||
//! @param domain selects the protocol family which will be used for
|
||||
//! communication. On this version only AF_INET is supported
|
||||
//! @param type specifies the communication semantics. On this version
|
||||
//! only SOCK_STREAM, SOCK_DGRAM, SOCK_RAW are supported
|
||||
//! @param protocol specifies a particular protocol to be used with the
|
||||
//! socket IPPROTO_TCP, IPPROTO_UDP or IPPROTO_RAW are
|
||||
//! supported.
|
||||
//!
|
||||
//! @return On success, socket handle that is used for consequent socket
|
||||
//! operations. On error, -1 is returned.
|
||||
//!
|
||||
//! @brief create an endpoint for communication
|
||||
//! The socket function creates a socket that is bound to a specific
|
||||
//! transport service provider. This function is called by the
|
||||
//! application layer to obtain a socket handle.
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern int socket(long domain, long type, long protocol);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! closesocket
|
||||
//!
|
||||
//! @param sd socket handle.
|
||||
//!
|
||||
//! @return On success, zero is returned. On error, -1 is returned.
|
||||
//!
|
||||
//! @brief The socket function closes a created socket.
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern long closesocket(long sd);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! accept
|
||||
//!
|
||||
//! @param[in] sd socket descriptor (handle)
|
||||
//! @param[out] addr the argument addr is a pointer to a sockaddr structure
|
||||
//! This structure is filled in with the address of the
|
||||
//! peer socket, as known to the communications layer.
|
||||
//! determined. The exact format of the address returned
|
||||
//! addr is by the socket's address sockaddr.
|
||||
//! On this version only AF_INET is supported.
|
||||
//! This argument returns in network order.
|
||||
//! @param[out] addrlen the addrlen argument is a value-result argument:
|
||||
//! it should initially contain the size of the structure
|
||||
//! pointed to by addr.
|
||||
//!
|
||||
//! @return For socket in blocking mode:
|
||||
//! On success, socket handle. on failure negative
|
||||
//! For socket in non-blocking mode:
|
||||
//! - On connection establishment, socket handle
|
||||
//! - On connection pending, SOC_IN_PROGRESS (-2)
|
||||
//! - On failure, SOC_ERROR (-1)
|
||||
//!
|
||||
//! @brief accept a connection on a socket:
|
||||
//! This function is used with connection-based socket types
|
||||
//! (SOCK_STREAM). It extracts the first connection request on the
|
||||
//! queue of pending connections, creates a new connected socket, and
|
||||
//! returns a new file descriptor referring to that socket.
|
||||
//! The newly created socket is not in the listening state.
|
||||
//! The original socket sd is unaffected by this call.
|
||||
//! The argument sd is a socket that has been created with socket(),
|
||||
//! bound to a local address with bind(), and is listening for
|
||||
//! connections after a listen(). The argument addr is a pointer
|
||||
//! to a sockaddr structure. This structure is filled in with the
|
||||
//! address of the peer socket, as known to the communications layer.
|
||||
//! The exact format of the address returned addr is determined by the
|
||||
//! socket's address family. The addrlen argument is a value-result
|
||||
//! argument: it should initially contain the size of the structure
|
||||
//! pointed to by addr, on return it will contain the actual
|
||||
//! length (in bytes) of the address returned.
|
||||
//!
|
||||
//! @sa socket ; bind ; listen
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern long accept(long sd, sockaddr *addr, socklen_t *addrlen);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! bind
|
||||
//!
|
||||
//! @param[in] sd socket descriptor (handle)
|
||||
//! @param[out] addr specifies the destination address. On this version
|
||||
//! only AF_INET is supported.
|
||||
//! @param[out] addrlen contains the size of the structure pointed to by addr.
|
||||
//!
|
||||
//! @return On success, zero is returned. On error, -1 is returned.
|
||||
//!
|
||||
//! @brief assign a name to a socket
|
||||
//! This function gives the socket the local address addr.
|
||||
//! addr is addrlen bytes long. Traditionally, this is called when a
|
||||
//! socket is created with socket, it exists in a name space (address
|
||||
//! family) but has no name assigned.
|
||||
//! It is necessary to assign a local address before a SOCK_STREAM
|
||||
//! socket may receive connections.
|
||||
//!
|
||||
//! @sa socket ; accept ; listen
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern long bind(long sd, const sockaddr *addr, long addrlen);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! listen
|
||||
//!
|
||||
//! @param[in] sd socket descriptor (handle)
|
||||
//! @param[in] backlog specifies the listen queue depth. On this version
|
||||
//! backlog is not supported.
|
||||
//! @return On success, zero is returned. On error, -1 is returned.
|
||||
//!
|
||||
//! @brief listen for connections on a socket
|
||||
//! The willingness to accept incoming connections and a queue
|
||||
//! limit for incoming connections are specified with listen(),
|
||||
//! and then the connections are accepted with accept.
|
||||
//! The listen() call applies only to sockets of type SOCK_STREAM
|
||||
//! The backlog parameter defines the maximum length the queue of
|
||||
//! pending connections may grow to.
|
||||
//!
|
||||
//! @sa socket ; accept ; bind
|
||||
//!
|
||||
//! @note On this version, backlog is not supported
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern long listen(long sd, long backlog);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! gethostbyname
|
||||
//!
|
||||
//! @param[in] hostname host name
|
||||
//! @param[in] usNameLen name length
|
||||
//! @param[out] out_ip_addr This parameter is filled in with host IP address.
|
||||
//! In case that host name is not resolved,
|
||||
//! out_ip_addr is zero.
|
||||
//! @return On success, positive is returned. On error, negative is returned
|
||||
//!
|
||||
//! @brief Get host IP by name. Obtain the IP Address of machine on network,
|
||||
//! by its name.
|
||||
//!
|
||||
//! @note On this version, only blocking mode is supported. Also note that
|
||||
//! the function requires DNS server to be configured prior to its usage.
|
||||
//
|
||||
//*****************************************************************************
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
extern int gethostbyname(const char * hostname, uint8_t usNameLen, uint32_t* out_ip_addr);
|
||||
#endif
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! connect
|
||||
//!
|
||||
//! @param[in] sd socket descriptor (handle)
|
||||
//! @param[in] addr specifies the destination addr. On this version
|
||||
//! only AF_INET is supported.
|
||||
//! @param[out] addrlen contains the size of the structure pointed to by addr
|
||||
//! @return On success, zero is returned. On error, -1 is returned
|
||||
//!
|
||||
//! @brief initiate a connection on a socket
|
||||
//! Function connects the socket referred to by the socket descriptor
|
||||
//! sd, to the address specified by addr. The addrlen argument
|
||||
//! specifies the size of addr. The format of the address in addr is
|
||||
//! determined by the address space of the socket. If it is of type
|
||||
//! SOCK_DGRAM, this call specifies the peer with which the socket is
|
||||
//! to be associated; this address is that to which datagrams are to be
|
||||
//! sent, and the only address from which datagrams are to be received.
|
||||
//! If the socket is of type SOCK_STREAM, this call attempts to make a
|
||||
//! connection to another socket. The other socket is specified by
|
||||
//! address, which is an address in the communications space of the
|
||||
//! socket. Note that the function implements only blocking behavior
|
||||
//! thus the caller will be waiting either for the connection
|
||||
//! establishment or for the connection establishment failure.
|
||||
//!
|
||||
//! @sa socket
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern long connect(long sd, const sockaddr *addr, long addrlen);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! select
|
||||
//!
|
||||
//! @param[in] nfds the highest-numbered file descriptor in any of the
|
||||
//! three sets, plus 1.
|
||||
//! @param[out] writesds socket descriptors list for write monitoring
|
||||
//! @param[out] readsds socket descriptors list for read monitoring
|
||||
//! @param[out] exceptsds socket descriptors list for exception monitoring
|
||||
//! @param[in] timeout is an upper bound on the amount of time elapsed
|
||||
//! before select() returns. Null means infinity
|
||||
//! timeout. The minimum timeout is 5 milliseconds,
|
||||
//! less than 5 milliseconds will be set
|
||||
//! automatically to 5 milliseconds.
|
||||
//! @return On success, select() returns the number of file descriptors
|
||||
//! contained in the three returned descriptor sets (that is, the
|
||||
//! total number of bits that are set in readfds, writefds,
|
||||
//! exceptfds) which may be zero if the timeout expires before
|
||||
//! anything interesting happens.
|
||||
//! On error, -1 is returned.
|
||||
//! *readsds - return the sockets on which Read request will
|
||||
//! return without delay with valid data.
|
||||
//! *writesds - return the sockets on which Write request
|
||||
//! will return without delay.
|
||||
//! *exceptsds - return the sockets which closed recently.
|
||||
//!
|
||||
//! @brief Monitor socket activity
|
||||
//! Select allow a program to monitor multiple file descriptors,
|
||||
//! waiting until one or more of the file descriptors become
|
||||
//! "ready" for some class of I/O operation
|
||||
//!
|
||||
//! @Note If the timeout value set to less than 5ms it will automatically set
|
||||
//! to 5ms to prevent overload of the system
|
||||
//!
|
||||
//! @sa socket
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern int select(long nfds, fd_set *readsds, fd_set *writesds,
|
||||
fd_set *exceptsds, struct timeval *timeout);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! setsockopt
|
||||
//!
|
||||
//! @param[in] sd socket handle
|
||||
//! @param[in] level defines the protocol level for this option
|
||||
//! @param[in] optname defines the option name to Interrogate
|
||||
//! @param[in] optval specifies a value for the option
|
||||
//! @param[in] optlen specifies the length of the option value
|
||||
//! @return On success, zero is returned. On error, -1 is returned
|
||||
//!
|
||||
//! @brief set socket options
|
||||
//! This function manipulate the options associated with a socket.
|
||||
//! Options may exist at multiple protocol levels; they are always
|
||||
//! present at the uppermost socket level.
|
||||
//! When manipulating socket options the level at which the option
|
||||
//! resides and the name of the option must be specified.
|
||||
//! To manipulate options at the socket level, level is specified as
|
||||
//! SOL_SOCKET. To manipulate options at any other level the protocol
|
||||
//! number of the appropriate protocol controlling the option is
|
||||
//! supplied. For example, to indicate that an option is to be
|
||||
//! interpreted by the TCP protocol, level should be set to the
|
||||
//! protocol number of TCP;
|
||||
//! The parameters optval and optlen are used to access optval -
|
||||
//! use for setsockopt(). For getsockopt() they identify a buffer
|
||||
//! in which the value for the requested option(s) are to
|
||||
//! be returned. For getsockopt(), optlen is a value-result
|
||||
//! parameter, initially containing the size of the buffer
|
||||
//! pointed to by option_value, and modified on return to
|
||||
//! indicate the actual size of the value returned. If no option
|
||||
//! value is to be supplied or returned, option_value may be NULL.
|
||||
//!
|
||||
//! @Note On this version the following two socket options are enabled:
|
||||
//! The only protocol level supported in this version
|
||||
//! is SOL_SOCKET (level).
|
||||
//! 1. SOCKOPT_RECV_TIMEOUT (optname)
|
||||
//! SOCKOPT_RECV_TIMEOUT configures recv and recvfrom timeout
|
||||
//! in milliseconds.
|
||||
//! In that case optval should be pointer to unsigned long.
|
||||
//! 2. SOCKOPT_NONBLOCK (optname). sets the socket non-blocking mode on
|
||||
//! or off.
|
||||
//! In that case optval should be SOCK_ON or SOCK_OFF (optval).
|
||||
//!
|
||||
//! @sa getsockopt
|
||||
//
|
||||
//*****************************************************************************
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
extern int setsockopt(long sd, long level, long optname, const void *optval,
|
||||
socklen_t optlen);
|
||||
#endif
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! getsockopt
|
||||
//!
|
||||
//! @param[in] sd socket handle
|
||||
//! @param[in] level defines the protocol level for this option
|
||||
//! @param[in] optname defines the option name to Interrogate
|
||||
//! @param[out] optval specifies a value for the option
|
||||
//! @param[out] optlen specifies the length of the option value
|
||||
//! @return On success, zero is returned. On error, -1 is returned
|
||||
//!
|
||||
//! @brief set socket options
|
||||
//! This function manipulate the options associated with a socket.
|
||||
//! Options may exist at multiple protocol levels; they are always
|
||||
//! present at the uppermost socket level.
|
||||
//! When manipulating socket options the level at which the option
|
||||
//! resides and the name of the option must be specified.
|
||||
//! To manipulate options at the socket level, level is specified as
|
||||
//! SOL_SOCKET. To manipulate options at any other level the protocol
|
||||
//! number of the appropriate protocol controlling the option is
|
||||
//! supplied. For example, to indicate that an option is to be
|
||||
//! interpreted by the TCP protocol, level should be set to the
|
||||
//! protocol number of TCP;
|
||||
//! The parameters optval and optlen are used to access optval -
|
||||
//! use for setsockopt(). For getsockopt() they identify a buffer
|
||||
//! in which the value for the requested option(s) are to
|
||||
//! be returned. For getsockopt(), optlen is a value-result
|
||||
//! parameter, initially containing the size of the buffer
|
||||
//! pointed to by option_value, and modified on return to
|
||||
//! indicate the actual size of the value returned. If no option
|
||||
//! value is to be supplied or returned, option_value may be NULL.
|
||||
//!
|
||||
//! @Note On this version the following two socket options are enabled:
|
||||
//! The only protocol level supported in this version
|
||||
//! is SOL_SOCKET (level).
|
||||
//! 1. SOCKOPT_RECV_TIMEOUT (optname)
|
||||
//! SOCKOPT_RECV_TIMEOUT configures recv and recvfrom timeout
|
||||
//! in milliseconds.
|
||||
//! In that case optval should be pointer to unsigned long.
|
||||
//! 2. SOCKOPT_NONBLOCK (optname). sets the socket non-blocking mode on
|
||||
//! or off.
|
||||
//! In that case optval should be SOCK_ON or SOCK_OFF (optval).
|
||||
//!
|
||||
//! @sa setsockopt
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern int getsockopt(long sd, long level, long optname, void *optval,
|
||||
socklen_t *optlen);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! recv
|
||||
//!
|
||||
//! @param[in] sd socket handle
|
||||
//! @param[out] buf Points to the buffer where the message should be stored
|
||||
//! @param[in] len Specifies the length in bytes of the buffer pointed to
|
||||
//! by the buffer argument.
|
||||
//! @param[in] flags Specifies the type of message reception.
|
||||
//! On this version, this parameter is not supported.
|
||||
//!
|
||||
//! @return Return the number of bytes received, or -1 if an error
|
||||
//! occurred
|
||||
//!
|
||||
//! @brief function receives a message from a connection-mode socket
|
||||
//!
|
||||
//! @sa recvfrom
|
||||
//!
|
||||
//! @Note On this version, only blocking mode is supported.
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern int recv(long sd, void *buf, long len, long flags);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! recvfrom
|
||||
//!
|
||||
//! @param[in] sd socket handle
|
||||
//! @param[out] buf Points to the buffer where the message should be stored
|
||||
//! @param[in] len Specifies the length in bytes of the buffer pointed to
|
||||
//! by the buffer argument.
|
||||
//! @param[in] flags Specifies the type of message reception.
|
||||
//! On this version, this parameter is not supported.
|
||||
//! @param[in] from pointer to an address structure indicating the source
|
||||
//! address: sockaddr. On this version only AF_INET is
|
||||
//! supported.
|
||||
//! @param[in] fromlen source address structure size
|
||||
//!
|
||||
//! @return Return the number of bytes received, or -1 if an error
|
||||
//! occurred
|
||||
//!
|
||||
//! @brief read data from socket
|
||||
//! function receives a message from a connection-mode or
|
||||
//! connectionless-mode socket. Note that raw sockets are not
|
||||
//! supported.
|
||||
//!
|
||||
//! @sa recv
|
||||
//!
|
||||
//! @Note On this version, only blocking mode is supported.
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern int recvfrom(long sd, void *buf, long len, long flags, sockaddr *from,
|
||||
socklen_t *fromlen);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! send
|
||||
//!
|
||||
//! @param sd socket handle
|
||||
//! @param buf Points to a buffer containing the message to be sent
|
||||
//! @param len message size in bytes
|
||||
//! @param flags On this version, this parameter is not supported
|
||||
//!
|
||||
//! @return Return the number of bytes transmitted, or -1 if an
|
||||
//! error occurred
|
||||
//!
|
||||
//! @brief Write data to TCP socket
|
||||
//! This function is used to transmit a message to another
|
||||
//! socket.
|
||||
//!
|
||||
//! @Note On this version, only blocking mode is supported.
|
||||
//!
|
||||
//! @sa sendto
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
extern int send(long sd, const void *buf, long len, long flags);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! sendto
|
||||
//!
|
||||
//! @param sd socket handle
|
||||
//! @param buf Points to a buffer containing the message to be sent
|
||||
//! @param len message size in bytes
|
||||
//! @param flags On this version, this parameter is not supported
|
||||
//! @param to pointer to an address structure indicating the destination
|
||||
//! address: sockaddr. On this version only AF_INET is
|
||||
//! supported.
|
||||
//! @param tolen destination address structure size
|
||||
//!
|
||||
//! @return Return the number of bytes transmitted, or -1 if an
|
||||
//! error occurred
|
||||
//!
|
||||
//! @brief Write data to TCP socket
|
||||
//! This function is used to transmit a message to another
|
||||
//! socket.
|
||||
//!
|
||||
//! @Note On this version, only blocking mode is supported.
|
||||
//!
|
||||
//! @sa send
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
extern int sendto(long sd, const void *buf, long len, long flags,
|
||||
const sockaddr *to, socklen_t tolen);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! mdnsAdvertiser
|
||||
//!
|
||||
//! @param[in] mdnsEnabled flag to enable/disable the mDNS feature
|
||||
//! @param[in] deviceServiceName Service name as part of the published
|
||||
//! canonical domain name
|
||||
//! @param[in] deviceServiceNameLength Length of the service name
|
||||
//!
|
||||
//!
|
||||
//! @return On success, zero is returned, return SOC_ERROR if socket was not
|
||||
//! opened successfully, or if an error occurred.
|
||||
//!
|
||||
//! @brief Set CC3000 in mDNS advertiser mode in order to advertise itself.
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern int mdnsAdvertiser(unsigned short mdnsEnabled, char * deviceServiceName, unsigned short deviceServiceNameLength);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Close the Doxygen group.
|
||||
//! @}
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Mark the end of the C bindings section for C++ compilers.
|
||||
//
|
||||
//*****************************************************************************
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
||||
#endif // __SOCKET_H__
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,533 +0,0 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* wlan.h - CC3000 Host Driver Implementation.
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* Adapted for use with the Arduino/AVR by KTOWN (Kevin Townsend)
|
||||
* & Limor Fried for Adafruit Industries
|
||||
* This library works with the Adafruit CC3000 breakout
|
||||
* ----> https://www.adafruit.com/products/1469
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
|
||||
Adapted for use with the Arduino/AVR by KTOWN for Adafruit Industries
|
||||
This library works with the Adafruit CC3000 breakout
|
||||
----> https://www.adafruit.com/products/1469
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
*****************************************************************************/
|
||||
#ifndef __WLAN_H__
|
||||
#define __WLAN_H__
|
||||
|
||||
#include "cc3000_common.h"
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// If building with a C++ compiler, make all of the definitions in this header
|
||||
// have a C binding.
|
||||
//
|
||||
//*****************************************************************************
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define WLAN_SEC_UNSEC (0)
|
||||
#define WLAN_SEC_WEP (1)
|
||||
#define WLAN_SEC_WPA (2)
|
||||
#define WLAN_SEC_WPA2 (3)
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! \addtogroup wlan_api
|
||||
//! @{
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! wlan_init
|
||||
//!
|
||||
//! @param sWlanCB Asynchronous events callback.
|
||||
//! 0 no event call back.
|
||||
//! -call back parameters:
|
||||
//! 1) event_type: HCI_EVNT_WLAN_UNSOL_CONNECT connect event,
|
||||
//! HCI_EVNT_WLAN_UNSOL_DISCONNECT disconnect event,
|
||||
//! HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE config done,
|
||||
//! HCI_EVNT_WLAN_UNSOL_DHCP dhcp report,
|
||||
//! HCI_EVNT_WLAN_ASYNC_PING_REPORT ping report OR
|
||||
//! HCI_EVNT_WLAN_KEEPALIVE keepalive.
|
||||
//! 2) data: pointer to extra data that received by the event
|
||||
//! (NULL no data).
|
||||
//! 3) length: data length.
|
||||
//! -Events with extra data:
|
||||
//! HCI_EVNT_WLAN_UNSOL_DHCP: 4 bytes IP, 4 bytes Mask,
|
||||
//! 4 bytes default gateway, 4 bytes DHCP server and 4 bytes
|
||||
//! for DNS server.
|
||||
//! HCI_EVNT_WLAN_ASYNC_PING_REPORT: 4 bytes Packets sent,
|
||||
//! 4 bytes Packets received, 4 bytes Min round time,
|
||||
//! 4 bytes Max round time and 4 bytes for Avg round time.
|
||||
//!
|
||||
//! @param sFWPatches 0 no patch or pointer to FW patches
|
||||
//! @param sDriverPatches 0 no patch or pointer to driver patches
|
||||
//! @param sBootLoaderPatches 0 no patch or pointer to bootloader patches
|
||||
//! @param sReadWlanInterruptPin init callback. the callback read wlan
|
||||
//! interrupt status.
|
||||
//! @param sWlanInterruptEnable init callback. the callback enable wlan
|
||||
//! interrupt.
|
||||
//! @param sWlanInterruptDisable init callback. the callback disable wlan
|
||||
//! interrupt.
|
||||
//! @param sWriteWlanPin init callback. the callback write value
|
||||
//! to device pin.
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @sa wlan_set_event_mask , wlan_start , wlan_stop
|
||||
//!
|
||||
//! @brief Initialize wlan driver
|
||||
//!
|
||||
//! @warning This function must be called before ANY other wlan driver function
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern void wlan_init( tWlanCB sWlanCB,
|
||||
tFWPatches sFWPatches,
|
||||
tDriverPatches sDriverPatches,
|
||||
tBootLoaderPatches sBootLoaderPatches,
|
||||
tWlanReadInteruptPin sReadWlanInterruptPin,
|
||||
tWlanInterruptEnable sWlanInterruptEnable,
|
||||
tWlanInterruptDisable sWlanInterruptDisable,
|
||||
tWriteWlanPin sWriteWlanPin);
|
||||
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! wlan_start
|
||||
//!
|
||||
//! @param usPatchesAvailableAtHost - flag to indicate if patches available
|
||||
//! from host or from EEPROM. Due to the
|
||||
//! fact the patches are burn to the EEPROM
|
||||
//! using the patch programmer utility, the
|
||||
//! patches will be available from the EEPROM
|
||||
//! and not from the host.
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Start WLAN device. This function asserts the enable pin of
|
||||
//! the device (WLAN_EN), starting the HW initialization process.
|
||||
//! The function blocked until device Initialization is completed.
|
||||
//! Function also configure patches (FW, driver or bootloader)
|
||||
//! and calls appropriate device callbacks.
|
||||
//!
|
||||
//! @Note Prior calling the function wlan_init shall be called.
|
||||
//! @Warning This function must be called after wlan_init and before any
|
||||
//! other wlan API
|
||||
//! @sa wlan_init , wlan_stop
|
||||
//!
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern void wlan_start(unsigned short usPatchesAvailableAtHost);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! wlan_stop
|
||||
//!
|
||||
//! @param none
|
||||
//!
|
||||
//! @return none
|
||||
//!
|
||||
//! @brief Stop WLAN device by putting it into reset state.
|
||||
//!
|
||||
//! @sa wlan_start
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern void wlan_stop(void);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! wlan_connect
|
||||
//!
|
||||
//! @param sec_type security options:
|
||||
//! WLAN_SEC_UNSEC,
|
||||
//! WLAN_SEC_WEP (ASCII support only),
|
||||
//! WLAN_SEC_WPA or WLAN_SEC_WPA2
|
||||
//! @param ssid up to 32 bytes and is ASCII SSID of the AP
|
||||
//! @param ssid_len length of the SSID
|
||||
//! @param bssid 6 bytes specified the AP bssid
|
||||
//! @param key up to 16 bytes specified the AP security key
|
||||
//! @param key_len key length
|
||||
//!
|
||||
//! @return On success, zero is returned. On error, negative is returned.
|
||||
//! Note that even though a zero is returned on success to trigger
|
||||
//! connection operation, it does not mean that CCC3000 is already
|
||||
//! connected. An asynchronous "Connected" event is generated when
|
||||
//! actual association process finishes and CC3000 is connected to
|
||||
//! the AP. If DHCP is set, An asynchronous "DHCP" event is
|
||||
//! generated when DHCP process is finish.
|
||||
//!
|
||||
//!
|
||||
//! @brief Connect to AP
|
||||
//! @warning Please Note that when connection to AP configured with security
|
||||
//! type WEP, please confirm that the key is set as ASCII and not
|
||||
//! as HEX.
|
||||
//! @sa wlan_disconnect
|
||||
//
|
||||
//*****************************************************************************
|
||||
#ifndef CC3000_TINY_DRIVER
|
||||
extern long wlan_connect(unsigned long ulSecType, const char *ssid, long ssid_len,
|
||||
unsigned char *bssid, unsigned char *key, long key_len);
|
||||
#else
|
||||
extern long wlan_connect(const char *ssid, long ssid_len);
|
||||
|
||||
#endif
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! wlan_disconnect
|
||||
//!
|
||||
//! @return 0 disconnected done, other CC3000 already disconnected
|
||||
//!
|
||||
//! @brief Disconnect connection from AP.
|
||||
//!
|
||||
//! @sa wlan_connect
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
extern long wlan_disconnect(void);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! wlan_add_profile
|
||||
//!
|
||||
//! @param ulSecType WLAN_SEC_UNSEC,WLAN_SEC_WEP,WLAN_SEC_WPA,WLAN_SEC_WPA2
|
||||
//! @param ucSsid ssid SSID up to 32 bytes
|
||||
//! @param ulSsidLen ssid length
|
||||
//! @param ucBssid bssid 6 bytes
|
||||
//! @param ulPriority ulPriority profile priority. Lowest priority:0.
|
||||
//! @param ulPairwiseCipher_Or_TxKeyLen key length for WEP security
|
||||
//! @param ulGroupCipher_TxKeyIndex key index
|
||||
//! @param ulKeyMgmt KEY management
|
||||
//! @param ucPf_OrKey security key
|
||||
//! @param ulPassPhraseLen security key length for WPA\WPA2
|
||||
//!
|
||||
//! @return On success, zero is returned. On error, -1 is returned
|
||||
//!
|
||||
//! @brief When auto start is enabled, the device connects to
|
||||
//! station from the profiles table. Up to 7 profiles are supported.
|
||||
//! If several profiles configured the device choose the highest
|
||||
//! priority profile, within each priority group, device will choose
|
||||
//! profile based on security policy, signal strength, etc
|
||||
//! parameters. All the profiles are stored in CC3000 NVMEM.
|
||||
//!
|
||||
//! @sa wlan_ioctl_del_profile
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
extern long wlan_add_profile(unsigned long ulSecType, unsigned char* ucSsid,
|
||||
unsigned long ulSsidLen,
|
||||
unsigned char *ucBssid,
|
||||
unsigned long ulPriority,
|
||||
unsigned long ulPairwiseCipher_Or_Key,
|
||||
unsigned long ulGroupCipher_TxKeyLen,
|
||||
unsigned long ulKeyMgmt,
|
||||
unsigned char* ucPf_OrKey,
|
||||
unsigned long ulPassPhraseLen);
|
||||
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! wlan_ioctl_del_profile
|
||||
//!
|
||||
//! @param index number of profile to delete
|
||||
//!
|
||||
//! @return On success, zero is returned. On error, -1 is returned
|
||||
//!
|
||||
//! @brief Delete WLAN profile
|
||||
//!
|
||||
//! @Note In order to delete all stored profile, set index to 255.
|
||||
//!
|
||||
//! @sa wlan_add_profile
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern long wlan_ioctl_del_profile(unsigned long ulIndex);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! wlan_set_event_mask
|
||||
//!
|
||||
//! @param mask mask option:
|
||||
//! HCI_EVNT_WLAN_UNSOL_CONNECT connect event
|
||||
//! HCI_EVNT_WLAN_UNSOL_DISCONNECT disconnect event
|
||||
//! HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE smart config done
|
||||
//! HCI_EVNT_WLAN_UNSOL_INIT init done
|
||||
//! HCI_EVNT_WLAN_UNSOL_DHCP dhcp event report
|
||||
//! HCI_EVNT_WLAN_ASYNC_PING_REPORT ping report
|
||||
//! HCI_EVNT_WLAN_KEEPALIVE keepalive
|
||||
//! HCI_EVNT_WLAN_TX_COMPLETE - disable information on end of transmission
|
||||
//! Saved: no.
|
||||
//!
|
||||
//! @return On success, zero is returned. On error, -1 is returned
|
||||
//!
|
||||
//! @brief Mask event according to bit mask. In case that event is
|
||||
//! masked (1), the device will not send the masked event to host.
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern long wlan_set_event_mask(unsigned long ulMask);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! wlan_ioctl_statusget
|
||||
//!
|
||||
//! @param none
|
||||
//!
|
||||
//! @return WLAN_STATUS_DISCONNECTED, WLAN_STATUS_SCANING,
|
||||
//! STATUS_CONNECTING or WLAN_STATUS_CONNECTED
|
||||
//!
|
||||
//! @brief get wlan status: disconnected, scanning, connecting or connected
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern long wlan_ioctl_statusget(void);
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! wlan_ioctl_set_connection_policy
|
||||
//!
|
||||
//! @param should_connect_to_open_ap enable(1), disable(0) connect to any
|
||||
//! available AP. This parameter corresponds to the configuration of
|
||||
//! item # 3 in the brief description.
|
||||
//! @param should_use_fast_connect enable(1), disable(0). if enabled, tries
|
||||
//! to connect to the last connected AP. This parameter corresponds
|
||||
//! to the configuration of item # 1 in the brief description.
|
||||
//! @param auto_start enable(1), disable(0) auto connect
|
||||
//! after reset and periodically reconnect if needed. This
|
||||
//! configuration configures option 2 in the above description.
|
||||
//!
|
||||
//! @return On success, zero is returned. On error, -1 is returned
|
||||
//!
|
||||
//! @brief When auto is enabled, the device tries to connect according
|
||||
//! the following policy:
|
||||
//! 1) If fast connect is enabled and last connection is valid,
|
||||
//! the device will try to connect to it without the scanning
|
||||
//! procedure (fast). The last connection will be marked as
|
||||
//! invalid, due to adding/removing profile.
|
||||
//! 2) If profile exists, the device will try to connect it
|
||||
//! (Up to seven profiles).
|
||||
//! 3) If fast and profiles are not found, and open mode is
|
||||
//! enabled, the device will try to connect to any AP.
|
||||
//! * Note that the policy settings are stored in the CC3000 NVMEM.
|
||||
//!
|
||||
//! @sa wlan_add_profile , wlan_ioctl_del_profile
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern long wlan_ioctl_set_connection_policy(
|
||||
unsigned long should_connect_to_open_ap,
|
||||
unsigned long should_use_fast_connect,
|
||||
unsigned long ulUseProfiles);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! wlan_ioctl_get_scan_results
|
||||
//!
|
||||
//! @param[in] scan_timeout parameter not supported
|
||||
//! @param[out] ucResults scan result (_wlan_full_scan_results_args_t)
|
||||
//!
|
||||
//! @return On success, zero is returned. On error, -1 is returned
|
||||
//!
|
||||
//! @brief Gets entry from scan result table.
|
||||
//! The scan results are returned one by one, and each entry
|
||||
//! represents a single AP found in the area. The following is a
|
||||
//! format of the scan result:
|
||||
//! - 4 Bytes: number of networks found
|
||||
//! - 4 Bytes: The status of the scan: 0 - aged results,
|
||||
//! 1 - results valid, 2 - no results
|
||||
//! - 42 bytes: Result entry, where the bytes are arranged as follows:
|
||||
//!
|
||||
//! - 1 bit isValid - is result valid or not
|
||||
//! - 7 bits rssi - RSSI value;
|
||||
//! - 2 bits: securityMode - security mode of the AP:
|
||||
//! 0 - Open, 1 - WEP, 2 WPA, 3 WPA2
|
||||
//! - 6 bits: SSID name length
|
||||
//! - 2 bytes: the time at which the entry has entered into
|
||||
//! scans result table
|
||||
//! - 32 bytes: SSID name
|
||||
//! - 6 bytes: BSSID
|
||||
//!
|
||||
//! @Note scan_timeout, is not supported on this version.
|
||||
//!
|
||||
//! @sa wlan_ioctl_set_scan_params
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
|
||||
extern long wlan_ioctl_get_scan_results(unsigned long ulScanTimeout,
|
||||
unsigned char *ucResults);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! wlan_ioctl_set_scan_params
|
||||
//!
|
||||
//! @param uiEnable - start/stop application scan:
|
||||
//! 1 = start scan with default interval value of 10 min.
|
||||
//! in order to set a different scan interval value apply the value
|
||||
//! in milliseconds. minimum 1 second. 0=stop). Wlan reset
|
||||
//! (wlan_stop() wlan_start()) is needed when changing scan interval
|
||||
//! value. Saved: No
|
||||
//! @param uiMinDwellTime minimum dwell time value to be used for each
|
||||
//! channel, in milliseconds. Saved: yes
|
||||
//! Recommended Value: 100 (Default: 20)
|
||||
//! @param uiMaxDwellTime maximum dwell time value to be used for each
|
||||
//! channel, in milliseconds. Saved: yes
|
||||
//! Recommended Value: 100 (Default: 30)
|
||||
//! @param uiNumOfProbeRequests max probe request between dwell time.
|
||||
//! Saved: yes. Recommended Value: 5 (Default:2)
|
||||
//! @param uiChannelMask bitwise, up to 13 channels (0x1fff).
|
||||
//! Saved: yes. Default: 0x7ff
|
||||
//! @param uiRSSIThreshold RSSI threshold. Saved: yes (Default: -80)
|
||||
//! @param uiSNRThreshold NSR threshold. Saved: yes (Default: 0)
|
||||
//! @param uiDefaultTxPower probe Tx power. Saved: yes (Default: 205)
|
||||
//! @param aiIntervalList pointer to array with 16 entries (16 channels)
|
||||
//! each entry (unsigned long) holds timeout between periodic scan
|
||||
//! (connection scan) - in milliseconds. Saved: yes. Default 2000ms.
|
||||
//!
|
||||
//! @return On success, zero is returned. On error, -1 is returned
|
||||
//!
|
||||
//! @brief start and stop scan procedure. Set scan parameters.
|
||||
//!
|
||||
//! @Note uiDefaultTxPower, is not supported on this version.
|
||||
//!
|
||||
//! @sa wlan_ioctl_get_scan_results
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern long wlan_ioctl_set_scan_params(unsigned long uiEnable, unsigned long
|
||||
uiMinDwellTime,unsigned long uiMaxDwellTime,
|
||||
unsigned long uiNumOfProbeRequests,
|
||||
unsigned long uiChannelMask,
|
||||
long iRSSIThreshold,unsigned long uiSNRThreshold,
|
||||
unsigned long uiDefaultTxPower,
|
||||
unsigned long *aiIntervalList);
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! wlan_smart_config_start
|
||||
//!
|
||||
//! @param algoEncryptedFlag indicates whether the information is encrypted
|
||||
//!
|
||||
//! @return On success, zero is returned. On error, -1 is returned
|
||||
//!
|
||||
//! @brief Start to acquire device profile. The device acquire its own
|
||||
//! profile, if profile message is found. The acquired AP information
|
||||
//! is stored in CC3000 EEPROM only in case AES128 encryption is used.
|
||||
//! In case AES128 encryption is not used, a profile is created by
|
||||
//! CC3000 internally.
|
||||
//!
|
||||
//! @Note An asynchronous event - Smart Config Done will be generated as soon
|
||||
//! as the process finishes successfully.
|
||||
//!
|
||||
//! @sa wlan_smart_config_set_prefix , wlan_smart_config_stop
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern long wlan_smart_config_start(unsigned long algoEncryptedFlag);
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! wlan_smart_config_stop
|
||||
//!
|
||||
//! @param algoEncryptedFlag indicates whether the information is encrypted
|
||||
//!
|
||||
//! @return On success, zero is returned. On error, -1 is returned
|
||||
//!
|
||||
//! @brief Stop the acquire profile procedure
|
||||
//!
|
||||
//! @sa wlan_smart_config_start , wlan_smart_config_set_prefix
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern long wlan_smart_config_stop(void);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! wlan_smart_config_set_prefix
|
||||
//!
|
||||
//! @param newPrefix 3 bytes identify the SSID prefix for the Smart Config.
|
||||
//!
|
||||
//! @return On success, zero is returned. On error, -1 is returned
|
||||
//!
|
||||
//! @brief Configure station ssid prefix. The prefix is used internally
|
||||
//! in CC3000. It should always be TTT.
|
||||
//!
|
||||
//! @Note The prefix is stored in CC3000 NVMEM
|
||||
//!
|
||||
//! @sa wlan_smart_config_start , wlan_smart_config_stop
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern long wlan_smart_config_set_prefix(char* cNewPrefix);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! wlan_smart_config_process
|
||||
//!
|
||||
//! @param none
|
||||
//!
|
||||
//! @return On success, zero is returned. On error, -1 is returned
|
||||
//!
|
||||
//! @brief process the acquired data and store it as a profile. The acquired
|
||||
//! AP information is stored in CC3000 EEPROM encrypted.
|
||||
//! The encrypted data is decrypted and stored as a profile.
|
||||
//! behavior is as defined by connection policy.
|
||||
//
|
||||
//*****************************************************************************
|
||||
extern long wlan_smart_config_process(void);
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Close the Doxygen group.
|
||||
//! @}
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
// Mark the end of the C bindings section for C++ compilers.
|
||||
//
|
||||
//*****************************************************************************
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
||||
#endif // __WLAN_H__
|
||||
@@ -1,7 +0,0 @@
|
||||
# Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||
# See LICENSE for details.
|
||||
|
||||
[env:microduino]
|
||||
platform = atmelavr
|
||||
framework = arduino
|
||||
board = 644pa16m
|
||||
@@ -1,185 +0,0 @@
|
||||
|
||||
/***************************************************
|
||||
Adafruit CC3000 Breakout/Shield TCP Echo Server
|
||||
|
||||
This is a simple implementation of the echo
|
||||
protocol, RFC 862 http://tools.ietf.org/html/rfc862 ,
|
||||
for the Arduino platform and Adafruit CC3000 breakout
|
||||
or shield. This sketch will create a TCP server that
|
||||
listens by default on port 7 and echos back any data
|
||||
received. Up to 3 clients can be connected concurrently
|
||||
to the server. This sketch is meant as an example of how
|
||||
to write a simple server with the Arduino and CC3000.
|
||||
|
||||
See the CC3000 tutorial on Adafruit's learning system
|
||||
for more information on setting up and using the
|
||||
CC3000:
|
||||
http://learn.adafruit.com/adafruit-cc3000-wifi
|
||||
|
||||
Requirements:
|
||||
|
||||
This sketch requires the Adafruit CC3000 library. You can
|
||||
download the library from:
|
||||
https://github.com/adafruit/Adafruit_CC3000_Library
|
||||
|
||||
For information on installing libraries in the Arduino IDE
|
||||
see this page:
|
||||
http://arduino.cc/en/Guide/Libraries
|
||||
|
||||
Usage:
|
||||
|
||||
Update the SSID and, if necessary, the CC3000 hardware pin
|
||||
information below, then run the sketch and check the
|
||||
output of the serial port. After connecting to the
|
||||
wireless network successfully the sketch will output
|
||||
the IP address of the server and start listening for
|
||||
connections. Once listening for connections, connect
|
||||
to the server from your computer using a telnet client
|
||||
on port 7.
|
||||
|
||||
For example on Linux or Mac OSX, if your CC3000 has an
|
||||
IP address 192.168.1.100 you would execute in a command
|
||||
window:
|
||||
|
||||
telnet 192.168.1.100 7
|
||||
|
||||
After connecting, notice that as you type input and
|
||||
press enter to send it the CC3000 will echo back exactly
|
||||
what you typed. Press ctrl-] and type quit at the prompt
|
||||
to close the telnet session.
|
||||
|
||||
On Windows you'll need to download a telnet client. PuTTY
|
||||
is a good, free GUI client:
|
||||
http://www.chiark.greenend.org.uk/~sgtatham/putty/
|
||||
|
||||
License:
|
||||
|
||||
This example is copyright (c) 2013 Tony DiCola (tony@tonydicola.com)
|
||||
and is released under an open source MIT license. See details at:
|
||||
http://opensource.org/licenses/MIT
|
||||
|
||||
This code was adapted from Adafruit CC3000 library example
|
||||
code which has the following license:
|
||||
|
||||
Designed specifically to work with the Adafruit WiFi products:
|
||||
----> https://www.adafruit.com/products/1469
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried & Kevin Townsend for Adafruit Industries.
|
||||
BSD license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
#include <Adafruit_CC3000.h>
|
||||
#include <SPI.h>
|
||||
#include "utility/debug.h"
|
||||
#include "utility/socket.h"
|
||||
|
||||
// These are the interrupt and control pins
|
||||
#define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin!
|
||||
// These can be any two pins
|
||||
#define ADAFRUIT_CC3000_VBAT 5
|
||||
#define ADAFRUIT_CC3000_CS 10
|
||||
// Use hardware SPI for the remaining pins
|
||||
// On an UNO, SCK = 13, MISO = 12, and MOSI = 11
|
||||
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,
|
||||
SPI_CLOCK_DIVIDER); // you can change this clock speed
|
||||
|
||||
#define WLAN_SSID "myNetwork" // cannot be longer than 32 characters!
|
||||
#define WLAN_PASS "myPassword"
|
||||
// Security can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2
|
||||
#define WLAN_SECURITY WLAN_SEC_WPA2
|
||||
|
||||
#define LISTEN_PORT 7 // What TCP port to listen on for connections. The echo protocol uses port 7.
|
||||
|
||||
Adafruit_CC3000_Server echoServer(LISTEN_PORT);
|
||||
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("Hello, CC3000!\n"));
|
||||
|
||||
Serial.print("Free RAM: "); Serial.println(getFreeRam(), DEC);
|
||||
|
||||
/* Initialise the module */
|
||||
Serial.println(F("\nInitializing..."));
|
||||
if (!cc3000.begin())
|
||||
{
|
||||
Serial.println(F("Couldn't begin()! Check your wiring?"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
Serial.print(F("\nAttempting to connect to ")); Serial.println(WLAN_SSID);
|
||||
if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
|
||||
Serial.println(F("Failed!"));
|
||||
while(1);
|
||||
}
|
||||
|
||||
Serial.println(F("Connected!"));
|
||||
|
||||
Serial.println(F("Request DHCP"));
|
||||
while (!cc3000.checkDHCP())
|
||||
{
|
||||
delay(100); // ToDo: Insert a DHCP timeout!
|
||||
}
|
||||
|
||||
/* Display the IP address DNS, Gateway, etc. */
|
||||
while (! displayConnectionDetails()) {
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
/*********************************************************/
|
||||
/* You can safely remove this to save some flash memory! */
|
||||
/*********************************************************/
|
||||
Serial.println(F("\r\nNOTE: This sketch may cause problems with other sketches"));
|
||||
Serial.println(F("since the .disconnect() function is never called, so the"));
|
||||
Serial.println(F("AP may refuse connection requests from the CC3000 until a"));
|
||||
Serial.println(F("timeout period passes. This is normal behaviour since"));
|
||||
Serial.println(F("there isn't an obvious moment to disconnect with a server.\r\n"));
|
||||
|
||||
// Start listening for connections
|
||||
echoServer.begin();
|
||||
|
||||
Serial.println(F("Listening for connections..."));
|
||||
}
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
// Try to get a client which is connected.
|
||||
Adafruit_CC3000_ClientRef client = echoServer.available();
|
||||
if (client) {
|
||||
// Check if there is data available to read.
|
||||
if (client.available() > 0) {
|
||||
// Read a byte and write it to all clients.
|
||||
uint8_t ch = client.read();
|
||||
client.write(ch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the IP address and other connection details
|
||||
*/
|
||||
/**************************************************************************/
|
||||
bool displayConnectionDetails(void)
|
||||
{
|
||||
uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;
|
||||
|
||||
if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve the IP Address!\r\n"));
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
|
||||
Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask);
|
||||
Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway);
|
||||
Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
|
||||
Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
|
||||
Serial.println();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
Arduino Example: Build code with internal library
|
||||
=================================================
|
||||
|
||||
1. Download ``platformio``
|
||||
`sources <https://github.com/ivankravets/platformio/archive/develop.zip>`_
|
||||
2. Extract ZIP archive
|
||||
3. Then run these commands:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# Change directory to example
|
||||
$ cd platformio-develop/examples/arduino-internal-library/
|
||||
|
||||
# Install Atmel AVR development platform with Arduino Framework
|
||||
$ platformio install atmelavr
|
||||
|
||||
# Process example project
|
||||
$ platformio run
|
||||
|
||||
.. image:: console-result.png
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 806 KiB |
@@ -1,7 +0,0 @@
|
||||
# Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||
# See LICENSE for details.
|
||||
|
||||
[env:arduino_pro5v]
|
||||
platform = atmelavr
|
||||
framework = arduino
|
||||
board = pro16MHzatmega168
|
||||
@@ -1,51 +0,0 @@
|
||||
/**
|
||||
* Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||
* See LICENSE for details.
|
||||
*/
|
||||
|
||||
/*
|
||||
* EEPROM Read
|
||||
*
|
||||
* Reads the value of each byte of the EEPROM and prints it
|
||||
* to the computer.
|
||||
* This example code is in the public domain.
|
||||
*
|
||||
* https://github.com/arduino/Arduino/blob/master/libraries/EEPROM/examples/eeprom_read/eeprom_read.ino
|
||||
*/
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <EEPROM.h>
|
||||
|
||||
// start reading from the first byte (address 0) of the EEPROM
|
||||
int address = 0;
|
||||
byte value;
|
||||
|
||||
void setup()
|
||||
{
|
||||
// initialize serial and wait for port to open:
|
||||
Serial.begin(9600);
|
||||
while (!Serial) {
|
||||
; // wait for serial port to connect. Needed for Leonardo only
|
||||
}
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
// read a byte from the current address of the EEPROM
|
||||
value = EEPROM.read(address);
|
||||
|
||||
Serial.print(address);
|
||||
Serial.print("\t");
|
||||
Serial.print(value, DEC);
|
||||
Serial.println();
|
||||
|
||||
// advance to the next address of the EEPROM
|
||||
address = address + 1;
|
||||
|
||||
// there are only 512 bytes of EEPROM, from 0 to 511, so if we're
|
||||
// on address 512, wrap around to address 0
|
||||
if (address == 512)
|
||||
address = 0;
|
||||
|
||||
delay(500);
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
Atmel AVR: Native Blink Example
|
||||
===============================
|
||||
|
||||
1. Download ``platformio``
|
||||
`sources <https://github.com/ivankravets/platformio/archive/develop.zip>`_
|
||||
2. Extract ZIP archive
|
||||
3. Then run these commands:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# Change directory to example
|
||||
$ cd platformio-develop/examples/atmelavr-native-blink/
|
||||
|
||||
# Install Atmel AVR development platform
|
||||
$ platformio install atmelavr
|
||||
|
||||
# Process example project
|
||||
$ platformio run
|
||||
|
||||
.. image:: console-result.png
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 126 KiB |
@@ -1,14 +0,0 @@
|
||||
# Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||
# See LICENSE for details.
|
||||
|
||||
[env:arduino_pro5v]
|
||||
platform = atmelavr
|
||||
board_mcu = atmega168
|
||||
board_f_cpu = 16000000L
|
||||
|
||||
upload_port = /dev/tty.SLAB_USBtoUART
|
||||
# upload_port = COM3
|
||||
upload_protocol = arduino
|
||||
upload_speed = 19200
|
||||
|
||||
targets = upload
|
||||
@@ -1,23 +0,0 @@
|
||||
/**
|
||||
* Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||
* See LICENSE for details.
|
||||
*/
|
||||
|
||||
#include <avr/io.h>
|
||||
#include <util/delay.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
// make the LED pin an output for PORTB5
|
||||
DDRB = 1 << 5;
|
||||
|
||||
while (1)
|
||||
{
|
||||
_delay_ms(500);
|
||||
|
||||
// toggle the LED
|
||||
PORTB ^= 1 << 5;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
Eclipse IDE Integration
|
||||
=======================
|
||||
|
||||
The detailed information and steps are described in this article:
|
||||
`Building and debugging Atmel AVR (Arduino-based) project using Eclipse IDE+PlatformIO <http://www.ikravets.com/computer-life/programming/2014/06/20/building-and-debugging-atmel-avr-arduino-based-project-using-eclipse-ideplatformio>`_.
|
||||
|
||||
|
||||
.. image:: http://www.ikravets.com/wp-content/uploads/2014/06/eclipse_build_arduino_pro5v-1024x822.png
|
||||
:width: 850px
|
||||
:target: http://www.ikravets.com/computer-life/programming/2014/06/20/building-and-debugging-atmel-avr-arduino-based-project-using-eclipse-ideplatformio
|
||||
|
||||
.. image:: http://www.ikravets.com/wp-content/uploads/2014/06/eclipse_debugging_result_1-1024x775.png
|
||||
:width: 850px
|
||||
:target: http://www.ikravets.com/computer-life/programming/2014/06/20/building-and-debugging-atmel-avr-arduino-based-project-using-eclipse-ideplatformio
|
||||
@@ -1,77 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<?fileVersion 4.0.0?>
|
||||
|
||||
<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||
<cconfiguration id="0.910961921">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.910961921" moduleId="org.eclipse.cdt.core.settings" name="Default">
|
||||
<externalSettings/>
|
||||
<extensions>
|
||||
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<configuration artifactName="${ProjName}" buildProperties="" description="" id="0.910961921" name="Default" parent="org.eclipse.cdt.build.core.prefbase.cfg">
|
||||
<folderInfo id="0.910961921." name="/" resourcePath="">
|
||||
<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.952979152" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
|
||||
<targetPlatform id="org.eclipse.cdt.build.core.prefbase.toolchain.952979152.52310970" name=""/>
|
||||
<builder id="org.eclipse.cdt.build.core.settings.default.builder.1519453406" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
|
||||
<tool id="org.eclipse.cdt.build.core.settings.holder.libs.1409095472" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
|
||||
<tool id="org.eclipse.cdt.build.core.settings.holder.1624502120" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.239157887" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${HOME}/.platformio/atmelavr/tools/toolchain/avr/include""/>
|
||||
<listOptionValue builtIn="false" value=""${HOME}/.platformio/atmelavr/frameworks/arduino/cores/arduino""/>
|
||||
</option>
|
||||
<option id="org.eclipse.cdt.build.core.settings.holder.symbols.922107295" superClass="org.eclipse.cdt.build.core.settings.holder.symbols" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="__AVR_ATmega168__"/>
|
||||
</option>
|
||||
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.149990277" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||
</tool>
|
||||
<tool id="org.eclipse.cdt.build.core.settings.holder.54121539" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1096940598" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${HOME}/.platformio/atmelavr/tools/toolchain/avr/include""/>
|
||||
<listOptionValue builtIn="false" value=""${HOME}/.platformio/atmelavr/frameworks/arduino/cores/arduino""/>
|
||||
</option>
|
||||
<option id="org.eclipse.cdt.build.core.settings.holder.symbols.1198905600" superClass="org.eclipse.cdt.build.core.settings.holder.symbols" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="__AVR_ATmega168__"/>
|
||||
</option>
|
||||
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.762536863" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||
</tool>
|
||||
<tool id="org.eclipse.cdt.build.core.settings.holder.1310559623" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.41298875" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${HOME}/.platformio/atmelavr/tools/toolchain/avr/include""/>
|
||||
<listOptionValue builtIn="false" value=""${HOME}/.platformio/atmelavr/frameworks/arduino/cores/arduino""/>
|
||||
</option>
|
||||
<option id="org.eclipse.cdt.build.core.settings.holder.symbols.884639970" superClass="org.eclipse.cdt.build.core.settings.holder.symbols" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="__AVR_ATmega168__"/>
|
||||
</option>
|
||||
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.549319812" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||
</tool>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
</cconfiguration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<project id="arduino_pro5.null.189551033" name="arduino_pro5"/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="scannerConfiguration">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
<scannerConfigBuildInfo instanceId="0.910961921">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
||||
<storageModule moduleId="refreshScope" versionNumber="2">
|
||||
<configuration configurationName="Default">
|
||||
<resource resourceType="PROJECT" workspacePath="/arduino_pro5"/>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
</cproject>
|
||||
@@ -1,5 +0,0 @@
|
||||
all:
|
||||
platformio run -t upload
|
||||
|
||||
clean:
|
||||
platformio run -t clean
|
||||
@@ -1,8 +0,0 @@
|
||||
# Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||
# See LICENSE for details.
|
||||
|
||||
[env:arduino_pro5v]
|
||||
platform = atmelavr
|
||||
framework = arduino
|
||||
board = pro16MHzatmega168
|
||||
upload_port = /dev/tty.SLAB_USBtoUART
|
||||
@@ -1,20 +0,0 @@
|
||||
/**
|
||||
* Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||
* See LICENSE for details.
|
||||
*/
|
||||
|
||||
#include "Arduino.h"
|
||||
#define WLED 13 // Most Arduino boards already have an LED attached to pin 13 on the board itself
|
||||
|
||||
void setup()
|
||||
{
|
||||
pinMode(WLED, OUTPUT); // set pin as output
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
digitalWrite(WLED, HIGH); // set the LED on
|
||||
delay(1000); // wait for a second
|
||||
digitalWrite(WLED, LOW); // set the LED off
|
||||
delay(1000); // wait for a second
|
||||
}
|
||||
@@ -1,75 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<?fileVersion 4.0.0?>
|
||||
|
||||
<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||
<cconfiguration id="0.1706826288">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1706826288" moduleId="org.eclipse.cdt.core.settings" name="Default">
|
||||
<externalSettings/>
|
||||
<extensions>
|
||||
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<configuration artifactName="${ProjName}" buildProperties="" description="" id="0.1706826288" name="Default" parent="org.eclipse.cdt.build.core.prefbase.cfg">
|
||||
<folderInfo id="0.1706826288." name="/" resourcePath="">
|
||||
<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.944229927" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
|
||||
<targetPlatform id="org.eclipse.cdt.build.core.prefbase.toolchain.944229927.1146791472" name=""/>
|
||||
<builder id="org.eclipse.cdt.build.core.settings.default.builder.81097189" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
|
||||
<tool id="org.eclipse.cdt.build.core.settings.holder.libs.615700392" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
|
||||
<tool id="org.eclipse.cdt.build.core.settings.holder.509191184" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1976688999" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${HOME}/.platformio/atmelavr/tools/toolchain/avr/include""/>
|
||||
</option>
|
||||
<option id="org.eclipse.cdt.build.core.settings.holder.symbols.1146079252" name="Symbols" superClass="org.eclipse.cdt.build.core.settings.holder.symbols" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="__AVR_ATmega168__"/>
|
||||
</option>
|
||||
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1061741986" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||
</tool>
|
||||
<tool id="org.eclipse.cdt.build.core.settings.holder.524184308" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1379816017" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${HOME}/.platformio/atmelavr/tools/toolchain/avr/include""/>
|
||||
</option>
|
||||
<option id="org.eclipse.cdt.build.core.settings.holder.symbols.1180078676" name="Symbols" superClass="org.eclipse.cdt.build.core.settings.holder.symbols" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="__AVR_ATmega168__"/>
|
||||
</option>
|
||||
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.492516621" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||
</tool>
|
||||
<tool id="org.eclipse.cdt.build.core.settings.holder.746817635" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.905883681" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${HOME}/.platformio/atmelavr/tools/toolchain/avr/include""/>
|
||||
</option>
|
||||
<option id="org.eclipse.cdt.build.core.settings.holder.symbols.1589314232" name="Symbols" superClass="org.eclipse.cdt.build.core.settings.holder.symbols" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="__AVR_ATmega168__"/>
|
||||
</option>
|
||||
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.247974714" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||
</tool>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
</cconfiguration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<project id="test.null.312168076" name="test"/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="scannerConfiguration">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
<scannerConfigBuildInfo instanceId="0.1706826288">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
||||
<storageModule moduleId="refreshScope" versionNumber="2">
|
||||
<configuration configurationName="Default">
|
||||
<resource resourceType="PROJECT" workspacePath="/test"/>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
|
||||
</cproject>
|
||||
@@ -1,27 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>atmelavr_atmega168</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||
<triggers>clean,full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
||||
<triggers>full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||
<nature>org.eclipse.cdt.core.ccnature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@@ -1,67 +0,0 @@
|
||||
eclipse.preferences.version=1
|
||||
org.eclipse.cdt.codan.checkers.errnoreturn=Warning
|
||||
org.eclipse.cdt.codan.checkers.errnoreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},implicit\=>false}
|
||||
org.eclipse.cdt.codan.checkers.errreturnvalue=Error
|
||||
org.eclipse.cdt.codan.checkers.errreturnvalue.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.checkers.noreturn=Error
|
||||
org.eclipse.cdt.codan.checkers.noreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},implicit\=>false}
|
||||
org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},no_break_comment\=>"no break",last_case_param\=>false,empty_case_param\=>false}
|
||||
org.eclipse.cdt.codan.internal.checkers.CatchByReference=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.CatchByReference.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},unknown\=>false,exceptions\=>()}
|
||||
org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},skip\=>true}
|
||||
org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.InvalidArguments=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.InvalidArguments.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker=-Info
|
||||
org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},pattern\=>"^[a-z]",macro\=>true,exceptions\=>()}
|
||||
org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.OverloadProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.OverloadProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem=-Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem=-Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true,exceptions\=>()}
|
||||
org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},paramNot\=>false}
|
||||
org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},else\=>false,afterelse\=>false}
|
||||
org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true}
|
||||
org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true}
|
||||
org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true,exceptions\=>("@(\#)","$Id")}
|
||||
org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
@@ -1,5 +0,0 @@
|
||||
all:
|
||||
platformio run -t upload
|
||||
|
||||
clean:
|
||||
platformio run -t clean
|
||||
@@ -1,12 +0,0 @@
|
||||
# Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||
# See LICENSE for details.
|
||||
|
||||
[env:atmelavr_atmega168]
|
||||
platform = atmelavr
|
||||
board_mcu = atmega168
|
||||
board_f_cpu = 16000000L
|
||||
|
||||
upload_port = /dev/tty.SLAB_USBtoUART
|
||||
# upload_port = COM3
|
||||
upload_protocol = arduino
|
||||
upload_speed = 19200
|
||||
@@ -1,23 +0,0 @@
|
||||
/**
|
||||
* Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||
* See LICENSE for details.
|
||||
*/
|
||||
|
||||
#include <avr/io.h>
|
||||
#include <util/delay.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
// make the LED pin an output for PORTB5
|
||||
DDRB = 1 << 5;
|
||||
|
||||
while (1)
|
||||
{
|
||||
_delay_ms(500);
|
||||
|
||||
// toggle the LED
|
||||
PORTB ^= 1 << 5;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,61 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<?fileVersion 4.0.0?>
|
||||
|
||||
<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||
<cconfiguration id="0.1778616297">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1778616297" moduleId="org.eclipse.cdt.core.settings" name="Default">
|
||||
<externalSettings/>
|
||||
<extensions>
|
||||
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<configuration artifactName="${ProjName}" buildProperties="" description="" id="0.1778616297" name="Default" parent="org.eclipse.cdt.build.core.prefbase.cfg">
|
||||
<folderInfo id="0.1778616297." name="/" resourcePath="">
|
||||
<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.576447412" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
|
||||
<targetPlatform id="org.eclipse.cdt.build.core.prefbase.toolchain.576447412.203226592" name=""/>
|
||||
<builder id="org.eclipse.cdt.build.core.settings.default.builder.592280532" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
|
||||
<tool id="org.eclipse.cdt.build.core.settings.holder.libs.251286138" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
|
||||
<tool id="org.eclipse.cdt.build.core.settings.holder.1824859462" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.2021826184" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${HOME}/.platformio/timsp430/tools/toolchain/msp430/include""/>
|
||||
</option>
|
||||
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1509314343" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||
</tool>
|
||||
<tool id="org.eclipse.cdt.build.core.settings.holder.1251065831" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1876118829" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${HOME}/.platformio/timsp430/tools/toolchain/msp430/include""/>
|
||||
</option>
|
||||
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.518683230" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||
</tool>
|
||||
<tool id="org.eclipse.cdt.build.core.settings.holder.847615484" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1922525168" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${HOME}/.platformio/timsp430/tools/toolchain/msp430/include""/>
|
||||
</option>
|
||||
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.68822385" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||
</tool>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
</cconfiguration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<project id="tilaunchpad_msp430g2.null.26341321" name="tilaunchpad_msp430g2"/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="scannerConfiguration">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
<scannerConfigBuildInfo instanceId="0.1778616297">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
||||
<storageModule moduleId="refreshScope"/>
|
||||
</cproject>
|
||||
@@ -1,27 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>tilaunchpad_msp430g2</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||
<triggers>clean,full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
||||
<triggers>full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||
<nature>org.eclipse.cdt.core.ccnature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@@ -1,5 +0,0 @@
|
||||
all:
|
||||
platformio run -t upload
|
||||
|
||||
clean:
|
||||
platformio run -t clean
|
||||
@@ -1,9 +0,0 @@
|
||||
# Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||
# See LICENSE for details.
|
||||
|
||||
[env:launchpad_msp430g2]
|
||||
platform = timsp430
|
||||
board_mcu = msp430g2553
|
||||
board_f_cpu = 16000000L
|
||||
|
||||
upload_protocol = rf2500
|
||||
@@ -1,26 +0,0 @@
|
||||
/**
|
||||
* Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||
* See LICENSE for details.
|
||||
*/
|
||||
|
||||
#include <msp430g2553.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
WDTCTL = WDTPW + WDTHOLD;
|
||||
|
||||
// make the LED pin an output for P1.0
|
||||
P1DIR |= 0x01;
|
||||
|
||||
volatile int i;
|
||||
|
||||
while (1)
|
||||
{
|
||||
for (i = 0; i < 10000; i++);
|
||||
|
||||
// toggle the LED
|
||||
P1OUT ^= 0x01;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<?fileVersion 4.0.0?>
|
||||
|
||||
<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||
<cconfiguration id="0.18931736">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.18931736" moduleId="org.eclipse.cdt.core.settings" name="Default">
|
||||
<externalSettings/>
|
||||
<extensions>
|
||||
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<configuration artifactName="${ProjName}" buildProperties="" description="" id="0.18931736" name="Default" parent="org.eclipse.cdt.build.core.prefbase.cfg">
|
||||
<folderInfo id="0.18931736." name="/" resourcePath="">
|
||||
<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.946409409" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
|
||||
<targetPlatform id="org.eclipse.cdt.build.core.prefbase.toolchain.946409409.264614082" name=""/>
|
||||
<builder id="org.eclipse.cdt.build.core.settings.default.builder.2099118713" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
|
||||
<tool id="org.eclipse.cdt.build.core.settings.holder.libs.1860044306" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
|
||||
<tool id="org.eclipse.cdt.build.core.settings.holder.490604788" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1186638432" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${HOME}/.platformio/titiva/frameworks/energia/cores/lm4f""/>
|
||||
<listOptionValue builtIn="false" value=""${HOME}/.platformio/titiva/tools/toolchain/arm-none-eabi/include""/>
|
||||
</option>
|
||||
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1338936035" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||
</tool>
|
||||
<tool id="org.eclipse.cdt.build.core.settings.holder.1620533967" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1007143336" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${HOME}/.platformio/titiva/frameworks/energia/cores/lm4f""/>
|
||||
<listOptionValue builtIn="false" value=""${HOME}/.platformio/titiva/tools/toolchain/arm-none-eabi/include""/>
|
||||
</option>
|
||||
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.2051673558" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||
</tool>
|
||||
<tool id="org.eclipse.cdt.build.core.settings.holder.549164281" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.454536693" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${HOME}/.platformio/titiva/frameworks/energia/cores/lm4f""/>
|
||||
<listOptionValue builtIn="false" value=""${HOME}/.platformio/titiva/tools/toolchain/arm-none-eabi/include""/>
|
||||
</option>
|
||||
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1468046922" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||
</tool>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
</cconfiguration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<project id="titiva_lm4f120h5qr.null.1743670775" name="titiva_lm4f120h5qr"/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="scannerConfiguration">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
<scannerConfigBuildInfo instanceId="0.18931736">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
||||
<storageModule moduleId="refreshScope"/>
|
||||
</cproject>
|
||||
@@ -1,27 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>titiva_lm4f120</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||
<triggers>clean,full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
||||
<triggers>full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||
<nature>org.eclipse.cdt.core.ccnature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@@ -1,5 +0,0 @@
|
||||
all:
|
||||
platformio run -t upload
|
||||
|
||||
clean:
|
||||
platformio run -t clean
|
||||
@@ -1,8 +0,0 @@
|
||||
# Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||
# See LICENSE for details.
|
||||
|
||||
[env:launchpad_lm4f120]
|
||||
platform = titiva
|
||||
framework = energia
|
||||
board = lplm4f120h5qr
|
||||
targets = upload
|
||||
@@ -1,42 +0,0 @@
|
||||
/**
|
||||
* Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||
* See LICENSE for details.
|
||||
*/
|
||||
|
||||
#define false 0
|
||||
#define true 1
|
||||
typedef int bool;
|
||||
|
||||
#include <stdint.h>
|
||||
#include "inc/hw_memmap.h"
|
||||
#include "driverlib/gpio.h"
|
||||
#include "driverlib/sysctl.h"
|
||||
|
||||
#define LED_RED GPIO_PIN_1
|
||||
#define LED_BLUE GPIO_PIN_2
|
||||
#define LED_GREEN GPIO_PIN_3
|
||||
|
||||
int main(void)
|
||||
{
|
||||
SysCtlClockSet(
|
||||
SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
|
||||
|
||||
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
|
||||
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, LED_RED|LED_BLUE|LED_GREEN);
|
||||
|
||||
while (1)
|
||||
{
|
||||
GPIOPinWrite(GPIO_PORTF_BASE, LED_RED|LED_BLUE|LED_GREEN, LED_RED);
|
||||
SysCtlDelay(3000000);
|
||||
GPIOPinWrite(GPIO_PORTF_BASE, LED_RED|LED_BLUE|LED_GREEN, LED_BLUE);
|
||||
SysCtlDelay(3000000);
|
||||
GPIOPinWrite(GPIO_PORTF_BASE, LED_RED|LED_BLUE|LED_GREEN, LED_GREEN);
|
||||
SysCtlDelay(3000000);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// hook for Energia main.cpp where these methods are defined
|
||||
void setup() {}
|
||||
void loop() {}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 258 KiB |
@@ -1,20 +0,0 @@
|
||||
TI MSP430: Native Blink Example
|
||||
===============================
|
||||
|
||||
1. Download ``platformio``
|
||||
`sources <https://github.com/ivankravets/platformio/archive/develop.zip>`_
|
||||
2. Extract ZIP archive
|
||||
3. Then run these commands:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# Change directory to example
|
||||
$ cd platformio-develop/examples/timsp430-native-blink/
|
||||
|
||||
# Install TI MSP430 development platform
|
||||
$ platformio install timsp430
|
||||
|
||||
# Process example project
|
||||
$ platformio run
|
||||
|
||||
.. image:: console-result.png
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 175 KiB |
@@ -1,11 +0,0 @@
|
||||
# Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||
# See LICENSE for details.
|
||||
|
||||
[env:launchpad_msp430g2]
|
||||
platform = timsp430
|
||||
board_mcu = msp430g2553
|
||||
board_f_cpu = 16000000L
|
||||
|
||||
upload_protocol = rf2500
|
||||
|
||||
targets = upload
|
||||
@@ -1,26 +0,0 @@
|
||||
/**
|
||||
* Copyright (C) Ivan Kravets <me@ikravets.com>
|
||||
* See LICENSE for details.
|
||||
*/
|
||||
|
||||
#include <msp430g2553.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
WDTCTL = WDTPW + WDTHOLD;
|
||||
|
||||
// make the LED pin an output for P1.0
|
||||
P1DIR |= 0x01;
|
||||
|
||||
volatile int i;
|
||||
|
||||
while (1)
|
||||
{
|
||||
for (i = 0; i < 10000; i++);
|
||||
|
||||
// toggle the LED
|
||||
P1OUT ^= 0x01;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user