Compare commits
1792 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
697342ca5a | ||
|
|
b204e85fe5 | ||
|
|
5f073f781d | ||
|
|
4436ca5a18 | ||
|
|
98858da51c | ||
|
|
ea2a66e399 | ||
|
|
22e3ee1ca6 | ||
|
|
1a57e45fb6 | ||
|
|
04a302a4e4 | ||
|
|
f992f21242 | ||
|
|
dc0ccd4798 | ||
|
|
6d81873277 | ||
|
|
0e0c08e34d | ||
|
|
b0bbec6ba2 | ||
|
|
48317fb7a7 | ||
|
|
157028c24d | ||
|
|
83a00af6bc | ||
|
|
2844af9f1e | ||
|
|
c52a7fa382 | ||
|
|
67c3de54e3 | ||
|
|
d35dba2a29 | ||
|
|
c650ffa74a | ||
|
|
d37579b69b | ||
|
|
62c1fac580 | ||
|
|
cc9c2bfc79 | ||
|
|
c2bcb16e6b | ||
|
|
d0c384a478 | ||
|
|
d3cdbbbe36 | ||
|
|
aee176baf1 | ||
|
|
271eaeb31b | ||
|
|
8cd80db43b | ||
|
|
c299717bc4 | ||
|
|
6a12bc18b7 | ||
|
|
cdeb68b435 | ||
|
|
ae262f9211 | ||
|
|
e35c66c6dc | ||
|
|
9c11074f0a | ||
|
|
399088b83e | ||
|
|
71b88d6616 | ||
|
|
0ed60b16f1 | ||
|
|
1248d27d91 | ||
|
|
13bf2b5aba | ||
|
|
dcb7cb3236 | ||
|
|
a78a68414c | ||
|
|
eba6df427b | ||
|
|
4700dbc883 | ||
|
|
973fb40db9 | ||
|
|
ec5b8fd0bb | ||
|
|
2bead0676a | ||
|
|
a071c85555 | ||
|
|
975c9d9daf | ||
|
|
5d2ea70b2f | ||
|
|
f5cf9e65a3 | ||
|
|
a6eabb73d7 | ||
|
|
e7e6e0bd70 | ||
|
|
bc49580e51 | ||
|
|
2a9ddaf61b | ||
|
|
ef8107c3bd | ||
|
|
2070645a36 | ||
|
|
a6d6ee5a1d | ||
|
|
a6640ec324 | ||
|
|
98cb17b124 | ||
|
|
04b11710e0 | ||
|
|
0558f3df25 | ||
|
|
f1f7203c67 | ||
|
|
816e58db8a | ||
|
|
deae129f1a | ||
|
|
496fd4a015 | ||
|
|
acd6089d58 | ||
|
|
a81f1b213a | ||
|
|
644d88a018 | ||
|
|
7ffde09931 | ||
|
|
4c3d722412 | ||
|
|
646fa9a3aa | ||
|
|
e335a1dd75 | ||
|
|
a2dbcb914a | ||
|
|
eb3f9860a0 | ||
|
|
7e8f5f7a56 | ||
|
|
67491d2e30 | ||
|
|
d0209a6033 | ||
|
|
d04512cc31 | ||
|
|
6ae5b9d882 | ||
|
|
dce4fa9a0c | ||
|
|
734c96cb22 | ||
|
|
61f9a3dcf8 | ||
|
|
4f6af1317b | ||
|
|
6f717cacbf | ||
|
|
2d16ac684c | ||
|
|
6b965bb9b3 | ||
|
|
80f8654669 | ||
|
|
273f96fe55 | ||
|
|
b46b39e53a | ||
|
|
684df352de | ||
|
|
1da100608d | ||
|
|
cf7b486347 | ||
|
|
63b12ad69d | ||
|
|
936b4aa131 | ||
|
|
b198b54cde | ||
|
|
f6e8bad516 | ||
|
|
c86cae70f0 | ||
|
|
cac9f6cc48 | ||
|
|
623b425000 | ||
|
|
520f92e30e | ||
|
|
0267eec3e8 | ||
|
|
3273ba839f | ||
|
|
ec7c89d326 | ||
|
|
6311977d40 | ||
|
|
18ddf5ad11 | ||
|
|
e74ecc1f09 | ||
|
|
a7af4e4a5f | ||
|
|
8b1b1a4882 | ||
|
|
c69e2b6d8a | ||
|
|
564e126a06 | ||
|
|
49db5cb321 | ||
|
|
391ed47d0e | ||
|
|
2a92029fd2 | ||
|
|
6923c69495 | ||
|
|
d9f5e1b3c9 | ||
|
|
dbf78d994b | ||
|
|
4b962a47fa | ||
|
|
c9679ea721 | ||
|
|
b40ac62d70 | ||
|
|
338dd4e4f1 | ||
|
|
3b3a337984 | ||
|
|
96770ae200 | ||
|
|
debb918315 | ||
|
|
d665da4958 | ||
|
|
4fba4d0535 | ||
|
|
a38856edd0 | ||
|
|
e55f408cd9 | ||
|
|
2f3f06b544 | ||
|
|
723c088912 | ||
|
|
fef08be40b | ||
|
|
5049ea3071 | ||
|
|
67c1794196 | ||
|
|
17ed0815ec | ||
|
|
2ea8cc082a | ||
|
|
f15931a307 | ||
|
|
b911757d4f | ||
|
|
3f59c6cf93 | ||
|
|
f1cc304f54 | ||
|
|
3ad59ac5cc | ||
|
|
261c0d06ed | ||
|
|
55ee756fef | ||
|
|
a55e04405c | ||
|
|
a4ec375118 | ||
|
|
19203bba76 | ||
|
|
80ad5bf9df | ||
|
|
5a5dc65b98 | ||
|
|
4e17a9970f | ||
|
|
3ab4d21a5e | ||
|
|
d33e102e18 | ||
|
|
3a545d225e | ||
|
|
70d0356f4f | ||
|
|
15f470c3de | ||
|
|
3b92cdaabe | ||
|
|
df90366685 | ||
|
|
20a15ed647 | ||
|
|
8d03e014ef | ||
|
|
7fe4e11382 | ||
|
|
c43eefb45a | ||
|
|
5b3cab00c3 | ||
|
|
9f4ce89c09 | ||
|
|
52541cc46b | ||
|
|
bcb671763f | ||
|
|
d71aa8c0a2 | ||
|
|
fe414772d0 | ||
|
|
7b94987260 | ||
|
|
f04592b62b | ||
|
|
9dab87dfda | ||
|
|
580103ee7e | ||
|
|
c62794881e | ||
|
|
dc19141997 | ||
|
|
1a8d683303 | ||
|
|
e42df848ec | ||
|
|
1f0515e723 | ||
|
|
b23f39ebc8 | ||
|
|
791b5115f4 | ||
|
|
e39b662690 | ||
|
|
422d5ad5fc | ||
|
|
e1312caa33 | ||
|
|
221afed822 | ||
|
|
9d337a76aa | ||
|
|
6925a7fcaf | ||
|
|
57e0060eb6 | ||
|
|
49516a7eb6 | ||
|
|
49ce337a02 | ||
|
|
1f6e2cfc5f | ||
|
|
1606cdd391 | ||
|
|
d9c76c1503 | ||
|
|
3f414caf08 | ||
|
|
dbf240616f | ||
|
|
4e02b77481 | ||
|
|
a4f3e21be1 | ||
|
|
06241c6ac0 | ||
|
|
4cc19dffdf | ||
|
|
6dfcff19c2 | ||
|
|
3d2b5d8076 | ||
|
|
38048a8de0 | ||
|
|
6f1af4b718 | ||
|
|
dc402f1204 | ||
|
|
b1bb4b6259 | ||
|
|
e8325dbcdc | ||
|
|
3b2eb13689 | ||
|
|
bcb7b870ca | ||
|
|
38a93ebb81 | ||
|
|
b529e04907 | ||
|
|
cac9b84859 | ||
|
|
42248d5584 | ||
|
|
2dbe960dfb | ||
|
|
d95ec38593 | ||
|
|
1d1508c524 | ||
|
|
fa40917053 | ||
|
|
7d884cff93 | ||
|
|
33016507eb | ||
|
|
16a31b859f | ||
|
|
d8d90370e2 | ||
|
|
6da3e0aafd | ||
|
|
58b3557f86 | ||
|
|
0abbeed952 | ||
|
|
e6cc21bfbc | ||
|
|
28eb76827c | ||
|
|
e4b2abdb29 | ||
|
|
139af8d3a2 | ||
|
|
17ea4e3fed | ||
|
|
c42bb3fa50 | ||
|
|
8c5900cae3 | ||
|
|
9533b95738 | ||
|
|
d40d865dfa | ||
|
|
9e833d4a04 | ||
|
|
35c098101a | ||
|
|
44c0f0a9b5 | ||
|
|
ac402756aa | ||
|
|
731d9b1924 | ||
|
|
d6ba11ba8d | ||
|
|
df994818e6 | ||
|
|
9ece3459d2 | ||
|
|
48fe226b22 | ||
|
|
274ca405e6 | ||
|
|
e0b16bd32e | ||
|
|
6f7618e1dc | ||
|
|
046d7d7777 | ||
|
|
ced6851e4a | ||
|
|
84c4d52c56 | ||
|
|
601b720e94 | ||
|
|
db4081a7a7 | ||
|
|
7b3271335e | ||
|
|
c9b01643dd | ||
|
|
9b749af6fe | ||
|
|
973cc4d40c | ||
|
|
141acde7d7 | ||
|
|
3ebf0b68f7 | ||
|
|
b3161bb598 | ||
|
|
cd8c123961 | ||
|
|
4393c505b5 | ||
|
|
e444801401 | ||
|
|
a87f5a7193 | ||
|
|
bbdba62f99 | ||
|
|
126bc61aaa | ||
|
|
a2f085a238 | ||
|
|
c588863f20 | ||
|
|
0ed3da989f | ||
|
|
b25958f024 | ||
|
|
c754825222 | ||
|
|
09099704c5 | ||
|
|
6799d2eb9d | ||
|
|
c6a8babfe4 | ||
|
|
5d17699d49 | ||
|
|
033f92a0e0 | ||
|
|
ea8ad65d88 | ||
|
|
f760b1733c | ||
|
|
5ce28a8088 | ||
|
|
cddf18d58f | ||
|
|
60b1562d55 | ||
|
|
3f861159c9 | ||
|
|
a6a333c9ba | ||
|
|
5d0a91010d | ||
|
|
9d52cf70ce | ||
|
|
da34d9524d | ||
|
|
29a685ee4f | ||
|
|
8a82383e38 | ||
|
|
dafe3615c1 | ||
|
|
37565c4854 | ||
|
|
11cfbe5cd8 | ||
|
|
d35989eb0f | ||
|
|
dbcd2526c5 | ||
|
|
4dfc5c9918 | ||
|
|
6771336574 | ||
|
|
e5d6b8caa0 | ||
|
|
cb65205b42 | ||
|
|
e328c9fd22 | ||
|
|
a5a0b8741f | ||
|
|
069342f6f5 | ||
|
|
892281b58d | ||
|
|
da0935d2cf | ||
|
|
ff015f534e | ||
|
|
17bf55c40d | ||
|
|
e9a7ff434d | ||
|
|
aced5805b1 | ||
|
|
67e455314c | ||
|
|
dbe92eec27 | ||
|
|
32af651e50 | ||
|
|
d8487bfb4a | ||
|
|
10b5f75a47 | ||
|
|
cf380b9222 | ||
|
|
d99534ba26 | ||
|
|
a57a6e683e | ||
|
|
d13b396663 | ||
|
|
d11d016480 | ||
|
|
4b2679cdf1 | ||
|
|
90ac02e3c9 | ||
|
|
7f6991520c | ||
|
|
bf4c37f7b2 | ||
|
|
e0a7f5a943 | ||
|
|
84c5b6bdca | ||
|
|
4f570d8106 | ||
|
|
f83b0b1d64 | ||
|
|
13b5f00c0a | ||
|
|
a1baecb605 | ||
|
|
72925953ea | ||
|
|
e1f2c1b48b | ||
|
|
6088c21a32 | ||
|
|
4941dacd8c | ||
|
|
965bc37130 | ||
|
|
2e949b13bf | ||
|
|
99845aa12a | ||
|
|
a9b50af7a1 | ||
|
|
dedcd71026 | ||
|
|
5b4aee0788 | ||
|
|
1ec69a925e | ||
|
|
22bc70cd1a | ||
|
|
3431f87adc | ||
|
|
4e972a504c | ||
|
|
97e7ad62c7 | ||
|
|
06c1546a05 | ||
|
|
8bd13b11bc | ||
|
|
aa3e3102f9 | ||
|
|
58e2c88c9a | ||
|
|
7bc1537f30 | ||
|
|
04919f7d67 | ||
|
|
aebec00813 | ||
|
|
896c3e5574 | ||
|
|
677d9ff531 | ||
|
|
391a21d9a4 | ||
|
|
fdb04a0446 | ||
|
|
cc04a8532e | ||
|
|
ae7c176236 | ||
|
|
75860d7609 | ||
|
|
8d4320f583 | ||
|
|
5940557909 | ||
|
|
06a41f4583 | ||
|
|
273245c5b3 | ||
|
|
1e082391df | ||
|
|
53670707e6 | ||
|
|
07da4f3235 | ||
|
|
e047c6ca3a | ||
|
|
4194918b4b | ||
|
|
7b08fa9ea1 | ||
|
|
57968feb07 | ||
|
|
fd45d618f4 | ||
|
|
07a15b7194 | ||
|
|
706d2ad206 | ||
|
|
8bb45fd0a3 | ||
|
|
fb18164cfa | ||
|
|
f9690049d3 | ||
|
|
00c3856da4 | ||
|
|
1cb628f415 | ||
|
|
a93f37459e | ||
|
|
23633692c4 | ||
|
|
43aa31b607 | ||
|
|
f502400363 | ||
|
|
5358521f0b | ||
|
|
b016913293 | ||
|
|
1b86ce7207 | ||
|
|
b8723b20ff | ||
|
|
eb767cfdc1 | ||
|
|
5cb1d91cef | ||
|
|
a96102e3d2 | ||
|
|
a03c00f819 | ||
|
|
517435a656 | ||
|
|
cedf6cb3a5 | ||
|
|
09cc67f431 | ||
|
|
30ca55787d | ||
|
|
ea18e6718d | ||
|
|
c3d75b5ca0 | ||
|
|
9ddb02e015 | ||
|
|
6108f74128 | ||
|
|
55193b7033 | ||
|
|
6d1673d42b | ||
|
|
009b9c93a3 | ||
|
|
46712b407a | ||
|
|
7c2f23d3d0 | ||
|
|
9ca9bf8aef | ||
|
|
a7ba81429d | ||
|
|
f8684629c2 | ||
|
|
470ee13c6d | ||
|
|
8d82c8543d | ||
|
|
dce74a8f93 | ||
|
|
d29481c196 | ||
|
|
ff5cc08757 | ||
|
|
b93f3f8c7b | ||
|
|
9ace9bd562 | ||
|
|
187dbc836f | ||
|
|
e85434e710 | ||
|
|
802548c2e9 | ||
|
|
c18fbaf742 | ||
|
|
cff6de50d5 | ||
|
|
076c9b79ea | ||
|
|
cd3c8d3dd3 | ||
|
|
91716bf57d | ||
|
|
483e27090d | ||
|
|
bbfdbef63e | ||
|
|
2601180b0c | ||
|
|
ddd8b89963 | ||
|
|
2aff8c1328 | ||
|
|
1fde62e8e1 | ||
|
|
afe4ff9c66 | ||
|
|
60cc22ffa7 | ||
|
|
7b1bf52ec3 | ||
|
|
c334fc6cce | ||
|
|
2f910992a0 | ||
|
|
8d4ddb94f6 | ||
|
|
285cf57412 | ||
|
|
3a4b306790 | ||
|
|
ed234156e2 | ||
|
|
1b46801856 | ||
|
|
471a9fa98b | ||
|
|
f2d05c9b1d | ||
|
|
1956ac93d0 | ||
|
|
642c83e3ba | ||
|
|
45ca7e7716 | ||
|
|
e98212017b | ||
|
|
44ef1d8b62 | ||
|
|
e3ba2dcab5 | ||
|
|
6660b0ba7c | ||
|
|
f2ee3cb7c3 | ||
|
|
2427f42b76 | ||
|
|
8d56bcfc24 | ||
|
|
ad53f63e1a | ||
|
|
d56ae728dc | ||
|
|
b43b8f9643 | ||
|
|
4c64dc9933 | ||
|
|
2f6b4afa2f | ||
|
|
f70ab87a36 | ||
|
|
b41a984107 | ||
|
|
34a6ffc0f7 | ||
|
|
d3e1dcaa7e | ||
|
|
387ecdb6af | ||
|
|
af961ccafe | ||
|
|
4e7cbcd246 | ||
|
|
5fc0a96195 | ||
|
|
6c671ed30f | ||
|
|
3cec9c5000 | ||
|
|
7b15ae8beb | ||
|
|
5292ed06c1 | ||
|
|
aba1ac814f | ||
|
|
25a58eb9c4 | ||
|
|
fe73fcb2ff | ||
|
|
2d093b53de | ||
|
|
e07a99ce5c | ||
|
|
1af00737e5 | ||
|
|
a2a51aedfd | ||
|
|
8c2775b00d | ||
|
|
17b49df5e3 | ||
|
|
70b2163454 | ||
|
|
1839c5fa92 | ||
|
|
d1ef783bf9 | ||
|
|
121f2e9deb | ||
|
|
f61e746118 | ||
|
|
728d546c49 | ||
|
|
220b2f9f1a | ||
|
|
6b71394f1e | ||
|
|
714c956e92 | ||
|
|
f60c87416e | ||
|
|
3ef711b0a9 | ||
|
|
e8eeed1bb8 | ||
|
|
f8b450e78f | ||
|
|
974e137bbe | ||
|
|
f93277b122 | ||
|
|
e142ca4efc | ||
|
|
d8c01df44a | ||
|
|
a79fd628a5 | ||
|
|
8b292ce172 | ||
|
|
6029162df3 | ||
|
|
d05b93a36e | ||
|
|
09e3f8ae40 | ||
|
|
873fbef65f | ||
|
|
0a3fb01b60 | ||
|
|
0680c3de5b | ||
|
|
59f65b1756 | ||
|
|
9e852faf5c | ||
|
|
8aba4e969a | ||
|
|
4d7aae5a81 | ||
|
|
2fcf0dd023 | ||
|
|
7704253a9e | ||
|
|
abdc518652 | ||
|
|
56f8b8cc9a | ||
|
|
c5d30e67b6 | ||
|
|
4b940e61a7 | ||
|
|
11fb9bd94a | ||
|
|
b7640d7b0f | ||
|
|
47d91cbaaa | ||
|
|
170ec5f634 | ||
|
|
ea55ba06e1 | ||
|
|
c36af2094b | ||
|
|
ca63736c46 | ||
|
|
72e2ddc0ef | ||
|
|
2b03ce7bb5 | ||
|
|
8db5fe1f70 | ||
|
|
b317e5aec2 | ||
|
|
b7c646d2c9 | ||
|
|
48cc7a2bfa | ||
|
|
246260eab2 | ||
|
|
9883bfaec6 | ||
|
|
33b2c81090 | ||
|
|
179c5708f8 | ||
|
|
a698ea51ba | ||
|
|
dc7589a3ab | ||
|
|
1d37437486 | ||
|
|
e4498e6006 | ||
|
|
42b51f434d | ||
|
|
b3098e322d | ||
|
|
29ff182974 | ||
|
|
541c65eabc | ||
|
|
e364c20854 | ||
|
|
a2e7dd8505 | ||
|
|
6e1271310d | ||
|
|
97c551c466 | ||
|
|
ad2f9de62a | ||
|
|
c1291ac3c0 | ||
|
|
95f0d7ae95 | ||
|
|
481858e90e | ||
|
|
1dcb8db416 | ||
|
|
6a2c779390 | ||
|
|
d1c0de896f | ||
|
|
815fde61ba | ||
|
|
587f4523a7 | ||
|
|
1787be6069 | ||
|
|
0502124a89 | ||
|
|
4694109149 | ||
|
|
9002d4a76a | ||
|
|
0cb6114cd6 | ||
|
|
0176292218 | ||
|
|
fd3ca40e8a | ||
|
|
e9926f5dbd | ||
|
|
61f0295fda | ||
|
|
49f4377e13 | ||
|
|
44e37ef5ce | ||
|
|
9ca99bbe50 | ||
|
|
36ad3a1025 | ||
|
|
da17240900 | ||
|
|
eea7f8eeb9 | ||
|
|
7a20e2679a | ||
|
|
2f7f5c7234 | ||
|
|
9314ceff5f | ||
|
|
760825fcdc | ||
|
|
5fa4d58be0 | ||
|
|
b358563318 | ||
|
|
83e0f4239a | ||
|
|
7515f0aa9f | ||
|
|
985cea4020 | ||
|
|
36e768ce00 | ||
|
|
c4c15ada67 | ||
|
|
65cf9706ac | ||
|
|
3da0972d4b | ||
|
|
f37669bcc7 | ||
|
|
5909a03bcc | ||
|
|
fc83c2b757 | ||
|
|
cf14216a03 | ||
|
|
789a9e864b | ||
|
|
82ddf4acaa | ||
|
|
a01cdffaa7 | ||
|
|
ec893f2b7c | ||
|
|
805772a2c4 | ||
|
|
ecfb6afbfb | ||
|
|
544afa8e75 | ||
|
|
31cdb21f04 | ||
|
|
47dac73da1 | ||
|
|
1f53d249e0 | ||
|
|
92c89d43ea | ||
|
|
9c444c7fcb | ||
|
|
7bc2c79e74 | ||
|
|
02a43bf045 | ||
|
|
382b32a73d | ||
|
|
90a0f4701b | ||
|
|
6a228901d8 | ||
|
|
c3ac435942 | ||
|
|
4d03b52f87 | ||
|
|
00badb6cb1 | ||
|
|
32ae899861 | ||
|
|
6d1dd8b9e2 | ||
|
|
934374e6d2 | ||
|
|
3757e43ce7 | ||
|
|
30fc76979c | ||
|
|
a8c332bd16 | ||
|
|
78e966c4d8 | ||
|
|
270dbfba04 | ||
|
|
0d025afd8e | ||
|
|
8a09fe0ca2 | ||
|
|
22dbfaee7d | ||
|
|
32e03921a6 | ||
|
|
c7d2981d92 | ||
|
|
2b8f9cfc52 | ||
|
|
05bffb0def | ||
|
|
b03420b7bb | ||
|
|
2f7cb429ad | ||
|
|
2222d1decd | ||
|
|
d46801f4a0 | ||
|
|
8dde97bca2 | ||
|
|
884ba768b5 | ||
|
|
84c911c2e2 | ||
|
|
148064ed81 | ||
|
|
42f449a7ae | ||
|
|
816a1a520b | ||
|
|
7cc8e302de | ||
|
|
a6d7e565b3 | ||
|
|
4c83f55c3e | ||
|
|
916e8ee7a1 | ||
|
|
a5d4754cdc | ||
|
|
42ef6ba55e | ||
|
|
c6ad4d3ee9 | ||
|
|
7ff3af85b2 | ||
|
|
fc1d44ef06 | ||
|
|
8bf4454230 | ||
|
|
eff23d9bfb | ||
|
|
9c14f78c54 | ||
|
|
997616546c | ||
|
|
d8063d4980 | ||
|
|
6306967a54 | ||
|
|
d6690cd5ae | ||
|
|
5b6a652f0a | ||
|
|
f9591812ce | ||
|
|
2b8bccb04e | ||
|
|
8496e66dd4 | ||
|
|
344bcc23a9 | ||
|
|
2fda2bf37f | ||
|
|
94aa07e101 | ||
|
|
6835e8188c | ||
|
|
e469bc333f | ||
|
|
5eeaf0810d | ||
|
|
12615590e3 | ||
|
|
573adb1ef2 | ||
|
|
88ca6f9f39 | ||
|
|
f73686b4ff | ||
|
|
65fc5f84a2 | ||
|
|
0275d4b52f | ||
|
|
c49e16f375 | ||
|
|
9c057191b5 | ||
|
|
4a2513c1c7 | ||
|
|
203b03686b | ||
|
|
761d82b509 | ||
|
|
7da90c4c0e | ||
|
|
7fb8eb66d1 | ||
|
|
1f93856f31 | ||
|
|
df997a5e0e | ||
|
|
5a3ad8887e | ||
|
|
51242da94d | ||
|
|
b9438037b8 | ||
|
|
cc7bbbec48 | ||
|
|
768e6f835c | ||
|
|
55fb4d68c6 | ||
|
|
b02a869674 | ||
|
|
36f57ac240 | ||
|
|
038e6f5098 | ||
|
|
d2a2b4b9e0 | ||
|
|
1a7ea91efd | ||
|
|
7fdedf0bfe | ||
|
|
f5dd509c9e | ||
|
|
2e1b347851 | ||
|
|
5fc448c6ab | ||
|
|
03bd38f497 | ||
|
|
391ca0d29c | ||
|
|
7ae35dbcf8 | ||
|
|
eb413b7c3f | ||
|
|
16f13542f2 | ||
|
|
c10cd99360 | ||
|
|
48ac3aebbe | ||
|
|
05f4997fca | ||
|
|
c69b2b2e96 | ||
|
|
ea980149ca | ||
|
|
dfc058cd04 | ||
|
|
2e818e9428 | ||
|
|
33a711b03a | ||
|
|
6c8e32180a | ||
|
|
509a123989 | ||
|
|
675efe966e | ||
|
|
c00eefe89a | ||
|
|
aaa03aa34a | ||
|
|
082ee3b4c0 | ||
|
|
41890c852a | ||
|
|
3dca5ab996 | ||
|
|
995920eb8b | ||
|
|
785e1cb231 | ||
|
|
b8c21ca895 | ||
|
|
471afd21a0 | ||
|
|
aea510ec68 | ||
|
|
d742775ec4 | ||
|
|
76a79df78e | ||
|
|
8223a20b77 | ||
|
|
d503003e17 | ||
|
|
aaf6b486b8 | ||
|
|
0e34307d2d | ||
|
|
2f43e564d8 | ||
|
|
4979ac585a | ||
|
|
4b52dda7c4 | ||
|
|
bc24f52f35 | ||
|
|
f2c423be5d | ||
|
|
3d6f079147 | ||
|
|
3b8bcca4b6 | ||
|
|
cf8c3d3fee | ||
|
|
b90c5c0894 | ||
|
|
51077668e5 | ||
|
|
a3cee46676 | ||
|
|
47afd82d9e | ||
|
|
f7f4578241 | ||
|
|
947190a683 | ||
|
|
6f7546b6ba | ||
|
|
d8b3e500ac | ||
|
|
e2a56fd8a4 | ||
|
|
25c5b7f8b8 | ||
|
|
63dbaa25d9 | ||
|
|
ba748461d7 | ||
|
|
f1775c800b | ||
|
|
5f4357a232 | ||
|
|
88b668f604 | ||
|
|
597dccff9c | ||
|
|
70d6fd192b | ||
|
|
645d392a08 | ||
|
|
5c745e60d4 | ||
|
|
f8a0900ee1 | ||
|
|
53bf19ebc6 | ||
|
|
9679c48cae | ||
|
|
fc320c30c3 | ||
|
|
0c76544c34 | ||
|
|
c1f642d520 | ||
|
|
bff5de5a85 | ||
|
|
e4daf3b770 | ||
|
|
2f96e475ec | ||
|
|
7643c2cb00 | ||
|
|
b1946b50bc | ||
|
|
1e3f7227e2 | ||
|
|
3b3c98187f | ||
|
|
2dda61bee3 | ||
|
|
d5238b7cf1 | ||
|
|
2ae96d3d8e | ||
|
|
fabd6bffc9 | ||
|
|
353527af13 | ||
|
|
81a3d487e6 | ||
|
|
4690f0e605 | ||
|
|
d285ec8d97 | ||
|
|
d12d18c701 | ||
|
|
9027e1db02 | ||
|
|
758e9256a1 | ||
|
|
c1739199b2 | ||
|
|
d5ae1bf685 | ||
|
|
2912982132 | ||
|
|
ffce828c77 | ||
|
|
66afa908b1 | ||
|
|
3054541d3b | ||
|
|
f9c496f150 | ||
|
|
dec099fd21 | ||
|
|
f292e523e2 | ||
|
|
ac77ff53d7 | ||
|
|
b100ebbde4 | ||
|
|
39b92ac29c | ||
|
|
50d4e9bde1 | ||
|
|
12b0ab68ac | ||
|
|
54db2720e6 | ||
|
|
4b32ed544c | ||
|
|
ac947f6a32 | ||
|
|
3b90f147e4 | ||
|
|
7312122cb0 | ||
|
|
08c7eb4959 | ||
|
|
644a8f069e | ||
|
|
edf9b826ff | ||
|
|
461501fe21 | ||
|
|
502e671bc7 | ||
|
|
80ab042b25 | ||
|
|
166c8c6132 | ||
|
|
ca4de3b676 | ||
|
|
a78214944f | ||
|
|
8f03f38981 | ||
|
|
db2f25fc0b | ||
|
|
377310c24f | ||
|
|
05b19bc5b6 | ||
|
|
5ee6ae15b7 | ||
|
|
6cff666215 | ||
|
|
02d8add9b3 | ||
|
|
70c9587428 | ||
|
|
9a9424f924 | ||
|
|
3332b0228c | ||
|
|
67db9d59c8 | ||
|
|
9e63c6ee7d | ||
|
|
6b2a2dbb65 | ||
|
|
100c0be881 | ||
|
|
b0c4b7786f | ||
|
|
4500899d0e | ||
|
|
9751a85bf7 | ||
|
|
1710c37f92 | ||
|
|
9e59e5d60c | ||
|
|
e9b9bb6c04 | ||
|
|
8a3e35b880 | ||
|
|
90c053f09f | ||
|
|
4b81b6ddc5 | ||
|
|
feba99481c | ||
|
|
bf4ca0af64 | ||
|
|
0daae7f020 | ||
|
|
49e964f585 | ||
|
|
de1262b010 | ||
|
|
bc87b16acf | ||
|
|
008e217ec0 | ||
|
|
cdc8857536 | ||
|
|
58c8c0bf2a | ||
|
|
59bc0c3307 | ||
|
|
b100fc23de | ||
|
|
dbfee3db52 | ||
|
|
f5bfcb112b | ||
|
|
a9150d8a4e | ||
|
|
bdf346a2e8 | ||
|
|
f4434892dd | ||
|
|
926a08f1b6 | ||
|
|
9d0e3e241e | ||
|
|
3f1b9fe5d1 | ||
|
|
7a5d937336 | ||
|
|
474148670b | ||
|
|
37edf945d8 | ||
|
|
878776e051 | ||
|
|
e96fcd170c | ||
|
|
1ef8910db8 | ||
|
|
3e2cf20255 | ||
|
|
ad9398208f | ||
|
|
a5fb9846f1 | ||
|
|
99e455a1c4 | ||
|
|
50ddbe62ab | ||
|
|
ae29908a3d | ||
|
|
9a41e4a897 | ||
|
|
787932f183 | ||
|
|
e9b834f553 | ||
|
|
3eb3698d6f | ||
|
|
a37c91e004 | ||
|
|
602d108b82 | ||
|
|
57314d0f56 | ||
|
|
42c3ac51e2 | ||
|
|
296c59f0e4 | ||
|
|
ba3487b112 | ||
|
|
3cc415f208 | ||
|
|
dce1add51b | ||
|
|
10003e4806 | ||
|
|
805ff21cb9 | ||
|
|
aca583ee0b | ||
|
|
33158f9ba9 | ||
|
|
485004f030 | ||
|
|
511eb77df6 | ||
|
|
bd9775bb9f | ||
|
|
9fea4f8ad3 | ||
|
|
d0fc5627b5 | ||
|
|
3bf39f4f3f | ||
|
|
ca02ed4454 | ||
|
|
7c3219a6c2 | ||
|
|
0f2fc731a2 | ||
|
|
fc026ec219 | ||
|
|
c4a819db67 | ||
|
|
39fb140b82 | ||
|
|
3151b1fee3 | ||
|
|
750fac2606 | ||
|
|
f3d015b2bb | ||
|
|
528221170c | ||
|
|
e21540f469 | ||
|
|
6fde93afe0 | ||
|
|
59da5f83b2 | ||
|
|
ad160cbf05 | ||
|
|
5df7503904 | ||
|
|
9e3b33638f | ||
|
|
1d11a6b7ca | ||
|
|
ddef4ec356 | ||
|
|
3c409241b7 | ||
|
|
b60c93e343 | ||
|
|
18d8d131ab | ||
|
|
0b5af0d7b6 | ||
|
|
9e510ca08b | ||
|
|
d43ee7b6a4 | ||
|
|
ea37db2167 | ||
|
|
e0688da2d7 | ||
|
|
4856e58dac | ||
|
|
e3e00f2761 | ||
|
|
92145eac34 | ||
|
|
c5a536e10f | ||
|
|
ad822a9472 | ||
|
|
2cbca0a812 | ||
|
|
744ddc4a31 | ||
|
|
fe93793e5b | ||
|
|
d254e0b9ae | ||
|
|
c42b003715 | ||
|
|
1cfc023473 | ||
|
|
9e2b6079f4 | ||
|
|
5ea16e9b1e | ||
|
|
a6484a3430 | ||
|
|
a78dce2cb9 | ||
|
|
a9a31edb3a | ||
|
|
4b953a214c | ||
|
|
d63fdb6126 | ||
|
|
ecc02d22b7 | ||
|
|
0a44e4c7ab | ||
|
|
87f0729d43 | ||
|
|
c84cfae01d | ||
|
|
5fd2873df2 | ||
|
|
5b1e035517 | ||
|
|
2b0de63b32 | ||
|
|
1be93193fe | ||
|
|
dd339a0a2e | ||
|
|
1577af489b | ||
|
|
226e2c928d | ||
|
|
4531765d1b | ||
|
|
613f6f6a89 | ||
|
|
e7d2faa381 | ||
|
|
bc301d091f | ||
|
|
7b5c0b0eb2 | ||
|
|
3d630442c9 | ||
|
|
f5afd6c112 | ||
|
|
8b609d2da2 | ||
|
|
f70a01ca48 | ||
|
|
97854bdd8c | ||
|
|
17bb16708d | ||
|
|
ff8aba4ec2 | ||
|
|
226e81608e | ||
|
|
46c02ea4e6 | ||
|
|
36991ae45e | ||
|
|
b6b2472419 | ||
|
|
9348dcf52d | ||
|
|
5703cfa116 | ||
|
|
efe7a5d0dd | ||
|
|
34e7bb6d08 | ||
|
|
fd07763891 | ||
|
|
234481a541 | ||
|
|
ea5599b76e | ||
|
|
7517b359e3 | ||
|
|
821542c7fe | ||
|
|
436128f340 | ||
|
|
816ff5f3a1 | ||
|
|
23503aa25f | ||
|
|
d7c5e705cf | ||
|
|
7035c09d37 | ||
|
|
ad65688ece | ||
|
|
ac8174ea4d | ||
|
|
0f9bd25847 | ||
|
|
528aa2400f | ||
|
|
907ba634c2 | ||
|
|
aea39b8ec8 | ||
|
|
d18c6346d4 | ||
|
|
7e1b7729dd | ||
|
|
26f6a36cba | ||
|
|
d4065d3c99 | ||
|
|
f14b785dbc | ||
|
|
54707abcd8 | ||
|
|
d9ff54c2ad | ||
|
|
5454c45fbd | ||
|
|
fb994fa5e7 | ||
|
|
728c9a6537 | ||
|
|
2286f670df | ||
|
|
f1a37ea895 | ||
|
|
8a4295996d | ||
|
|
6632226e00 | ||
|
|
ae7d4f511a | ||
|
|
c146c04aef | ||
|
|
0feefc4a26 | ||
|
|
7015011adb | ||
|
|
c643ad2e0a | ||
|
|
86cade882d | ||
|
|
48d10ea033 | ||
|
|
7b07a380fc | ||
|
|
8518cdb643 | ||
|
|
a9e0ef14b6 | ||
|
|
411ea4e77a | ||
|
|
a7f4585d70 | ||
|
|
1cf7b14bee | ||
|
|
98065ede18 | ||
|
|
09718b708b | ||
|
|
85f4351ffa | ||
|
|
fa5642c95f | ||
|
|
a888f6a77b | ||
|
|
bbc978b77a | ||
|
|
f394e68b67 | ||
|
|
1afcc52cbe | ||
|
|
22885a7dbc | ||
|
|
5cc97fe0dc | ||
|
|
e4d6a5e22c | ||
|
|
beca209de4 | ||
|
|
d3f0ab5449 | ||
|
|
74f9206c0d | ||
|
|
c4d99dd2b7 | ||
|
|
8f4d318199 | ||
|
|
0bcc78613a | ||
|
|
c5cd8cc140 | ||
|
|
4b271749a0 | ||
|
|
6e414a4774 | ||
|
|
07a6af5904 | ||
|
|
1d230f04f2 | ||
|
|
7df3ab909a | ||
|
|
ca323c9f66 | ||
|
|
d03fbcd975 | ||
|
|
efd3859d2e | ||
|
|
c934e8b4d0 | ||
|
|
4fcb015976 | ||
|
|
6b521b0be1 | ||
|
|
2a5ab3f228 | ||
|
|
1897156616 | ||
|
|
685699729a | ||
|
|
16573ffe98 | ||
|
|
a45ab6d56b | ||
|
|
49b1210031 | ||
|
|
ee0592a246 | ||
|
|
35bb937dc5 | ||
|
|
ca34011082 | ||
|
|
f8544eb4af | ||
|
|
a6737eb84c | ||
|
|
049f527d09 | ||
|
|
e73fbc5902 | ||
|
|
ae964ae5b6 | ||
|
|
6c9de3597b | ||
|
|
d7212f1d69 | ||
|
|
bd126a0620 | ||
|
|
f742c143dc | ||
|
|
5514d3d2bb | ||
|
|
43d572edde | ||
|
|
c98cc0e3ea | ||
|
|
338e265969 | ||
|
|
45ef3fbf10 | ||
|
|
c09bc0bae4 | ||
|
|
9092f19f2c | ||
|
|
b555c0cc86 | ||
|
|
04cabf1c44 | ||
|
|
979cc891fe | ||
|
|
e492a58b92 | ||
|
|
35bd254a70 | ||
|
|
b1e2ea3a8f | ||
|
|
43fc25dd3c | ||
|
|
930a335855 | ||
|
|
6ba4bebe57 | ||
|
|
14413fcb94 | ||
|
|
b888e58ac4 | ||
|
|
758ef4086d | ||
|
|
f85fd89af7 | ||
|
|
b32c01464f | ||
|
|
df94e42e58 | ||
|
|
b5f45d20e6 | ||
|
|
b68487fbbe | ||
|
|
86d4528991 | ||
|
|
ba29c2d3f9 | ||
|
|
d33f800f73 | ||
|
|
418d45b253 | ||
|
|
c58cdca7d1 | ||
|
|
6163ed4083 | ||
|
|
45f033f8a3 | ||
|
|
493f0a6274 | ||
|
|
13909a8495 | ||
|
|
7b2f8f0e9b | ||
|
|
92a065fc5d | ||
|
|
ebbd954734 | ||
|
|
15da5e929d | ||
|
|
19a0359957 | ||
|
|
0c9a02e743 | ||
|
|
52edebd096 | ||
|
|
2e522c6728 | ||
|
|
b41326d39f | ||
|
|
c0616fa5af | ||
|
|
5f6cfe278a | ||
|
|
1330b003a7 | ||
|
|
06ec7d61ad | ||
|
|
fbffd1b467 | ||
|
|
dd57141184 | ||
|
|
01f8013b37 | ||
|
|
8d98c5901c | ||
|
|
3be79d45f1 | ||
|
|
f655dbdde8 | ||
|
|
220b0f2842 | ||
|
|
32b18da693 | ||
|
|
44eb69c4a7 | ||
|
|
7d33f3c754 | ||
|
|
72ce3cc4b1 | ||
|
|
fb2f9932a5 | ||
|
|
c18ea6eb44 | ||
|
|
32985d5d4d | ||
|
|
e6f7817b6d | ||
|
|
5f6c595472 | ||
|
|
6c412fc27c | ||
|
|
bb7c6a304a | ||
|
|
93f78a8f32 | ||
|
|
cb9d9239a4 | ||
|
|
b7c8a49e7d | ||
|
|
670d3e5fca | ||
|
|
cae4b8b47b | ||
|
|
599205813b | ||
|
|
728186a51e | ||
|
|
585801aa1a | ||
|
|
0369508910 | ||
|
|
e556b398b2 | ||
|
|
7cce1cf0ce | ||
|
|
2845a3efc9 | ||
|
|
22580fdf70 | ||
|
|
0af1bf78a5 | ||
|
|
e2ea640cbe | ||
|
|
2e914c281e | ||
|
|
6a95e206b0 | ||
|
|
80e53dcf2f | ||
|
|
39d044576f | ||
|
|
3dba2c58f5 | ||
|
|
d8cf1e3d08 | ||
|
|
5c54b50722 | ||
|
|
74e4d9e440 | ||
|
|
3d9f8eea70 | ||
|
|
a8d310262b | ||
|
|
dc8cb24f43 | ||
|
|
f5ba4743da | ||
|
|
404d8c84fe | ||
|
|
4b51aa2f27 | ||
|
|
d4e0653500 | ||
|
|
b18d1a1b46 | ||
|
|
c1a5c46e8b | ||
|
|
a734430afa | ||
|
|
6b0cc37f83 | ||
|
|
c633a4c29f | ||
|
|
6f7c6af50d | ||
|
|
8759580c39 | ||
|
|
168a3abc69 | ||
|
|
5ac2aa1d6a | ||
|
|
aa3d8e0d76 | ||
|
|
4cfd7386a2 | ||
|
|
80790d72d6 | ||
|
|
7ce398a251 | ||
|
|
13a0a998ea | ||
|
|
db4a4a0809 | ||
|
|
bae36e6b2a | ||
|
|
d81db266f3 | ||
|
|
86a599bfb8 | ||
|
|
011ad14e6f | ||
|
|
09605fbc3e | ||
|
|
51cc29906c | ||
|
|
ad556808c5 | ||
|
|
313feeab63 | ||
|
|
503a1b4de0 | ||
|
|
5345a69cdf | ||
|
|
38ddf01adc | ||
|
|
b12e853a36 | ||
|
|
825372bca8 | ||
|
|
03d6a8b11a | ||
|
|
5284447498 | ||
|
|
26d232c171 | ||
|
|
73144ae7a1 | ||
|
|
bbd4063781 | ||
|
|
17fecc41c7 | ||
|
|
17597e052d | ||
|
|
c7e71646c0 | ||
|
|
5529bcff66 | ||
|
|
99ea36cad5 | ||
|
|
d255ae5f92 | ||
|
|
d80a326d66 | ||
|
|
b3dbeb2517 | ||
|
|
4d381b877c | ||
|
|
fb5c6a2bcf | ||
|
|
9c9dc93567 | ||
|
|
13b093ff23 | ||
|
|
580a5a780a | ||
|
|
7b2423afac | ||
|
|
b71aa39d3a | ||
|
|
36c0f0365c | ||
|
|
0a5cb2b4a3 | ||
|
|
6c5f726bf5 | ||
|
|
5102b7e75c | ||
|
|
04c3d8cee7 | ||
|
|
2fb17922d3 | ||
|
|
2566ca38f5 | ||
|
|
f4dc2cae81 | ||
|
|
99023f0756 | ||
|
|
3f6b6d2577 | ||
|
|
50f8582570 | ||
|
|
94d733b75b | ||
|
|
f39214cbe8 | ||
|
|
b28d7a5a40 | ||
|
|
7c776ddcff | ||
|
|
f2d17652ea | ||
|
|
56b5114af7 | ||
|
|
16ab91985a | ||
|
|
3ccd49acea | ||
|
|
c5afdf0022 | ||
|
|
a9543c050a | ||
|
|
9a17258f44 | ||
|
|
8cfd02f8b5 | ||
|
|
bccdf10335 | ||
|
|
ec217367c3 | ||
|
|
d78c0bf402 | ||
|
|
59a17cc7db | ||
|
|
3567d2d7bf | ||
|
|
02d83a982c | ||
|
|
16336ca1d3 | ||
|
|
9d3f48869a | ||
|
|
327c1b2102 | ||
|
|
5bb5dc3d9e | ||
|
|
377cde71c3 | ||
|
|
6cbf83928c | ||
|
|
19ec794fb2 | ||
|
|
365778fb0c | ||
|
|
55928938ef | ||
|
|
24500c3700 | ||
|
|
3b4e2b4372 | ||
|
|
15df8e51cf | ||
|
|
39e691b4b4 | ||
|
|
0d0c3dacbe | ||
|
|
25604491d7 | ||
|
|
01bec9218e | ||
|
|
fb8179d298 | ||
|
|
e1a1f6ab4f | ||
|
|
315d4fe1f3 | ||
|
|
e5f178a453 | ||
|
|
30cfaf853a | ||
|
|
17b4477a8c | ||
|
|
e814d98797 | ||
|
|
178dc6dbed | ||
|
|
db28f52368 | ||
|
|
2927cae26e | ||
|
|
47801c2b52 | ||
|
|
3c3b8e91e4 | ||
|
|
9e8905a7f1 | ||
|
|
0d6a75342a | ||
|
|
1a3941ac38 | ||
|
|
f1c9bbfa06 | ||
|
|
07bc4249e3 | ||
|
|
282d35db32 | ||
|
|
a4237e158e | ||
|
|
254f463760 | ||
|
|
c40630c1ca | ||
|
|
5692d362d0 | ||
|
|
e7399ba4f2 | ||
|
|
8be9f8a7b9 | ||
|
|
ce88839674 | ||
|
|
627e9fd71e | ||
|
|
379db8b6c1 | ||
|
|
6ae209c21b | ||
|
|
a214c96278 | ||
|
|
486c4d536c | ||
|
|
936d3fe77d | ||
|
|
cea492019c | ||
|
|
b4a54e5de1 | ||
|
|
15e7589f70 | ||
|
|
6ff7a0e5d6 | ||
|
|
78e2b63596 | ||
|
|
c9334343cc | ||
|
|
d6e8f08521 | ||
|
|
6a459b89e4 | ||
|
|
80acabbc96 | ||
|
|
1db138138b | ||
|
|
a04894bc2a | ||
|
|
a703c69d2e | ||
|
|
7878c33f0b | ||
|
|
78a058880a | ||
|
|
4cb47c7abd | ||
|
|
6a2e9b9c67 | ||
|
|
83a5c7d84e | ||
|
|
9fe930dca5 | ||
|
|
33be087c2f | ||
|
|
98720f099e | ||
|
|
9c1f110d3a | ||
|
|
995d5fb4f1 | ||
|
|
e08955d599 | ||
|
|
7ad2bda418 | ||
|
|
3561188711 | ||
|
|
f88a85b244 | ||
|
|
da679d3f20 | ||
|
|
44aea09d97 | ||
|
|
a8192d863d | ||
|
|
fe2e9b467b | ||
|
|
2a5187c478 | ||
|
|
db967076dd | ||
|
|
bc1e3c2713 | ||
|
|
a2c13f4cbd | ||
|
|
ea56e65b88 | ||
|
|
9a11cf5452 | ||
|
|
1bb4c3264b | ||
|
|
c1307da442 | ||
|
|
4483b734d1 | ||
|
|
c3c64c9912 | ||
|
|
8e9232f2d1 | ||
|
|
5f39c9e226 | ||
|
|
bedf369a02 | ||
|
|
bc2391f089 | ||
|
|
ed778d8b1c | ||
|
|
c9278b9fef | ||
|
|
a399c73de8 | ||
|
|
e37d0da017 | ||
|
|
b11c750ae8 | ||
|
|
118a5fc4e4 | ||
|
|
2c4b2568fd | ||
|
|
6ca48b3621 | ||
|
|
16fa4017d3 | ||
|
|
0a91cf9ef6 | ||
|
|
70ff5f91e5 | ||
|
|
a33dff05e5 | ||
|
|
d10ac1eb84 | ||
|
|
075db59373 | ||
|
|
9a6879f033 | ||
|
|
fdf3760dee | ||
|
|
b8402088d7 | ||
|
|
5cb9696b09 | ||
|
|
c2db6a66a2 | ||
|
|
8f8e2a63ad | ||
|
|
eb3b245dab | ||
|
|
d1d1d885de | ||
|
|
973a497355 | ||
|
|
bf4522b639 | ||
|
|
279ec56d13 | ||
|
|
40b9be717f | ||
|
|
e7ef34a122 | ||
|
|
39762171fe | ||
|
|
8f034fa5b2 | ||
|
|
7a5ca6f36a | ||
|
|
9f35459b55 | ||
|
|
40db32a56d | ||
|
|
e201b62064 | ||
|
|
8a462b43fe | ||
|
|
698a598927 | ||
|
|
31c9f6151e | ||
|
|
f9cc3cc83a | ||
|
|
bf7c80b73d | ||
|
|
0697af7e9a | ||
|
|
72fadc23ac | ||
|
|
01ac756ef1 | ||
|
|
b737dcbebd | ||
|
|
56fd645277 | ||
|
|
a2f44e718f | ||
|
|
3782f31952 | ||
|
|
67903db188 | ||
|
|
2e3ee9c07a | ||
|
|
90db8a87be | ||
|
|
f8b18278c8 | ||
|
|
0fe2d1b6f6 | ||
|
|
ead01c69e9 | ||
|
|
1025aa95f7 | ||
|
|
43a966e4a5 | ||
|
|
e88ac85f29 | ||
|
|
e9a7442103 | ||
|
|
0610575a7c | ||
|
|
b105204b66 | ||
|
|
901933e58d | ||
|
|
3de714a629 | ||
|
|
ca90b79a34 | ||
|
|
96d2bea2d8 | ||
|
|
62e9ae6b96 | ||
|
|
4fb31ee2ea | ||
|
|
6bd1ef1cc2 | ||
|
|
ee0faf430c | ||
|
|
2492108d35 | ||
|
|
7b8d1c4054 | ||
|
|
3a1c7309f3 | ||
|
|
e97045703a | ||
|
|
f4ad330a5f | ||
|
|
6f32e16f6b | ||
|
|
4b3abd3787 | ||
|
|
c2b23a060c | ||
|
|
ae1ea97728 | ||
|
|
656e8f9363 | ||
|
|
b95ff295cd | ||
|
|
9b5065dc34 | ||
|
|
0840980ad6 | ||
|
|
7adb64fe27 | ||
|
|
de5538dbe9 | ||
|
|
4d482e7b6d | ||
|
|
d1863e6641 | ||
|
|
8d378bde5e | ||
|
|
1a4765016c | ||
|
|
5d13307f96 | ||
|
|
293d389baf | ||
|
|
57b6b9fc8f | ||
|
|
c106d17c4c | ||
|
|
848b90c804 | ||
|
|
d3a49a633a | ||
|
|
96ecd617db | ||
|
|
e19b78dada | ||
|
|
2cc47da374 | ||
|
|
98dc3448cf | ||
|
|
3cf5b2fe56 | ||
|
|
6c31fe82e1 | ||
|
|
111577088a | ||
|
|
3277b96897 | ||
|
|
e5ca8ae880 | ||
|
|
dddaf19531 | ||
|
|
713d97c120 | ||
|
|
22584288ca | ||
|
|
75fdd97998 | ||
|
|
89bd88189d | ||
|
|
57d485e117 | ||
|
|
f3fbc3b026 | ||
|
|
0d7fbb7b8d | ||
|
|
fe03e9264e | ||
|
|
c5cc16ab00 | ||
|
|
278cec18ba | ||
|
|
3570faa3e1 | ||
|
|
ac54877334 | ||
|
|
0d4120db6f | ||
|
|
07c2ff444e | ||
|
|
ac925c6c43 | ||
|
|
1e94b2baf1 | ||
|
|
ac6627f353 | ||
|
|
92560d81eb | ||
|
|
aa4b2ca552 | ||
|
|
ee65b435c9 | ||
|
|
ecafc4b8e4 | ||
|
|
62b7cdc1be | ||
|
|
82d79085f4 | ||
|
|
d14e078c38 | ||
|
|
7ab124f522 | ||
|
|
9725f62eda | ||
|
|
f7a276d93e | ||
|
|
62772295fd | ||
|
|
9d5ade417c | ||
|
|
632d637f00 | ||
|
|
2d2d3dac2f | ||
|
|
f5a61672f3 | ||
|
|
f5b9b60502 | ||
|
|
b7fa8e4ba8 | ||
|
|
ad57cd0826 | ||
|
|
b84d4f1ad7 | ||
|
|
c4849d78f2 | ||
|
|
03c73d9af7 | ||
|
|
dc5beca607 | ||
|
|
aeb3eed27e | ||
|
|
aba0e5b933 | ||
|
|
5c9da4de37 | ||
|
|
282ecdef63 | ||
|
|
0a00fd88bf | ||
|
|
1683ae9e2e | ||
|
|
89569e1331 | ||
|
|
6680a71499 | ||
|
|
27c0d100f5 | ||
|
|
e9a2acdbc6 | ||
|
|
f87adaa89a | ||
|
|
a61c1e3217 | ||
|
|
4c3c1a7582 | ||
|
|
6a4a3eb02a | ||
|
|
1ae3fb8811 | ||
|
|
13ea19c159 | ||
|
|
85d4b59295 | ||
|
|
aea550c267 | ||
|
|
ee02071461 | ||
|
|
00ea1bfc86 | ||
|
|
d6bbbfe112 | ||
|
|
f07ba8c8f7 | ||
|
|
acac8d307a | ||
|
|
5515467dd9 | ||
|
|
106c98255e | ||
|
|
f148481ada | ||
|
|
f15ef1e223 | ||
|
|
43afccd81b | ||
|
|
a7397e7ae7 | ||
|
|
7318c79237 | ||
|
|
7d68e103ca | ||
|
|
a7526242b0 | ||
|
|
bfd606218b | ||
|
|
6308a34717 | ||
|
|
ae765755c4 | ||
|
|
ac2fad1305 | ||
|
|
b0bac869f7 | ||
|
|
ed4176709d | ||
|
|
553500596c | ||
|
|
13d5db0bd1 | ||
|
|
d835ed5861 | ||
|
|
f8a73d2f4d | ||
|
|
c1ecc6826a | ||
|
|
87cfa6d1dc | ||
|
|
2a6ad65dc1 | ||
|
|
3868096745 | ||
|
|
56a07f8106 | ||
|
|
8925bc20e5 | ||
|
|
e8bee5c56c | ||
|
|
16f1bba797 | ||
|
|
b12d966aef | ||
|
|
52408ad1b5 | ||
|
|
0db864a4d9 | ||
|
|
35eb416bd2 | ||
|
|
1cd85fa415 | ||
|
|
edc094e9fa | ||
|
|
24deab0feb | ||
|
|
23a7f40b30 | ||
|
|
957bd3ea1f | ||
|
|
7707f757b0 | ||
|
|
251f5c862e | ||
|
|
4ffed24c4d | ||
|
|
8f923813ac | ||
|
|
9b6ddc7aa7 | ||
|
|
7d23b9ef0f | ||
|
|
1853f0d8f1 | ||
|
|
7a627f6322 | ||
|
|
5afcbed029 | ||
|
|
7e84981736 | ||
|
|
424498010a | ||
|
|
d0bc460039 | ||
|
|
7d6cb2bdf4 | ||
|
|
5cc118ca5d | ||
|
|
ce3607b699 | ||
|
|
641a21af89 | ||
|
|
ee5f032588 | ||
|
|
bd7082f877 | ||
|
|
2a53f30141 | ||
|
|
e0c7c932ba | ||
|
|
1554865415 | ||
|
|
c6246b11ae | ||
|
|
a9a4b924a1 | ||
|
|
cf422d6830 | ||
|
|
5052554422 | ||
|
|
35b8f05380 | ||
|
|
a745dfdcc3 | ||
|
|
757bf50807 | ||
|
|
bf2b7d0605 | ||
|
|
db34e57a65 | ||
|
|
e326fb8704 | ||
|
|
26e6639ae5 | ||
|
|
62adda849f | ||
|
|
36da18b78f | ||
|
|
d618f0d8cd | ||
|
|
5cbba9efcd | ||
|
|
7c5a86aa96 | ||
|
|
2439781748 | ||
|
|
0ba6757d3e | ||
|
|
df62267090 | ||
|
|
2745900954 | ||
|
|
ca3ee9cef6 | ||
|
|
4b213a085a | ||
|
|
f82b22da5a | ||
|
|
50e7228ea6 | ||
|
|
137349a907 | ||
|
|
09c997dc4b | ||
|
|
f42b8c109b | ||
|
|
0e4525da11 | ||
|
|
a1cefcb1ff | ||
|
|
7486aec760 | ||
|
|
9846815f4a | ||
|
|
af545cc541 | ||
|
|
7266ad7817 | ||
|
|
ea3160bbe5 | ||
|
|
d98212e624 | ||
|
|
9dc4398ae3 | ||
|
|
50b4ae41ca | ||
|
|
a681bb8196 | ||
|
|
03ba468d8f | ||
|
|
8eccd0b682 | ||
|
|
3fc8bee85f | ||
|
|
334a7bfc40 | ||
|
|
ec7d2ee647 | ||
|
|
2cbe27ced4 | ||
|
|
a91e53a02b | ||
|
|
6444df2178 | ||
|
|
1f5fe35b83 | ||
|
|
bcc19c94ef | ||
|
|
064b32db90 | ||
|
|
a0531d293a | ||
|
|
3d2c8660ba | ||
|
|
34a6f5d6d2 | ||
|
|
c6dee10f8d | ||
|
|
d4b3cbacf2 | ||
|
|
2adcabf239 | ||
|
|
4406981b78 | ||
|
|
783d9869c5 | ||
|
|
aa4770ca05 | ||
|
|
f1d9e6de4c | ||
|
|
ded3c0c14c | ||
|
|
dcb2dcf59a | ||
|
|
500ca79693 | ||
|
|
7bfe92df2d | ||
|
|
39ce98a959 | ||
|
|
7d1b59d0a4 | ||
|
|
e3f67b7830 | ||
|
|
e8886aec4b | ||
|
|
5bb19fd630 | ||
|
|
d56bd21156 | ||
|
|
48058676ec | ||
|
|
b0ed28ba97 | ||
|
|
75886a70af | ||
|
|
f80427d98e | ||
|
|
4f2a4179bb | ||
|
|
d1334d8dff | ||
|
|
9b982731cd | ||
|
|
6b992b963a | ||
|
|
87432d611d | ||
|
|
08987d693a | ||
|
|
11c026cf29 | ||
|
|
25ee643094 | ||
|
|
04423b1385 | ||
|
|
8c2c7c9286 | ||
|
|
68904300e3 | ||
|
|
fae700e3c3 | ||
|
|
92cfbbd02f | ||
|
|
d09f896950 | ||
|
|
f0f428090a | ||
|
|
b77ab9c5ab | ||
|
|
e39493ceef | ||
|
|
3f45e8541b | ||
|
|
a73d5df95c | ||
|
|
da73b072ed | ||
|
|
693da5fadd | ||
|
|
0322d5f25b | ||
|
|
31cce4a67b | ||
|
|
96b1467b39 | ||
|
|
6c62ee1819 | ||
|
|
c9aa0052ad | ||
|
|
cb9967bf28 | ||
|
|
b535d2676e | ||
|
|
02a585c6e0 | ||
|
|
ae03d72708 | ||
|
|
ae5a27f9c6 | ||
|
|
45496f2f92 | ||
|
|
0906dcba4a | ||
|
|
22e5fb5a25 | ||
|
|
6a0714c645 | ||
|
|
80f97951b0 | ||
|
|
66570337b3 | ||
|
|
00d2e989d4 | ||
|
|
230f028037 | ||
|
|
0bf8a8ab89 | ||
|
|
51af6ba76d | ||
|
|
f27462a4f5 | ||
|
|
656fb90590 | ||
|
|
e3850a6146 | ||
|
|
8b21c0994f | ||
|
|
b0aca1f42c | ||
|
|
7e2542b915 | ||
|
|
c7cdffe68c | ||
|
|
8cd29d5555 | ||
|
|
bdc00585ca | ||
|
|
e6c2152171 | ||
|
|
4d9ce4c5ed | ||
|
|
92834fbc86 | ||
|
|
a95ef5b8d3 | ||
|
|
245eba65e6 | ||
|
|
f1447d2664 | ||
|
|
db3e580aa8 | ||
|
|
cda1266960 | ||
|
|
bca7cba11e | ||
|
|
bfd052973d | ||
|
|
abedd19b7c | ||
|
|
6de25f3d01 | ||
|
|
9799e8774f | ||
|
|
8ac171d06e | ||
|
|
1607bda7f4 | ||
|
|
1d398be89e | ||
|
|
f583de0801 | ||
|
|
17f23f8b28 | ||
|
|
93d0799bc2 | ||
|
|
30484e1af7 | ||
|
|
1230a9eb40 | ||
|
|
99defb5885 | ||
|
|
c65553d063 | ||
|
|
eb5a6a9497 | ||
|
|
189ab96a48 | ||
|
|
13bc58e18f | ||
|
|
3202181142 | ||
|
|
8004deecd1 | ||
|
|
fb641681bf | ||
|
|
8fc1fac7ed | ||
|
|
4f498436b1 | ||
|
|
db1a1cbcb6 | ||
|
|
516118847c | ||
|
|
0555b9b05f | ||
|
|
223ee29b89 | ||
|
|
243923c135 | ||
|
|
e62259f5ca | ||
|
|
3d00475450 | ||
|
|
10b5d4a589 | ||
|
|
0eeb434bef | ||
|
|
a9e17ffa65 | ||
|
|
3942c0a594 | ||
|
|
c094aa92b0 | ||
|
|
96f9076c9b | ||
|
|
070082b1c0 | ||
|
|
ca7ef59573 | ||
|
|
2102a0f7bb | ||
|
|
809696d9b3 | ||
|
|
40556883e6 | ||
|
|
15183e16be | ||
|
|
71a7323a40 | ||
|
|
b92c4d67a4 | ||
|
|
8ba99d9907 | ||
|
|
dc56efd4bd | ||
|
|
4906783478 | ||
|
|
9703161743 | ||
|
|
20819fedc3 | ||
|
|
379989ed1c | ||
|
|
1777ce0854 | ||
|
|
0b9962f614 | ||
|
|
489c9e5988 | ||
|
|
3fabc6810a | ||
|
|
e09e2a3ba9 | ||
|
|
635b425bf6 | ||
|
|
98967f3574 | ||
|
|
4b1a62d68f | ||
|
|
502ceb5ffb | ||
|
|
0c91318f38 | ||
|
|
4fa35a72c0 | ||
|
|
8bd8ffd27b | ||
|
|
b6d4f3fa2b | ||
|
|
bceb7c6664 | ||
|
|
454e8c2cc5 | ||
|
|
27f23fe4f9 | ||
|
|
0a90063bd9 | ||
|
|
7831550668 | ||
|
|
9efcc7ba3a | ||
|
|
b92564d719 | ||
|
|
4b1a31891c | ||
|
|
6da909a7c7 | ||
|
|
f4d902dcbb | ||
|
|
36e7fb7caf | ||
|
|
95b3b5aa92 | ||
|
|
d7662133ce | ||
|
|
c4f8e12237 | ||
|
|
c4a48590be | ||
|
|
5b84ceb1dc | ||
|
|
4a4459b6f7 | ||
|
|
122b352ee0 | ||
|
|
092c84090a | ||
|
|
df81fdcc92 | ||
|
|
47fb5068df | ||
|
|
3578c9caca | ||
|
|
a0d6d6d865 | ||
|
|
3d91e0d392 | ||
|
|
6caf97ddb9 | ||
|
|
89d03987c9 | ||
|
|
10788a4cc8 | ||
|
|
31ea0f86f6 | ||
|
|
32a49f4c2a | ||
|
|
27782ffb9a | ||
|
|
93e5f724cf | ||
|
|
2795f7e073 | ||
|
|
8ee12aa8ca | ||
|
|
b440a2af9e | ||
|
|
7d72213dfa | ||
|
|
44d0a6c11d | ||
|
|
75480a60ab | ||
|
|
d862ff6acb | ||
|
|
87a886100b | ||
|
|
6b1fabff55 | ||
|
|
392d4f2ed3 | ||
|
|
71d62bffed | ||
|
|
381faed61b | ||
|
|
b54552d496 | ||
|
|
a7b2e3f226 | ||
|
|
ba5be12bb7 | ||
|
|
a0156aab27 | ||
|
|
6dafc611d9 | ||
|
|
85f6912619 | ||
|
|
50241e91eb | ||
|
|
5fe2058bae | ||
|
|
2b690f2d31 | ||
|
|
0e980dbc31 | ||
|
|
a79074834a | ||
|
|
2ec1fe4beb | ||
|
|
b2b6db2a8f | ||
|
|
bf2f830f52 | ||
|
|
1579c68f9b | ||
|
|
640d3b7721 | ||
|
|
981d97c2ed | ||
|
|
68992c129d | ||
|
|
85fc57de37 | ||
|
|
3c0506bef7 | ||
|
|
04a95545ec | ||
|
|
42d7661ca0 | ||
|
|
9d469f771d | ||
|
|
72124addef | ||
|
|
d94f9f7130 | ||
|
|
964676e94f | ||
|
|
b65be86f1d | ||
|
|
83eb4a2ec7 | ||
|
|
de268dabf1 | ||
|
|
ce5a8d8e9a | ||
|
|
06fc40a6b4 | ||
|
|
a0e55fee9d | ||
|
|
10640ae3f0 | ||
|
|
9051ff3baf | ||
|
|
09e73f05c3 | ||
|
|
183608d797 | ||
|
|
94c4492db2 | ||
|
|
85d1fbe822 | ||
|
|
37c4152ed2 | ||
|
|
99d10960d9 | ||
|
|
347783211f | ||
|
|
0789fdea98 | ||
|
|
41f5cd19d6 | ||
|
|
3c0db9efa3 | ||
|
|
66c525e2aa | ||
|
|
56afa3c938 | ||
|
|
feb579ac70 | ||
|
|
ef4d1bc8b4 | ||
|
|
03fd402b64 | ||
|
|
0721816b01 | ||
|
|
c6112bd13c | ||
|
|
528d880a90 |
17
.gitignore
vendored
@@ -1,4 +1,5 @@
|
||||
Makefile
|
||||
.qmake.stash
|
||||
|
||||
# old skool
|
||||
.svn
|
||||
@@ -14,3 +15,19 @@ lib/
|
||||
bin/
|
||||
plugins/
|
||||
resources/
|
||||
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
|
||||
|
||||
113
.travis.yml
Normal file
@@ -0,0 +1,113 @@
|
||||
branches:
|
||||
- master
|
||||
language:
|
||||
- objective-c
|
||||
compiler:
|
||||
- clang
|
||||
- gcc
|
||||
env:
|
||||
matrix:
|
||||
- BRANCH=master QT=qt4 QT_PATH=qt
|
||||
- BRANCH=master QT=qt5 QT_PATH=qt5
|
||||
global:
|
||||
- secure: iqYW7f3//ZkMVzeCEarYn0S0DqKjFU9juBh0KF6WTlUsKX902Jtsk7dFoJlNDYBf63HLgV+wW2Hc6MxI9sGiUkom0gY9/To/aeGIJFGEX2sLm/e0Ok3qN521FA0Q/OiCFsD0RC6J+yrHxzI+rf8Z1rujceUsz2KgsrfAjYYv+BY=
|
||||
- secure: C6f58PXwvvHeVOjCLbyDRjgyF0tk+bXjCNUDur8VJLhJEGNdnrt+rH+d3azYaX0n348ZnQZ14as4M4rHjN1A/3DRbdUdOS7PQZrkj/n363ck1tvYOG/tzYqkEcVoQyjIJ7ZoTuBXDQry/VJmLxQjM0glTa2upNFHMOMwqZNkF+I=
|
||||
- secure: mgf181ok4rJTHxAdSaeIb/OzUx7PQc6UjJYfhJQcZDjN1Nou+Um6OHpnooMHeEq0CdGuLSiv2xVmuQnRjI5MfG5re/a3l39hSzi9tPLWi1y7uOLCtQFooJw3H+LhiKZcgAtEnkTmEhUCEu5uZ7cp4lWhrQZWCR5mCDNtJrGHjiw=
|
||||
- secure: UkW6SpgeACb6enGZADTAtPPRe23Tffne/SRQoBsZ3kGbKzgv8kTCLY0G5N71B1xEGdLB/36piOa0yji2SMW1jbflxR7tdOsiNpfd9R5qYqWVZRulY0qite8ZCwU5dqgy87pp4ECC1hNSOTq17aa4Sc4G4egg9AOy8cntLBTtxJA=
|
||||
- secure: rb/MKPHEK8yOK5uYpXq2o+MQ7h65ft+c/xE9XmLFk1jLnK0oxe6+KeoSFlQ0n5UwLSsHrytMXVaUHex6EEt0TheXFlohi7BcNFWRWXr+wLucuaPjMnU49VErrSigjJ5VW/rcR7fORmnDwn5y06r3Rer9SC1hImCxf/pqF8hFZps=
|
||||
- secure: FXJzm98lwbc1R2eh9/CvVReVRHEPLDm+sCRjiV9HJgeCveIUauLasp9Skamz0c6OKLmkjLY8JERPT491ZgCG8YcQ9x1bM8HGbmRqnn9xSUxINIRzVmyTiLMBoT/ibHHeFjFpyiGfukOAkHwMNNsrSrbaekhiJuekaXo7iTwYQB0=
|
||||
before_install:
|
||||
- date
|
||||
- brew update
|
||||
- sh travis/install-qt.sh
|
||||
- brew install libical
|
||||
- brew install libusb libusb-compat
|
||||
- brew install srmio
|
||||
- brew install libsamplerate
|
||||
## Disable KML for now
|
||||
##- brew install --HEAD travis/libkml.rb
|
||||
- sudo chmod -R +w /usr/local
|
||||
- curl -O http://www.ftdichip.com/Drivers/D2XX/MacOSX/D2XX1.2.2.dmg
|
||||
- git clone --depth 1 https://github.com/sintegrial/qwtplot3d.git qwtplot3d
|
||||
- cd qwtplot3d
|
||||
- CC=clang CXX=clang++ /usr/local/opt/$QT_PATH/bin/qmake -makefile -recursive QMAKE_CXXFLAGS_WARN_ON+=-Wno-unused-private-field
|
||||
- CC=clang CXX=clang++ make -j2
|
||||
- cd ..
|
||||
- git clone --branch 0.98 https://github.com/kypeli/kQOAuth.git kQOAuth-0.98
|
||||
- cd kQOAuth-0.98
|
||||
- CC=clang CXX=clang++ /usr/local/opt/$QT_PATH/bin/qmake -makefile -recursive QMAKE_CXXFLAGS_WARN_ON+=-Wno-unused-private-field
|
||||
- CC=clang CXX=clang++ make -j2 qmake_all
|
||||
- CC=clang CXX=clang++ sudo make install
|
||||
- cd ..
|
||||
- hdiutil mount D2XX1.2.2.dmg
|
||||
before_script:
|
||||
- mkdir D2XX
|
||||
- cp /Volumes/release/D2XX/Object/10.5-10.7/x86_64/libftd2xx.1.2.2.dylib D2XX
|
||||
- sudo cp /Volumes/release/D2XX/Object/10.5-10.7/x86_64/libftd2xx.1.2.2.dylib /usr/local/lib
|
||||
- cp /Volumes/release/D2XX/bin/*.h D2XX
|
||||
- sed -i "" "s|libftd2xx.dylib|@executable_path/../Frameworks/libftd2xx.1.2.2.dylib|"
|
||||
src/D2XX.cpp
|
||||
- cp qwt/qwtconfig.pri.in qwt/qwtconfig.pri
|
||||
- cp src/gcconfig.pri.in src/gcconfig.pri
|
||||
- /usr/local/opt/$QT_PATH/bin/lupdate src/src.pro
|
||||
- sed -i "" "s|#\(CONFIG += release.*\)|\1 static |" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(QMAKE_LRELEASE\).*|\1 += /usr/local/opt/$QT_PATH/bin/lrelease|"
|
||||
src/gcconfig.pri
|
||||
- sed -i "" "s|#\(QMAKE_CXXFLAGS\).*|\1_RELEASE += -mmacosx-version-min=10.7 -arch
|
||||
x86_64|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(SRMIO_INSTALL =.*\)|\1 /usr/local|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(D2XX_INCLUDE =.*\)|\1 ../D2XX|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(D2XX_LIBS =.*\)|\1 -L../D2XX -lftd2xx.1.2.2|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(KQOAUTH_INSTALL =.*\)|\1 /usr/local|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(KQOAUTH_INCLUDE =.*\)|\1 \$\$[QT_INSTALL_LIBS]/kqoauth.framework/Headers|"
|
||||
src/gcconfig.pri
|
||||
- sed -i "" "s|#\(KQOAUTH_LIBS =.*\)|\1 -F\$\$[QT_INSTALL_LIBS] -framework kqoauth|"
|
||||
src/gcconfig.pri
|
||||
- sed -i "" "s|#\(QWT3D_INSTALL =.*\)|\1 ../qwtplot3d|" src/gcconfig.pri
|
||||
## Disable KML for now
|
||||
##- sed -i "" "s|#\(KML_INSTALL =\).*|\1 /usr/local|" src/gcconfig.pri
|
||||
##- sed -i "" "s|#\(KML_LIBS =.*\)|\1 -L/usr/local/lib -lkmlxsd -lkmlregionator -lkmldom
|
||||
## -lkmlconvenience -lkmlengine -lkmlbase|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(ICAL_INSTALL =.*\)|\1 /usr/local|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(ICAL_LIBS =.*\)|\1 -L/usr/local/lib -lical|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(LIBUSB_INSTALL =\).*|\1 /usr/local|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(LIBUSB_LIBS =.*\)|\1 -L/usr/local/lib -lusb|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(SAMPLERATE_INSTALL =\).*|\1 /usr/local|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(SAMPLERATE_LIBS =\).*|\1 -L/usr/local/lib -lsamplerate|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(DEFINES += GC_HAVE_LION*\)|\1|" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(HTPATH = ../httpserver.*\)|\1 |" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(DEFINES += GC_DROPBOX*\)|\1 |" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(DEFINES += GC_WANT_ROBOT.*\)|\1 |" src/gcconfig.pri
|
||||
- sed -i "" "s|\(DEFINES += GC_VIDEO_NONE.*\)|#\1 |" src/gcconfig.pri
|
||||
- sed -i "" "s|#\(DEFINES += GC_VIDEO_QUICKTIME.*\)|\1 |" src/gcconfig.pri
|
||||
- echo "QMAKE_CFLAGS_RELEASE += -mmacosx-version-min=10.7 -arch x86_64" >> src/gcconfig.pri
|
||||
- sed -i "" "s/__GC_GOOGLE_CALENDAR_CLIENT_SECRET__/"$GC_GOOGLE_CALENDAR_CLIENT_SECRET"/" src/Secrets.h
|
||||
- sed -i "" "s/__GC_STRAVA_CLIENT_SECRET__/"$GC_STRAVA_CLIENT_SECRET"/" src/Secrets.h
|
||||
- sed -i "" "s/__GC_DROPBOX_CLIENT_SECRET__/"$GC_DROPBOX_CLIENT_SECRET"/" src/Secrets.h
|
||||
- sed -i "" "s/__GC_CYCLINGANALYTICS_CLIENT_SECRET__/"$GC_CYCLINGANALYTICS_CLIENT_SECRET"/" src/Secrets.h
|
||||
- sed -i "" "s/__GC_TWITTER_CONSUMER_SECRET__/"$GC_TWITTER_CONSUMER_SECRET"/" src/Secrets.h
|
||||
- cat src/gcconfig.pri
|
||||
script:
|
||||
- CC=clang CXX=clang++ /usr/local/opt/$QT_PATH/bin/qmake -makefile -recursive QMAKE_CXXFLAGS_WARN_ON+=-Wno-unused-private-field
|
||||
- CC=clang CXX=clang++ make qmake_all
|
||||
- CC=clang CXX=clang++ make -j4 sub-qwt --silent
|
||||
- CC=clang CXX=clang++ make -j4 sub-src
|
||||
after_success:
|
||||
- cd src
|
||||
- ls -laR GoldenCheetah.app
|
||||
- sh travis/check-gc.sh
|
||||
- /usr/local/opt/$QT_PATH/bin/macdeployqt GoldenCheetah.app -verbose=2 -dmg
|
||||
- brew remove $QT
|
||||
- mv GoldenCheetah.dmg GoldenCheetah_$QT.dmg
|
||||
- hdiutil mount GoldenCheetah_$QT.dmg
|
||||
- cd /Volumes/GoldenCheetah_$QT
|
||||
- ls -laR GoldenCheetah.app
|
||||
- GoldenCheetah.app/Contents/MacOS/GoldenCheetah --help
|
||||
|
||||
deploy:
|
||||
provider: releases
|
||||
api_key: $GH_OAUTH_TOKEN
|
||||
file: GoldenCheetah_$QT.dmg
|
||||
skip_cleanup: true
|
||||
on:
|
||||
tags: true
|
||||
@@ -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
|
||||
|
||||
@@ -2,8 +2,14 @@ Golden Cheetah install and build instructions are documented
|
||||
for each platform;
|
||||
|
||||
INSTALL-WIN32 For building on Microsoft Windows
|
||||
|
||||
INSTALL-LINUX For building on Ubuntu Linux
|
||||
|
||||
INSTALL-MAC For building on Apple OS X
|
||||
|
||||
|
||||
[](https://travis-ci.org/GoldenCheetah/GoldenCheetah)
|
||||
|
||||
Alternatively official builds are available from http://www.goldencheetah.org
|
||||
|
||||
whilst latest developer builds are available from http://goldencheetah.stand2surf.net
|
||||
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 |
BIN
doc/user/Convert_Texinfo_to_GitHub_MD.exe
Normal file
46
doc/user/GC31-Announce.txt
Normal file
@@ -0,0 +1,46 @@
|
||||
We are proud to announce that GoldenCheetah v3.1 was released today.
|
||||
|
||||
It can be downloaded from our new website[http://www.goldencheetah.org/index.html#section-download]
|
||||
|
||||
We have recorded a video[https://vimeo.com/99817526] to explain the main changes, and the user guide[https://github.com/GoldenCheetah/GoldenCheetah/wiki/Main-Page_Users-Guide] has been overhauled to cover all the main features along with an updated FAQ[https://github.com/GoldenCheetah/GoldenCheetah/wiki/FAQ].
|
||||
|
||||
We have also added a section on the science of GoldenCheetah[http://www.goldencheetah.org/index.html#section-science] to help users new to power training and analysis.
|
||||
|
||||
MAJOR NEW FEATURES
|
||||
|
||||
1. Compare Mode
|
||||
* Across Summary, Ride, QA, CP, Histogram, Metric charts
|
||||
* Compare Athletes, Seasons, Rides, Intervals
|
||||
* Easy and intuitive user interface
|
||||
|
||||
2. Additional Power Duration Models
|
||||
* Multiple PD models now available
|
||||
* Track changes in model estimates for W', CP, P-Max, FTP over time
|
||||
* Track changes in model estimates for any duration over time
|
||||
|
||||
2. Merge data from multiple rides into a single ride
|
||||
3. Share Dialog to upload to multiple services in one click
|
||||
|
||||
OTHER SELECTED HIGHLIGHTS
|
||||
|
||||
* Open Athletes in Tabs
|
||||
* Redesign Tabbed mode with a ChartBar
|
||||
* Themes and better support for color customisation
|
||||
* Improved Interactivity (axes, interval hover)
|
||||
|
||||
Device enhancements
|
||||
* Fixed up Tacx Fortius Support
|
||||
* Pedal Smoothness / Torque Effectiveness support
|
||||
|
||||
Metrics and new science
|
||||
* Plot best x power
|
||||
* Plot estimated W', CP, FTP et al
|
||||
* W'bal implemented with metrics
|
||||
|
||||
Charts
|
||||
* Improved UX for chart configuration and setup
|
||||
* Export data for MMP curves, trends data
|
||||
* Over 50 new charting options (heat, stack, labels etc etc)
|
||||
|
||||
Work on 3.11 starts today, focusing on indoor training.
|
||||
|
||||
|
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 |