Compare commits
2485 Commits
v3.1
...
v4.0-DEV16
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f9ae19f7ed | ||
|
|
ec2738d023 | ||
|
|
f144480068 | ||
|
|
77248ecf56 | ||
|
|
6e8ef811f0 | ||
|
|
f4effc77dd | ||
|
|
dfd3b4e572 | ||
|
|
21d2c0bedf | ||
|
|
ac4a9d4f00 | ||
|
|
10d000ee04 | ||
|
|
30464db0af | ||
|
|
c771c57d83 | ||
|
|
3cc9888090 | ||
|
|
a1643d2d68 | ||
|
|
d428edb082 | ||
|
|
c168d2f74a | ||
|
|
c7c7ee6b68 | ||
|
|
2a1c56311b | ||
|
|
c41d5758f9 | ||
|
|
dae9863649 | ||
|
|
9ca6990c1a | ||
|
|
aa70fbca81 | ||
|
|
08f71fa859 | ||
|
|
0c48b0caf0 | ||
|
|
7ddb569079 | ||
|
|
f6bdefe4c1 | ||
|
|
f65be7f793 | ||
|
|
7f78699023 | ||
|
|
7e0d64d99f | ||
|
|
1a13e1c961 | ||
|
|
c657654a2e | ||
|
|
7b257a4bb1 | ||
|
|
55b7b6781d | ||
|
|
c277d2fc68 | ||
|
|
d1c636afa9 | ||
|
|
6a1e7e9bed | ||
|
|
8dc42e233e | ||
|
|
6ac937884f | ||
|
|
53591fd8a7 | ||
|
|
5d4157d7fe | ||
|
|
5b1dbcec35 | ||
|
|
9345fa47ca | ||
|
|
b9a5c9345d | ||
|
|
41df2a234d | ||
|
|
53083c792b | ||
|
|
7db149c37e | ||
|
|
42d8d03855 | ||
|
|
6c56620fbf | ||
|
|
0f0aec935b | ||
|
|
967077e809 | ||
|
|
a4e7291d08 | ||
|
|
0aab0bc236 | ||
|
|
88e559d07e | ||
|
|
7fe0babd43 | ||
|
|
872f5d7f9f | ||
|
|
c3d1bf9cbd | ||
|
|
637214283a | ||
|
|
ce40818add | ||
|
|
9e959c1fc6 | ||
|
|
5e6ddba735 | ||
|
|
6158666e5c | ||
|
|
7335e523e8 | ||
|
|
b312bb23c6 | ||
|
|
053e28311a | ||
|
|
3e5a19f284 | ||
|
|
bbdb82f33d | ||
|
|
ff1d7b9e28 | ||
|
|
120b31d758 | ||
|
|
042e215df1 | ||
|
|
f201ad8823 | ||
|
|
fbc9e2c708 | ||
|
|
277a05925e | ||
|
|
054f1d7ceb | ||
|
|
b189ddf4db | ||
|
|
afd1a6ab6c | ||
|
|
54ce2aeaa7 | ||
|
|
b0a90589c2 | ||
|
|
19790f5c33 | ||
|
|
ff867e1b22 | ||
|
|
2a914b60c8 | ||
|
|
17a7b4f660 | ||
|
|
5ad0f237ee | ||
|
|
35678e2765 | ||
|
|
915adb79f0 | ||
|
|
782bc43904 | ||
|
|
dde16978ad | ||
|
|
717fab4337 | ||
|
|
d0cf13369e | ||
|
|
09e97f0ce9 | ||
|
|
f6ccddcf67 | ||
|
|
f2a279154d | ||
|
|
25e8b7fa5d | ||
|
|
6d567b691a | ||
|
|
b048194bb7 | ||
|
|
4e26c1afa2 | ||
|
|
d5b8cea918 | ||
|
|
fb9814d740 | ||
|
|
9623351c06 | ||
|
|
750e032631 | ||
|
|
09782f666f | ||
|
|
1047ab9083 | ||
|
|
81910cfdc6 | ||
|
|
809c9334b7 | ||
|
|
11a6e130e9 | ||
|
|
56bd39f494 | ||
|
|
357f4224db | ||
|
|
e9268e9121 | ||
|
|
8d6e215d63 | ||
|
|
dfa4ab9659 | ||
|
|
ba57688b2d | ||
|
|
5d8ab001a2 | ||
|
|
f0dde6cb0e | ||
|
|
9b6a64d8d0 | ||
|
|
4a60c0ab94 | ||
|
|
d73edc5302 | ||
|
|
8576d794b3 | ||
|
|
6206ee9e07 | ||
|
|
63f3196897 | ||
|
|
a133d33f9e | ||
|
|
ae78d5d360 | ||
|
|
0fdb0c14d9 | ||
|
|
a6d16f15d3 | ||
|
|
8eef4e7eec | ||
|
|
bde354dd21 | ||
|
|
d05f44a0e2 | ||
|
|
b7423c2fce | ||
|
|
3bd0edb4e3 | ||
|
|
5d3f9b88cd | ||
|
|
aa1cd718b0 | ||
|
|
0f114b4135 | ||
|
|
23e9b8009d | ||
|
|
bedb15e29c | ||
|
|
8664f2b105 | ||
|
|
0bac511391 | ||
|
|
86db9e78a4 | ||
|
|
c9ede38d0f | ||
|
|
ea11ae92ec | ||
|
|
bd2fa41e0d | ||
|
|
1d31577119 | ||
|
|
8fed460543 | ||
|
|
477f413553 | ||
|
|
cba2c3ee43 | ||
|
|
6d0b523189 | ||
|
|
846727dd94 | ||
|
|
76c95b7298 | ||
|
|
7a5a126b4d | ||
|
|
a7ed36cff7 | ||
|
|
1cb9c71dda | ||
|
|
94b6521918 | ||
|
|
7f8305c2b3 | ||
|
|
dfb398dd81 | ||
|
|
421ee3b128 | ||
|
|
ab17f42596 | ||
|
|
5267b9c1da | ||
|
|
5daefcaf4f | ||
|
|
92b9c9736d | ||
|
|
869036de82 | ||
|
|
cfcffc88d8 | ||
|
|
f1a2da3847 | ||
|
|
2ef4ad838a | ||
|
|
324d7a2d7c | ||
|
|
2eb662785e | ||
|
|
0b7fdd8b88 | ||
|
|
65d1e9f91a | ||
|
|
007d94282f | ||
|
|
b7a12553c7 | ||
|
|
74c75e11d1 | ||
|
|
067cac240a | ||
|
|
7cb0a49a25 | ||
|
|
01121b0f4c | ||
|
|
9021d72725 | ||
|
|
b2bc8df586 | ||
|
|
533d283356 | ||
|
|
ea0096cbe9 | ||
|
|
66c1ddebfb | ||
|
|
0bb71a8d9a | ||
|
|
4120a18bdc | ||
|
|
2e894e629f | ||
|
|
c752449ab3 | ||
|
|
5c758e7c44 | ||
|
|
07f50fec7b | ||
|
|
18d795be74 | ||
|
|
183ba72658 | ||
|
|
4e1867b823 | ||
|
|
851dc1b627 | ||
|
|
eabc80b84e | ||
|
|
ff4950f84d | ||
|
|
80f11bad54 | ||
|
|
04768ebeca | ||
|
|
4fba1da587 | ||
|
|
0b8cff4053 | ||
|
|
a917460d44 | ||
|
|
c0310fe9f4 | ||
|
|
e60554f958 | ||
|
|
ccaff70a40 | ||
|
|
1c12c593a3 | ||
|
|
01c8da904f | ||
|
|
5e9e02aaae | ||
|
|
1b5b700ace | ||
|
|
9fd91e6da5 | ||
|
|
d66c8a40b0 | ||
|
|
bb8d292f0d | ||
|
|
244eaf2802 | ||
|
|
0d7143bd88 | ||
|
|
40e5d45a5c | ||
|
|
a5a9824295 | ||
|
|
ee07b18a7b | ||
|
|
2725ea7d29 | ||
|
|
f1571fb482 | ||
|
|
5584723811 | ||
|
|
ef7d1d3795 | ||
|
|
1fcc94c7f4 | ||
|
|
ef48e0c7b7 | ||
|
|
d160467f0d | ||
|
|
c0a8422c30 | ||
|
|
fe1609eb0e | ||
|
|
1639abee81 | ||
|
|
a4a67cba56 | ||
|
|
b52d865998 | ||
|
|
89b5aff954 | ||
|
|
7f2c42898b | ||
|
|
08dca02f13 | ||
|
|
78834c1bfc | ||
|
|
7065d70960 | ||
|
|
3ea174a81b | ||
|
|
7b09d3a115 | ||
|
|
342a33ebc1 | ||
|
|
76c80bab5d | ||
|
|
32f66e6e0b | ||
|
|
ba41b4b98f | ||
|
|
958c0717a5 | ||
|
|
c74c74ea27 | ||
|
|
d65a58d452 | ||
|
|
df12830a61 | ||
|
|
ed4ab41077 | ||
|
|
0949c6070a | ||
|
|
016ba66a3a | ||
|
|
da82e01ef5 | ||
|
|
d92b7baf50 | ||
|
|
ba78b36b6d | ||
|
|
f971ccff4b | ||
|
|
5ae5da1b0f | ||
|
|
6c707fd94f | ||
|
|
37441f108d | ||
|
|
ec3e38158f | ||
|
|
63d273de50 | ||
|
|
aa0cf5b2d6 | ||
|
|
7958cd7cce | ||
|
|
1a5f0780a1 | ||
|
|
414c9eb15f | ||
|
|
3cb292a88e | ||
|
|
ca5d636e45 | ||
|
|
05a3869b54 | ||
|
|
9f06d48c42 | ||
|
|
e55d1af0f2 | ||
|
|
d44e4bea31 | ||
|
|
f470803ac2 | ||
|
|
2b6af76527 | ||
|
|
b3c09260f9 | ||
|
|
60f66982b3 | ||
|
|
f6062ab5ef | ||
|
|
dcac0a0925 | ||
|
|
255aadab46 | ||
|
|
a072163db2 | ||
|
|
5d4679b035 | ||
|
|
ff50dcebba | ||
|
|
6a69b6c3a8 | ||
|
|
fb19cf9691 | ||
|
|
f8076d1d09 | ||
|
|
cb6fb85181 | ||
|
|
5591ea7bc7 | ||
|
|
30412d5a0f | ||
|
|
afb3be78b6 | ||
|
|
c8ee808916 | ||
|
|
b9bcd5fd90 | ||
|
|
2f4e94259c | ||
|
|
012511d6c6 | ||
|
|
01e0e3c8ad | ||
|
|
d5e0097816 | ||
|
|
986085619d | ||
|
|
dfbb035971 | ||
|
|
68ad8b7bb3 | ||
|
|
66b2b111a0 | ||
|
|
b1a3cd58f9 | ||
|
|
bdb8d63a30 | ||
|
|
2b3505462c | ||
|
|
7cc82c857b | ||
|
|
dbf8b09548 | ||
|
|
8e240ee661 | ||
|
|
fa7d4a9a95 | ||
|
|
a49e9cdb92 | ||
|
|
7cc2cc6cd7 | ||
|
|
f7c31a78be | ||
|
|
3cccd647ec | ||
|
|
58352f4b72 | ||
|
|
3f046bcecd | ||
|
|
113ce091fa | ||
|
|
78dc9ddb8a | ||
|
|
9824770110 | ||
|
|
dae514f586 | ||
|
|
135df4b3ab | ||
|
|
74ca328196 | ||
|
|
56bf17c6d1 | ||
|
|
c624433386 | ||
|
|
945d3fd7c1 | ||
|
|
6d571b8ca5 | ||
|
|
efe97be345 | ||
|
|
577e08930e | ||
|
|
cd3474b810 | ||
|
|
19aa3e142c | ||
|
|
f6323a67ab | ||
|
|
e4216c351b | ||
|
|
58f2840050 | ||
|
|
20bed06094 | ||
|
|
4453e869b7 | ||
|
|
bea64dc718 | ||
|
|
83dea1b3b1 | ||
|
|
a7b561e7a3 | ||
|
|
874779ec09 | ||
|
|
77cadf2874 | ||
|
|
5106549120 | ||
|
|
bca2d5145b | ||
|
|
1e0cb4a39f | ||
|
|
2fb2b7aa4c | ||
|
|
cc8253489e | ||
|
|
7a2a3050c6 | ||
|
|
e725c77e5e | ||
|
|
f445189e77 | ||
|
|
a1e89909b1 | ||
|
|
95bffb30af | ||
|
|
38c54628de | ||
|
|
284864bb95 | ||
|
|
04ec5349bd | ||
|
|
5e59fbe0b7 | ||
|
|
229a43062b | ||
|
|
6d4207871d | ||
|
|
222ccc4708 | ||
|
|
2ca332911f | ||
|
|
4b6de65e04 | ||
|
|
192708c3ab | ||
|
|
2bf9337cda | ||
|
|
e7fa19e5d6 | ||
|
|
f70f175e92 | ||
|
|
682f33c6ba | ||
|
|
2057669fbe | ||
|
|
512fc323ed | ||
|
|
1c6843cdb8 | ||
|
|
d743fdd3ec | ||
|
|
cc5ba4bf29 | ||
|
|
d86215c5a0 | ||
|
|
484a59a640 | ||
|
|
9935edecd3 | ||
|
|
c46bc137a0 | ||
|
|
fa47344b8e | ||
|
|
a7728c6bc2 | ||
|
|
c329f2bb08 | ||
|
|
9b7597edd7 | ||
|
|
c9e1c919e3 | ||
|
|
cff326a1b1 | ||
|
|
1f126c98e0 | ||
|
|
e1e834aa08 | ||
|
|
8080712d4a | ||
|
|
711cf13372 | ||
|
|
c6d2fef46c | ||
|
|
faff84a552 | ||
|
|
b7eadf9fb1 | ||
|
|
274fa7e8f8 | ||
|
|
5016300650 | ||
|
|
913a0d0c70 | ||
|
|
8eef00d99d | ||
|
|
e44cd3f696 | ||
|
|
15ba65544e | ||
|
|
2497d5060a | ||
|
|
527a0fa81b | ||
|
|
692f5db5f9 | ||
|
|
078d4ac5ad | ||
|
|
95479401d9 | ||
|
|
2f91591198 | ||
|
|
ae9c2b15f4 | ||
|
|
0f12872e6f | ||
|
|
212e53563f | ||
|
|
aa6f6b78a4 | ||
|
|
b24592441b | ||
|
|
b0aff76866 | ||
|
|
3a0f6d3ef4 | ||
|
|
55f036eca1 | ||
|
|
79c2ff3c43 | ||
|
|
c7a123907c | ||
|
|
48e7dda3a5 | ||
|
|
b73885378f | ||
|
|
6a6a29c9d2 | ||
|
|
d96d115838 | ||
|
|
a872ebd7c6 | ||
|
|
6becfe2aef | ||
|
|
8e230c15af | ||
|
|
7ffcdec165 | ||
|
|
10306ca3e1 | ||
|
|
bca7990776 | ||
|
|
6b9af54899 | ||
|
|
149e3a8c2d | ||
|
|
82363469a8 | ||
|
|
eefa8db75b | ||
|
|
16e1ec0a4d | ||
|
|
d6c8949355 | ||
|
|
43d557f558 | ||
|
|
8a033a8c53 | ||
|
|
d50a426448 | ||
|
|
88ee6248b7 | ||
|
|
fb3d9ec816 | ||
|
|
105a3b05db | ||
|
|
007d942f4e | ||
|
|
4c9dc5615a | ||
|
|
e6e25e9fcd | ||
|
|
09b2f4355c | ||
|
|
c9b33c834e | ||
|
|
c93795ee23 | ||
|
|
d7a179907d | ||
|
|
5a114ab66f | ||
|
|
d72e75143a | ||
|
|
5011b7bf64 | ||
|
|
cbf5b34ded | ||
|
|
59c13e15ec | ||
|
|
6aaf5a2a7e | ||
|
|
071de7ef07 | ||
|
|
0909a67eba | ||
|
|
553ade5a9c | ||
|
|
39bb27f3d8 | ||
|
|
5e66df56bd | ||
|
|
22ae3500ee | ||
|
|
8520205c53 | ||
|
|
bba2c903e4 | ||
|
|
dfe4395b6b | ||
|
|
6ac6debca2 | ||
|
|
263d4e0069 | ||
|
|
8f8e7593d5 | ||
|
|
1a85bbd70f | ||
|
|
6bea3d2a3a | ||
|
|
d02951453e | ||
|
|
69395e6cda | ||
|
|
4cb26cf27c | ||
|
|
282445abc9 | ||
|
|
1717cd4605 | ||
|
|
56273ea0aa | ||
|
|
fcd7c778f5 | ||
|
|
2c64ffa83f | ||
|
|
45880246f0 | ||
|
|
28f77538ae | ||
|
|
fc223b3b77 | ||
|
|
1e51f05491 | ||
|
|
62d8285f2a | ||
|
|
253cca6027 | ||
|
|
5902365456 | ||
|
|
eb6fda0223 | ||
|
|
994893c928 | ||
|
|
7945290079 | ||
|
|
b21fba4367 | ||
|
|
cd6d1852b2 | ||
|
|
558caa85a5 | ||
|
|
0485c873f4 | ||
|
|
a0f3b33304 | ||
|
|
59a6b961c7 | ||
|
|
92a4ec6730 | ||
|
|
f361a27028 | ||
|
|
76c778b158 | ||
|
|
25ba461a8e | ||
|
|
1fd039f95e | ||
|
|
453c8ecdd0 | ||
|
|
ee741d8753 | ||
|
|
bccfe24024 | ||
|
|
89c79e0549 | ||
|
|
04ee639c69 | ||
|
|
cb90839b45 | ||
|
|
fcd8920507 | ||
|
|
addc85afa9 | ||
|
|
0985c56c76 | ||
|
|
1e9952f336 | ||
|
|
7ae6518f25 | ||
|
|
d888c13157 | ||
|
|
89e2a88d0c | ||
|
|
73815f570c | ||
|
|
0001aedad7 | ||
|
|
b5427d4c34 | ||
|
|
27b267e336 | ||
|
|
a40f2239c2 | ||
|
|
3db4863d40 | ||
|
|
70b692ec88 | ||
|
|
5d7df47619 | ||
|
|
40324a6839 | ||
|
|
63665aba67 | ||
|
|
fd90525f10 | ||
|
|
d37e5afaf4 | ||
|
|
364bc3b186 | ||
|
|
1eb27f0176 | ||
|
|
aaba5e8f0d | ||
|
|
6613f2c9ee | ||
|
|
8c5d13fc25 | ||
|
|
483b513c9b | ||
|
|
ac6c9b29d0 | ||
|
|
54014e0bd9 | ||
|
|
1bcd7cd860 | ||
|
|
6f91980228 | ||
|
|
1a1d1fd353 | ||
|
|
95ff987fb5 | ||
|
|
6a82e19e3b | ||
|
|
a37fe414b2 | ||
|
|
c9e00ee522 | ||
|
|
53e361ca05 | ||
|
|
ca38fff251 | ||
|
|
4d075f3571 | ||
|
|
541d311f8e | ||
|
|
2dd42913be | ||
|
|
eef8192420 | ||
|
|
1fa9db220c | ||
|
|
867efe2c39 | ||
|
|
5192d6f225 | ||
|
|
7d5b6a8bd6 | ||
|
|
7cf63b4f15 | ||
|
|
92071e3e9a | ||
|
|
dc8ca6cf75 | ||
|
|
dbe5632e94 | ||
|
|
490af9381a | ||
|
|
b39427256d | ||
|
|
32dc6fecf3 | ||
|
|
7886b5e120 | ||
|
|
e74e8fc4dd | ||
|
|
c90264702f | ||
|
|
65f522f732 | ||
|
|
07e74f7165 | ||
|
|
e7cc1f09bd | ||
|
|
d0b155c12d | ||
|
|
a3c5e2c495 | ||
|
|
154a46b66d | ||
|
|
b41bba4a79 | ||
|
|
9d41a376a8 | ||
|
|
1613f032ff | ||
|
|
e476c5d732 | ||
|
|
e79fc3753f | ||
|
|
40a061eda9 | ||
|
|
c1e893187b | ||
|
|
d73a55ebc9 | ||
|
|
62aced9ada | ||
|
|
5bbf5bd5af | ||
|
|
f466cda9df | ||
|
|
66c403a3c2 | ||
|
|
f7d222d99d | ||
|
|
4b38aff80f | ||
|
|
4516c866fb | ||
|
|
b881771b47 | ||
|
|
f65b62c13d | ||
|
|
555e8698fc | ||
|
|
818b1cd573 | ||
|
|
bdb599cc62 | ||
|
|
00b8c2cdf6 | ||
|
|
6a85293872 | ||
|
|
e0ac708082 | ||
|
|
c15451a85c | ||
|
|
a54370f6d8 | ||
|
|
fb717eefce | ||
|
|
f5744a49af | ||
|
|
3111ede203 | ||
|
|
7f7cc46992 | ||
|
|
751a57c7a0 | ||
|
|
cb7501ba5d | ||
|
|
58f5fbb2b4 | ||
|
|
80adc0bfa0 | ||
|
|
6e2d9593e5 | ||
|
|
5cf48bb5bb | ||
|
|
8a5708c219 | ||
|
|
0a259ade8f | ||
|
|
d70e8c4af7 | ||
|
|
11e78739ff | ||
|
|
c294e1ff4d | ||
|
|
b642b45312 | ||
|
|
e8bd6a8002 | ||
|
|
6cf627b2fb | ||
|
|
a26c8d2ee7 | ||
|
|
b67eb536f7 | ||
|
|
427d2cd346 | ||
|
|
95d8c60761 | ||
|
|
eab115c470 | ||
|
|
3c65bc2ea4 | ||
|
|
a1ee851c36 | ||
|
|
c3ef27c340 | ||
|
|
0d868745ad | ||
|
|
4048bf4ef8 | ||
|
|
3552485227 | ||
|
|
4df48f0168 | ||
|
|
1d1eba3799 | ||
|
|
f1c4908e3c | ||
|
|
fcc9df724a | ||
|
|
9de481c2b2 | ||
|
|
0e459c1013 | ||
|
|
e10db64186 | ||
|
|
f18d9e13bb | ||
|
|
aba22f315c | ||
|
|
17019ff00a | ||
|
|
2055c27944 | ||
|
|
65bee72699 | ||
|
|
3e4339251a | ||
|
|
f893f17594 | ||
|
|
18f3a87eaf | ||
|
|
68ae5d74c0 | ||
|
|
4503b3a351 | ||
|
|
1e9893e569 | ||
|
|
ba778fa76f | ||
|
|
cb2a89641d | ||
|
|
6539791e01 | ||
|
|
3391ccbfdb | ||
|
|
13823bdff4 | ||
|
|
32432ab068 | ||
|
|
28eb6e1b7d | ||
|
|
6752adfe52 | ||
|
|
01839be878 | ||
|
|
2e22b76464 | ||
|
|
ea6224f8c7 | ||
|
|
c784ccde13 | ||
|
|
3e2dccd91a | ||
|
|
591ac9b753 | ||
|
|
d3abf3f99e | ||
|
|
c22fe3b315 | ||
|
|
718a838709 | ||
|
|
db6c662207 | ||
|
|
fd386a473b | ||
|
|
f04f3c9cea | ||
|
|
506f4a71bc | ||
|
|
ed0edc2d22 | ||
|
|
c517fd3c7b | ||
|
|
6b996c27b3 | ||
|
|
7cb8daefa3 | ||
|
|
a18358f998 | ||
|
|
ff4585a863 | ||
|
|
feee94b4fb | ||
|
|
695c78f126 | ||
|
|
39ab699e41 | ||
|
|
363678f729 | ||
|
|
d384f5bad7 | ||
|
|
5e26557130 | ||
|
|
733941f35b | ||
|
|
8c0637754a | ||
|
|
1f87338d09 | ||
|
|
8bb3ffe761 | ||
|
|
1fec549014 | ||
|
|
8279b22f42 | ||
|
|
83f9d44fc2 | ||
|
|
f0ae40fbfa | ||
|
|
02d51156cd | ||
|
|
3c99576313 | ||
|
|
8837306bb6 | ||
|
|
04c5a77d7e | ||
|
|
85437c8c3d | ||
|
|
15b5b596a0 | ||
|
|
a07180b960 | ||
|
|
815e36e463 | ||
|
|
c49fb3acf3 | ||
|
|
f5232e5cb9 | ||
|
|
5d6ba9d868 | ||
|
|
c6a134adb3 | ||
|
|
56944bc09b | ||
|
|
4ee0562f56 | ||
|
|
394591c805 | ||
|
|
d72ea80f15 | ||
|
|
ee6ff308be | ||
|
|
2f9d74d759 | ||
|
|
07ef48ec06 | ||
|
|
4a33fd5f38 | ||
|
|
8290a19b47 | ||
|
|
653199b8ee | ||
|
|
e592d79463 | ||
|
|
55ce8d5103 | ||
|
|
95e5f66fce | ||
|
|
3a514ef77f | ||
|
|
a483edd52e | ||
|
|
96c9d9c6af | ||
|
|
0994827056 | ||
|
|
871b18704a | ||
|
|
0239176ce6 | ||
|
|
dbd6ace7dc | ||
|
|
370217d2b8 | ||
|
|
ef46ceb27c | ||
|
|
8e81ed9c64 | ||
|
|
c6f09f966e | ||
|
|
3c5b41a459 | ||
|
|
5220b84bc3 | ||
|
|
1b81822df3 | ||
|
|
8b17eef298 | ||
|
|
fc4ce118bc | ||
|
|
eded6f5b4d | ||
|
|
5169c16244 | ||
|
|
166f61bc57 | ||
|
|
b0b24c0f3a | ||
|
|
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 | ||
|
|
6a0660bd83 | ||
|
|
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 | ||
|
|
008395d6c9 | ||
|
|
0c57e500a1 | ||
|
|
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 |
35
.gitignore
vendored
@@ -1,16 +1,49 @@
|
||||
Makefile
|
||||
|
||||
.qmake.stash
|
||||
*.o
|
||||
*.so.*
|
||||
*.so
|
||||
*.a
|
||||
*~
|
||||
*.orig
|
||||
*.rej
|
||||
# old skool
|
||||
.svn
|
||||
*.pri
|
||||
*.prl
|
||||
|
||||
# osx noise
|
||||
.DS_Store
|
||||
profile
|
||||
|
||||
# qmake Xcode generator side-effects
|
||||
*.xcodeproj
|
||||
xcshareddata/
|
||||
*.xcworkspace
|
||||
*.pbxproj
|
||||
*.mak
|
||||
*.build/
|
||||
|
||||
moc_*
|
||||
moc/
|
||||
obj/
|
||||
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
|
||||
|
||||
120
.travis.yml
Normal file
@@ -0,0 +1,120 @@
|
||||
branches:
|
||||
- master
|
||||
language:
|
||||
- objective-c
|
||||
compiler:
|
||||
- clang
|
||||
- gcc
|
||||
env:
|
||||
matrix:
|
||||
## Test 4.8 or 5.4.2
|
||||
- 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 $QT
|
||||
- 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|^#CloudDB|CloudDB|" src/gcconfig.pri
|
||||
- sed -i "" "s|^#LIBZ|LIBZ|" 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_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
|
||||
- GoldenCheetah.app/Contents/MacOS/GoldenCheetah --help
|
||||
- /usr/local/opt/$QT_PATH/bin/macdeployqt GoldenCheetah.app -verbose=2 -dmg
|
||||
## fix up the bundle with macdeployqtfix
|
||||
- python ../travis/macdeployqtfix.py GoldenCheetah.app /usr/local/opt/$QT_PATH
|
||||
- brew remove $QT
|
||||
- mv GoldenCheetah.dmg GoldenCheetah_$QT.dmg
|
||||
- hdiutil mount GoldenCheetah_$QT.dmg
|
||||
- cd /Volumes/GoldenCheetah
|
||||
- ls -laR GoldenCheetah.app
|
||||
- GoldenCheetah.app/Contents/MacOS/GoldenCheetah --help
|
||||
##deploy broken in travis, read-only filesystem error
|
||||
##before_deploy:
|
||||
##- gem install mime-types -v 2.6.2
|
||||
##deploy:
|
||||
## provider: releases
|
||||
## api_key: $GH_OAUTH_TOKEN
|
||||
## file: GoldenCheetah_$QT.dmg
|
||||
## skip_cleanup: true
|
||||
## on:
|
||||
## tags: true
|
||||
839
COPYING
@@ -1,285 +1,626 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
0. Definitions.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
1. Source Code.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
2. Basic Permissions.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
14. Revised Versions of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
NO WARRANTY
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
16. Limitation of Liability.
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
@@ -287,15 +628,15 @@ free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
@@ -304,37 +645,31 @@ the "copyright" line and a pointer to where the full notice is found.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
40
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
|
||||
@@ -20,12 +20,11 @@ CONTENTS
|
||||
2. ADDING OPTIONAL DEPENDENCIES
|
||||
- FTDI D2XX
|
||||
- SRMIO
|
||||
- liboauth
|
||||
- kQOAuth
|
||||
- QwtPlot3d
|
||||
- libkml
|
||||
- libusb
|
||||
- libical
|
||||
- libclucene
|
||||
|
||||
|
||||
1. BASIC INSTALLATION WITH MANDATORY DEPENDENCIES
|
||||
@@ -95,12 +94,12 @@ $ cd GoldenCheetah
|
||||
$ ls
|
||||
|
||||
You should see a number of directories such as doc, qwt, src etc. If you are
|
||||
building the latest development release you may need to check it out. At the
|
||||
time of writing the latest development release is release_3.0.0dev, if you
|
||||
want to build version 3 then you should perform the next command, otherwise
|
||||
skip to 1.5.
|
||||
wanting to build a particular release you need to checkout the release. To
|
||||
build a release you need to checkout the code at the tag for the release.
|
||||
|
||||
$ checkout release_3.0.0dev
|
||||
A list of releases can be found at: https://github.com/GoldenCheetah/GoldenCheetah/tags
|
||||
|
||||
$ git checkout V3.3-RC1
|
||||
$ ls
|
||||
|
||||
You will now see an updated version of this walkthrough, please jump to using
|
||||
@@ -228,7 +227,7 @@ And you're up and running.
|
||||
===============================
|
||||
|
||||
- SRMIO
|
||||
- liboauth
|
||||
- kQOAuth
|
||||
- QwtPlot3d
|
||||
- libkml
|
||||
- libusb
|
||||
@@ -245,12 +244,13 @@ should be taken into account.
|
||||
SRMIO (git)
|
||||
./configure CFLAGS="-isysroot /Developer/SDKs/MacOSX10.7.sdk -arch x86_64" CPPFLAGS=-I/usr/local/D2XX/ --disable-dependency-tracking
|
||||
|
||||
2.2 Liboauth - For Twitter support
|
||||
----------------------------------
|
||||
2.2 kQOAuth - For OAuth Authentication
|
||||
--------------------------------------
|
||||
|
||||
oauth (0.8.8)
|
||||
kQOauth (0.98)
|
||||
|
||||
qmake
|
||||
|
||||
./configure CFLAGS="-isysroot /Developer/SDKs/MacOSX10.7.sdk -arch x86_64 CURL_CFLAGS="-I/Developer/SDKs/MacOSX10.7.sdk/usr/include/curl" CURL_LIBS="-lcurl" --disable-dependency-tracking
|
||||
|
||||
2.3 QwtPlot3d - For 3d plot support
|
||||
-----------------------------------
|
||||
@@ -297,15 +297,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,16 @@ 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)
|
||||
|
||||
[](https://scan.coverity.com/projects/goldencheetah-goldencheetah)
|
||||
|
||||
Alternatively official builds are available from http://www.goldencheetah.org
|
||||
|
||||
whilst latest developer builds are available from http://goldencheetah.stand2surf.net
|
||||
@@ -1,3 +1,7 @@
|
||||
TEMPLATE = subdirs
|
||||
SUBDIRS = qwt src
|
||||
SUBDIRS = qwt
|
||||
unix:!macx {
|
||||
SUBDIRS += kqoauth
|
||||
}
|
||||
SUBDIRS += src
|
||||
CONFIG += ordered
|
||||
|
||||
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
|
||||
|
||||
BIN
contrib/GC_Fortius-VR_libusb-0.1_drivers.zip
Normal file
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/contrib/cTSS.pdf
Normal file
BIN
doc/design/refresh events-v311.png
Normal file
|
After Width: | Height: | Size: 173 KiB |
161
doc/design/user metric dialog.bmml
Normal file
@@ -0,0 +1,161 @@
|
||||
<mockup version="1.0" skin="sketch" fontFace="Balsamiq Sans" measuredW="654" measuredH="544" mockupW="499" mockupH="529">
|
||||
<controls>
|
||||
<control controlID="2" controlTypeID="com.balsamiq.mockups::TitleWindow" x="155" y="15" w="499" h="529" measuredW="450" measuredH="400" zOrder="0" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>User%20Defined%20Metric</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="3" controlTypeID="com.balsamiq.mockups::Canvas" x="170" y="237" w="471" h="228" measuredW="100" measuredH="70" zOrder="1" locked="false" isInGroup="-1"/>
|
||||
<control controlID="4" controlTypeID="com.balsamiq.mockups::Label" x="170" y="213" w="77" h="-1" measuredW="33" measuredH="21" zOrder="2" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Code</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="5" controlTypeID="com.balsamiq.mockups::Button" x="552" y="479" w="88" h="27" measuredW="41" measuredH="27" zOrder="3" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>OK</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="7" controlTypeID="com.balsamiq.mockups::Button" x="449" y="479" w="88" h="27" measuredW="64" measuredH="27" zOrder="4" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Cancel</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="8" controlTypeID="com.balsamiq.mockups::Label" x="171" y="487" w="77" h="-1" measuredW="60" measuredH="21" zOrder="5" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Evaluates</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="9" controlTypeID="com.balsamiq.mockups::Label" x="246" y="489" w="27" h="-1" measuredW="25" measuredH="21" zOrder="6" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>false</bold>
|
||||
<text>200</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="10" controlTypeID="com.balsamiq.mockups::Label" x="273" y="489" w="50" h="-1" measuredW="34" measuredH="21" zOrder="7" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>false</bold>
|
||||
<text>Watts</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="11" controlTypeID="com.balsamiq.mockups::Label" x="246" y="468" w="77" h="-1" measuredW="41" measuredH="21" zOrder="8" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Metric</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="12" controlTypeID="com.balsamiq.mockups::Label" x="333" y="489" w="27" h="-1" measuredW="25" measuredH="21" zOrder="9" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>false</bold>
|
||||
<text>200</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="13" controlTypeID="com.balsamiq.mockups::Label" x="360" y="489" w="74" h="-1" measuredW="34" measuredH="21" zOrder="10" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>false</bold>
|
||||
<text>Watts</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="14" controlTypeID="com.balsamiq.mockups::Label" x="333" y="468" w="77" h="-1" measuredW="51" measuredH="21" zOrder="11" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Imperial</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="15" controlTypeID="com.balsamiq.mockups::Label" x="176" y="239" w="451" h="-1" measuredW="312" measuredH="224" zOrder="12" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>%23%20Average%20Power%20%5Cr%23%20Calculated%20using%20samples%20and%20should%20work%20with%5Cr%23%20variable%20sample%20rates%20since%20it%20%5Cr%23%20accumulates%20joules%20and%20duration.%20%5Crrelevant%20%7B%20Data%20contains%20%22P%22%3B%20%7D%5Crinit%20%7B%20joules%20%3C-%200%3B%20secs%20%3C-%200%3B%20%7D%20%5Cr%5Crsample%20%7B%5Cr%09joules%20%3C-%20joules%20+%20%28POWER%20*%20RECINTSECS%29%3B%5Cr%09secs%20%3C-%20secs%20+%20RECINTSECS%3B%5Cr%20%7D%5Cr%5Crvalue%20%7B%20joules%20/%20seconds%3B%20%7D%5Crcount%20%7B%20seconds%3B%20%7D</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="16" controlTypeID="com.balsamiq.mockups::Label" x="170" y="50" w="77" h="-1" measuredW="46" measuredH="21" zOrder="13" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Symbol</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="17" controlTypeID="com.balsamiq.mockups::Label" x="345" y="50" w="77" h="-1" measuredW="72" measuredH="21" zOrder="14" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Description</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="18" controlTypeID="com.balsamiq.mockups::TextInput" x="243" y="47" w="82" h="-1" measuredW="31" measuredH="27" zOrder="15" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>AP</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="20" controlTypeID="com.balsamiq.mockups::TextArea" x="434" y="48" w="207" h="91" measuredW="200" measuredH="140" zOrder="16" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Average%20Power%20computed%20via%20Joules%20to%20account%20for%20variable%20sample%20rates.</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="21" controlTypeID="com.balsamiq.mockups::Label" x="170" y="159" w="77" h="-1" measuredW="77" measuredH="21" zOrder="17" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Metric%20Units</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="22" controlTypeID="com.balsamiq.mockups::Label" x="324" y="159" w="104" h="-1" measuredW="87" measuredH="21" zOrder="18" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Imperial%20Units</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="23" controlTypeID="com.balsamiq.mockups::Label" x="465" y="144" w="80" h="-1" measuredW="68" measuredH="37" zOrder="19" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Conversion%5CrFactor</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="24" controlTypeID="com.balsamiq.mockups::Label" x="567" y="144" w="77" h="-1" measuredW="68" measuredH="37" zOrder="20" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Conversion%5CrSum</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="25" controlTypeID="com.balsamiq.mockups::TextInput" x="170" y="180" w="129" h="-1" measuredW="48" measuredH="27" zOrder="21" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Watts</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="26" controlTypeID="com.balsamiq.mockups::TextInput" x="324" y="180" w="119" h="-1" measuredW="48" measuredH="27" zOrder="22" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Watts</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="27" controlTypeID="com.balsamiq.mockups::TextInput" x="465" y="180" w="80" h="-1" measuredW="38" measuredH="27" zOrder="23" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>1.00</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="28" controlTypeID="com.balsamiq.mockups::TextInput" x="564" y="180" w="78" h="-1" measuredW="41" measuredH="27" zOrder="24" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>0.00</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="29" controlTypeID="com.balsamiq.mockups::Label" x="170" y="118" w="77" h="-1" measuredW="57" measuredH="21" zOrder="25" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Precision</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="30" controlTypeID="com.balsamiq.mockups::TextInput" x="243" y="115" w="82" h="-1" measuredW="23" measuredH="27" zOrder="26" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>2</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="31" controlTypeID="com.balsamiq.mockups::Label" x="170" y="86" w="77" h="-1" measuredW="31" measuredH="21" zOrder="27" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<bold>true</bold>
|
||||
<text>Type</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
<control controlID="32" controlTypeID="com.balsamiq.mockups::ComboBox" x="243" y="82" w="-1" h="-1" measuredW="77" measuredH="24" zOrder="28" locked="false" isInGroup="-1">
|
||||
<controlProperties>
|
||||
<text>Average</text>
|
||||
</controlProperties>
|
||||
</control>
|
||||
</controls>
|
||||
</mockup>
|
||||
BIN
doc/design/user metric dialog.png
Normal file
|
After Width: | Height: | Size: 103 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.
|
||||
|
||||
20
doc/user/announce-sites.txt
Normal file
@@ -0,0 +1,20 @@
|
||||
Sites to announce releases / updates on
|
||||
|
||||
|
||||
* English
|
||||
|
||||
Google Groups: golden-cheetah-announce, golden-cheetah-users, wattage
|
||||
BikeRadar.com: http://www.bikeradar.com/forums/viewforum.php?f=40011
|
||||
Timetrialling.co.uk: http://www.timetriallingforum.co.uk/index.php?showforum=33
|
||||
Slowtwitch.com: http://forum.slowtwitch.com/forum/Slowtwitch_Forums_C1/Triathlon_Forum_F1/
|
||||
Weightweenies: http://weightweenies.starbike.com/forum/viewforum.php?f=8
|
||||
Roadbike Review: http://forums.roadbikereview.com/racing-training-nutrition-triathlons/
|
||||
|
||||
* Italian
|
||||
|
||||
Ask "fester54 hotmail com" to post in Italian to http://www.bdc-forum.it/
|
||||
|
||||
* German
|
||||
|
||||
Ask "joern.rm gmail com" to post in German to http://forum.tour-magazin.de/forum.php
|
||||
|
||||
441
doc/user/formula-syntax.txt
Normal file
@@ -0,0 +1,441 @@
|
||||
MATHS FUNCTIONS
|
||||
|
||||
cos(p1)
|
||||
tan(p1)
|
||||
sin(p1)
|
||||
acos(p1)
|
||||
atan(p1)
|
||||
asin(p1)
|
||||
cosh(p1)
|
||||
tanh(p1)
|
||||
sinh(p1)
|
||||
acosh(p1)
|
||||
atanh(p1)
|
||||
asinh(p1)
|
||||
exp(p1)
|
||||
log(p1)
|
||||
log10(p1)
|
||||
ceil(p1)
|
||||
floor(p1)
|
||||
round(p1)
|
||||
fabs(p1)
|
||||
isinf(p1)
|
||||
isnan(p1)
|
||||
|
||||
LIST / VECTOR REDUCE FUNCTIONS
|
||||
sum(...)
|
||||
mean(...)
|
||||
max(...)
|
||||
min(...)
|
||||
count(...)
|
||||
which(...)
|
||||
|
||||
MODEL FUNCTIONS
|
||||
estimate(model, (cp|ftp|w'|pmax|x))
|
||||
vdottime(VDOT, distance)
|
||||
|
||||
MEAN MAX and ZONE FUNCTIONS
|
||||
best(...)
|
||||
tiz(...)
|
||||
|
||||
PMC FUNCTIONS
|
||||
lts(p1)
|
||||
sts(p1)
|
||||
sb(p1)
|
||||
ctl
|
||||
tsb
|
||||
atl
|
||||
rr(p1)
|
||||
|
||||
SET/UNSET FUNCTIONS
|
||||
set(...)
|
||||
unset(...)
|
||||
isset(p1)
|
||||
|
||||
CONFIGURED PARAMETERS
|
||||
config(cranklength)
|
||||
config(cp)
|
||||
config(w)
|
||||
config(pmax)
|
||||
config(cv)
|
||||
config(scv)
|
||||
config(height)
|
||||
config(weight)
|
||||
config(lthr)
|
||||
config(maxhr)
|
||||
config(rhr)
|
||||
config(units)
|
||||
const(e)
|
||||
const(pi)
|
||||
|
||||
DATE RANGE SELECTION
|
||||
daterange(start)
|
||||
daterange(stop)
|
||||
|
||||
RIDE SAMPLE DATA
|
||||
|
||||
SECS
|
||||
CADENCE
|
||||
CADENCED
|
||||
HEARTRATE
|
||||
HEARTRATED
|
||||
DISTANCE
|
||||
SPEED
|
||||
SPEEDD
|
||||
TORQUE
|
||||
TORQUED
|
||||
POWER
|
||||
POWERD
|
||||
ALTITUDE
|
||||
LON
|
||||
LAT
|
||||
HEADWIND
|
||||
SLOPE
|
||||
TEMPERATURE
|
||||
BALANCE
|
||||
LEFTEFFECTIVENESS
|
||||
RIGHTEFFECTIVENESS
|
||||
LEFTSMOOTHNESS
|
||||
RIGHTSMOOTHNESS
|
||||
SMO2
|
||||
THB
|
||||
RUNVERT
|
||||
RUNCADENCE
|
||||
RUNCONTACT
|
||||
LEFTPCO
|
||||
RIGHTPCO
|
||||
LEFTPPB
|
||||
RIGHTPPB
|
||||
LEFTPPE
|
||||
RIGHTPPE
|
||||
LEFTPPPB
|
||||
RIGHTPPPB
|
||||
LEFTPPPE
|
||||
RIGHTPPPE
|
||||
|
||||
RIDE AND INTERVAL METRICS
|
||||
|
||||
95%_Heartrate
|
||||
aBikeScore
|
||||
Activities
|
||||
Aerobic_TISS
|
||||
Aerobic_TISS
|
||||
aIF
|
||||
Anaerobic_TISS
|
||||
Anaerobic_TISS
|
||||
aNP
|
||||
aPower_Efficiency_Factor
|
||||
aPower_Relative_Intensity
|
||||
aPower_Response_Index
|
||||
Athlete_Bodyfat
|
||||
Athlete_Bodyfat_Percent
|
||||
Athlete_Lean_Weight
|
||||
Athlete_Weight
|
||||
aTSS
|
||||
aTSS_per_hour
|
||||
Average_aPower
|
||||
Average_Cadence
|
||||
Average_Core_Temperature
|
||||
Average_Heart_Rate
|
||||
Average_Left_Peak_Power_Phase_End
|
||||
Average_Peak_Left_Power_Phase_Length
|
||||
Average_Left_Peak_Power_Phase_Start
|
||||
Average_Left_Pedal_Center_Offset
|
||||
Average_Left_Pedal_Smoothness
|
||||
Average_Left_Power_Phase_End
|
||||
Average_Left_Power_Phase_Length
|
||||
Average_Left_Power_Phase_Start
|
||||
Average_Left_Torque_Effectiveness
|
||||
Average_Power
|
||||
Average_Power_Variance
|
||||
Average_Right_Peak_Power_Phase_End
|
||||
Average_Right_Peak_Power_Phase_Length
|
||||
Average_Right_Peak_Power_Phase_Start
|
||||
Average_Right_Pedal_Center_Offset
|
||||
Average_Right_Pedal_Smoothness
|
||||
Average_Right_Power_Phase_End
|
||||
Average_Right_Power_Phase_Length
|
||||
Average_Right_Power_Phase_Start
|
||||
Average_Right_Torque_Effectiveness
|
||||
Average_SmO2
|
||||
Average_Speed
|
||||
Average_Temp
|
||||
Average_tHb
|
||||
Average_Cadence
|
||||
Average_Heart_Rate
|
||||
Average_Power
|
||||
Average_Speed
|
||||
aVI
|
||||
axPower
|
||||
Below_CP_Work
|
||||
BikeScore
|
||||
BikeScore
|
||||
Calendar_Text
|
||||
Calories
|
||||
Climb_Rating
|
||||
color
|
||||
CP
|
||||
CP_setting
|
||||
Daniels_EqP
|
||||
Daniels_Points
|
||||
Daniels_EqP
|
||||
Daniels_Points
|
||||
Data
|
||||
Date
|
||||
Device
|
||||
Device_Info
|
||||
Distance
|
||||
Distance_Swim
|
||||
Duration
|
||||
EOA
|
||||
Efficiency_Factor
|
||||
Elevation_Gain
|
||||
Elevation_Gain_Carrying
|
||||
Elevation_Loss
|
||||
Elevation_Gain
|
||||
Estimated_VO2MAX
|
||||
Fatigue_Index
|
||||
File
|
||||
GOVSS
|
||||
Gradient
|
||||
Heartbeats
|
||||
HrNp_Ratio
|
||||
HrPw_Ratio
|
||||
IF
|
||||
Interesting
|
||||
isRun
|
||||
IWF
|
||||
Left/Right_Balance
|
||||
LNP
|
||||
Max_Cadence
|
||||
Max_Core_Temperature
|
||||
Max_Heartrate
|
||||
Max_Power
|
||||
Max_Power_Variance
|
||||
Max_SmO2
|
||||
Max_Speed
|
||||
Max_Temp
|
||||
Max_tHb
|
||||
Max_W'_Expended
|
||||
Maximum_W'bal_Match
|
||||
Min_Heartrate
|
||||
Min_SmO2
|
||||
Min_tHb
|
||||
Minimum_W'bal
|
||||
MMP_Percentage
|
||||
Nonzero_Average_Power
|
||||
Notes
|
||||
NP
|
||||
Objective
|
||||
Pace
|
||||
Pace_Swim
|
||||
Pacing_Index
|
||||
path
|
||||
Pmax
|
||||
Power_Percent_of_Max
|
||||
Power_Zone
|
||||
Recording_Interval
|
||||
Relative_Intensity
|
||||
Response_Index
|
||||
Route
|
||||
RPE
|
||||
RTP
|
||||
Session_RPE
|
||||
Skiba_aVI
|
||||
Skiba_VI
|
||||
Sport
|
||||
SRI
|
||||
Start_Date
|
||||
Start_Time
|
||||
STP
|
||||
SwimScore
|
||||
Tau
|
||||
Test
|
||||
Time
|
||||
Time_Carrying
|
||||
Time_Moving
|
||||
Time_Moving
|
||||
TISS_Aerobicity
|
||||
TPace
|
||||
TRIMP_Points
|
||||
TRIMP_Zonal_Points
|
||||
TRIMP(100)_Points
|
||||
TriScore
|
||||
TSS
|
||||
TSS_per_hour
|
||||
VAM
|
||||
VDOT
|
||||
VI
|
||||
W'
|
||||
W'_Watts
|
||||
W'_Work
|
||||
W'bal_Matches_>_2KJ
|
||||
W'bal_TAU
|
||||
Watts_Per_Kilogram
|
||||
Watts_RPE_Ratio
|
||||
Weight
|
||||
Work
|
||||
Workbeat_stress
|
||||
Workout_Code
|
||||
xPace
|
||||
xPace_Swim
|
||||
xPower
|
||||
xPower_Swim
|
||||
|
||||
TIME IN ZONES
|
||||
|
||||
Heartrate
|
||||
H1_Percent_in_Zone
|
||||
H1_Time_in_Zone
|
||||
H10_Percent_in_Zone
|
||||
H10_Time_in_Zone
|
||||
H2_Percent_in_Zone
|
||||
H2_Time_in_Zone
|
||||
H3_Percent_in_Zone
|
||||
H3_Time_in_Zone
|
||||
H4_Percent_in_Zone
|
||||
H4_Time_in_Zone
|
||||
H5_Percent_in_Zone
|
||||
H5_Time_in_Zone
|
||||
H6_Percent_in_Zone
|
||||
H6_Time_in_Zone
|
||||
H7_Percent_in_Zone
|
||||
H7_Time_in_Zone
|
||||
H8_Percent_in_Zone
|
||||
H8_Time_in_Zone
|
||||
H9_Percent_in_Zone
|
||||
H9_Time_in_Zone
|
||||
|
||||
Power
|
||||
L1_Percent_in_Zone
|
||||
L1_Sustained_Time
|
||||
L1_Time_in_Zone
|
||||
L10_Percent_in_Zone
|
||||
L10_Sustained_Time
|
||||
L10_Time_in_Zone
|
||||
L2_Percent_in_Zone
|
||||
L2_Sustained_Time
|
||||
L2_Time_in_Zone
|
||||
L3_Percent_in_Zone
|
||||
L3_Sustained_Time
|
||||
L3_Time_in_Zone
|
||||
L4_Percent_in_Zone
|
||||
L4_Sustained_Time
|
||||
L4_Time_in_Zone
|
||||
L5_Percent_in_Zone
|
||||
L5_Sustained_Time
|
||||
L5_Time_in_Zone
|
||||
L6_Percent_in_Zone
|
||||
L6_Sustained_Time
|
||||
L6_Time_in_Zone
|
||||
L7_Percent_in_Zone
|
||||
L7_Sustained_Time
|
||||
L7_Time_in_Zone
|
||||
L8_Percent_in_Zone
|
||||
L8_Sustained_Time
|
||||
L8_Time_in_Zone
|
||||
L9_Percent_in_Zone
|
||||
L9_Sustained_Time
|
||||
L9_Time_in_Zone
|
||||
|
||||
Pace
|
||||
P1_Percent_in_Pace_Zone
|
||||
P1_Time_in_Pace_Zone
|
||||
P10_Percent_in_Pace_Zone
|
||||
P10_Time_in_Pace_Zone
|
||||
P2_Percent_in_Pace_Zone
|
||||
P2_Time_in_Pace_Zone
|
||||
P3_Percent_in_Pace_Zone
|
||||
P3_Time_in_Pace_Zone
|
||||
P4_Percent_in_Pace_Zone
|
||||
P4_Time_in_Pace_Zone
|
||||
P5_Percent_in_Pace_Zone
|
||||
P5_Time_in_Pace_Zone
|
||||
P6_Percent_in_Pace_Zone
|
||||
P6_Time_in_Pace_Zone
|
||||
P7_Percent_in_Pace_Zone
|
||||
P7_Time_in_Pace_Zone
|
||||
P8_Percent_in_Pace_Zone
|
||||
P8_Time_in_Pace_Zone
|
||||
P9_Percent_in_Pace_Zone
|
||||
P9_Time_in_Pace_Zone
|
||||
|
||||
W'bal
|
||||
|
||||
W1_Above_CP_W'bal_Low_Fatigue
|
||||
W2_Above_CP_W'bal_Moderate_Fatigue
|
||||
W3_Above_CP_W'bal_Heavy_Fatigue
|
||||
W4_Above_CP_W'bal_Severe_Fatigue
|
||||
W1_W'bal_Low_Fatigue
|
||||
W2_W'bal_Moderate_Fatigue
|
||||
W3_W'bal_Heavy_Fatigue
|
||||
W4_W'bal_Heavy_Fatigue
|
||||
W1_W'bal_Work_Low_Fatigue
|
||||
W2_W'bal_Work_Moderate_Fatigue
|
||||
W3_W'bal_Work_Heavy_Fatigue
|
||||
W4_W'bal_Work_Severe_Fatigue
|
||||
|
||||
PEAK DURATION METRICS
|
||||
|
||||
1_min_Peak_Pace
|
||||
1_min_Peak_Pace_Swim
|
||||
1_min_Peak_Power
|
||||
1_min_Peak_Power_HR
|
||||
1_min_Peak_WPK
|
||||
1_sec_Peak_Power
|
||||
1_sec_Peak_WPK
|
||||
10_min_Peak_Pace
|
||||
10_min_Peak_Pace_Swim
|
||||
10_min_Peak_Power
|
||||
10_min_Peak_Power_HR
|
||||
10_min_Peak_WPK
|
||||
10_sec_Peak_Pace
|
||||
10_sec_Peak_Pace_Swim
|
||||
10_sec_Peak_Power
|
||||
10_sec_Peak_WPK
|
||||
15_sec_Peak_Pace
|
||||
15_sec_Peak_Pace_Swim
|
||||
15_sec_Peak_Power
|
||||
15_sec_Peak_WPK
|
||||
2_min_Peak_Pace
|
||||
2_min_Peak_Pace_Swim
|
||||
2_min_Peak_Power
|
||||
20_min_Peak_Pace
|
||||
20_min_Peak_Pace_Swim
|
||||
20_min_Peak_Power
|
||||
20_min_Peak_Power_HR
|
||||
20_min_Peak_WPK
|
||||
20_sec_Peak_Pace
|
||||
20_sec_Peak_Pace_Swim
|
||||
20_sec_Peak_Power
|
||||
20_sec_Peak_WPK
|
||||
3_min_Peak_Pace
|
||||
3_min_Peak_Pace_Swim
|
||||
3_min_Peak_Power
|
||||
30_min_Peak_Pace
|
||||
30_min_Peak_Pace_Swim
|
||||
30_min_Peak_Power
|
||||
30_min_Peak_Power_HR
|
||||
30_min_Peak_WPK
|
||||
30_sec_Peak_Pace
|
||||
30_sec_Peak_Pace_Swim
|
||||
30_sec_Peak_Power
|
||||
30_sec_Peak_WPK
|
||||
5_min_Peak_Pace
|
||||
5_min_Peak_Pace_Swim
|
||||
5_min_Peak_Power
|
||||
5_min_Peak_Power_HR
|
||||
5_min_Peak_WPK
|
||||
5_sec_Peak_Power
|
||||
5_sec_Peak_WPK
|
||||
60_min_Peak_Pace
|
||||
60_min_Peak_Pace_Swim
|
||||
60_min_Peak_Power
|
||||
60_min_Peak_Power_HR
|
||||
60_min_Peak_WPK
|
||||
8_min_Peak_Pace
|
||||
8_min_Peak_Pace_Swim
|
||||
8_min_Peak_Power
|
||||
90_min_Peak_Pace
|
||||
90_min_Peak_Pace_Swim
|
||||
90_min_Peak_Power
|
||||
33
doc/user/rest-api.txt
Normal file
@@ -0,0 +1,33 @@
|
||||
http://localhost:12021 Default base URL
|
||||
|
||||
/ List Athletes
|
||||
Returns csv of athletes and core data (dob, sex etc)
|
||||
|
||||
/<athlete> List Athlete Rides with Metrics and Metadata
|
||||
since=yyyy/mm/dd
|
||||
before=yyyy/mm/dd
|
||||
metrics=NP,IF,TSS,AveragePower
|
||||
metadata=none or all or list (Sport,Workout Code)
|
||||
intervals=true
|
||||
Returns csv of activities incl. metrics and metadata
|
||||
|
||||
/<athlete>/zones List Athlete Zone Config
|
||||
for=xxx where xxx is one of power, hr, pace, swimpace
|
||||
Returns csv of zone config history (e.g. configured CP/W')
|
||||
|
||||
|
||||
/<athlete>/activity/<filename> Fetch activity file
|
||||
format=xxx where xxx is one of csv, tcx, json, pwx
|
||||
Returns ride file data in the requested format
|
||||
|
||||
|
||||
/<athlete>/meanmax/<filename> Fetch activity Mean Max data
|
||||
series=xxx where xxx is one of watts,hr,cad,speed,nm,vam.xPower,NP
|
||||
Returns csv of the mean max data for a ride
|
||||
|
||||
|
||||
/<athlete>/meanmax/bests Fetch Mean Max Bests for a Date Range
|
||||
since=yyyy/mm/dd
|
||||
before=yyyy/mm/dd
|
||||
series=xxx where xxx is one of watts,hr,cad,speed,nm,vam.xPower,NP
|
||||
Returns an aggregate of the best mean maximal values over the date range
|
||||
|
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: 70 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 35 KiB |
BIN
doc/wiki/MenuBar_Edit.jpg
Normal file
|
After Width: | Height: | Size: 119 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 108 KiB |
BIN
doc/wiki/MenuBar_Share.jpg
Normal file
|
After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 117 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: 134 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.jpg
Normal file
|
After Width: | Height: | Size: 165 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_Measures.jpg
Normal file
|
After Width: | Height: | Size: 91 KiB |