Compare commits
1425 Commits
release_3.
...
release_3.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3b72bfcd4f | ||
|
|
e2cb864d5b | ||
|
|
3d4425852c | ||
|
|
078534ca9e | ||
|
|
37ecb2c353 | ||
|
|
f7bbc05835 | ||
|
|
aa818bec00 | ||
|
|
4ae9d45695 | ||
|
|
052ac8222d | ||
|
|
c500d8bb36 | ||
|
|
46769d6ca9 | ||
|
|
3c5378f047 | ||
|
|
aefb50b6b3 | ||
|
|
3200b9e334 | ||
|
|
602b94b730 | ||
|
|
c877e8731c | ||
|
|
6f87400368 | ||
|
|
5b211e1c69 | ||
|
|
2823da7e2e | ||
|
|
02e4ca537f | ||
|
|
94fea2b1c5 | ||
|
|
381ab7e987 | ||
|
|
5acf6210a3 | ||
|
|
ff16e2952e | ||
|
|
4e99143943 | ||
|
|
7f93f7a969 | ||
|
|
bc011dfedd | ||
|
|
49fb90f6e4 | ||
|
|
82f7d590aa | ||
|
|
d6c59d6b0d | ||
|
|
3bf05fca18 | ||
|
|
0171fd46ae | ||
|
|
472fe3929a | ||
|
|
bcad5c2cb4 | ||
|
|
a9ff348a9f | ||
|
|
169a852b48 | ||
|
|
7a665a3bf6 | ||
|
|
9a39390b32 | ||
|
|
0a2ddc9f6c | ||
|
|
46b2e6cfe2 | ||
|
|
a7fa3a0b50 | ||
|
|
4b87e84643 | ||
|
|
9f6d7a6256 | ||
|
|
27cf3af4f3 | ||
|
|
5ff676a237 | ||
|
|
b65d9b178c | ||
|
|
02c77cf5d9 | ||
|
|
a8d08b5a06 | ||
|
|
81b8a26d8a | ||
|
|
4ec2b793ff | ||
|
|
acb1abf73f | ||
|
|
92e22b90e9 | ||
|
|
42e66dd14b | ||
|
|
091f4e6c4f | ||
|
|
75d3124cdc | ||
|
|
4b2610dc1f | ||
|
|
f451191cb2 | ||
|
|
fd5d1aac73 | ||
|
|
3abbf4fea7 | ||
|
|
d6fc1c58c6 | ||
|
|
1b7e282bde | ||
|
|
2b3f3bce3a | ||
|
|
3b089b1e6d | ||
|
|
adc534c575 | ||
|
|
76d1b7b391 | ||
|
|
ebe8b5d2c4 | ||
|
|
63265af146 | ||
|
|
545c895fd4 | ||
|
|
6435c23591 | ||
|
|
903aeb5c65 | ||
|
|
5a6363b1c5 | ||
|
|
f4ec8ea494 | ||
|
|
6780e1c80b | ||
|
|
64dfe28994 | ||
|
|
0131bdb8f7 | ||
|
|
09464dba1a | ||
|
|
dbe163d7d9 | ||
|
|
798e6e3ae9 | ||
|
|
bee0f8e032 | ||
|
|
c6c0c3204a | ||
|
|
7567f625fc | ||
|
|
4799137010 | ||
|
|
28610f87cb | ||
|
|
81ae04f19e | ||
|
|
3ff81dc127 | ||
|
|
1b3d72af7a | ||
|
|
c2c0ae708f | ||
|
|
013e47025f | ||
|
|
9efb920806 | ||
|
|
41b80d8fa6 | ||
|
|
a0344d4fb5 | ||
|
|
a0d637b239 | ||
|
|
f7426957ca | ||
|
|
9e66191e3c | ||
|
|
6f1e25cdbb | ||
|
|
64183a6647 | ||
|
|
ed9b9197e7 | ||
|
|
32dfaf5875 | ||
|
|
6da6a43516 | ||
|
|
6714e88e14 | ||
|
|
1d9ebb2c44 | ||
|
|
5ca8b816e8 | ||
|
|
cb2dcd7f84 | ||
|
|
df6790eae2 | ||
|
|
081994038f | ||
|
|
91c47de934 | ||
|
|
a0c500f947 | ||
|
|
0b3eeab600 | ||
|
|
e5a043e81e | ||
|
|
7330ac66a5 | ||
|
|
ad85ce0560 | ||
|
|
fc81383a3e | ||
|
|
5ade8926b0 | ||
|
|
c05f5bba27 | ||
|
|
3a1ed2c871 | ||
|
|
abfe642dea | ||
|
|
126af19b5d | ||
|
|
858e467851 | ||
|
|
e02fddd4d7 | ||
|
|
1a0f9993c6 | ||
|
|
cc781d8f68 | ||
|
|
7588098a31 | ||
|
|
a5a42a6878 | ||
|
|
4c79caadcc | ||
|
|
e12c250e61 | ||
|
|
068baafb0d | ||
|
|
aa9da6c98a | ||
|
|
6d68128eb8 | ||
|
|
fa56273204 | ||
|
|
b56e87e649 | ||
|
|
f83d2df3d7 | ||
|
|
36e6960af5 | ||
|
|
7fb3306390 | ||
|
|
9e39714b2e | ||
|
|
8844166fad | ||
|
|
dd3e168b31 | ||
|
|
9101eca7ef | ||
|
|
dffc8a0e44 | ||
|
|
a744802374 | ||
|
|
9409b8d654 | ||
|
|
735dd4d0e6 | ||
|
|
9268dd5fff | ||
|
|
6e9f88c5c9 | ||
|
|
bec9369082 | ||
|
|
7eb07fa038 | ||
|
|
ce9476ca32 | ||
|
|
1b5e6beff9 | ||
|
|
6d4afd844c | ||
|
|
f1cbecdcf3 | ||
|
|
ef676cd412 | ||
|
|
71b824830c | ||
|
|
fa443ba705 | ||
|
|
befbd75902 | ||
|
|
745e4b36a9 | ||
|
|
305e07b939 | ||
|
|
324c7af370 | ||
|
|
af7c2c6d8e | ||
|
|
4d5fd3e514 | ||
|
|
8851ddf470 | ||
|
|
a14820fcca | ||
|
|
0992e54736 | ||
|
|
58aa68b427 | ||
|
|
d4b222efac | ||
|
|
7c5a17a934 | ||
|
|
a9bd516150 | ||
|
|
fd652c506e | ||
|
|
4f2e5ed5f4 | ||
|
|
9a6eefaf7e | ||
|
|
6a02939ac6 | ||
|
|
c3f89ff968 | ||
|
|
7eedd915b9 | ||
|
|
80f9eb6787 | ||
|
|
d6a5323d0c | ||
|
|
148087ee27 | ||
|
|
498b2b3c4c | ||
|
|
9b880e751a | ||
|
|
a4df9014f0 | ||
|
|
aa83502765 | ||
|
|
3820845542 | ||
|
|
dce6491f91 | ||
|
|
21db619f57 | ||
|
|
a293733efc | ||
|
|
30da13e2e7 | ||
|
|
125ae8e261 | ||
|
|
3211995df5 | ||
|
|
69b0296e4a | ||
|
|
70454be78f | ||
|
|
d3233906e0 | ||
|
|
865d87d589 | ||
|
|
7de96e0802 | ||
|
|
c2698de16c | ||
|
|
49f529c37e | ||
|
|
12e7554af9 | ||
|
|
e716319c6a | ||
|
|
4081d7707c | ||
|
|
077cd11ea9 | ||
|
|
847623c67b | ||
|
|
ab836d6f99 | ||
|
|
5d6dd1bf6b | ||
|
|
9266cee05d | ||
|
|
501b8fea06 | ||
|
|
30927e706f | ||
|
|
52ca9c4635 | ||
|
|
4638af6cad | ||
|
|
8b6cd2b3dd | ||
|
|
9cec4855a3 | ||
|
|
266ff03fb4 | ||
|
|
c7fcba5160 | ||
|
|
5292adee01 | ||
|
|
988a70aed3 | ||
|
|
2350141712 | ||
|
|
a19f67f586 | ||
|
|
47d19d6f19 | ||
|
|
c49ec37db8 | ||
|
|
b6f715bbde | ||
|
|
e28be2ff78 | ||
|
|
42274f87ae | ||
|
|
10a85702f3 | ||
|
|
edf490b8d4 | ||
|
|
d0112d057b | ||
|
|
92f957c1f8 | ||
|
|
ecd6f36830 | ||
|
|
f87d833578 | ||
|
|
976d305388 | ||
|
|
e7b122360a | ||
|
|
20f93af2dc | ||
|
|
e94f3577c8 | ||
|
|
1b916549d8 | ||
|
|
8ee944ab6e | ||
|
|
7484045f4c | ||
|
|
56c79ed71d | ||
|
|
b7e9073d3b | ||
|
|
7c4f056f09 | ||
|
|
7bb725ce20 | ||
|
|
9151ae61ae | ||
|
|
3062e273ca | ||
|
|
e6f9c2e65f | ||
|
|
28b2a12bc3 | ||
|
|
97eede8a03 | ||
|
|
89b4daf9ea | ||
|
|
f71cf2cb4e | ||
|
|
cc281e6e7a | ||
|
|
7dd10d7c75 | ||
|
|
49d7ff7a7d | ||
|
|
06cf774867 | ||
|
|
63597dc82d | ||
|
|
187359a271 | ||
|
|
483f7fafa0 | ||
|
|
7bf1e73154 | ||
|
|
132e8cd196 | ||
|
|
40fdc66a1b | ||
|
|
de146c3b24 | ||
|
|
56fadcbd4b | ||
|
|
855dc18a74 | ||
|
|
1be8e93356 | ||
|
|
55e8255154 | ||
|
|
749b6f00fc | ||
|
|
ab07ad7dcb | ||
|
|
4b32b681aa | ||
|
|
3be61454db | ||
|
|
6a3cd6b6a2 | ||
|
|
5d589af458 | ||
|
|
c862e42162 | ||
|
|
d76cb9665c | ||
|
|
e7163cbb64 | ||
|
|
1e3d7eeb56 | ||
|
|
3047bb9d45 | ||
|
|
4f1ac967f1 | ||
|
|
d9b81fd228 | ||
|
|
62473866ab | ||
|
|
4325fea4ac | ||
|
|
8316a0b280 | ||
|
|
3f35f7878e | ||
|
|
d8eeb8090d | ||
|
|
18a611dd02 | ||
|
|
05232c90b7 | ||
|
|
2dda2bfe9d | ||
|
|
a5fa5fe17f | ||
|
|
b092315a11 | ||
|
|
479e0acfd8 | ||
|
|
dfc8e9bae3 | ||
|
|
c322623fde | ||
|
|
834a11bd0f | ||
|
|
298bf545e5 | ||
|
|
645f98dd34 | ||
|
|
28a53a5249 | ||
|
|
1d5755443d | ||
|
|
3ada40c7ad | ||
|
|
3a39b771c5 | ||
|
|
840c0c05ac | ||
|
|
6e1aef249a | ||
|
|
00be914a61 | ||
|
|
d932a1a8e9 | ||
|
|
ddf6203c37 | ||
|
|
5966052fcc | ||
|
|
0fac48d451 | ||
|
|
cbad81b846 | ||
|
|
6dee248b0d | ||
|
|
f7ad52d0b6 | ||
|
|
f8ef8ef737 | ||
|
|
7fb4ec5649 | ||
|
|
1a4e53dd29 | ||
|
|
fe4222d2c6 | ||
|
|
ff96eb7ba9 | ||
|
|
807859e26a | ||
|
|
d2c9178aab | ||
|
|
c04d8b9370 | ||
|
|
9a029c7f91 | ||
|
|
b8864b8516 | ||
|
|
4c34e4e946 | ||
|
|
fa71f9a600 | ||
|
|
21ca33f798 | ||
|
|
6df17471d9 | ||
|
|
9374e95732 | ||
|
|
d775519453 | ||
|
|
15b0211798 | ||
|
|
6025444a68 | ||
|
|
69a45d0b21 | ||
|
|
ceca142ca9 | ||
|
|
6c5f3e2dcf | ||
|
|
d902bb332c | ||
|
|
0bff270d5d | ||
|
|
2c13186fc6 | ||
|
|
e30509c4b9 | ||
|
|
563d94d2ca | ||
|
|
7e887a9669 | ||
|
|
3ad16e01d9 | ||
|
|
f8fd7752a8 | ||
|
|
e281f94135 | ||
|
|
3b07d8997a | ||
|
|
f3dbb4e0f4 | ||
|
|
19276db443 | ||
|
|
eb6e580079 | ||
|
|
62f937e6b2 | ||
|
|
9484b9ea6e | ||
|
|
12b33f47a2 | ||
|
|
a68e87636f | ||
|
|
68742ba7a6 | ||
|
|
38c957842d | ||
|
|
774ac155f9 | ||
|
|
8abb2e123c | ||
|
|
1e1eafbbc9 | ||
|
|
142685ef70 | ||
|
|
92cee86e7c | ||
|
|
d6e54241ad | ||
|
|
3fc8e5abec | ||
|
|
26350499ca | ||
|
|
8b507781db | ||
|
|
aada2ca316 | ||
|
|
a9d8b2a194 | ||
|
|
e01fbfc6b4 | ||
|
|
5e005ad99e | ||
|
|
c4b30b2d62 | ||
|
|
4779e1e982 | ||
|
|
ca6085f25e | ||
|
|
fb511fe2a9 | ||
|
|
e7936a29b5 | ||
|
|
42b4f48f2a | ||
|
|
8b0c37fd89 | ||
|
|
c9eee6ca53 | ||
|
|
359606c3cd | ||
|
|
9db6291034 | ||
|
|
ddf3aac246 | ||
|
|
60e2b6f28b | ||
|
|
2ae2c0c652 | ||
|
|
d6d41df95d | ||
|
|
85387236ce | ||
|
|
15e5f54e40 | ||
|
|
6e18774fa7 | ||
|
|
398f003a93 | ||
|
|
5252ecf9a3 | ||
|
|
8145cbd764 | ||
|
|
3ef9bb5960 | ||
|
|
4124290787 | ||
|
|
5368ee6bfb | ||
|
|
9c001b66df | ||
|
|
ab5a935d44 | ||
|
|
9bfa5cd06e | ||
|
|
b52197a94e | ||
|
|
536866a9ce | ||
|
|
61d7aeeb7a | ||
|
|
d455f163ef | ||
|
|
ef4e908f06 | ||
|
|
1191e3a24f | ||
|
|
0578da8086 | ||
|
|
2175806e30 | ||
|
|
feb39a3942 | ||
|
|
4fe02fe8f2 | ||
|
|
8e24abced0 | ||
|
|
6911c1e485 | ||
|
|
d92ad6fe0c | ||
|
|
0fb15262f2 | ||
|
|
482ee11fbe | ||
|
|
0e11f9de11 | ||
|
|
bdeb4870a1 | ||
|
|
f7eb53d169 | ||
|
|
b439b0cd1f | ||
|
|
708e118536 | ||
|
|
8cf97b96a8 | ||
|
|
91a1d6697f | ||
|
|
2767de8b8b | ||
|
|
b2b6db0676 | ||
|
|
2c5cc110bd | ||
|
|
7abe0cfaed | ||
|
|
2410dd6dbc | ||
|
|
1a2bd09693 | ||
|
|
d9fab25bb5 | ||
|
|
617ff27bd4 | ||
|
|
6066fec78a | ||
|
|
6eb9cbfa4f | ||
|
|
3afd942b5d | ||
|
|
84ee85b8ec | ||
|
|
a4c11c065d | ||
|
|
bf21a80fb6 | ||
|
|
bc1a16fd17 | ||
|
|
9b9cf099b5 | ||
|
|
599d136cb2 | ||
|
|
073a09cf3f | ||
|
|
0ee96ec6ce | ||
|
|
2096bab2b7 | ||
|
|
8873984ba7 | ||
|
|
90def71147 | ||
|
|
2a00e9f634 | ||
|
|
f109d10c78 | ||
|
|
483847875b | ||
|
|
7c2723c552 | ||
|
|
bc1b55317d | ||
|
|
906e52bced | ||
|
|
f8821b9257 | ||
|
|
6fce50c520 | ||
|
|
5ffdbec508 | ||
|
|
2bb2b4b152 | ||
|
|
0f51c0d251 | ||
|
|
f9405a0952 | ||
|
|
1f352f24f6 | ||
|
|
db97bd307e | ||
|
|
24019ea1f9 | ||
|
|
6932ef0229 | ||
|
|
0202c334b9 | ||
|
|
8e511def6d | ||
|
|
daf0328498 | ||
|
|
a1bc30adf9 | ||
|
|
adf7a0bd00 | ||
|
|
8419c01070 | ||
|
|
d208f27a11 | ||
|
|
999a6de715 | ||
|
|
28f9576359 | ||
|
|
01d5370200 | ||
|
|
b0ce0bb19a | ||
|
|
edd89d9eeb | ||
|
|
0d2bea605c | ||
|
|
a29472965f | ||
|
|
8ab318bcd4 | ||
|
|
a09be906f2 | ||
|
|
aa3add45ca | ||
|
|
8787ffe0a7 | ||
|
|
580512cac9 | ||
|
|
e89041669e | ||
|
|
2f701d48f3 | ||
|
|
f4fe10270c | ||
|
|
c1f889d998 | ||
|
|
a9e32d3086 | ||
|
|
2d2272e9af | ||
|
|
52845ffd2a | ||
|
|
1a93d243d4 | ||
|
|
7fcac6da94 | ||
|
|
11eaac4b09 | ||
|
|
941ca37003 | ||
|
|
1956fadca2 | ||
|
|
7d107585f1 | ||
|
|
ed8a45f3db | ||
|
|
86e44355ff | ||
|
|
579a91ce18 | ||
|
|
6c3cf8c959 | ||
|
|
48e6bdb82b | ||
|
|
63fe5ad62c | ||
|
|
71f0567c44 | ||
|
|
4a53912162 | ||
|
|
b771fd85ee | ||
|
|
a974970476 | ||
|
|
ce782061b6 | ||
|
|
cf9928a70d | ||
|
|
da6af52f5e | ||
|
|
934e36843a | ||
|
|
f58ba07ac7 | ||
|
|
d4d93f71e7 | ||
|
|
abda720eab | ||
|
|
2cfe4f5899 | ||
|
|
d8a836938a | ||
|
|
4240748df6 | ||
|
|
85ac8b5ac4 | ||
|
|
c9ca244165 | ||
|
|
897bac6109 | ||
|
|
2e21cced40 | ||
|
|
e7ca201a97 | ||
|
|
96a9b3cdef | ||
|
|
679ebfff85 | ||
|
|
63e4472b58 | ||
|
|
1460e4ca58 | ||
|
|
129ee0e264 | ||
|
|
7121bb8084 | ||
|
|
9fe586eec3 | ||
|
|
c62a50312a | ||
|
|
b64f64f847 | ||
|
|
5221e4eb2a | ||
|
|
0b3d6be461 | ||
|
|
f2415448a9 | ||
|
|
e3b0dc0ce0 | ||
|
|
d0042b4e48 | ||
|
|
eaad1440c2 | ||
|
|
1b921725d9 | ||
|
|
29bf621fc1 | ||
|
|
954cae87b3 | ||
|
|
0e19472fa8 | ||
|
|
32347dc29e | ||
|
|
4d4ccb5532 | ||
|
|
4831ea63d6 | ||
|
|
bc0a0e1133 | ||
|
|
dfe828a628 | ||
|
|
d45d7efec8 | ||
|
|
75f505a3c3 | ||
|
|
5e614aadb4 | ||
|
|
2b91fbef04 | ||
|
|
a441887b17 | ||
|
|
4e49417ee5 | ||
|
|
378038c5c1 | ||
|
|
386421fccf | ||
|
|
4890135e9a | ||
|
|
6ff987be5e | ||
|
|
f7ac784e7f | ||
|
|
7995106a76 | ||
|
|
34e03da7da | ||
|
|
aa68d56ef5 | ||
|
|
d6be8c4c93 | ||
|
|
2e895bcb43 | ||
|
|
4431b8015d | ||
|
|
2713000f5e | ||
|
|
83e755c4bc | ||
|
|
7be349e5f8 | ||
|
|
c8c7a14ee0 | ||
|
|
741510cfaf | ||
|
|
9fa73927cf | ||
|
|
d6257f5b58 | ||
|
|
c65cbe2585 | ||
|
|
de1e36d1fd | ||
|
|
cb92a1cc52 | ||
|
|
16c6c06466 | ||
|
|
378ab8ef1d | ||
|
|
920e50c4e9 | ||
|
|
4f6695379a | ||
|
|
4e6c4a07df | ||
|
|
44183a0247 | ||
|
|
9f8a61fddd | ||
|
|
ef05f0f133 | ||
|
|
9754d3a149 | ||
|
|
f09e0b9129 | ||
|
|
2d0d380cf1 | ||
|
|
139bb3ef47 | ||
|
|
5b9902860e | ||
|
|
d14eff1ced | ||
|
|
4d97012911 | ||
|
|
08fb7376e0 | ||
|
|
7dfc2a6e4f | ||
|
|
adc44b95ef | ||
|
|
e2aa42c418 | ||
|
|
491cccb2b3 | ||
|
|
85213c80c3 | ||
|
|
270f47c446 | ||
|
|
3d85ecf9cf | ||
|
|
3722f95ed4 | ||
|
|
5d20e9c44a | ||
|
|
f1523c571e | ||
|
|
c3f510fce1 | ||
|
|
2be7f495bf | ||
|
|
d82b5f9904 | ||
|
|
b7dd06aeae | ||
|
|
679089f67c | ||
|
|
d78fb92ad2 | ||
|
|
1909ec3e56 | ||
|
|
ecadae4d66 | ||
|
|
6b0650a054 | ||
|
|
f7b970b9e3 | ||
|
|
a049db70ea | ||
|
|
522447f4db | ||
|
|
809be4a560 | ||
|
|
bd21e21f37 | ||
|
|
808141675f | ||
|
|
0c39be86e8 | ||
|
|
b406cf8727 | ||
|
|
289fc8d9c0 | ||
|
|
5cf58d15e6 | ||
|
|
b35bc5b244 | ||
|
|
d7f3bc8137 | ||
|
|
65fc51d731 | ||
|
|
bca3723106 | ||
|
|
d9eb2aec8c | ||
|
|
2a0b477cfb | ||
|
|
b5f41f650b | ||
|
|
836f3054ab | ||
|
|
461ae43f3e | ||
|
|
f7c8024632 | ||
|
|
547b427106 | ||
|
|
26c269ed8a | ||
|
|
abee301fe5 | ||
|
|
721c76f062 | ||
|
|
72df7ff20b | ||
|
|
048a6e76cc | ||
|
|
276c712dee | ||
|
|
ea8b0ae36a | ||
|
|
931df37257 | ||
|
|
75111d70e4 | ||
|
|
717dce05d5 | ||
|
|
c1976d5b47 | ||
|
|
4ebd1c0464 | ||
|
|
ccd7c7ef57 | ||
|
|
0fe65ae22b | ||
|
|
ab1042ed72 | ||
|
|
87939821b0 | ||
|
|
f848e56af1 | ||
|
|
f438817e66 | ||
|
|
0ab086d41b | ||
|
|
8c96812a72 | ||
|
|
a2e19afd56 | ||
|
|
9782807b13 | ||
|
|
be567c85db | ||
|
|
e809204a10 | ||
|
|
7748704448 | ||
|
|
1861fdd427 | ||
|
|
1dda134898 | ||
|
|
42d7e02c16 | ||
|
|
a3dc0c1cdb | ||
|
|
c085e10688 | ||
|
|
8a1d737adb | ||
|
|
4d8bfc857e | ||
|
|
feef39981c | ||
|
|
de83bb6504 | ||
|
|
38b2bdad9c | ||
|
|
0579892b0b | ||
|
|
413f8c71fc | ||
|
|
61d1e4307e | ||
|
|
d82e933e5a | ||
|
|
a2759b368e | ||
|
|
23f47cf371 | ||
|
|
1438ebbc48 | ||
|
|
4c28926f24 | ||
|
|
e82cfdd04d | ||
|
|
59bf313ce4 | ||
|
|
29979e6067 | ||
|
|
fe54cd98a8 | ||
|
|
57ad62036a | ||
|
|
7afb0ecc1f | ||
|
|
d829a3548b | ||
|
|
6112b6c4a9 | ||
|
|
883b2bc043 | ||
|
|
1886f109e1 | ||
|
|
826270136d | ||
|
|
1fb4ed0335 | ||
|
|
14642ad394 | ||
|
|
b7258deb63 | ||
|
|
fec9e73d37 | ||
|
|
d34e4eda0d | ||
|
|
39ed9f5821 | ||
|
|
af5c8a6626 | ||
|
|
8c3eb526e6 | ||
|
|
3115ef446e | ||
|
|
6297c7fb2c | ||
|
|
2f27c830cd | ||
|
|
c1ee2b612f | ||
|
|
83edac90d3 | ||
|
|
584e139892 | ||
|
|
0f651f7a9f | ||
|
|
44a23212ce | ||
|
|
01dd44b109 | ||
|
|
cc435c495d | ||
|
|
f20c2b5389 | ||
|
|
e5bcc5edee | ||
|
|
1620b9d0ea | ||
|
|
f6b4424537 | ||
|
|
f6dcc1711f | ||
|
|
3f7b07d27c | ||
|
|
809021537b | ||
|
|
dcb1cd8efb | ||
|
|
1f9c96f7f3 | ||
|
|
59ffa7b8f1 | ||
|
|
e8f731d453 | ||
|
|
6458d935bd | ||
|
|
52f0c02ad2 | ||
|
|
5880240c3b | ||
|
|
3524cc4bd2 | ||
|
|
03a902186a | ||
|
|
54026c1e9f | ||
|
|
a22779e024 | ||
|
|
0980c05e0c | ||
|
|
ead354ef83 | ||
|
|
a2d1455eee | ||
|
|
c39a8615cb | ||
|
|
b05b6bb486 | ||
|
|
ee3ac8b4cb | ||
|
|
f690f6424e | ||
|
|
c2c4b8e673 | ||
|
|
ce50cabca9 | ||
|
|
785cb5f651 | ||
|
|
e1de007313 | ||
|
|
ecad3177b7 | ||
|
|
eb61d18086 | ||
|
|
eac558e6d5 | ||
|
|
57ced9a25b | ||
|
|
7c0c3fc3d6 | ||
|
|
ba339b978a | ||
|
|
1921584f44 | ||
|
|
04900bb640 | ||
|
|
deb0703469 | ||
|
|
126d08c9a1 | ||
|
|
e8c70091e2 | ||
|
|
0b198dd481 | ||
|
|
b025f5b878 | ||
|
|
658bb4e030 | ||
|
|
9ef20793a3 | ||
|
|
7fe54a9622 | ||
|
|
bcfd7456f2 | ||
|
|
99dc9839ba | ||
|
|
0cf3ec5f03 | ||
|
|
28eb72002c | ||
|
|
abd89f6477 | ||
|
|
aa9af315ee | ||
|
|
73d5efe17a | ||
|
|
cbe098dcf1 | ||
|
|
3296c2264e | ||
|
|
534e79eed5 | ||
|
|
72ed656b6d | ||
|
|
3a2cf04f7c | ||
|
|
979315db16 | ||
|
|
9113427686 | ||
|
|
c37359b161 | ||
|
|
e39bcf1b3a | ||
|
|
7903019e99 | ||
|
|
98f2061786 | ||
|
|
ca8bc63760 | ||
|
|
bb947a4d3d | ||
|
|
4b9c7d7587 | ||
|
|
6e9b10968b | ||
|
|
aea64a29e0 | ||
|
|
2b87a0d899 | ||
|
|
858efd5866 | ||
|
|
724b282f90 | ||
|
|
981d58393f | ||
|
|
8e76db307a | ||
|
|
1e21759f36 | ||
|
|
4d1677c09b | ||
|
|
ba18e77a7f | ||
|
|
b4ff0b5d87 | ||
|
|
267f3cd1cb | ||
|
|
f129d96f9c | ||
|
|
bfa271be95 | ||
|
|
a7051e2bff | ||
|
|
836e07d287 | ||
|
|
ed6fd9a009 | ||
|
|
ca664c1d6e | ||
|
|
10de4cb2e8 | ||
|
|
92c57ae64b | ||
|
|
6c4e302f3a | ||
|
|
f44472e953 | ||
|
|
e12ce4c654 | ||
|
|
3a0da792ff | ||
|
|
e2c6b31045 | ||
|
|
749829ce7d | ||
|
|
5b1c58d362 | ||
|
|
fb7f6d70d5 | ||
|
|
8bf7d5399c | ||
|
|
e64aad87aa | ||
|
|
9f756b86cb | ||
|
|
53ae8ddeaf | ||
|
|
6c0ad54ced | ||
|
|
fd6c01160d | ||
|
|
6188040b40 | ||
|
|
0a55161567 | ||
|
|
b71aa7c2bf | ||
|
|
48b9bdd8e6 | ||
|
|
b311b8ebdf | ||
|
|
e64e5829d4 | ||
|
|
d851651369 | ||
|
|
c8535d9706 | ||
|
|
a8ba7843cd | ||
|
|
38a431ef98 | ||
|
|
b24ee97278 | ||
|
|
ac5c905b10 | ||
|
|
5991341e5f | ||
|
|
0fe87165c5 | ||
|
|
794b43c32b | ||
|
|
a0a1b2d6e2 | ||
|
|
43ef7ada91 | ||
|
|
bf1e2b3f07 | ||
|
|
55d503d21f | ||
|
|
5f0405e78b | ||
|
|
22beffa12b | ||
|
|
a8856f94d2 | ||
|
|
0e94bb8520 | ||
|
|
e5f91f097e | ||
|
|
9b72d8b7c3 | ||
|
|
6cbaed374e | ||
|
|
9a0386884c | ||
|
|
667e1d7234 | ||
|
|
8654421095 | ||
|
|
6a06941e25 | ||
|
|
dc0cee7c59 | ||
|
|
a5b1058145 | ||
|
|
d55d75cfcf | ||
|
|
60ac85f9c0 | ||
|
|
645ea3045e | ||
|
|
377e85d3a3 | ||
|
|
e8a0e4c1e0 | ||
|
|
17ae2cdc2c | ||
|
|
188573b3cd | ||
|
|
c4e1257774 | ||
|
|
8c54a0aac4 | ||
|
|
378b7ec99c | ||
|
|
b13cc61609 | ||
|
|
1bf9600668 | ||
|
|
82bb264f3f | ||
|
|
6faaec503a | ||
|
|
f19f6696d9 | ||
|
|
0976369ab7 | ||
|
|
1ca31ad7c8 | ||
|
|
aada4f4341 | ||
|
|
575857d29e | ||
|
|
2ce5718d0e | ||
|
|
08cae251a9 | ||
|
|
9aef569c1b | ||
|
|
433d0c1df7 | ||
|
|
14e786cc85 | ||
|
|
7dc284399c | ||
|
|
d0b6a8a749 | ||
|
|
2489a130a7 | ||
|
|
ddb10e856f | ||
|
|
b6971891dc | ||
|
|
f0066a6861 | ||
|
|
9c14ddbcf8 | ||
|
|
90d0365018 | ||
|
|
aaa2698404 | ||
|
|
401cc8081f | ||
|
|
8a17db3635 | ||
|
|
a80a8e7ac4 | ||
|
|
e5cda3cd93 | ||
|
|
b959bb7d03 | ||
|
|
3d003fe000 | ||
|
|
e295ecd0c5 | ||
|
|
cf921a7e9e | ||
|
|
0df233ad58 | ||
|
|
d198499ed4 | ||
|
|
bfeffaac9a | ||
|
|
8c3f12a50d | ||
|
|
61512b95b7 | ||
|
|
dedd3e0274 | ||
|
|
2cfdb68ada | ||
|
|
3d0d747534 | ||
|
|
385755109a | ||
|
|
5ef2593db6 | ||
|
|
0297d3d71c | ||
|
|
3c0fc7d948 | ||
|
|
c9cd48d5c5 | ||
|
|
e58a6efc90 | ||
|
|
0672ab7e31 | ||
|
|
5f46aaf134 | ||
|
|
ac7ba01cff | ||
|
|
423569eaea | ||
|
|
c87be4831c | ||
|
|
a2255fefb9 | ||
|
|
82ee4a5827 | ||
|
|
aff18fec80 | ||
|
|
255f69c1ad | ||
|
|
1e7a26ee1f | ||
|
|
365df56dca | ||
|
|
837d0f8977 | ||
|
|
18591a1216 | ||
|
|
20e36784e8 | ||
|
|
ff0c96c3d4 | ||
|
|
2039829321 | ||
|
|
f41052ba33 | ||
|
|
c11b55b5be | ||
|
|
ba4e7d8696 | ||
|
|
2de5d3e8ac | ||
|
|
90031f82fa | ||
|
|
a3505a375f | ||
|
|
26811f2576 | ||
|
|
47f8bc4ca8 | ||
|
|
8caf2cbd25 | ||
|
|
eafe0b873f | ||
|
|
029a288051 | ||
|
|
4fc53a7010 | ||
|
|
c4a26d6da0 | ||
|
|
132e6b0a31 | ||
|
|
c7b230f989 | ||
|
|
1601eddeeb | ||
|
|
124f5fe5bc | ||
|
|
2816e6a432 | ||
|
|
7862b991c7 | ||
|
|
fb5cbaa39d | ||
|
|
dc7cc4e461 | ||
|
|
a3c7bc41be | ||
|
|
894cb6fe23 | ||
|
|
cf04968dd4 | ||
|
|
196ea3cdb4 | ||
|
|
cf951eabc9 | ||
|
|
a7c2a73a00 | ||
|
|
b854043971 | ||
|
|
c7dc29fab6 | ||
|
|
9cf024f946 | ||
|
|
3c56c9c557 | ||
|
|
4cde5b44b7 | ||
|
|
2314a9ed7d | ||
|
|
c7402703d6 | ||
|
|
cbbd160b9e | ||
|
|
f351c80313 | ||
|
|
4db41a662d | ||
|
|
140c37cb9c | ||
|
|
b25feb0d23 | ||
|
|
de80d9d37a | ||
|
|
db8ad8414c | ||
|
|
2bbc503304 | ||
|
|
70cbe30458 | ||
|
|
133aa6e6de | ||
|
|
efb30d970f | ||
|
|
89eaf26a45 | ||
|
|
5bf1cf141c | ||
|
|
250a64edcc | ||
|
|
22a34a5428 | ||
|
|
39d5fb7a96 | ||
|
|
01a6499fb0 | ||
|
|
b272ee63d8 | ||
|
|
e4acf344c6 | ||
|
|
5e7e581a4d | ||
|
|
a4966d23a4 | ||
|
|
1c68cb8054 | ||
|
|
3b546b71d6 | ||
|
|
92da82e922 | ||
|
|
ea3dbd1026 | ||
|
|
e60edb92d3 | ||
|
|
26d23edd2e | ||
|
|
e4c11c846c | ||
|
|
fdf9ad75fa | ||
|
|
1f9df00d08 | ||
|
|
9a403939df | ||
|
|
6f7145db7d | ||
|
|
b0c29f9696 | ||
|
|
d1a339db17 | ||
|
|
6ee2a8f59e | ||
|
|
ce579a9365 | ||
|
|
211263519d | ||
|
|
8a205e414b | ||
|
|
3e095af720 | ||
|
|
d8039b6c53 | ||
|
|
9851b299f3 | ||
|
|
a0d729e86a | ||
|
|
1517da1f96 | ||
|
|
4a789f002e | ||
|
|
fd8a4714d6 | ||
|
|
eebb8d2a55 | ||
|
|
c14cfab98f | ||
|
|
9ebcb9b579 | ||
|
|
2fa498a82d | ||
|
|
1104e97259 | ||
|
|
f313f7f637 | ||
|
|
31ddcafabf | ||
|
|
065e337ef2 | ||
|
|
f111994d60 | ||
|
|
d6b1489011 | ||
|
|
43b8ed720e | ||
|
|
bc451469a2 | ||
|
|
d17a3b892e | ||
|
|
6f339ec6e6 | ||
|
|
f53a22140b | ||
|
|
8e347312d5 | ||
|
|
12a69f8024 | ||
|
|
43b7e83a28 | ||
|
|
3d933ebe9a | ||
|
|
b54ce441b4 | ||
|
|
f727c4bbaf | ||
|
|
68b60088f1 | ||
|
|
dfb7b8fc36 | ||
|
|
9a486ae9c8 | ||
|
|
df5fc26ac0 | ||
|
|
b9aa123674 | ||
|
|
804c2ed197 | ||
|
|
8c15ff9f9e | ||
|
|
dc7597d17d | ||
|
|
18f7c02f9d | ||
|
|
c98d80621c | ||
|
|
c1435277c9 | ||
|
|
6c8318afe6 | ||
|
|
2e5dc84188 | ||
|
|
7077c3d223 | ||
|
|
c25e91d5d8 | ||
|
|
995a417554 | ||
|
|
294ed0d4d9 | ||
|
|
c87b9963ea | ||
|
|
944d612fd9 | ||
|
|
cf289b31f7 | ||
|
|
7dbb2f8da1 | ||
|
|
5ecb26e728 | ||
|
|
7f103ac59b | ||
|
|
26d7e79cd6 | ||
|
|
6145b69b06 | ||
|
|
dae0276b0a | ||
|
|
c663b2ec85 | ||
|
|
9837d6d0cc | ||
|
|
8d78aeaaf9 | ||
|
|
b282eb70f5 | ||
|
|
9c2e820335 | ||
|
|
9ae44f8a96 | ||
|
|
77847f08ac | ||
|
|
03e94f4844 | ||
|
|
dbe44a40b5 | ||
|
|
1699312f10 | ||
|
|
db40fb733f | ||
|
|
7d218382a7 | ||
|
|
1cf988a550 | ||
|
|
0c0987e99b | ||
|
|
a94bda9403 | ||
|
|
e8105ce23e | ||
|
|
170c38467a | ||
|
|
93393246d7 | ||
|
|
8f2fc62cac | ||
|
|
c0d63dbdf3 | ||
|
|
79748ecb3d | ||
|
|
bf78eeaec7 | ||
|
|
32d80b524a | ||
|
|
36f8b36df5 | ||
|
|
69fbec9061 | ||
|
|
dcb78aff9e | ||
|
|
d899584d4b | ||
|
|
1acd2304cf | ||
|
|
18159ed113 | ||
|
|
04d0042df7 | ||
|
|
b1f72ce77a | ||
|
|
1efecf1705 | ||
|
|
54c4cd6daa | ||
|
|
1823e202ff | ||
|
|
3764b0b7ca | ||
|
|
c63104f612 | ||
|
|
0acce7538f | ||
|
|
204135fc20 | ||
|
|
58694d51b6 | ||
|
|
cc31b093f8 | ||
|
|
796a1d6a4e | ||
|
|
4000453d03 | ||
|
|
f00c2deb1f | ||
|
|
842f334ff6 | ||
|
|
f64acd3d68 | ||
|
|
f1bf65e60d | ||
|
|
04ffb9f371 | ||
|
|
1433c6d1a4 | ||
|
|
f37d9e8516 | ||
|
|
3f3bbf521c | ||
|
|
8278bcb5cf | ||
|
|
7d9c596ceb | ||
|
|
7b84ea2355 | ||
|
|
470441671f | ||
|
|
eb00126c42 | ||
|
|
98a15ed4fb | ||
|
|
51f25cb1f7 | ||
|
|
259b739bf6 | ||
|
|
760f1870a7 | ||
|
|
96ee321852 | ||
|
|
a1e95d0880 | ||
|
|
23ebb0542c | ||
|
|
b597a2dafc | ||
|
|
97baee2256 | ||
|
|
076a6e86ec | ||
|
|
0b7f6e22d4 | ||
|
|
27df106889 | ||
|
|
c9dabc5d00 | ||
|
|
53d4834e3a | ||
|
|
45550c0f28 | ||
|
|
0b5da213da | ||
|
|
9b92ad6605 | ||
|
|
d02909660c | ||
|
|
f70bf3080f | ||
|
|
f91aa20464 | ||
|
|
48e437ddf5 | ||
|
|
973281317d | ||
|
|
bfaa317d22 | ||
|
|
d04fb74458 | ||
|
|
45ea8ed7ce | ||
|
|
0447489ea4 | ||
|
|
8f06039451 | ||
|
|
2ef71f6df3 | ||
|
|
37a496ac38 | ||
|
|
1c7edb30b4 | ||
|
|
ec11bb4005 | ||
|
|
994b4f71b8 | ||
|
|
5ea9957867 | ||
|
|
c11d8b0fcc | ||
|
|
ece98610f0 | ||
|
|
790bbe8603 | ||
|
|
deb110fca1 | ||
|
|
3dbb32cb3b | ||
|
|
6cbce57b8b | ||
|
|
fe9ea06b9f | ||
|
|
0d802af6a8 | ||
|
|
19e12b813d | ||
|
|
f14a276ece | ||
|
|
8b944f37a1 | ||
|
|
e9bcad0a8d | ||
|
|
50845a3bfb | ||
|
|
0d63293e2a | ||
|
|
b5d1597fe5 | ||
|
|
7ebe5faeb6 | ||
|
|
8036a06882 | ||
|
|
433b46e6a9 | ||
|
|
1947387537 | ||
|
|
9bed3d69d3 | ||
|
|
0108980e16 | ||
|
|
f19ac356e8 | ||
|
|
9e4a9ffdd7 | ||
|
|
e4760ed6d1 | ||
|
|
a001ffef4f | ||
|
|
7b22d21050 | ||
|
|
d42b7b332d | ||
|
|
114809929d | ||
|
|
02828b6b0f | ||
|
|
7db0ecd358 | ||
|
|
59eb73bb58 | ||
|
|
f55b76683e | ||
|
|
afd2907a8b | ||
|
|
d19883ba09 | ||
|
|
99c044ff88 | ||
|
|
f9edb3c43c | ||
|
|
3357ce5c3c | ||
|
|
f37760370a | ||
|
|
a0ca1d169a | ||
|
|
6ef21005d6 | ||
|
|
6acafac0f6 | ||
|
|
8d84f5000a | ||
|
|
88cddb1f2f | ||
|
|
213c3a6608 | ||
|
|
84f394f766 | ||
|
|
a222df1a40 | ||
|
|
baa4dfc9e9 | ||
|
|
eed715de59 | ||
|
|
c329cd403d | ||
|
|
5c72cc1091 | ||
|
|
c73c33872b | ||
|
|
412e3a36f6 | ||
|
|
cbf20ce5fc | ||
|
|
c4b05e6de4 | ||
|
|
e619253c5b | ||
|
|
583054850c | ||
|
|
9188c3d288 | ||
|
|
e5976a17a6 | ||
|
|
1ec63ef424 | ||
|
|
c302dcd73b | ||
|
|
1affe2e14a | ||
|
|
b903e592d9 | ||
|
|
f232b0bc21 | ||
|
|
5ba1cbb97b | ||
|
|
698d546e5b | ||
|
|
cd05928126 | ||
|
|
8739a508a2 | ||
|
|
0d5579dd4d | ||
|
|
0c615c5d37 | ||
|
|
1b9d7a37b9 | ||
|
|
6b76f8e5d9 | ||
|
|
47bf2f3901 | ||
|
|
35ac05b4a7 | ||
|
|
dec682346e | ||
|
|
c00ea899f2 | ||
|
|
5cefa6a238 | ||
|
|
de68f7528e | ||
|
|
5f03ae8eaf | ||
|
|
34b513c969 | ||
|
|
3fad5f296a | ||
|
|
d802cccd3c | ||
|
|
f0eecc254f | ||
|
|
eefd1a1048 | ||
|
|
c700b7b7ec | ||
|
|
170bc3d99a | ||
|
|
fdd8cabf24 | ||
|
|
9db8c214d0 | ||
|
|
19670b9fba | ||
|
|
09b983e56a | ||
|
|
b28cd97f7e | ||
|
|
72fd123c25 | ||
|
|
7bca928a2a | ||
|
|
3766dceb62 | ||
|
|
635703c273 | ||
|
|
84ec76d44b | ||
|
|
598a1943f2 | ||
|
|
e3c23999e8 | ||
|
|
90f5b94a87 | ||
|
|
5542b03b37 | ||
|
|
ee7f103b51 | ||
|
|
2f1cf28fe6 | ||
|
|
62a44458bf | ||
|
|
85da6b1743 | ||
|
|
fd0a8176b9 | ||
|
|
6f9a54b449 | ||
|
|
dee917ca11 | ||
|
|
ca7a951b8e | ||
|
|
42fc68fd99 | ||
|
|
a25cf3aaf2 | ||
|
|
a446d5c9e7 | ||
|
|
2a19e4d423 | ||
|
|
924f0edf84 | ||
|
|
b2b9416d0d | ||
|
|
b375e34d0d | ||
|
|
2795a5d2a1 | ||
|
|
3ea6deaa05 | ||
|
|
4332f7dd49 | ||
|
|
231f919aac | ||
|
|
1f9a49f82d | ||
|
|
baeee89f2e | ||
|
|
60f437cd83 | ||
|
|
8ae0a6bef9 | ||
|
|
26af23f4a1 | ||
|
|
786cb60fdf | ||
|
|
4249bdece9 | ||
|
|
255a7901a9 | ||
|
|
ea007f91ec | ||
|
|
5ae5ad3405 | ||
|
|
8c6d0a9a69 | ||
|
|
534ef98a01 | ||
|
|
b05e5048f2 | ||
|
|
1f21434f1f | ||
|
|
1e29ff0465 | ||
|
|
29f7583d05 | ||
|
|
83715ead91 | ||
|
|
3ac9e560a0 | ||
|
|
c0b386be04 | ||
|
|
d5dbac86e3 | ||
|
|
2f18d4e5ff | ||
|
|
165684d999 | ||
|
|
fdd9286367 | ||
|
|
8dbca72d46 | ||
|
|
1098848f1d | ||
|
|
a88316c9c5 | ||
|
|
108c26ef3c | ||
|
|
c9e7b09bc9 | ||
|
|
8a85c331be | ||
|
|
39a5695b58 | ||
|
|
cce437f221 | ||
|
|
2692fe310c | ||
|
|
d130cdd34a | ||
|
|
3a220af8f5 | ||
|
|
cbce06c011 | ||
|
|
a95a721f5e | ||
|
|
0b23404ee7 | ||
|
|
fb9c09234d | ||
|
|
8880c478c4 | ||
|
|
d5d51869b4 | ||
|
|
5eceef6dda | ||
|
|
4138bde7e9 | ||
|
|
ff6b90f8aa | ||
|
|
3fd41860b1 | ||
|
|
1011271269 | ||
|
|
2266dcbfa9 | ||
|
|
d711b3a708 | ||
|
|
df830b9938 | ||
|
|
213e9f7083 | ||
|
|
4e131cef20 | ||
|
|
e9f130c136 | ||
|
|
3707725d7b | ||
|
|
b1da921856 | ||
|
|
57fe05ac6d | ||
|
|
bb00268770 | ||
|
|
3dd2f2e99b | ||
|
|
8ff99aca3c | ||
|
|
99895d4a43 | ||
|
|
fff1933eac | ||
|
|
684aee0899 | ||
|
|
5b5f9791a9 | ||
|
|
6bd11c4290 | ||
|
|
00cf37c078 | ||
|
|
920d844e06 | ||
|
|
01a411e65b | ||
|
|
8da31441e5 | ||
|
|
fe8b278e61 | ||
|
|
55aa00f2c4 | ||
|
|
3a83068178 | ||
|
|
1138831ac7 | ||
|
|
e6ebf3a78b | ||
|
|
682b6e8a61 | ||
|
|
a6033b7e5e | ||
|
|
09225d7331 | ||
|
|
ff20fd527f | ||
|
|
3757241456 | ||
|
|
1c2527bea2 | ||
|
|
ca49c8948f | ||
|
|
e8f190b274 | ||
|
|
ec5c02432c | ||
|
|
f1c545f119 | ||
|
|
060c0dba90 | ||
|
|
0c86d94fee | ||
|
|
80d9478455 | ||
|
|
bc58d78479 | ||
|
|
3f37952dfc | ||
|
|
8eca2e74b4 | ||
|
|
72a7fd1dc0 | ||
|
|
bfac86aab0 | ||
|
|
338fbe17b2 | ||
|
|
4a0674e204 | ||
|
|
0c93d5771d | ||
|
|
5f46059638 | ||
|
|
0a88553192 | ||
|
|
fd68d3df24 | ||
|
|
d6df536589 | ||
|
|
05581b3980 | ||
|
|
cad84b1d0b | ||
|
|
a383de172b | ||
|
|
63ac580f43 | ||
|
|
7b3db94592 | ||
|
|
c1791a9fe4 | ||
|
|
d84ce64860 | ||
|
|
863cab2ddc | ||
|
|
ba0666a0ee | ||
|
|
70e12e9075 | ||
|
|
070492e208 | ||
|
|
3e36ffe4e5 | ||
|
|
33c897ac04 | ||
|
|
174735c7f4 | ||
|
|
2e3e177fcf | ||
|
|
7e78a25bdd | ||
|
|
aa712fb4d6 | ||
|
|
d71b9b6669 | ||
|
|
2228a401d3 | ||
|
|
747423d3b6 | ||
|
|
c55bac66ff | ||
|
|
6efc3ad8f1 | ||
|
|
f5ecbd33d9 | ||
|
|
85bcc60456 | ||
|
|
8d1945a9d7 | ||
|
|
2778fdd296 | ||
|
|
3743d0eb46 | ||
|
|
5ff35cefcd | ||
|
|
7a4e8e6273 | ||
|
|
8b923af8de | ||
|
|
a6bb2360e2 | ||
|
|
819ee2ed10 | ||
|
|
1e658af11d | ||
|
|
43a9e12e15 | ||
|
|
6c31a8c476 | ||
|
|
f2634728fc | ||
|
|
fa8f6d5326 | ||
|
|
b383dcc6b1 | ||
|
|
fc064abe3f | ||
|
|
7f93ed2761 | ||
|
|
b1bc12d853 | ||
|
|
b7be0c762f | ||
|
|
3d2b66f9d8 | ||
|
|
d220606eac | ||
|
|
9df18020fe | ||
|
|
be06e4f5d2 | ||
|
|
f9163a091f | ||
|
|
54f23bbab4 | ||
|
|
17a17b0c70 | ||
|
|
ab7d624c18 | ||
|
|
c0de924272 | ||
|
|
83a5f74c3c | ||
|
|
84f373dda5 | ||
|
|
51155007bd | ||
|
|
56be3d2fb1 | ||
|
|
fa1b3a73ac | ||
|
|
b2bab736fe | ||
|
|
1e53d14d7b | ||
|
|
77ba548d6a | ||
|
|
2dfe65a714 | ||
|
|
85b94f7eb1 | ||
|
|
8733a34e50 | ||
|
|
ad014b12ba | ||
|
|
15629dc58e | ||
|
|
459c5d5c51 | ||
|
|
75d801287a | ||
|
|
5379728496 | ||
|
|
9f4c225ee4 | ||
|
|
8f88918ca6 | ||
|
|
4292a24290 | ||
|
|
f3313e7fa1 | ||
|
|
1714e2fbc8 | ||
|
|
0730f467be | ||
|
|
1c1fe58587 | ||
|
|
9dc98ac314 | ||
|
|
872e6c4006 | ||
|
|
12f4a8ac6e | ||
|
|
414589b36c | ||
|
|
aab1b2f936 | ||
|
|
3701f65a2d | ||
|
|
684a3f3ad2 | ||
|
|
64860d9547 | ||
|
|
d029f2cc26 | ||
|
|
490d35236e | ||
|
|
20d3cb9a1d | ||
|
|
86bd5338cf | ||
|
|
b7039d49a6 | ||
|
|
7c074da9d2 | ||
|
|
9e555b0896 | ||
|
|
9ca4b8d8e9 | ||
|
|
323486badc | ||
|
|
d625a58eb5 | ||
|
|
008506cc67 | ||
|
|
b5a4791923 | ||
|
|
25b260a078 | ||
|
|
9150290a0d | ||
|
|
70b864d79f | ||
|
|
895182a0dd | ||
|
|
5b3ff1aaea | ||
|
|
f6c7f1e06a | ||
|
|
67ec20d000 | ||
|
|
cb2a8a8870 | ||
|
|
a5e5f77190 | ||
|
|
8b20da0f7c | ||
|
|
9f4a2646fb | ||
|
|
d6b0598b7e | ||
|
|
97bdd039a9 | ||
|
|
1c11cb6841 | ||
|
|
80316ae81b | ||
|
|
9a58968b2f | ||
|
|
3e679e5c19 | ||
|
|
7de5ce30cf | ||
|
|
f97338d37b | ||
|
|
4ab6cb1aed | ||
|
|
aa7152e303 | ||
|
|
00befa4703 | ||
|
|
e7484d561e | ||
|
|
13a88d254a | ||
|
|
949cd43c19 | ||
|
|
48db053704 |
29
.gitignore
vendored
@@ -1,4 +1,5 @@
|
||||
Makefile
|
||||
.qmake.stash
|
||||
|
||||
# old skool
|
||||
.svn
|
||||
@@ -14,15 +15,19 @@ lib/
|
||||
bin/
|
||||
plugins/
|
||||
resources/
|
||||
|
||||
qwt/src/debug/
|
||||
qwt/src/release/
|
||||
src/Makefile.Debug
|
||||
src/Makefile.Release
|
||||
src/object_script.GoldenCheetah.Debug
|
||||
src/object_script.GoldenCheetah.Release
|
||||
qwt/src/object_script.libqwt.Release
|
||||
qwt/src/object_script.libqwtd.Debug
|
||||
qwt/src/Makefile.Release
|
||||
qwt/src/Makefile.Debug
|
||||
build.pro.user
|
||||
src/debug/
|
||||
src/release/
|
||||
|
||||
qwt/src/debug/
|
||||
qwt/src/release/
|
||||
src/Makefile.Debug
|
||||
src/Makefile.Release
|
||||
src/object_script.GoldenCheetah.Debug
|
||||
src/object_script.GoldenCheetah.Release
|
||||
qwt/src/object_script.libqwt.Release
|
||||
qwt/src/object_script.libqwtd.Debug
|
||||
qwt/src/Makefile.Release
|
||||
qwt/src/Makefile.Debug
|
||||
qwt/textengines/mathml/debug/
|
||||
qwt/textengines/mathml/release/
|
||||
build.pro.user
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
Mark Liversedge
|
||||
John Ehrlinger
|
||||
|
||||
May 2011
|
||||
Version 1.1
|
||||
Jan 2015
|
||||
Version 1.2
|
||||
|
||||
A walkthrough of building GoldenCheetah from scratch on Ubuntu linux. This walkthrough
|
||||
should be largely the same for any Linux distro.
|
||||
@@ -30,8 +30,6 @@ CONTENTS
|
||||
- bison
|
||||
- libical - Diary window and CalDAV support (google/mobileme calendar integration)
|
||||
- libvlc - Video playback in training mode
|
||||
- clucene - Indexing/Searching ride files
|
||||
|
||||
|
||||
1. BASIC INSTALLATION WITH MANDATORY DEPENDENCIES
|
||||
=================================================
|
||||
@@ -373,30 +371,3 @@ VLC_INSTALL = /usr/include/vlc/
|
||||
$ make clean
|
||||
$ qmake
|
||||
$ make
|
||||
|
||||
CLUCENE - Indexing and Searching ride files (search box)
|
||||
--------------------------------------------------------
|
||||
|
||||
You will need clucene runtime and core libraries, we developed against 0.9.21b-2 but
|
||||
any 0.9 branch should work fine, let us know if you experience any issues. You may find
|
||||
that the libclucene0ldbl runtime is already installed, this is fine and typical since
|
||||
clucene is a very popular search library.
|
||||
|
||||
$ sudo apt-get install libclucene-dev
|
||||
$ sudo apt-get install libclucene0ldbl
|
||||
|
||||
By default, and this is deliberate, the clucene install places the config headers into
|
||||
a platform specific location. For my install I just copy the platform (linux) specific
|
||||
header config into the normal /usr/include/CLucene directory with the following:
|
||||
|
||||
$ sudo cp /usr/lib/CLucene/clucene-config.h /usr/include/CLucene
|
||||
|
||||
Next we need to comment out the two CLUCENE lines in gcconfig.pri and they should read:
|
||||
|
||||
CLUCENE_INCLUDE = /usr/include/CLucene
|
||||
CLUCENE_LIBS = -lclucene
|
||||
|
||||
$ make clean
|
||||
$ qmake
|
||||
$ make
|
||||
|
||||
|
||||
17
INSTALL-MAC
@@ -4,8 +4,8 @@
|
||||
|
||||
Mark Liversedge
|
||||
|
||||
Nov 2011
|
||||
Version 1.1
|
||||
Jan 2015
|
||||
Version 1.2
|
||||
|
||||
A walkthrough of building GoldenCheetah from scratch on Mac OSX. This was performed
|
||||
on Mac OSX Lion (10.7) but the instructions are largely the same for all versions of
|
||||
@@ -25,7 +25,6 @@ CONTENTS
|
||||
- libkml
|
||||
- libusb
|
||||
- libical
|
||||
- libclucene
|
||||
|
||||
|
||||
1. BASIC INSTALLATION WITH MANDATORY DEPENDENCIES
|
||||
@@ -297,15 +296,3 @@ libical (0.46)
|
||||
first run autogen.sh
|
||||
then
|
||||
./configure CFLAGS="-isysroot /Developer/SDKs/MacOSX10.7.sdk -arch x86_64" --disable-dependency-tracking
|
||||
|
||||
2.7 clucene
|
||||
-----------
|
||||
|
||||
DO NOT USE THE MACPORTS VERSION (0.9.23) IT DOES NOT WORK.
|
||||
|
||||
git clone git://clucene.git.sourceforge.net/gitroot/clucene/clucene
|
||||
cmake -G "Unix Makefiles"
|
||||
make
|
||||
sudo make install
|
||||
|
||||
will install clucene into /usr/local/include/clucene and /usr/local/lib
|
||||
|
||||
316
contrib/0001-Patch-LIBKML-Windows-MingGW-subset-for-GC.patch
Normal file
@@ -0,0 +1,316 @@
|
||||
From 7be04e65a53b22ce382d640a6c409b5d3bfe5645 Mon Sep 17 00:00:00 2001
|
||||
From: Joern <joern.rm@gmail.com>
|
||||
Date: Sat, 20 Dec 2014 12:42:37 +0100
|
||||
Subject: [PATCH] Patch-Windows-MingGW-subset for GC
|
||||
|
||||
... reduce the libs in Make to what GoldenCheetah needs
|
||||
... add two functions missing in MingGW standard libs
|
||||
---
|
||||
Makefile.am | 2 +-
|
||||
configure.ac | 44 -------------------
|
||||
src/Makefile.am | 2 +-
|
||||
src/kml/base/file_posix.cc | 102 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
src/kml/base/string_util.cc | 17 ++++++++
|
||||
third_party/Makefile.am | 42 +++---------------
|
||||
6 files changed, 126 insertions(+), 83 deletions(-)
|
||||
|
||||
diff --git a/Makefile.am b/Makefile.am
|
||||
index 2be0803..e29201e 100644
|
||||
--- a/Makefile.am
|
||||
+++ b/Makefile.am
|
||||
@@ -1,7 +1,7 @@
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
# Order is important:
|
||||
-SUBDIRS = third_party src testdata examples msvc xcode
|
||||
+SUBDIRS = third_party src
|
||||
|
||||
EXTRA_DIST = \
|
||||
AUTHORS \
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index d5fa75f..033128b 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -203,23 +203,6 @@ AC_CHECK_LIB(pthread, pthread_create,,
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
- examples/Makefile
|
||||
- examples/domviewer/Makefile
|
||||
- examples/engine/Makefile
|
||||
- examples/gpx/Makefile
|
||||
- examples/gx/Makefile
|
||||
- examples/hellonet/Makefile
|
||||
- examples/helloworld/Makefile
|
||||
- examples/java/Makefile
|
||||
- examples/kml/Makefile
|
||||
- examples/python/Makefile
|
||||
- examples/regionator/Makefile
|
||||
- examples/wxregionator/Makefile
|
||||
- examples/wxviewer/Makefile
|
||||
- examples/xsd/Makefile
|
||||
- msvc/Makefile
|
||||
- msvc/examples/Makefile
|
||||
- msvc/tests/Makefile
|
||||
src/Makefile
|
||||
src/kml/Makefile
|
||||
src/kml/convenience/Makefile
|
||||
@@ -228,34 +211,7 @@ AC_CONFIG_FILES([
|
||||
src/kml/regionator/Makefile
|
||||
src/kml/base/Makefile
|
||||
src/kml/xsd/Makefile
|
||||
- src/swig/Makefile
|
||||
- src/swig/java/Makefile
|
||||
- src/swig/python/Makefile
|
||||
- testdata/Makefile
|
||||
- testdata/atom/Makefile
|
||||
- testdata/balloon/Makefile
|
||||
- testdata/csv/Makefile
|
||||
- testdata/deprecated/Makefile
|
||||
- testdata/gdata/Makefile
|
||||
- testdata/gmaps/Makefile
|
||||
- testdata/gpx/Makefile
|
||||
- testdata/gx/Makefile
|
||||
- testdata/kml/Makefile
|
||||
- testdata/kmz/Makefile
|
||||
- testdata/kmz/files/Makefile
|
||||
- testdata/kmz/kmzfiles/Makefile
|
||||
- testdata/kmz/rumsey/Makefile
|
||||
- testdata/kmz/rumsey/kml/Makefile
|
||||
- testdata/kmz/rumsey/imagery/Makefile
|
||||
- testdata/links/Makefile
|
||||
- testdata/style/Makefile
|
||||
- testdata/style/weather/Makefile
|
||||
- testdata/update/Makefile
|
||||
- testdata/xal/Makefile
|
||||
- testdata/xsd/Makefile
|
||||
third_party/Makefile
|
||||
- xcode/Makefile
|
||||
- xcode/LibKML/Makefile
|
||||
])
|
||||
|
||||
AC_OUTPUT
|
||||
diff --git a/src/Makefile.am b/src/Makefile.am
|
||||
index 0bf15ac..721209e 100644
|
||||
--- a/src/Makefile.am
|
||||
+++ b/src/Makefile.am
|
||||
@@ -1,4 +1,4 @@
|
||||
-SUBDIRS = kml swig
|
||||
+SUBDIRS = kml
|
||||
|
||||
# TODO: use the phc files in msvc.
|
||||
EXTRA_DIST = \
|
||||
diff --git a/src/kml/base/file_posix.cc b/src/kml/base/file_posix.cc
|
||||
index b9461c0..920a996 100644
|
||||
--- a/src/kml/base/file_posix.cc
|
||||
+++ b/src/kml/base/file_posix.cc
|
||||
@@ -33,8 +33,110 @@
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h> // For unlink, close.
|
||||
|
||||
+// START PATCH
|
||||
+#include <fcntl.h>
|
||||
+#include <sys/time.h>
|
||||
+#include <sys/stat.h>
|
||||
+// END PATCH
|
||||
+
|
||||
namespace kmlbase {
|
||||
|
||||
+// START PATCH
|
||||
+// Implementation of missing functions
|
||||
+
|
||||
+/* mkstemp extracted from libc/sysdeps/posix/tempname.c. Copyright
|
||||
+ (C) 1991-1999, 2000, 2001, 2006 Free Software Foundation, Inc.
|
||||
+
|
||||
+ The GNU C Library is free software; you can redistribute it and/or
|
||||
+ modify it under the terms of the GNU Lesser General Public
|
||||
+ License as published by the Free Software Foundation; either
|
||||
+ version 2.1 of the License, or (at your option) any later version. */
|
||||
+
|
||||
+static const char letters[] =
|
||||
+"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||
+
|
||||
+/* Generate a temporary file name based on TMPL. TMPL must match the
|
||||
+ rules for mk[s]temp (i.e. end in "XXXXXX"). The name constructed
|
||||
+ does not exist at the time of the call to mkstemp. TMPL is
|
||||
+ overwritten with the result. */
|
||||
+int
|
||||
+mkstemp (char *tmpl)
|
||||
+{
|
||||
+ int len;
|
||||
+ char *XXXXXX;
|
||||
+ static unsigned long value;
|
||||
+ unsigned long random_time_bits;
|
||||
+ unsigned int count;
|
||||
+ int fd = -1;
|
||||
+ int save_errno = errno;
|
||||
+
|
||||
+ /* A lower bound on the number of temporary files to attempt to
|
||||
+ generate. The maximum total number of temporary file names that
|
||||
+ can exist for a given template is 62**6. It should never be
|
||||
+ necessary to try all these combinations. Instead if a reasonable
|
||||
+ number of names is tried (we define reasonable as 62**3) fail to
|
||||
+ give the system administrator the chance to remove the problems. */
|
||||
+#define ATTEMPTS_MIN (62 * 62 * 62)
|
||||
+
|
||||
+ /* The number of times to attempt to generate a temporary file. To
|
||||
+ conform to POSIX, this must be no smaller than TMP_MAX. */
|
||||
+#if ATTEMPTS_MIN < TMP_MAX
|
||||
+ unsigned int attempts = TMP_MAX;
|
||||
+#else
|
||||
+ unsigned int attempts = ATTEMPTS_MIN;
|
||||
+#endif
|
||||
+
|
||||
+ len = strlen (tmpl);
|
||||
+ if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX"))
|
||||
+ {
|
||||
+ errno = EINVAL;
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+/* This is where the Xs start. */
|
||||
+ XXXXXX = &tmpl[len - 6];
|
||||
+
|
||||
+ /* Get some more or less random data. */
|
||||
+ {
|
||||
+ struct timeval tv;
|
||||
+ gettimeofday (&tv, NULL);
|
||||
+ random_time_bits = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec;
|
||||
+ }
|
||||
+ value += random_time_bits ^ getpid ();
|
||||
+
|
||||
+ for (count = 0; count < attempts; value += 7777, ++count)
|
||||
+ {
|
||||
+ unsigned long v = value;
|
||||
+
|
||||
+ /* Fill in the random bits. */
|
||||
+ XXXXXX[0] = letters[v % 62];
|
||||
+ v /= 62;
|
||||
+ XXXXXX[1] = letters[v % 62];
|
||||
+ v /= 62;
|
||||
+ XXXXXX[2] = letters[v % 62];
|
||||
+ v /= 62;
|
||||
+ XXXXXX[3] = letters[v % 62];
|
||||
+ v /= 62;
|
||||
+ XXXXXX[4] = letters[v % 62];
|
||||
+ v /= 62;
|
||||
+ XXXXXX[5] = letters[v % 62];
|
||||
+
|
||||
+ fd = open (tmpl, O_RDWR | O_CREAT | O_EXCL, _S_IREAD | _S_IWRITE);
|
||||
+ if (fd >= 0)
|
||||
+ {
|
||||
+ errno = save_errno;
|
||||
+ return fd;
|
||||
+ }
|
||||
+ else if (errno != EEXIST)
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ /* We got out of the loop because we ran out of combinations to try. */
|
||||
+ errno = EEXIST;
|
||||
+ return -1;
|
||||
+}
|
||||
+// END PATCH
|
||||
+
|
||||
// Internal to the POSIX File class.
|
||||
static bool StatFile(const char* path, struct stat* stat_data) {
|
||||
struct stat tmp;
|
||||
diff --git a/src/kml/base/string_util.cc b/src/kml/base/string_util.cc
|
||||
index b3a9654..3fdba2b 100644
|
||||
--- a/src/kml/base/string_util.cc
|
||||
+++ b/src/kml/base/string_util.cc
|
||||
@@ -31,6 +31,23 @@
|
||||
|
||||
namespace kmlbase {
|
||||
|
||||
+// START PATCH
|
||||
+int strncasecmp(const char *s1, const char *s2, size_t n) {
|
||||
+ while (*s1 != 0 && tolower(*s1) == tolower(*s2)) {
|
||||
+ ++s1;
|
||||
+ ++s2;
|
||||
+ }
|
||||
+
|
||||
+ return
|
||||
+ (*s2 == 0)
|
||||
+ ? (*s1 != 0)
|
||||
+ : (*s1 == 0)
|
||||
+ ? -1
|
||||
+ : (tolower(*s1) - tolower(*s2));
|
||||
+}
|
||||
+
|
||||
+// ENDPATCH
|
||||
+
|
||||
void b2a_hex(uint32_t i, char* out) {
|
||||
char map[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
'a', 'b', 'c', 'd', 'e', 'f'};
|
||||
diff --git a/third_party/Makefile.am b/third_party/Makefile.am
|
||||
index b73dec3..fe34dea 100644
|
||||
--- a/third_party/Makefile.am
|
||||
+++ b/third_party/Makefile.am
|
||||
@@ -12,7 +12,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/third_party/zlib-1.2.3/contrib \
|
||||
-I$(top_srcdir)/third_party/gtest-1.7.0/include
|
||||
|
||||
lib_LTLIBRARIES = libminizip.la liburiparser.la
|
||||
-noinst_LTLIBRARIES = libgtest.la libgtest_main.la
|
||||
+#noinst_LTLIBRARIES = libgtest.la libgtest_main.la
|
||||
|
||||
libminizip_la_SOURCES = \
|
||||
zlib-1.2.3/contrib/minizip/unzip.c \
|
||||
@@ -83,11 +83,11 @@ libboostconfigplatforminclude_HEADERS = \
|
||||
$(boost)/config/platform/linux.hpp \
|
||||
$(boost)/config/platform/macos.hpp
|
||||
|
||||
-libgtest_la_SOURCES = \
|
||||
- gtest-1.7.0/src/gtest-all.cc
|
||||
+#libgtest_la_SOURCES = \
|
||||
+# gtest-1.7.0/src/gtest-all.cc
|
||||
|
||||
-libgtest_main_la_SOURCES = gtest-1.7.0/src/gtest_main.cc
|
||||
-libgtest_main_la_LIBADD = libgtest.la
|
||||
+#libgtest_main_la_SOURCES = gtest-1.7.0/src/gtest_main.cc
|
||||
+#libgtest_main_la_LIBADD = libgtest.la
|
||||
|
||||
# TODO: add the new gtest libs for windows.
|
||||
# gtest-1.7.0.win32/debug/gtest.lib \
|
||||
@@ -149,38 +149,6 @@ EXTRA_DIST = \
|
||||
$(boost)/config/stdlib/sgi.hpp \
|
||||
$(boost)/config/stdlib/stlport.hpp \
|
||||
$(boost)/config/stdlib/vacpp.hpp \
|
||||
- gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||
- gtest-1.7.0/include/gtest/gtest-message.h \
|
||||
- gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||
- gtest-1.7.0/include/gtest/gtest-param-test.h.pump \
|
||||
- gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||
- gtest-1.7.0/include/gtest/gtest-spi.h \
|
||||
- gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||
- gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||
- gtest-1.7.0/include/gtest/gtest.h \
|
||||
- gtest-1.7.0/include/gtest/gtest_pred_impl.h \
|
||||
- gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-tuple.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||
- gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump \
|
||||
- gtest-1.7.0/src/gtest-death-test.cc \
|
||||
- gtest-1.7.0/src/gtest-filepath.cc \
|
||||
- gtest-1.7.0/src/gtest-internal-inl.h \
|
||||
- gtest-1.7.0/src/gtest-port.cc \
|
||||
- gtest-1.7.0/src/gtest-printers.cc \
|
||||
- gtest-1.7.0/src/gtest-test-part.cc \
|
||||
- gtest-1.7.0/src/gtest-typed-test.cc \
|
||||
- gtest-1.7.0/src/gtest.cc \
|
||||
uriparser-0.7.5/COPYING \
|
||||
uriparser-0.7.5.win32/debug/uriparser.lib \
|
||||
uriparser-0.7.5.win32/release/uriparser.lib \
|
||||
--
|
||||
1.9.5.github.0
|
||||
|
||||
9
contrib/RideLogger/.classpath
Normal file
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
||||
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="gen"/>
|
||||
<classpathentry kind="output" path="bin/classes"/>
|
||||
</classpath>
|
||||
12
contrib/RideLogger/.gitignore
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
# Ignores for Eclipse
|
||||
/.settings/
|
||||
|
||||
# Ignores for Android Projects
|
||||
/bin/
|
||||
/gen/
|
||||
/publish/
|
||||
/local.properties
|
||||
/secure.properties
|
||||
|
||||
# Ignores for Mac machines
|
||||
.DS_Store
|
||||
39
contrib/RideLogger/AndroidManifest.xml
Normal file
@@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE AndroidXML>
|
||||
<manifest
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:installLocation="auto"
|
||||
package="com.ridelogger"
|
||||
android:versionCode="040000"
|
||||
android:versionName="4.0.0"
|
||||
android:icon="@drawable/ic_launcher" >
|
||||
<uses-sdk android:minSdkVersion="14"
|
||||
android:targetSdkVersion="21" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||
<uses-permission android:name="android.permission.SEND_SMS"/>
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:icon="@drawable/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:theme="@android:style/Theme.DeviceDefault.Light" >
|
||||
<service
|
||||
android:name="com.ridelogger.RideService"
|
||||
android:icon="@drawable/ic_launcher"
|
||||
android:label="@string/service_name" >
|
||||
</service>
|
||||
<activity
|
||||
android:name="com.ridelogger.StartActivity"
|
||||
android:label="@string/app_name" >
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name="com.ridelogger.SettingsActivity"
|
||||
android:label="@string/setting_title" >
|
||||
</activity>
|
||||
</application>
|
||||
</manifest>
|
||||
BIN
contrib/RideLogger/ic_launcher-web.png
Normal file
|
After Width: | Height: | Size: 176 KiB |
BIN
contrib/RideLogger/libs/android-support-v4.jar
Normal file
BIN
contrib/RideLogger/libs/antpluginlib_3-1-0.jar
Normal file
BIN
contrib/RideLogger/libs/fit_12.00.jar
Normal file
3
contrib/RideLogger/lint.xml
Normal file
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<lint>
|
||||
</lint>
|
||||
68
contrib/RideLogger/proguard-android-optimize.txt
Normal file
@@ -0,0 +1,68 @@
|
||||
# This is a configuration file for ProGuard.
|
||||
# http://proguard.sourceforge.net/index.html#manual/usage.html
|
||||
|
||||
# Optimizations: If you don't want to optimize, use the
|
||||
# proguard-android.txt configuration file instead of this one, which
|
||||
# turns off the optimization flags. Adding optimization introduces
|
||||
# certain risks, since for example not all optimizations performed by
|
||||
# ProGuard works on all versions of Dalvik. The following flags turn
|
||||
# off various optimizations known to have issues, but the list may not
|
||||
# be complete or up to date. (The "arithmetic" optimization can be
|
||||
# used if you are only targeting Android 2.0 or later.) Make sure you
|
||||
# test thoroughly if you go this route.
|
||||
-optimizations code/simplification/arithmetic,code/simplification/cast,field/*,class/merging/*
|
||||
-optimizationpasses 24
|
||||
-allowaccessmodification
|
||||
-dontpreverify
|
||||
|
||||
# The remainder of this file is identical to the non-optimized version
|
||||
# of the Proguard configuration file (except that the other file has
|
||||
# flags to turn off optimization).
|
||||
|
||||
-dontusemixedcaseclassnames
|
||||
-dontskipnonpubliclibraryclasses
|
||||
-verbose
|
||||
|
||||
-keepattributes *Annotation*
|
||||
-keep public class com.google.vending.licensing.ILicensingService
|
||||
-keep public class com.android.vending.licensing.ILicensingService
|
||||
|
||||
# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
|
||||
-keepclasseswithmembernames class * {
|
||||
native <methods>;
|
||||
}
|
||||
|
||||
# keep setters in Views so that animations can still work.
|
||||
# see http://proguard.sourceforge.net/manual/examples.html#beans
|
||||
-keepclassmembers public class * extends android.view.View {
|
||||
void set*(***);
|
||||
*** get*();
|
||||
}
|
||||
|
||||
# We want to keep methods in Activity that could be used in the XML attribute onClick
|
||||
-keepclassmembers class * extends android.app.Activity {
|
||||
public void *(android.view.View);
|
||||
}
|
||||
|
||||
# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
|
||||
-keepclassmembers enum * {
|
||||
public static **[] values();
|
||||
public static ** valueOf(java.lang.String);
|
||||
}
|
||||
|
||||
-keep class * implements android.os.Parcelable {
|
||||
public static final android.os.Parcelable$Creator *;
|
||||
}
|
||||
|
||||
-keepclassmembers class **.R$* {
|
||||
public static <fields>;
|
||||
}
|
||||
|
||||
# The support library contains references to newer platform versions.
|
||||
# Don't warn about those in case this app is linking against an older
|
||||
# platform version. We know about them, and they are safe.
|
||||
-dontwarn android.support.**
|
||||
|
||||
-keep public class com.ridelogger.SettingsActivity$GeneralFragment
|
||||
-keep public class com.ridelogger.SettingsActivity$AntFragment
|
||||
-keep public class com.ridelogger.SettingsActivity$SensorsFragment
|
||||
15
contrib/RideLogger/project.properties
Normal file
@@ -0,0 +1,15 @@
|
||||
# This file is automatically generated by Android Tools.
|
||||
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||
#
|
||||
# This file must be checked in Version Control Systems.
|
||||
#
|
||||
# To customize properties used by the Ant build system edit
|
||||
# "ant.properties", and override values to adapt the script to your
|
||||
# project structure.
|
||||
#
|
||||
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||
proguard.config=proguard-android-optimize.txt
|
||||
|
||||
# Project target.
|
||||
target=android-21
|
||||
min=android-14
|
||||
BIN
contrib/RideLogger/res/drawable-hdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
BIN
contrib/RideLogger/res/drawable-ldpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
contrib/RideLogger/res/drawable-mdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
BIN
contrib/RideLogger/res/drawable-xhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
10
contrib/RideLogger/res/layout/activity_dashboard.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE AndroidXML>
|
||||
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/LayoutData"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:numColumns="auto_fit"
|
||||
android:stretchMode="columnWidth"
|
||||
android:gravity="right"
|
||||
/>
|
||||
13
contrib/RideLogger/res/layout/settings.xml
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<preference-headers
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<header android:fragment="com.ridelogger.SettingsActivity$GeneralFragment"
|
||||
android:title="@string/setting_general_title"
|
||||
android:summary="@string/setting_general_note" />
|
||||
<header android:fragment="com.ridelogger.SettingsActivity$AntFragment"
|
||||
android:title="@string/setting_ant_title"
|
||||
android:summary="@string/setting_ant_note" />
|
||||
<header android:fragment="com.ridelogger.SettingsActivity$SensorsFragment"
|
||||
android:title="@string/setting_sensors_title"
|
||||
android:summary="@string/setting_sensors_note" />
|
||||
</preference-headers>
|
||||
11
contrib/RideLogger/res/menu/start_activity.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
|
||||
<item android:id="@+id/Start"
|
||||
android:title="@string/start" />
|
||||
<item android:id="@+id/Stop"
|
||||
android:title="@string/stop" />
|
||||
<item android:id="@+id/Settings"
|
||||
android:title="@string/edit_settings"
|
||||
android:showAsAction="never" />
|
||||
</menu>
|
||||
97
contrib/RideLogger/res/values/strings.xml
Normal file
@@ -0,0 +1,97 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE AndroidXML>
|
||||
<resources>
|
||||
<string name="app_name">Ride Logger</string>
|
||||
<string name="service_name">Logging Ride</string>
|
||||
|
||||
<string name="emergency_contact_dialog_title">Emergency Contact</string>
|
||||
<string name="emergency_contact_dialog_note">Should a text messesage be sent on ride start and periodically to let your emergency contact know you are alright?</string>
|
||||
|
||||
<string name="sms_period_dialog_title">Emergency Contact SMS Period</string>
|
||||
<string name="sms_period_dialog_note">Period in Minutes:</string>
|
||||
|
||||
<string name="crash_detection_dialog_title">Crash Detection</string>
|
||||
<string name="crash_detection_dialog_note">Should a text messesage be sent on crash detction to your emergency contact?</string>
|
||||
|
||||
<string name="emergency_contact_number_dialog_title">Emergency Contact Number</string>
|
||||
<string name="emergency_contact_number_dialog_note">Emergency phone number to update position on crash detection</string>
|
||||
|
||||
<string name="ant_setup_title">Set Ant+</string>
|
||||
<string name="ant_setup_note">Pair your Ant+ devices now?</string>
|
||||
|
||||
<string name="ant_pair_dialog_title">Select Ant Devices</string>
|
||||
<string name="ant_pair_dialog_button_note">Pair</string>
|
||||
|
||||
<string name="gc_rider_name_dialog_title">Enter Rider Name</string>
|
||||
<string name="gc_rider_name_dialog_note">What is your Golder Cheata Rider Name?</string>
|
||||
|
||||
<string name="save_setting_button">Next</string>
|
||||
<string name="skip_setting_button">Skip</string>
|
||||
|
||||
<string name="boolean_dialog_yes">Yes</string>
|
||||
<string name="boolean_dialog_no">No</string>
|
||||
|
||||
<string name="starting_ride">Starting Ride!</string>
|
||||
<string name="stopping_ride">Stoping Ride!</string>
|
||||
|
||||
<string name="ride_on">Ride On</string>
|
||||
<string name="building_ride">Building ride: </string>
|
||||
|
||||
<string name="click_to_stop"> Click to stop ride.</string>
|
||||
|
||||
<string name="ride_start_title">Start Ride</string>
|
||||
<string name="ride_start_note">Make sure locations is turned on. Internet connection is NOT required.</string>
|
||||
|
||||
<string name="start">Start Logging</string>
|
||||
<string name="edit_settings">Settings</string>
|
||||
|
||||
<string name="ride_stop_title">Ride in Progress</string>
|
||||
<string name="ride_stop_note">Would you like to stop the ride or view current values.</string>
|
||||
|
||||
<string name="stop">Stop Logging</string>
|
||||
<string name="view">View</string>
|
||||
|
||||
<string name="crash_warning">WARNING CRASH!</string>
|
||||
<string name="crash_confirm">CRASH CONFIRMED!</string>
|
||||
<string name="crash_unknow_location">Unknow location.</string>
|
||||
<string name="crash_magnitude">Mag</string>
|
||||
|
||||
<string name="ride_start_sms">I\'m starting my ride.</string>
|
||||
<string name="ride_stop_sms">I have finished my ride.</string>
|
||||
<string name="riding_ok_sms">I\'m ok.</string>
|
||||
|
||||
<string name="setting_title">Settings</string>
|
||||
|
||||
<string name="setting_general_title">General</string>
|
||||
<string name="setting_general_note">Settings</string>
|
||||
|
||||
<string name="setting_ant_title">Ant+</string>
|
||||
<string name="setting_ant_note">Setup your Ant+ Devices</string>
|
||||
|
||||
<string name="searching_for_ants">Searching for Ant+ Devices...</string>
|
||||
<string name="found_ants">Found Ant+ Devices, Press to Pair.</string>
|
||||
<string name="no_found_ants">Nothing found to pair.</string>
|
||||
|
||||
<string name="setting_sensors_title">Display Sensors</string>
|
||||
<string name="setting_sensors_note">List of Sensors Display</string>
|
||||
|
||||
<string name="setting_wheel_size">Wheel Circumference in Meters</string>
|
||||
|
||||
<string name="imperial_units_title">Imperial Units</string>
|
||||
<string name="imperial_units_note">Show Measurements in Imperial Units</string>
|
||||
|
||||
<string name="setting_size_title">Display Text Size</string>
|
||||
|
||||
<string name="PREFS_NAME">RideLogger</string>
|
||||
<string name="PREF_RIDER_NAME">RiderName</string>
|
||||
<string name="PREF_EMERGENCY_NUMBER">EmergencyNumbuer</string>
|
||||
<string name="PREF_DETECT_CRASH">DetectCrash</string>
|
||||
<string name="PREF_PHONE_HOME">PhoneHome</string>
|
||||
<string name="PREF_PAIRED_ANTS">PairedAnts</string>
|
||||
<string name="PREF_PHONE_HOME_PERIOD">PhoneHomePeriod</string>
|
||||
<string name="PREF_TRACKING_SENSORS">TrackingSensors</string>
|
||||
<string name="PREF_TRACKING_SIZE">TrackingSize</string>
|
||||
<string name="PREF_TRACKING_IMPERIAL_UNITS">TrackingImperialUnits</string>
|
||||
<string name="PREF_WHEEL_SIZE">WheelSize</string>
|
||||
|
||||
</resources>
|
||||
20
contrib/RideLogger/res/xml/ant_settings.xml
Normal file
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<PreferenceCategory
|
||||
android:title="@string/PREFS_NAME">
|
||||
|
||||
<MultiSelectListPreference
|
||||
android:key="@string/PREF_PAIRED_ANTS"
|
||||
android:title="@string/ant_pair_dialog_title"
|
||||
android:summary="@string/ant_pair_dialog_button_note"
|
||||
/>
|
||||
|
||||
<EditTextPreference
|
||||
android:key="@string/PREF_WHEEL_SIZE"
|
||||
android:title="@string/setting_wheel_size"
|
||||
android:defaultValue="2.096"
|
||||
/>
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
</PreferenceScreen>
|
||||
42
contrib/RideLogger/res/xml/general_settings.xml
Normal file
@@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<PreferenceCategory
|
||||
android:title="@string/PREFS_NAME"
|
||||
android:persistent="true">
|
||||
|
||||
<EditTextPreference
|
||||
android:key="@string/PREF_RIDER_NAME"
|
||||
android:title="@string/gc_rider_name_dialog_title"
|
||||
android:summary="@string/gc_rider_name_dialog_note" />
|
||||
|
||||
<EditTextPreference
|
||||
android:key="@string/PREF_EMERGENCY_NUMBER"
|
||||
android:title="@string/emergency_contact_number_dialog_title"
|
||||
android:summary="@string/emergency_contact_number_dialog_note" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:layout="?android:attr/preferenceLayoutChild"
|
||||
android:dependency="@string/PREF_EMERGENCY_NUMBER"
|
||||
android:key="@string/PREF_DETECT_CRASH"
|
||||
android:title="@string/crash_detection_dialog_title"
|
||||
android:summary="@string/crash_detection_dialog_note" />
|
||||
|
||||
<!-- The visual style of a child is defined by this styled theme attribute. -->
|
||||
<CheckBoxPreference
|
||||
android:layout="?android:attr/preferenceLayoutChild"
|
||||
android:dependency="@string/PREF_EMERGENCY_NUMBER"
|
||||
android:key="@string/PREF_PHONE_HOME"
|
||||
android:title="@string/emergency_contact_dialog_title"
|
||||
android:summary="@string/emergency_contact_dialog_note" />
|
||||
|
||||
<EditTextPreference
|
||||
android:layout="?android:attr/preferenceLayoutChild"
|
||||
android:dependency="@string/PREF_PHONE_HOME"
|
||||
android:key="@string/PREF_PHONE_HOME_PERIOD"
|
||||
android:title="@string/sms_period_dialog_title"
|
||||
android:summary="@string/sms_period_dialog_note"
|
||||
android:defaultValue="20" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
</PreferenceScreen>
|
||||
25
contrib/RideLogger/res/xml/sensors_settings.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<PreferenceCategory
|
||||
android:title="@string/PREFS_NAME">
|
||||
|
||||
<MultiSelectListPreference
|
||||
android:key="@string/PREF_TRACKING_SENSORS"
|
||||
android:title="@string/setting_sensors_title"
|
||||
android:summary="@string/setting_sensors_note"
|
||||
/>
|
||||
<CheckBoxPreference
|
||||
android:key="@string/PREF_TRACKING_IMPERIAL_UNITS"
|
||||
android:title="@string/imperial_units_title"
|
||||
android:summary="@string/imperial_units_note"
|
||||
/>
|
||||
|
||||
<EditTextPreference
|
||||
android:key="@string/PREF_TRACKING_SIZE"
|
||||
android:title="@string/setting_size_title"
|
||||
android:defaultValue="20"
|
||||
/>
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
</PreferenceScreen>
|
||||
281
contrib/RideLogger/src/com/ridelogger/CurrentValuesAdapter.java
Normal file
@@ -0,0 +1,281 @@
|
||||
package com.ridelogger;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.Typeface;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.TypedValue;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.GridView;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
public class CurrentValuesAdapter extends BaseAdapter {
|
||||
private StartActivity context;
|
||||
|
||||
private int[] keys;
|
||||
private String[] values;
|
||||
private String[] keyLabels;
|
||||
private int size = 20;
|
||||
private boolean imperial = false;
|
||||
private SharedPreferences settings = null;
|
||||
|
||||
private GridView layout;
|
||||
|
||||
public CurrentValuesAdapter(StartActivity c, GridView pLayout) {
|
||||
context = c;
|
||||
layout = pLayout;
|
||||
|
||||
layout.setBackgroundColor(Color.BLACK);
|
||||
layout.setVerticalSpacing(4);
|
||||
layout.setHorizontalSpacing(4);
|
||||
|
||||
settings = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
Set<String> sensors = settings.getStringSet(context.getString(R.string.PREF_TRACKING_SENSORS), null);
|
||||
|
||||
size = Integer.valueOf(settings.getString(context.getString(R.string.PREF_TRACKING_SIZE), "20"));
|
||||
imperial = settings.getBoolean(context.getString(R.string.PREF_TRACKING_IMPERIAL_UNITS), false);
|
||||
|
||||
initKeys(sensors);
|
||||
initKeyLables();
|
||||
initValues();
|
||||
|
||||
settings.registerOnSharedPreferenceChangeListener(
|
||||
new SharedPreferences.OnSharedPreferenceChangeListener() {
|
||||
@Override
|
||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String pkey) {
|
||||
if(pkey == context.getString(R.string.PREF_TRACKING_SIZE)) {
|
||||
size = Integer.valueOf(sharedPreferences.getString(context.getString(R.string.PREF_TRACKING_SIZE), "20"));
|
||||
setupWidth();
|
||||
notifyDataSetChanged();
|
||||
} else if (pkey == context.getString(R.string.PREF_TRACKING_SENSORS)) {
|
||||
Set<String> sensors = sharedPreferences.getStringSet(context.getString(R.string.PREF_TRACKING_SENSORS), null);
|
||||
|
||||
initKeys(sensors);
|
||||
initKeyLables();
|
||||
initValues();
|
||||
|
||||
layout.setAdapter(CurrentValuesAdapter.this);
|
||||
notifyDataSetChanged();
|
||||
} else if (pkey == context.getString(R.string.PREF_TRACKING_IMPERIAL_UNITS)) {
|
||||
imperial = sharedPreferences.getBoolean(pkey, false);
|
||||
|
||||
initKeyLables();
|
||||
initValues();
|
||||
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
private void initKeys(Set<String> sensors) {
|
||||
if(sensors != null && sensors.size() > 0) {
|
||||
keys = new int[sensors.size()];
|
||||
int i = 0;
|
||||
for(String sensor : sensors) {
|
||||
keys[i] = Integer.parseInt(sensor);
|
||||
i++;
|
||||
}
|
||||
} else {
|
||||
keys = new int[RideService.KEYS.length];
|
||||
for (int i = 0; i < RideService.KEYS.length; i++) {
|
||||
keys[i] = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void initKeyLables() {
|
||||
keyLabels = new String[keys.length];
|
||||
|
||||
if(!imperial) {
|
||||
for(int key : keys) {
|
||||
keyLabels[key] = RideService.KEYS[key].toString().toLowerCase();
|
||||
}
|
||||
} else {
|
||||
for(int key : keys) {
|
||||
switch (key) {
|
||||
case RideService.ALTITUDE:
|
||||
keyLabels[key] = "ft";
|
||||
break;
|
||||
|
||||
case RideService.KPH:
|
||||
keyLabels[key] = "mph";
|
||||
break;
|
||||
|
||||
case RideService.KM:
|
||||
keyLabels[key] = "m";
|
||||
break;
|
||||
|
||||
default:
|
||||
keyLabels[key] = RideService.KEYS[key].toString().toLowerCase();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void initValues() {
|
||||
values = new String[keys.length];
|
||||
for (int key : keys) {
|
||||
if(key == RideService.SECS) {
|
||||
values[key] = "00:00:00";
|
||||
} else {
|
||||
values[key] = "0.0";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private RelativeLayout newRelativeLayout(int key) {
|
||||
RelativeLayout view = new RelativeLayout(context);
|
||||
view.setBackgroundColor(Color.WHITE);
|
||||
|
||||
TextView valueView = newValueTv(key);
|
||||
TextView keyView = newKeyTv(key);
|
||||
|
||||
RelativeLayout.LayoutParams valueLayoutParams = new RelativeLayout.LayoutParams(
|
||||
RelativeLayout.LayoutParams.WRAP_CONTENT,
|
||||
RelativeLayout.LayoutParams.WRAP_CONTENT
|
||||
);
|
||||
|
||||
valueLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
|
||||
valueLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
|
||||
|
||||
view.addView(valueView, valueLayoutParams);
|
||||
|
||||
RelativeLayout.LayoutParams keyLayoutParams = new RelativeLayout.LayoutParams(
|
||||
RelativeLayout.LayoutParams.WRAP_CONTENT,
|
||||
RelativeLayout.LayoutParams.WRAP_CONTENT
|
||||
);
|
||||
|
||||
keyLayoutParams.addRule(RelativeLayout.BELOW, valueView.getId());
|
||||
keyLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
|
||||
keyLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
|
||||
|
||||
view.addView(keyView, keyLayoutParams);
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
|
||||
private TextView newValueTv(int key){
|
||||
TextView tv = new TextView(context);
|
||||
tv.setTextAppearance(context, android.R.attr.textAppearanceLarge);
|
||||
tv.setTypeface(Typeface.MONOSPACE, Typeface.BOLD);
|
||||
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
|
||||
tv.setText(values[key]);
|
||||
tv.setId(key + 1);
|
||||
return tv;
|
||||
}
|
||||
|
||||
|
||||
private TextView newKeyTv(int key){
|
||||
TextView tv = new TextView(context);
|
||||
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
|
||||
tv.setBackgroundColor(Color.LTGRAY);
|
||||
tv.setTypeface(Typeface.MONOSPACE, Typeface.BOLD);
|
||||
tv.setPadding(4, 1, 4, 1);
|
||||
tv.setText(keyLabels[key]);
|
||||
return tv;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return keys.length;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Object getItem(int position) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public long getItemId(int position) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
if (convertView == null) {
|
||||
return newRelativeLayout(keys[position]);
|
||||
} else {
|
||||
RelativeLayout view = (RelativeLayout) convertView;
|
||||
TextView valueView = (TextView) (view.getChildAt(0));
|
||||
TextView valueKey = (TextView) (view.getChildAt(1));
|
||||
|
||||
if(valueView.getText() != values[keys[position]])
|
||||
valueView.setText(values[keys[position]]);
|
||||
|
||||
valueView.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
|
||||
|
||||
if(valueKey.getText() != keyLabels[keys[position]])
|
||||
valueKey.setText(keyLabels[keys[position]]);
|
||||
|
||||
return convertView;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void update(float[] current_float_values) {
|
||||
for (int key: keys) {
|
||||
if(key == RideService.SECS) {
|
||||
int hr = (int) (current_float_values[key]/3600);
|
||||
int rem = (int) (current_float_values[key]%3600);
|
||||
int mn = rem/60;
|
||||
int sec = rem%60;
|
||||
|
||||
values[key] = (hr<10 ? "0" : "") + hr + ":" + (mn<10 ? "0" : "") + mn + ":" + (sec<10 ? "0" : "")+sec;
|
||||
} else if(!imperial) {
|
||||
values[key] = String.format("%.1f", current_float_values[key]);
|
||||
} else {
|
||||
switch (key) {
|
||||
case RideService.ALTITUDE:
|
||||
values[key] = String.format("%.1f", current_float_values[key] * 3.28084);
|
||||
break;
|
||||
|
||||
case RideService.KPH:
|
||||
values[key] = String.format("%.1f", current_float_values[key] * 0.621371);
|
||||
break;
|
||||
|
||||
case RideService.KM:
|
||||
values[key] = String.format("%.1f", current_float_values[key] * 0.621371);
|
||||
break;
|
||||
|
||||
default:
|
||||
values[key] = String.format("%.1f", current_float_values[key]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the size of the cell basted on 8 chars wide and the configured size param
|
||||
* @return int
|
||||
*/
|
||||
private void setupWidth() {
|
||||
TextView tv = new TextView(context);
|
||||
tv.setTextAppearance(context, android.R.attr.textAppearanceLarge);
|
||||
tv.setTypeface(Typeface.MONOSPACE, Typeface.BOLD);
|
||||
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
|
||||
tv.setText(String.format("%.1f", 1111.11));
|
||||
|
||||
Rect bounds = new Rect();
|
||||
tv.getPaint().getTextBounds("00:00:00", 0, "00:00:00".length(), bounds);
|
||||
|
||||
layout.setColumnWidth(bounds.width() + 16);
|
||||
}
|
||||
}
|
||||
28
contrib/RideLogger/src/com/ridelogger/GzipWriter.java
Normal file
@@ -0,0 +1,28 @@
|
||||
package com.ridelogger;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
|
||||
public class GzipWriter extends GZIPOutputStream {
|
||||
public GzipWriter(OutputStream os) throws IOException {
|
||||
super(os);
|
||||
}
|
||||
|
||||
public void write(String data) throws IOException {
|
||||
super.write(data.getBytes());
|
||||
}
|
||||
|
||||
public void write(float data) throws IOException {
|
||||
super.write(Float.floatToIntBits(data));
|
||||
}
|
||||
|
||||
public void write(CharSequence data) throws IOException {
|
||||
byte[] barr = new byte[data.length()];
|
||||
for (int i = 0; i < barr.length; i++) {
|
||||
barr[i] = (byte) data.charAt(i);
|
||||
}
|
||||
|
||||
super.write(barr);
|
||||
}
|
||||
}
|
||||
417
contrib/RideLogger/src/com/ridelogger/RideService.java
Normal file
@@ -0,0 +1,417 @@
|
||||
package com.ridelogger;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.Set;
|
||||
import java.util.TimeZone;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.DeviceType;
|
||||
import com.dsi.ant.plugins.utility.log.LogAnt;
|
||||
import com.ridelogger.formats.BaseFormat;
|
||||
import com.ridelogger.formats.JsonFormat;
|
||||
import com.ridelogger.listners.Base;
|
||||
import com.ridelogger.listners.Gps;
|
||||
import com.ridelogger.listners.HeartRate;
|
||||
import com.ridelogger.listners.Power;
|
||||
import com.ridelogger.listners.Sensors;
|
||||
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.app.Service;
|
||||
import android.app.TaskStackBuilder;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.os.Environment;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
import android.os.Message;
|
||||
import android.os.Messenger;
|
||||
import android.os.RemoteException;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.v4.app.NotificationCompat;
|
||||
import android.telephony.PhoneNumberUtils;
|
||||
import android.telephony.SmsManager;
|
||||
|
||||
|
||||
/**
|
||||
* RideService
|
||||
* @author Chet Henry
|
||||
* Performs ride logging from sensors as an android service
|
||||
*/
|
||||
public class RideService extends Service
|
||||
{
|
||||
public static final int notifyID = 1; //Id of the notification in the top android bar that this class creates and alters
|
||||
|
||||
public static final int SECS = 0;
|
||||
public static final int KPH = 1;
|
||||
public static final int ALTITUDE = 2;
|
||||
public static final int bearing = 3;
|
||||
public static final int gpsa = 4;
|
||||
public static final int LAT = 5;
|
||||
public static final int LON = 6;
|
||||
public static final int HR = 7;
|
||||
public static final int WATTS = 8;
|
||||
public static final int NM = 9;
|
||||
public static final int CAD = 10;
|
||||
public static final int KM = 11;
|
||||
public static final int LTE = 12;
|
||||
public static final int RTE = 13;
|
||||
public static final int SNPLC = 14;
|
||||
public static final int SNPR = 15;
|
||||
public static final int ms2x = 16;
|
||||
public static final int ms2y = 17;
|
||||
public static final int ms2z = 18;
|
||||
public static final int temp = 19;
|
||||
public static final int uTx = 20;
|
||||
public static final int uTy = 21;
|
||||
public static final int uTz = 22;
|
||||
public static final int press = 23;
|
||||
public static final int lux = 24;
|
||||
|
||||
public static CharSequence[] KEYS = {
|
||||
"SECS",
|
||||
"KPH",
|
||||
"ALTITUDE",
|
||||
"bearing",
|
||||
"gpsa",
|
||||
"LAT",
|
||||
"LON",
|
||||
"HR",
|
||||
"WATTS",
|
||||
"NM",
|
||||
"CAD",
|
||||
"KM",
|
||||
"LTE",
|
||||
"RTE",
|
||||
"SNPLC",
|
||||
"SNPR",
|
||||
"ms2x",
|
||||
"ms2y",
|
||||
"ms2z",
|
||||
"temp",
|
||||
"uTx",
|
||||
"uTy",
|
||||
"uTz",
|
||||
"press",
|
||||
"lux"
|
||||
};
|
||||
|
||||
public GzipWriter buf; //writes to log file buffered
|
||||
public long startTime; //start time of the ride
|
||||
public float[] currentValues = new float[RideService.KEYS.length]; //float array of current values
|
||||
private Messenger mMessenger = null; //class to send back current values if needed
|
||||
private boolean rideStarted = false; //have we started logging the ride
|
||||
private int sensor_index = 0; //current index of sensors
|
||||
private String emergencyNumbuer; //the number to send the messages to
|
||||
private Timer timer; //timer class to control the periodic messages
|
||||
private Timer timerUI; //timer class to control the periodic messages
|
||||
private Base<?>[] sensors; //list of sensors tracking
|
||||
public BaseFormat<?> fileFormat;
|
||||
|
||||
|
||||
/**
|
||||
* starts the ride on service start
|
||||
*/
|
||||
@Override
|
||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||
startRide();
|
||||
return Service.START_NOT_STICKY;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* returns the messenger to talk to the app with
|
||||
*/
|
||||
@Override
|
||||
public IBinder onBind(Intent arg0) {
|
||||
mMessenger = new Messenger(new Handler() { // Handler of incoming messages from clients.
|
||||
Messenger replyTo;
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
if(timerUI != null) {
|
||||
timerUI.cancel();
|
||||
timerUI = null;
|
||||
}
|
||||
|
||||
timerUI = new Timer();
|
||||
|
||||
if(msg.replyTo != null) {
|
||||
replyTo = msg.replyTo;
|
||||
timerUI.scheduleAtFixedRate(
|
||||
new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
Message msg = Message.obtain(null, 2, 0, 0);
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putSerializable("currentValues", currentValues);
|
||||
msg.setData(bundle);
|
||||
try {
|
||||
replyTo.send(msg);
|
||||
} catch (RemoteException e) {}
|
||||
}
|
||||
},
|
||||
1000,
|
||||
1000
|
||||
); //every second update the screen
|
||||
}
|
||||
}
|
||||
}); // Target we publish for clients to send messages to IncomingHandler.
|
||||
|
||||
return mMessenger.getBinder();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* releases the timer that sends messages to the app
|
||||
*/
|
||||
@Override
|
||||
public boolean onUnbind (Intent intent) {
|
||||
if(timerUI != null) {
|
||||
timerUI.cancel();
|
||||
timerUI = null;
|
||||
}
|
||||
|
||||
mMessenger = null;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* stop the ride on service stop
|
||||
*/
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
stopRide();
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
/**
|
||||
* start a ride if there is not one started yet
|
||||
*/
|
||||
protected void startRide() {
|
||||
if(rideStarted) return;
|
||||
|
||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
emergencyNumbuer = settings.getString(getString(R.string.PREF_EMERGENCY_NUMBER), "");
|
||||
currentValues[SECS] = (float) 0.0;
|
||||
|
||||
startTime = System.currentTimeMillis();
|
||||
|
||||
|
||||
Date startDate = new Date(startTime);
|
||||
|
||||
SimpleDateFormat startTimef = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
|
||||
SimpleDateFormat filef = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
|
||||
SimpleDateFormat month = new SimpleDateFormat("MMMMM");
|
||||
SimpleDateFormat year = new SimpleDateFormat("yyyy");
|
||||
SimpleDateFormat day = new SimpleDateFormat("EEEEE");
|
||||
|
||||
startTimef.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
filef.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
month.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
year.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
day.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
|
||||
final String fileName = filef.format(startDate) + ".json.gz";
|
||||
|
||||
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
|
||||
fileFormat = new JsonFormat(this);
|
||||
fileFormat.createFile();
|
||||
fileFormat.writeHeader();
|
||||
|
||||
LogAnt.setDebugLevel(LogAnt.DebugLevel.NONE, this);
|
||||
|
||||
final Set<String> pairedAnts = settings.getStringSet(getString(R.string.PREF_PAIRED_ANTS), null);
|
||||
|
||||
if(pairedAnts != null && !pairedAnts.isEmpty()){
|
||||
sensors = new Base<?>[pairedAnts.size() + 2];
|
||||
for(String deviceNumber: pairedAnts) {
|
||||
DeviceType deviceType = DeviceType.getValueFromInt(settings.getInt(deviceNumber, 0));
|
||||
switch (deviceType) {
|
||||
case BIKE_CADENCE:
|
||||
break;
|
||||
case BIKE_POWER:
|
||||
sensors[sensor_index++] = new Power(Integer.valueOf(deviceNumber), this);
|
||||
break;
|
||||
case BIKE_SPD:
|
||||
break;
|
||||
case BIKE_SPDCAD:
|
||||
break;
|
||||
case BLOOD_PRESSURE:
|
||||
break;
|
||||
case ENVIRONMENT:
|
||||
break;
|
||||
case WEIGHT_SCALE:
|
||||
break;
|
||||
case HEARTRATE:
|
||||
sensors[sensor_index++] = new HeartRate(Integer.valueOf(deviceNumber), this);
|
||||
break;
|
||||
case STRIDE_SDM:
|
||||
break;
|
||||
case FITNESS_EQUIPMENT:
|
||||
break;
|
||||
case GEOCACHE:
|
||||
case CONTROLLABLE_DEVICE:
|
||||
break;
|
||||
case UNKNOWN:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
sensors = new Base<?>[4];
|
||||
sensors[sensor_index++] = new HeartRate(0, this);
|
||||
sensors[sensor_index++] = new Power(0, this);
|
||||
}
|
||||
|
||||
sensors[sensor_index++] = new Gps(this);
|
||||
sensors[sensor_index++] = new Sensors(this);
|
||||
}
|
||||
rideStarted = true;
|
||||
|
||||
if(settings.getBoolean(getString(R.string.PREF_PHONE_HOME), false)) {
|
||||
timer = new Timer();
|
||||
int period = Integer.parseInt(settings.getString(getString(R.string.PREF_PHONE_HOME_PERIOD), "10"));
|
||||
|
||||
timer.scheduleAtFixedRate(
|
||||
new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
phoneHome();
|
||||
}
|
||||
},
|
||||
60000 * period,
|
||||
60000 * period
|
||||
); //every ten min let them know where you are at
|
||||
phoneStart();
|
||||
}
|
||||
|
||||
//build the notification in the top android drawer
|
||||
NotificationCompat.Builder mBuilder = new NotificationCompat
|
||||
.Builder(this)
|
||||
.setSmallIcon(R.drawable.ic_launcher)
|
||||
.setContentTitle(getString(R.string.ride_on))
|
||||
.setContentText(getString(R.string.building_ride) + " " + fileName + " " + getString(R.string.click_to_stop))
|
||||
.setProgress(0, 0, true)
|
||||
.setContentIntent(
|
||||
TaskStackBuilder
|
||||
.create(this)
|
||||
.addParentStack(StartActivity.class)
|
||||
.addNextIntent(new Intent(this, StartActivity.class))
|
||||
.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)
|
||||
);
|
||||
|
||||
startForeground(notifyID, mBuilder.build());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* let a love one know where you are at about every 10 min
|
||||
*/
|
||||
public void phoneCrash(double mag) {
|
||||
smsHome(
|
||||
getString(R.string.crash_warning) + "\n" + getLocationLink()
|
||||
+ "\n " + getString(R.string.crash_magnitude) + ": " + String.valueOf(mag)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* confirm the crash if we are not moving
|
||||
*/
|
||||
public void phoneCrashConfirm() {
|
||||
smsHome(getString(R.string.crash_confirm) + "!\n" + getLocationLink());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* let them know we are starting
|
||||
*/
|
||||
public void phoneStart() {
|
||||
smsWithLocation(getString(R.string.ride_start_sms));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* let them know we are stopping
|
||||
*/
|
||||
public void phoneStop() {
|
||||
smsWithLocation(getString(R.string.ride_stop_sms));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* send an sms with location
|
||||
*/
|
||||
public void smsWithLocation(String body) {
|
||||
smsHome(body + "\n " + getLocationLink());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* let a love one know where you are at about every 10 min
|
||||
*/
|
||||
public void phoneHome() {
|
||||
smsWithLocation(getString(R.string.riding_ok_sms));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* send a sms message
|
||||
*/
|
||||
public void smsHome(String body) {
|
||||
SmsManager smsManager = SmsManager.getDefault();
|
||||
if(emergencyNumbuer != null && PhoneNumberUtils.isWellFormedSmsAddress(emergencyNumbuer)) {
|
||||
smsManager.sendTextMessage(emergencyNumbuer, null, body, null, null);
|
||||
}
|
||||
}
|
||||
|
||||
public String getLocationLink() {
|
||||
if(currentValues[LAT] != 0.0 || currentValues[LON] != 0.0) {
|
||||
return "https://www.google.com/maps/place/" + currentValues[LAT] + "," + currentValues[LON];
|
||||
}
|
||||
return getString(R.string.crash_unknow_location);
|
||||
}
|
||||
|
||||
|
||||
//stop the ride and clean up resources
|
||||
protected void stopRide() {
|
||||
if(!rideStarted) return;
|
||||
|
||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
if(settings.getBoolean(getString(R.string.PREF_PHONE_HOME), false)) {
|
||||
phoneStop();
|
||||
}
|
||||
|
||||
for(Base<?> sensor: sensors) {
|
||||
if(sensor != null) {
|
||||
sensor.onDestroy();
|
||||
}
|
||||
}
|
||||
|
||||
//stop the phoneHome timer if we need to.
|
||||
if(timer != null) {
|
||||
timer.cancel();
|
||||
timer = null;
|
||||
}
|
||||
|
||||
if(timerUI != null) {
|
||||
timerUI.cancel();
|
||||
timerUI = null;
|
||||
}
|
||||
|
||||
fileFormat.writeFooter();
|
||||
|
||||
rideStarted = false;
|
||||
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
mNotificationManager.cancel(notifyID);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
274
contrib/RideLogger/src/com/ridelogger/SettingsActivity.java
Normal file
@@ -0,0 +1,274 @@
|
||||
package com.ridelogger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.DeviceType;
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.RequestAccessResult;
|
||||
import com.dsi.ant.plugins.antplus.pccbase.MultiDeviceSearch;
|
||||
import com.dsi.ant.plugins.antplus.pccbase.MultiDeviceSearch.MultiDeviceSearchResult;
|
||||
import com.dsi.ant.plugins.utility.log.LogAnt;
|
||||
|
||||
import android.app.ActivityManager;
|
||||
import android.app.ActivityManager.RunningServiceInfo;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.SharedPreferences.Editor;
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.preference.MultiSelectListPreference;
|
||||
import android.preference.Preference;
|
||||
import android.preference.PreferenceActivity;
|
||||
import android.preference.PreferenceFragment;
|
||||
import android.preference.PreferenceManager;
|
||||
|
||||
public class SettingsActivity extends PreferenceActivity {
|
||||
|
||||
static ArrayList<MultiDeviceSearchResult> foundDevices = new ArrayList<MultiDeviceSearchResult>();
|
||||
|
||||
/**
|
||||
* This fragment contains a second-level set of preference that you
|
||||
* can get to by tapping an item in the first preferences fragment.
|
||||
*/
|
||||
public static class GeneralFragment extends PreferenceFragment {
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
// Load the preferences from an XML resource
|
||||
addPreferencesFromResource(R.xml.general_settings);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
// TODO Auto-generated method stub
|
||||
super.onResume();
|
||||
|
||||
if(((SettingsActivity) getActivity()).getServiceRunning(RideService.class) != null) {
|
||||
Preference pref = findPreference(getString(R.string.PREF_RIDER_NAME));
|
||||
pref.setEnabled(false);
|
||||
|
||||
pref = findPreference(getString(R.string.PREF_EMERGENCY_NUMBER));
|
||||
pref.setEnabled(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This fragment contains a second-level set of preference that you
|
||||
* can get to by tapping an item in the first preferences fragment.
|
||||
*/
|
||||
public static class SensorsFragment extends PreferenceFragment {
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
addPreferencesFromResource(R.xml.sensors_settings);
|
||||
MultiSelectListPreference mMultiSelectListPreference = (MultiSelectListPreference) findPreference(getString(R.string.PREF_TRACKING_SENSORS));
|
||||
mMultiSelectListPreference.setEntries( RideService.KEYS );
|
||||
|
||||
CharSequence[] keys = new CharSequence[RideService.KEYS.length];
|
||||
|
||||
for (int i = 0; i < RideService.KEYS.length; i++) {
|
||||
keys[i] = String.valueOf(i);
|
||||
}
|
||||
mMultiSelectListPreference.setEntryValues(keys);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isValidFragment(String fragment) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This fragment contains a second-level set of preference that you
|
||||
* can get to by tapping an item in the first preferences fragment.
|
||||
*/
|
||||
public static class AntFragment extends PreferenceFragment {
|
||||
private MultiDeviceSearch mSearch;
|
||||
private MultiSelectListPreference mMultiSelectListPreference;
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
// TODO Auto-generated method stub
|
||||
super.onConfigurationChanged(newConfig);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
addPreferencesFromResource(R.xml.ant_settings);
|
||||
mMultiSelectListPreference = (MultiSelectListPreference) findPreference(getString(R.string.PREF_PAIRED_ANTS));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
// TODO Auto-generated method stub
|
||||
super.onResume();
|
||||
initAntSearch();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* search for ant+ if we are not recording
|
||||
*/
|
||||
public void initAntSearch() {
|
||||
mMultiSelectListPreference.setEnabled(false);
|
||||
if(((SettingsActivity) getActivity()).getServiceRunning(RideService.class) == null) {
|
||||
mMultiSelectListPreference.setSummary(R.string.searching_for_ants);
|
||||
|
||||
setupAnt();
|
||||
|
||||
Timer timer = new Timer();
|
||||
final Handler handler = new Handler();
|
||||
|
||||
timer.schedule(
|
||||
new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
if(mMultiSelectListPreference.getEntryValues().length > 0) {
|
||||
handler.post(new Runnable() {
|
||||
public void run() {
|
||||
mMultiSelectListPreference.setEnabled(true);
|
||||
mMultiSelectListPreference.setSummary(R.string.found_ants);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
handler.post(new Runnable() {
|
||||
public void run() {
|
||||
mMultiSelectListPreference.setEnabled(true);
|
||||
mMultiSelectListPreference.setSummary(R.string.no_found_ants);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
5000
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* try to pair some ant+ devices
|
||||
*/
|
||||
protected void setupAnt() {
|
||||
MultiDeviceSearch.SearchCallbacks mCallback;
|
||||
MultiDeviceSearch.RssiCallback mRssiCallback;
|
||||
|
||||
updateList(foundDevices);
|
||||
|
||||
LogAnt.setDebugLevel(LogAnt.DebugLevel.NONE, this.getActivity());
|
||||
|
||||
mCallback = new MultiDeviceSearch.SearchCallbacks(){
|
||||
public void onDeviceFound(final MultiDeviceSearchResult deviceFound)
|
||||
{
|
||||
if(!foundDevices.contains(deviceFound)) {
|
||||
foundDevices.add(deviceFound);
|
||||
updateList(foundDevices);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSearchStopped(RequestAccessResult arg0) {}
|
||||
};
|
||||
|
||||
mRssiCallback = new MultiDeviceSearch.RssiCallback() {
|
||||
@Override
|
||||
public void onRssiUpdate(final int resultId, final int rssi){}
|
||||
};
|
||||
|
||||
// start the multi-device search
|
||||
mSearch = new MultiDeviceSearch(this.getActivity(), EnumSet.allOf(DeviceType.class), mCallback, mRssiCallback);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* dialog of soon to be paired ant devices
|
||||
* @param foundDevices
|
||||
*/
|
||||
protected void updateList(final ArrayList<MultiDeviceSearchResult> foundDevices) {
|
||||
ArrayList<CharSequence> foundDevicesString = new ArrayList<CharSequence>();
|
||||
ArrayList<CharSequence> foundDevicesValues = new ArrayList<CharSequence>();
|
||||
|
||||
for(MultiDeviceSearchResult device : foundDevices) {
|
||||
foundDevicesString.add(device.getAntDeviceType() + ": " + String.valueOf(device.getAntDeviceNumber()));
|
||||
}
|
||||
|
||||
for(MultiDeviceSearchResult device : foundDevices) {
|
||||
foundDevicesValues.add(String.valueOf(device.getAntDeviceNumber()));
|
||||
}
|
||||
|
||||
if(mMultiSelectListPreference != null) {
|
||||
mMultiSelectListPreference.setEntries(
|
||||
foundDevicesString.toArray(new CharSequence[foundDevicesString.size()])
|
||||
);
|
||||
mMultiSelectListPreference.setEntryValues(
|
||||
foundDevicesValues.toArray(new CharSequence[foundDevicesValues.size()])
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
if(mSearch != null) mSearch.close();
|
||||
super.onDestroy();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Populate the activity with the top-level headers.
|
||||
*/
|
||||
@Override
|
||||
public void onBuildHeaders(List<Header> target) {
|
||||
loadHeadersFromResource(R.layout.settings, target);
|
||||
|
||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
settings.registerOnSharedPreferenceChangeListener(
|
||||
new SharedPreferences.OnSharedPreferenceChangeListener() {
|
||||
@Override
|
||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String pkey) {
|
||||
if (pkey == getString(R.string.PREF_PAIRED_ANTS)) {
|
||||
Set<String> sensors = sharedPreferences.getStringSet(pkey, null);
|
||||
if(sensors != null && sensors.size() > 0) {
|
||||
Editor editor = sharedPreferences.edit();
|
||||
for(MultiDeviceSearchResult result : foundDevices) {
|
||||
sensors.contains(String.valueOf(result.getAntDeviceNumber()));
|
||||
editor.putInt(String.valueOf(result.getAntDeviceNumber()), result.getAntDeviceType().getIntValue());
|
||||
}
|
||||
editor.commit();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* is a service running or not
|
||||
* @param serviceClass
|
||||
* @return
|
||||
*/
|
||||
public RunningServiceInfo getServiceRunning(Class<?> serviceClass) {
|
||||
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
|
||||
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
|
||||
if (serviceClass.getName().equals(service.service.getClassName())) {
|
||||
return service;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
215
contrib/RideLogger/src/com/ridelogger/StartActivity.java
Normal file
@@ -0,0 +1,215 @@
|
||||
package com.ridelogger;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.ActivityManager.RunningServiceInfo;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.ServiceConnection;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
import android.os.Message;
|
||||
import android.os.Messenger;
|
||||
import android.os.RemoteException;
|
||||
import android.support.v4.app.FragmentActivity;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.widget.GridView;
|
||||
import android.widget.Toast;
|
||||
|
||||
public class StartActivity extends FragmentActivity
|
||||
{
|
||||
private MenuItem startMenu;
|
||||
private MenuItem stopMenu;
|
||||
|
||||
private ServiceConnection mConnection;
|
||||
static CurrentValuesAdapter currentValuesAdapter;
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
// Inflate the menu items for use in the action bar
|
||||
MenuInflater inflater = getMenuInflater();
|
||||
inflater.inflate(R.menu.start_activity, menu);
|
||||
return super.onCreateOptionsMenu(menu);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
// Handle presses on the action bar items
|
||||
if(item.getItemId() == R.id.Settings) {
|
||||
setupSettings();
|
||||
} else if(item.getItemId() == R.id.Start) {
|
||||
startRide();
|
||||
} else {
|
||||
stopRide();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* start up our class
|
||||
*/
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_dashboard);
|
||||
|
||||
GridView layout = (GridView) findViewById(R.id.LayoutData);
|
||||
currentValuesAdapter = new CurrentValuesAdapter(this, layout);
|
||||
layout.setAdapter(currentValuesAdapter);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
bindToService();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
unBindToService();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
unBindToService();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* setup the settings for the user
|
||||
*/
|
||||
private void setupSettings() {
|
||||
Intent intent = new Intent(this, SettingsActivity.class);
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* stop ride and clean up references
|
||||
*/
|
||||
private void stopRide() {
|
||||
Toast toast = Toast.makeText(getApplicationContext(), getString(R.string.stopping_ride), Toast.LENGTH_LONG);
|
||||
toast.show();
|
||||
|
||||
Intent rsi = new Intent(this, RideService.class);
|
||||
this.stopService(rsi);
|
||||
finish();
|
||||
}
|
||||
|
||||
static final Handler mHandler = new Handler(){
|
||||
@Override
|
||||
public void handleMessage(Message msg_internal) {
|
||||
updateValues(msg_internal.getData());
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* tell the service to start sending us messages with current values
|
||||
*/
|
||||
private void bindToService() {
|
||||
RunningServiceInfo service = getServiceRunning(RideService.class);
|
||||
|
||||
if(service != null) {
|
||||
mConnection = new ServiceConnection() {
|
||||
public void onServiceConnected(ComponentName className, IBinder service) {
|
||||
Messenger mService = new Messenger(service);
|
||||
try {
|
||||
Message msg = Message.obtain();
|
||||
msg.replyTo = new Messenger(mHandler);
|
||||
|
||||
mService.send(msg);
|
||||
} catch (RemoteException e) {
|
||||
// In this case the service has crashed before we could even do anything with it
|
||||
}
|
||||
}
|
||||
|
||||
public void onServiceDisconnected(ComponentName className) {}
|
||||
};
|
||||
|
||||
bindService(new Intent(StartActivity.this, RideService.class), mConnection, Context.BIND_AUTO_CREATE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* tell the service to stop sending us messages with current values
|
||||
*/
|
||||
private void unBindToService() {
|
||||
if (mConnection != null) {
|
||||
// Detach our existing connection.
|
||||
unbindService(mConnection);
|
||||
mConnection = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* update the text fields with current values
|
||||
* @param bundle
|
||||
*/
|
||||
private static void updateValues(Bundle bundle) {
|
||||
currentValuesAdapter.update((float[]) bundle.getSerializable("currentValues"));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onPrepareOptionsMenu(Menu menu) {
|
||||
super.onPrepareOptionsMenu(menu);
|
||||
|
||||
RunningServiceInfo service = getServiceRunning(RideService.class);
|
||||
startMenu = menu.findItem(R.id.Start);
|
||||
stopMenu = menu.findItem(R.id.Stop);
|
||||
if(service == null) {
|
||||
startMenu.setVisible(true);
|
||||
stopMenu.setVisible(false);
|
||||
} else {
|
||||
startMenu.setVisible(false);
|
||||
stopMenu.setVisible(true);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* start the ride and notify the user of success
|
||||
*/
|
||||
private void startRide() {
|
||||
Intent rsi = new Intent(this, RideService.class);
|
||||
this.startService(rsi);
|
||||
|
||||
startMenu.setVisible(false);
|
||||
stopMenu.setVisible(true);
|
||||
|
||||
bindToService();
|
||||
|
||||
Toast toast = Toast.makeText(getApplicationContext(), getString(R.string.starting_ride), Toast.LENGTH_LONG);
|
||||
toast.show();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* is a service running or not
|
||||
* @param serviceClass
|
||||
* @return
|
||||
*/
|
||||
private RunningServiceInfo getServiceRunning(Class<?> serviceClass) {
|
||||
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
|
||||
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
|
||||
if (serviceClass.getName().equals(service.service.getClassName())) {
|
||||
return service;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
package com.ridelogger.formats;
|
||||
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
import android.os.Environment;
|
||||
|
||||
import com.ridelogger.GzipWriter;
|
||||
import com.ridelogger.RideService;
|
||||
|
||||
|
||||
public class BaseFormat<T> {
|
||||
protected GzipWriter buf;
|
||||
protected RideService context;
|
||||
protected String subExt = "";
|
||||
|
||||
public BaseFormat(RideService rideService) {
|
||||
context = rideService;
|
||||
}
|
||||
|
||||
|
||||
public void createFile() {
|
||||
File dir = new File(
|
||||
Environment.getExternalStorageDirectory(),
|
||||
"Rides"
|
||||
);
|
||||
|
||||
dir.mkdirs();
|
||||
|
||||
Date startDate = new Date(context.startTime);
|
||||
SimpleDateFormat filef = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
|
||||
String fileName = filef.format(startDate) + subExt + ".gz";
|
||||
|
||||
try {
|
||||
buf = new GzipWriter(new BufferedOutputStream(new FileOutputStream(new File(dir, fileName))));
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
|
||||
|
||||
public void writeHeader(){
|
||||
try {
|
||||
synchronized (buf) {
|
||||
for(CharSequence key : RideService.KEYS) {
|
||||
buf.write(key);
|
||||
buf.write(",");
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
|
||||
|
||||
public void writeValues() {
|
||||
try {
|
||||
synchronized (buf) {
|
||||
for(float value : context.currentValues) {
|
||||
buf.write(value);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
|
||||
|
||||
public void writeFooter() {
|
||||
try {
|
||||
buf.close();
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
package com.ridelogger.formats;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import com.ridelogger.R;
|
||||
import com.ridelogger.RideService;
|
||||
|
||||
import android.content.SharedPreferences;
|
||||
import android.preference.PreferenceManager;
|
||||
|
||||
public class JsonFormat extends BaseFormat<Object> {
|
||||
public JsonFormat(RideService rideService) {
|
||||
super(rideService);
|
||||
subExt = ".json";
|
||||
}
|
||||
|
||||
public void writeHeader() {
|
||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
Date startDate = new Date(context.startTime);
|
||||
|
||||
SimpleDateFormat startTimef = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
|
||||
SimpleDateFormat filef = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
|
||||
SimpleDateFormat month = new SimpleDateFormat("MMMMM");
|
||||
SimpleDateFormat year = new SimpleDateFormat("yyyy");
|
||||
SimpleDateFormat day = new SimpleDateFormat("EEEEE");
|
||||
|
||||
startTimef.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
filef.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
month.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
year.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
day.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
|
||||
try {
|
||||
buf.write("{" +
|
||||
"\"RIDE\":{" +
|
||||
"\"STARTTIME\":\"" + startTimef.format(startDate) + " UTC\"," +
|
||||
"\"RECINTSECS\":1," +
|
||||
"\"DEVICETYPE\":\"Android\"," +
|
||||
"\"IDENTIFIER\":\"\"," +
|
||||
"\"TAGS\":{" +
|
||||
"\"Athlete\":\"" + settings.getString(context.getString(R.string.PREF_RIDER_NAME), "") + "\"," +
|
||||
"\"Calendar Text\":\"Auto Recored Android Ride\"," +
|
||||
"\"Change History\":\"\"," +
|
||||
"\"Data\":\"\"," +
|
||||
"\"Device\":\"\"," +
|
||||
"\"Device Info\":\"\"," +
|
||||
"\"File Format\":\"\"," +
|
||||
"\"Filename\":\"\"," +
|
||||
"\"Month\":\"" + month.format(startDate) +"\"," +
|
||||
"\"Notes\":\"\"," +
|
||||
"\"Objective\":\"\"," +
|
||||
"\"Sport\":\"Bike\"," +
|
||||
"\"Weekday\":\"" + day.format(startDate) + "\"," +
|
||||
"\"Workout Code\":\"\"," +
|
||||
"\"Year\":\"" + year.format(startDate) + "\"" +
|
||||
"}," +
|
||||
"\"SAMPLES\":[{\"SECS\":0}");
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
|
||||
|
||||
public void writeValues() {
|
||||
try {
|
||||
synchronized (buf) {
|
||||
buf.write(",{");
|
||||
buf.write("\"");
|
||||
buf.write(RideService.KEYS[0]);
|
||||
buf.write("\":");
|
||||
buf.write(String.format("%f", context.currentValues[0]));
|
||||
|
||||
for (int i = 1; i < context.currentValues.length; i++) {
|
||||
buf.write(",\"");
|
||||
buf.write(RideService.KEYS[i]);
|
||||
buf.write("\":");
|
||||
buf.write(String.format("%f", context.currentValues[i]));
|
||||
}
|
||||
|
||||
buf.write("}");
|
||||
}
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
|
||||
|
||||
public void writeFooter() {
|
||||
try {
|
||||
buf.write("]}}");
|
||||
|
||||
} catch (Exception e) {}
|
||||
super.writeFooter();
|
||||
}
|
||||
}
|
||||
54
contrib/RideLogger/src/com/ridelogger/listners/Ant.java
Normal file
@@ -0,0 +1,54 @@
|
||||
package com.ridelogger.listners;
|
||||
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.DeviceState;
|
||||
import com.dsi.ant.plugins.antplus.pccbase.PccReleaseHandle;
|
||||
import com.dsi.ant.plugins.antplus.pccbase.AntPluginPcc.IDeviceStateChangeReceiver;
|
||||
import com.dsi.ant.plugins.antplus.pccbase.AntPluginPcc.IPluginAccessResultReceiver;
|
||||
import com.ridelogger.RideService;
|
||||
|
||||
|
||||
/**
|
||||
* Ant
|
||||
* @author Chet Henry
|
||||
* Listen to and log Ant+ events base class
|
||||
*/
|
||||
public abstract class Ant extends Base<Object>
|
||||
{
|
||||
protected PccReleaseHandle<?> releaseHandle; //Handle class
|
||||
public IPluginAccessResultReceiver<?> mResultReceiver; //Receiver class
|
||||
protected int deviceNumber = 0;
|
||||
|
||||
|
||||
//setup listeners and logging
|
||||
public Ant(int pDeviceNumber, RideService mContext)
|
||||
{
|
||||
super(mContext);
|
||||
deviceNumber = pDeviceNumber;
|
||||
}
|
||||
|
||||
|
||||
public IDeviceStateChangeReceiver mDeviceStateChangeReceiver = new IDeviceStateChangeReceiver()
|
||||
{
|
||||
@Override
|
||||
public void onDeviceStateChange(final DeviceState newDeviceState){
|
||||
//if we lose a device zero out its values
|
||||
if(newDeviceState.equals(DeviceState.DEAD)) {
|
||||
zeroReadings();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
abstract protected void requestAccess();
|
||||
|
||||
|
||||
@Override
|
||||
public void onDestroy()
|
||||
{
|
||||
if(releaseHandle != null) {
|
||||
releaseHandle.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
58
contrib/RideLogger/src/com/ridelogger/listners/Base.java
Normal file
@@ -0,0 +1,58 @@
|
||||
package com.ridelogger.listners;
|
||||
|
||||
import com.ridelogger.RideService;
|
||||
|
||||
/**
|
||||
* Base
|
||||
* @author Chet Henry
|
||||
* Base sensor class that has methods to time stamp are write to buffer
|
||||
*/
|
||||
public class Base<T>
|
||||
{
|
||||
public RideService context;
|
||||
|
||||
public Base(RideService mContext) {
|
||||
context = mContext;
|
||||
}
|
||||
|
||||
|
||||
public void alterCurrentData(int key, float value)
|
||||
{
|
||||
synchronized (context.currentValues) {
|
||||
context.currentValues[RideService.SECS] = getTs();
|
||||
context.currentValues[key] = value;
|
||||
context.fileFormat.writeValues();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void alterCurrentData(int[] keys, float[] values)
|
||||
{
|
||||
synchronized (context.currentValues) {
|
||||
context.currentValues[RideService.SECS] = getTs();
|
||||
|
||||
int i = 0;
|
||||
for (int key : keys) {
|
||||
context.currentValues[key] = values[i];
|
||||
i++;
|
||||
}
|
||||
|
||||
context.fileFormat.writeValues();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//get current time stamp
|
||||
public float getTs() {
|
||||
return (float) ((System.currentTimeMillis() - context.startTime) / 1000.0);
|
||||
}
|
||||
|
||||
|
||||
//Clean up my listeners here
|
||||
public void onDestroy() {}
|
||||
|
||||
//zero any of my values
|
||||
public void zeroReadings() {}
|
||||
}
|
||||
|
||||
|
||||
61
contrib/RideLogger/src/com/ridelogger/listners/Gps.java
Normal file
@@ -0,0 +1,61 @@
|
||||
package com.ridelogger.listners;
|
||||
|
||||
import com.ridelogger.RideService;
|
||||
|
||||
import android.content.Context;
|
||||
import android.location.Location;
|
||||
import android.location.LocationListener;
|
||||
import android.location.LocationManager;
|
||||
|
||||
import android.os.Bundle;
|
||||
|
||||
/**
|
||||
* Gps
|
||||
* @author henry
|
||||
* Listen and log gps events
|
||||
*/
|
||||
public class Gps extends Base<Gps>
|
||||
{
|
||||
public Gps(RideService mContext)
|
||||
{
|
||||
super(mContext);
|
||||
|
||||
LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
|
||||
|
||||
//listen to gps events and log them
|
||||
LocationListener locationListener = new LocationListener() {
|
||||
public void onLocationChanged(Location location) {
|
||||
int[] keys = {
|
||||
RideService.ALTITUDE,
|
||||
RideService.KPH,
|
||||
RideService.bearing,
|
||||
RideService.gpsa,
|
||||
RideService.LAT,
|
||||
RideService.LON
|
||||
};
|
||||
|
||||
float[] values = {
|
||||
(float) location.getAltitude(),
|
||||
location.getSpeed(),
|
||||
location.getBearing(),
|
||||
location.getAccuracy(),
|
||||
(float) location.getLatitude(),
|
||||
(float) location.getLongitude()
|
||||
};
|
||||
|
||||
alterCurrentData(keys, values);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStatusChanged(String provider, int status, Bundle extras) {}
|
||||
|
||||
@Override
|
||||
public void onProviderEnabled(String provider) {}
|
||||
|
||||
@Override
|
||||
public void onProviderDisabled(String provider) {}
|
||||
};
|
||||
|
||||
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
package com.ridelogger.listners;
|
||||
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusHeartRatePcc;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusHeartRatePcc.DataState;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusHeartRatePcc.IHeartRateDataReceiver;
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.DeviceState;
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.EventFlag;
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.RequestAccessResult;
|
||||
import com.dsi.ant.plugins.antplus.pccbase.AntPluginPcc.IPluginAccessResultReceiver;
|
||||
import com.ridelogger.RideService;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.EnumSet;
|
||||
|
||||
/**
|
||||
* HeartRate
|
||||
* @author Chet Henry
|
||||
* Listen to and log Ant+ HearRate events
|
||||
*/
|
||||
public class HeartRate extends Ant
|
||||
{
|
||||
public IPluginAccessResultReceiver<AntPlusHeartRatePcc> mResultReceiver;
|
||||
|
||||
public HeartRate(int pDeviceNumber, RideService mContext) {
|
||||
super(pDeviceNumber, mContext);
|
||||
|
||||
mResultReceiver = new IPluginAccessResultReceiver<AntPlusHeartRatePcc>() {
|
||||
//Handle the result, connecting to events on success or reporting failure to user.
|
||||
@Override
|
||||
public void onResultReceived(AntPlusHeartRatePcc result, RequestAccessResult resultCode, DeviceState initialDeviceState)
|
||||
{
|
||||
if(resultCode == com.dsi.ant.plugins.antplus.pcc.defines.RequestAccessResult.SUCCESS) {
|
||||
deviceNumber = result.getAntDeviceNumber();
|
||||
result.subscribeHeartRateDataEvent(
|
||||
new IHeartRateDataReceiver() {
|
||||
@Override
|
||||
public void onNewHeartRateData(final long estTimestamp, EnumSet<EventFlag> eventFlags, final int computedHeartRate, final long heartBeatCount, final BigDecimal heartBeatEventTime, final DataState dataState) {
|
||||
alterCurrentData(RideService.HR, (float) computedHeartRate);
|
||||
}
|
||||
}
|
||||
);
|
||||
} else if(resultCode == com.dsi.ant.plugins.antplus.pcc.defines.RequestAccessResult.SEARCH_TIMEOUT) {
|
||||
if(deviceNumber != 0) {
|
||||
requestAccess();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
requestAccess();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
protected void requestAccess() {
|
||||
releaseHandle = AntPlusHeartRatePcc.requestAccess(context, deviceNumber, 0, mResultReceiver, mDeviceStateChangeReceiver);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void zeroReadings()
|
||||
{
|
||||
alterCurrentData(RideService.HR, (float) 0.0);
|
||||
}
|
||||
}
|
||||
223
contrib/RideLogger/src/com/ridelogger/listners/Power.java
Normal file
@@ -0,0 +1,223 @@
|
||||
package com.ridelogger.listners;
|
||||
import android.preference.PreferenceManager;
|
||||
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusBikePowerPcc;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusBikePowerPcc.CalculatedWheelDistanceReceiver;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusBikePowerPcc.CalculatedWheelSpeedReceiver;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusBikePowerPcc.DataSource;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusBikePowerPcc.ICalculatedCrankCadenceReceiver;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusBikePowerPcc.ICalculatedPowerReceiver;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusBikePowerPcc.ICalculatedTorqueReceiver;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusBikePowerPcc.IInstantaneousCadenceReceiver;
|
||||
import com.dsi.ant.plugins.antplus.pcc.AntPlusBikePowerPcc.IRawPowerOnlyDataReceiver;
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.DeviceState;
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.EventFlag;
|
||||
import com.dsi.ant.plugins.antplus.pcc.defines.RequestAccessResult;
|
||||
import com.dsi.ant.plugins.antplus.pccbase.AntPluginPcc.IPluginAccessResultReceiver;
|
||||
import com.ridelogger.R;
|
||||
import com.ridelogger.RideService;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.EnumSet;
|
||||
|
||||
/**
|
||||
* Power
|
||||
* @author Chet Henry
|
||||
* Listen to and log Ant+ Power events
|
||||
*/
|
||||
public class Power extends Ant
|
||||
{
|
||||
public BigDecimal wheelCircumferenceInMeters; //size of wheel to calculate speed
|
||||
public IPluginAccessResultReceiver<AntPlusBikePowerPcc> mResultReceiver;
|
||||
|
||||
//setup listeners and logging
|
||||
public Power(int pDeviceNumber, RideService mContext) {
|
||||
super(pDeviceNumber, mContext);
|
||||
|
||||
wheelCircumferenceInMeters = new BigDecimal(
|
||||
PreferenceManager.getDefaultSharedPreferences(context).getString(context.getString(R.string.PREF_WHEEL_SIZE), "2.096")
|
||||
);
|
||||
|
||||
//Handle messages
|
||||
mResultReceiver = new IPluginAccessResultReceiver<AntPlusBikePowerPcc>() {
|
||||
//Handle the result, connecting to events on success or reporting failure to user.
|
||||
@Override
|
||||
public void onResultReceived(AntPlusBikePowerPcc result, RequestAccessResult resultCode, DeviceState initialDeviceState) {
|
||||
if(resultCode == com.dsi.ant.plugins.antplus.pcc.defines.RequestAccessResult.SUCCESS) {
|
||||
deviceNumber = result.getAntDeviceNumber();
|
||||
|
||||
result.subscribeCalculatedPowerEvent(new ICalculatedPowerReceiver() {
|
||||
@Override
|
||||
public void onNewCalculatedPower(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final DataSource dataSource, final BigDecimal calculatedPower) {
|
||||
alterCurrentData(RideService.WATTS, calculatedPower.floatValue());
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribeCalculatedTorqueEvent(
|
||||
new ICalculatedTorqueReceiver() {
|
||||
@Override
|
||||
public void onNewCalculatedTorque(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final DataSource dataSource, final BigDecimal calculatedTorque) {
|
||||
alterCurrentData(RideService.NM, calculatedTorque.floatValue());
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribeCalculatedCrankCadenceEvent(
|
||||
new ICalculatedCrankCadenceReceiver() {
|
||||
@Override
|
||||
public void onNewCalculatedCrankCadence(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final DataSource dataSource, final BigDecimal calculatedCrankCadence) {
|
||||
alterCurrentData(RideService.CAD, calculatedCrankCadence.floatValue());
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribeCalculatedWheelSpeedEvent(
|
||||
new CalculatedWheelSpeedReceiver(wheelCircumferenceInMeters) {
|
||||
@Override
|
||||
public void onNewCalculatedWheelSpeed(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final DataSource dataSource, final BigDecimal calculatedWheelSpeed)
|
||||
{
|
||||
alterCurrentData(RideService.KPH, calculatedWheelSpeed.floatValue());
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribeCalculatedWheelDistanceEvent(
|
||||
new CalculatedWheelDistanceReceiver(wheelCircumferenceInMeters) {
|
||||
@Override
|
||||
public void onNewCalculatedWheelDistance(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final DataSource dataSource, final BigDecimal calculatedWheelDistance)
|
||||
{
|
||||
alterCurrentData(RideService.KM, calculatedWheelDistance.floatValue());
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribeInstantaneousCadenceEvent(
|
||||
new IInstantaneousCadenceReceiver() {
|
||||
@Override
|
||||
public void onNewInstantaneousCadence(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final DataSource dataSource, final int instantaneousCadence)
|
||||
{
|
||||
alterCurrentData(RideService.CAD, (float) instantaneousCadence);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribeRawPowerOnlyDataEvent(
|
||||
new IRawPowerOnlyDataReceiver() {
|
||||
@Override
|
||||
public void onNewRawPowerOnlyData(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final long powerOnlyUpdateEventCount, final int instantaneousPower, final long accumulatedPower)
|
||||
{
|
||||
alterCurrentData(RideService.WATTS, (float) instantaneousPower);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
/*result.subscribePedalPowerBalanceEvent(
|
||||
new IPedalPowerBalanceReceiver() {
|
||||
@Override
|
||||
public void onNewPedalPowerBalance(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final boolean rightPedalIndicator, final int pedalPowerPercentage)
|
||||
{
|
||||
alterCurrentData(RideService.LTE, pedalPowerPercentage);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribeRawWheelTorqueDataEvent(
|
||||
new IRawWheelTorqueDataReceiver() {
|
||||
@Override
|
||||
public void onNewRawWheelTorqueData(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final long wheelTorqueUpdateEventCount, final long accumulatedWheelTicks, final BigDecimal accumulatedWheelPeriod, final BigDecimal accumulatedWheelTorque)
|
||||
{
|
||||
alterCurrentData(RideService.NM, accumulatedWheelTorque);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribeRawCrankTorqueDataEvent(
|
||||
new IRawCrankTorqueDataReceiver() {
|
||||
@Override
|
||||
public void onNewRawCrankTorqueData(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final long crankTorqueUpdateEventCount, final long accumulatedCrankTicks, final BigDecimal accumulatedCrankPeriod, final BigDecimal accumulatedCrankTorque)
|
||||
{
|
||||
alterCurrentData(RideService.NM, accumulatedCrankTorque);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribeTorqueEffectivenessEvent(
|
||||
new ITorqueEffectivenessReceiver() {
|
||||
@Override
|
||||
public void onNewTorqueEffectiveness(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final long powerOnlyUpdateEventCount, final BigDecimal leftTorqueEffectiveness, final BigDecimal rightTorqueEffectiveness)
|
||||
{
|
||||
int[] keys = {
|
||||
RideService.LTE,
|
||||
RideService.RTE
|
||||
};
|
||||
|
||||
float[] values = {
|
||||
leftTorqueEffectiveness,
|
||||
rightTorqueEffectiveness
|
||||
}
|
||||
|
||||
alterCurrentData(keys, values);
|
||||
}
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
result.subscribePedalSmoothnessEvent(new IPedalSmoothnessReceiver() {
|
||||
@Override
|
||||
public void onNewPedalSmoothness(final long estTimestamp, final EnumSet<EventFlag> eventFlags, final long powerOnlyUpdateEventCount, final boolean separatePedalSmoothnessSupport, final BigDecimal leftOrCombinedPedalSmoothness, final BigDecimal rightPedalSmoothness)
|
||||
{
|
||||
int[] keys = {
|
||||
RideService.SNPLC,
|
||||
RideService.SNPR
|
||||
};
|
||||
|
||||
float[] values = {
|
||||
leftOrCombinedPedalSmoothness,
|
||||
rightPedalSmoothness
|
||||
}
|
||||
|
||||
alterCurrentData(map);
|
||||
}
|
||||
}
|
||||
);*/
|
||||
} else if(resultCode == com.dsi.ant.plugins.antplus.pcc.defines.RequestAccessResult.SEARCH_TIMEOUT) {
|
||||
if(deviceNumber != 0) {
|
||||
requestAccess();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
requestAccess();
|
||||
}
|
||||
|
||||
protected void requestAccess() {
|
||||
releaseHandle = AntPlusBikePowerPcc.requestAccess(context, deviceNumber, 0, mResultReceiver, mDeviceStateChangeReceiver);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void zeroReadings()
|
||||
{
|
||||
int[] keys = {
|
||||
RideService.WATTS,
|
||||
RideService.NM,
|
||||
RideService.CAD,
|
||||
RideService.KPH,
|
||||
RideService.KM
|
||||
};
|
||||
|
||||
float[] values = {
|
||||
(float) 0.0,
|
||||
(float) 0.0,
|
||||
(float) 0.0,
|
||||
(float) 0.0,
|
||||
(float) 0.0
|
||||
};
|
||||
|
||||
alterCurrentData(keys, values);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
222
contrib/RideLogger/src/com/ridelogger/listners/Sensors.java
Normal file
@@ -0,0 +1,222 @@
|
||||
package com.ridelogger.listners;
|
||||
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import com.ridelogger.R;
|
||||
import com.ridelogger.RideService;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.hardware.Sensor;
|
||||
import android.hardware.SensorEvent;
|
||||
import android.hardware.SensorEventListener;
|
||||
import android.hardware.SensorManager;
|
||||
import android.preference.PreferenceManager;
|
||||
|
||||
/**
|
||||
* Sensors
|
||||
* @author Chet Henry
|
||||
* Listen to android sensor events and log them
|
||||
*/
|
||||
public class Sensors extends Base<Object>
|
||||
{
|
||||
public static final double CRASHMAGNITUDE = 30.0;
|
||||
|
||||
private SensorEventListener luxListner;
|
||||
private SensorEventListener accelListner;
|
||||
private SensorEventListener pressListner;
|
||||
private SensorEventListener tempListner;
|
||||
private SensorEventListener fieldListner;
|
||||
|
||||
public Sensors(RideService mContext)
|
||||
{
|
||||
super(mContext);
|
||||
|
||||
SensorManager mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
|
||||
|
||||
Sensor mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
|
||||
Sensor mAccel = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
|
||||
Sensor mPress = mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);
|
||||
Sensor mTemp = mSensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE);
|
||||
Sensor mField = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
|
||||
|
||||
if(mLight != null) {
|
||||
luxListner = new SensorEventListener() {
|
||||
@Override
|
||||
public final void onAccuracyChanged(Sensor sensor, int accuracy) {}
|
||||
|
||||
@Override
|
||||
public final void onSensorChanged(SensorEvent event) {
|
||||
// The light sensor returns a single value.
|
||||
// Many sensors return 3 values, one for each axis.
|
||||
alterCurrentData(RideService.lux, event.values[0]);
|
||||
}
|
||||
};
|
||||
|
||||
mSensorManager.registerListener(luxListner, mLight, 3000000);
|
||||
}
|
||||
|
||||
if(mAccel != null) {
|
||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
if(settings.getBoolean(context.getString(R.string.PREF_DETECT_CRASH), false)) {
|
||||
accelListner = new SensorEventListener() {
|
||||
private boolean crashed = false;
|
||||
private Timer timer = new Timer();
|
||||
private double[] St = new double[3];
|
||||
|
||||
@Override
|
||||
public final void onAccuracyChanged(Sensor sensor, int accuracy) {}
|
||||
|
||||
@Override
|
||||
public final void onSensorChanged(SensorEvent event) {
|
||||
int[] keys = {
|
||||
RideService.ms2x,
|
||||
RideService.ms2y,
|
||||
RideService.ms2z
|
||||
};
|
||||
|
||||
alterCurrentData(keys, event.values);
|
||||
|
||||
if(St.length == 0) {
|
||||
St[0] = event.values[0];
|
||||
St[1] = event.values[1];
|
||||
St[2] = event.values[2];
|
||||
}
|
||||
|
||||
St[0] = 0.6 * event.values[0] + 0.4 * St[0];
|
||||
St[1] = 0.6 * event.values[1] + 0.4 * St[1];
|
||||
St[2] = 0.6 * event.values[2] + 0.4 * St[2];
|
||||
|
||||
double amag = Math.sqrt(St[0]*St[0] + St[1]*St[1] + St[2]*St[2]);
|
||||
|
||||
if(amag > CRASHMAGNITUDE && !crashed) {
|
||||
crashed = true;
|
||||
context.phoneCrash(amag);
|
||||
|
||||
if(!Float.isNaN(context.currentValues[RideService.KPH])) {
|
||||
timer.schedule(
|
||||
new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
//if we are traveling less then 1km/h at 5 seconds after crash detection
|
||||
// confirm the crash
|
||||
if(1.0 > context.currentValues[RideService.KPH]) {
|
||||
context.phoneCrashConfirm();
|
||||
} else {
|
||||
crashed = false;
|
||||
context.phoneHome();
|
||||
}
|
||||
}
|
||||
},
|
||||
5000
|
||||
); //in five sec reset
|
||||
} else {
|
||||
timer.schedule(
|
||||
new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
crashed = false;
|
||||
}
|
||||
},
|
||||
180000
|
||||
); //in three min reset
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
} else {
|
||||
accelListner = new SensorEventListener() {
|
||||
@Override
|
||||
public final void onAccuracyChanged(Sensor sensor, int accuracy) {}
|
||||
|
||||
@Override
|
||||
public final void onSensorChanged(SensorEvent event) {
|
||||
int[] keys = {
|
||||
RideService.ms2x,
|
||||
RideService.ms2y,
|
||||
RideService.ms2z
|
||||
};
|
||||
|
||||
alterCurrentData(keys, event.values);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
mSensorManager.registerListener(accelListner, mAccel, SensorManager.SENSOR_DELAY_NORMAL);
|
||||
}
|
||||
|
||||
if(mPress != null) {
|
||||
pressListner = new SensorEventListener() {
|
||||
@Override
|
||||
public final void onAccuracyChanged(Sensor sensor, int accuracy) {}
|
||||
|
||||
@Override
|
||||
public final void onSensorChanged(SensorEvent event) {
|
||||
// The light sensor returns a single value.
|
||||
// Many sensors return 3 values, one for each axis.
|
||||
alterCurrentData(RideService.press, event.values[0]);
|
||||
}
|
||||
};
|
||||
|
||||
mSensorManager.registerListener(pressListner, mPress, 3000000);
|
||||
}
|
||||
|
||||
if(mTemp != null) {
|
||||
tempListner = new SensorEventListener() {
|
||||
@Override
|
||||
public final void onAccuracyChanged(Sensor sensor, int accuracy) {}
|
||||
|
||||
@Override
|
||||
public final void onSensorChanged(SensorEvent event) {
|
||||
// The light sensor returns a single value.
|
||||
// Many sensors return 3 values, one for each axis.
|
||||
alterCurrentData(RideService.temp, event.values[0]);
|
||||
}
|
||||
};
|
||||
|
||||
mSensorManager.registerListener(tempListner, mTemp, 3000000);
|
||||
}
|
||||
|
||||
if(mField != null) {
|
||||
fieldListner = new SensorEventListener() {
|
||||
@Override
|
||||
public final void onAccuracyChanged(Sensor sensor, int accuracy) {}
|
||||
|
||||
@Override
|
||||
public final void onSensorChanged(SensorEvent event) {
|
||||
int[] keys = {
|
||||
RideService.uTx,
|
||||
RideService.uTy,
|
||||
RideService.uTz
|
||||
};
|
||||
|
||||
alterCurrentData(keys, event.values);
|
||||
}
|
||||
};
|
||||
|
||||
mSensorManager.registerListener(fieldListner, mField, SensorManager.SENSOR_DELAY_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy()
|
||||
{
|
||||
SensorManager mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
|
||||
if(luxListner != null) {
|
||||
mSensorManager.unregisterListener(luxListner);
|
||||
}
|
||||
if(accelListner != null) {
|
||||
mSensorManager.unregisterListener(accelListner);
|
||||
}
|
||||
if(pressListner != null) {
|
||||
mSensorManager.unregisterListener(pressListner);
|
||||
}
|
||||
if(tempListner != null) {
|
||||
mSensorManager.unregisterListener(tempListner);
|
||||
}
|
||||
if(fieldListner != null) {
|
||||
mSensorManager.unregisterListener(fieldListner);
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
doc/contrib/Computrainer Serial Protocol v0.3 draft.doc
Normal file
BIN
doc/contrib/WKO File Format.docx
Normal file
BIN
doc/design/refresh events-v311.png
Normal file
|
After Width: | Height: | Size: 173 KiB |
|
Before Width: | Height: | Size: 115 KiB After Width: | Height: | Size: 431 KiB |
|
Before Width: | Height: | Size: 578 KiB After Width: | Height: | Size: 578 KiB |
|
Before Width: | Height: | Size: 2.7 MiB After Width: | Height: | Size: 2.7 MiB |
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 127 KiB After Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 8.1 KiB |
|
Before Width: | Height: | Size: 344 KiB After Width: | Height: | Size: 344 KiB |
|
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 3.9 MiB After Width: | Height: | Size: 3.9 MiB |
|
Before Width: | Height: | Size: 154 KiB After Width: | Height: | Size: 154 KiB |
|
Before Width: | Height: | Size: 165 KiB After Width: | Height: | Size: 165 KiB |
|
Before Width: | Height: | Size: 155 KiB After Width: | Height: | Size: 155 KiB |
|
Before Width: | Height: | Size: 181 KiB After Width: | Height: | Size: 181 KiB |
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 323 KiB |
BIN
doc/wiki/Help_About.JPG
Normal file
|
After Width: | Height: | Size: 116 KiB |
BIN
doc/wiki/MenuBar_Activity-ShareActivity.jpg
Normal file
|
After Width: | Height: | Size: 121 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 129 KiB |
BIN
doc/wiki/MenuBar_Edit.jpg
Normal file
|
After Width: | Height: | Size: 166 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 109 KiB |
|
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 151 KiB |
|
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 388 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 67 KiB |
BIN
doc/wiki/MetricTrends_New_Curve_Edit_Stress.jpg
Normal file
|
After Width: | Height: | Size: 154 KiB |
|
Before Width: | Height: | Size: 164 KiB After Width: | Height: | Size: 304 KiB |
|
Before Width: | Height: | Size: 251 KiB After Width: | Height: | Size: 447 KiB |
|
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 216 KiB |
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 166 KiB |
|
Before Width: | Height: | Size: 127 KiB After Width: | Height: | Size: 122 KiB |
BIN
doc/wiki/PreferencesAthlete_Autoimport_Overview.jpg
Normal file
|
After Width: | Height: | Size: 196 KiB |
|
Before Width: | Height: | Size: 167 KiB After Width: | Height: | Size: 150 KiB |
BIN
doc/wiki/PreferencesAthlete_PaceZones_Overview.jpg
Normal file
|
After Width: | Height: | Size: 209 KiB |
|
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 165 KiB |
|
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 131 KiB |
|
Before Width: | Height: | Size: 178 KiB After Width: | Height: | Size: 198 KiB |
BIN
doc/wiki/PreferencesDataFields_Defaults.jpg
Normal file
|
After Width: | Height: | Size: 161 KiB |
|
Before Width: | Height: | Size: 214 KiB After Width: | Height: | Size: 359 KiB |
|
Before Width: | Height: | Size: 99 KiB After Width: | Height: | Size: 181 KiB |
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 299 KiB |
|
Before Width: | Height: | Size: 130 KiB After Width: | Height: | Size: 220 KiB |
|
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 175 KiB |
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 162 KiB |
BIN
doc/wiki/Share_Activity.jpg
Normal file
|
After Width: | Height: | Size: 119 KiB |
|
Before Width: | Height: | Size: 81 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 180 KiB After Width: | Height: | Size: 180 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 96 KiB |