Compare commits
1268 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
cc215a1e5c | ||
|
|
9ae1102467 | ||
|
|
2908f01196 | ||
|
|
526e459071 | ||
|
|
67991077f7 | ||
|
|
677fc9079d | ||
|
|
e500bfcfa9 | ||
|
|
feb579ac70 | ||
|
|
ef4d1bc8b4 | ||
|
|
ace540a572 | ||
|
|
ac2a809106 | ||
|
|
bc0cba5f46 | ||
|
|
7dba1d204f | ||
|
|
14578f7398 | ||
|
|
dda1597a8d | ||
|
|
8200066d68 | ||
|
|
b976905e68 | ||
|
|
ce5bd9f9d1 | ||
|
|
997c432167 | ||
|
|
9f0b61e642 | ||
|
|
9871100259 | ||
|
|
684970ef0f | ||
|
|
13bbfb876e | ||
|
|
9286d4f2fd | ||
|
|
cde54eba51 | ||
|
|
e4ed56bb8f | ||
|
|
1cb483654e | ||
|
|
7e3d8dcaaf | ||
|
|
b470523cd3 | ||
|
|
abea23dc9c | ||
|
|
9bdda8ebc5 | ||
|
|
250d9d1abe | ||
|
|
8917556ad0 | ||
|
|
5fe3e9bddf | ||
|
|
c8a438039e | ||
|
|
a4044191fa | ||
|
|
74e3591193 | ||
|
|
68beddd1b7 | ||
|
|
ecb674756b | ||
|
|
25b21819bd | ||
|
|
fd204a65e6 | ||
|
|
6bf0c2334b | ||
|
|
52c023d5c3 | ||
|
|
ffeec636c5 | ||
|
|
a4b2990b51 | ||
|
|
c6b2394a33 | ||
|
|
7c01f18202 | ||
|
|
c89fa2812f | ||
|
|
be83533509 | ||
|
|
0572680b2c | ||
|
|
03fd402b64 | ||
|
|
0721816b01 | ||
|
|
27ab0b89d1 | ||
|
|
7e1483d47b | ||
|
|
2ad8e4c4e6 | ||
|
|
c6112bd13c | ||
|
|
528d880a90 | ||
|
|
b2df92cbc6 | ||
|
|
4bea06f150 | ||
|
|
fdc4be16e6 | ||
|
|
539672b18b | ||
|
|
38076efc74 | ||
|
|
92b586b691 | ||
|
|
df9c72c822 | ||
|
|
c7c8e77197 | ||
|
|
c7ec57ba6c |
17
.gitignore
vendored
@@ -1,4 +1,5 @@
|
||||
Makefile
|
||||
.qmake.stash
|
||||
|
||||
# old skool
|
||||
.svn
|
||||
@@ -14,3 +15,19 @@ lib/
|
||||
bin/
|
||||
plugins/
|
||||
resources/
|
||||
src/debug/
|
||||
src/release/
|
||||
|
||||
qwt/src/debug/
|
||||
qwt/src/release/
|
||||
src/Makefile.Debug
|
||||
src/Makefile.Release
|
||||
src/object_script.GoldenCheetah.Debug
|
||||
src/object_script.GoldenCheetah.Release
|
||||
qwt/src/object_script.libqwt.Release
|
||||
qwt/src/object_script.libqwtd.Debug
|
||||
qwt/src/Makefile.Release
|
||||
qwt/src/Makefile.Debug
|
||||
qwt/textengines/mathml/debug/
|
||||
qwt/textengines/mathml/release/
|
||||
build.pro.user
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
Mark Liversedge
|
||||
John Ehrlinger
|
||||
|
||||
May 2011
|
||||
Version 1.1
|
||||
Jan 2015
|
||||
Version 1.2
|
||||
|
||||
A walkthrough of building GoldenCheetah from scratch on Ubuntu linux. This walkthrough
|
||||
should be largely the same for any Linux distro.
|
||||
@@ -30,8 +30,6 @@ CONTENTS
|
||||
- bison
|
||||
- libical - Diary window and CalDAV support (google/mobileme calendar integration)
|
||||
- libvlc - Video playback in training mode
|
||||
- clucene - Indexing/Searching ride files
|
||||
|
||||
|
||||
1. BASIC INSTALLATION WITH MANDATORY DEPENDENCIES
|
||||
=================================================
|
||||
@@ -373,30 +371,3 @@ VLC_INSTALL = /usr/include/vlc/
|
||||
$ make clean
|
||||
$ qmake
|
||||
$ make
|
||||
|
||||
CLUCENE - Indexing and Searching ride files (search box)
|
||||
--------------------------------------------------------
|
||||
|
||||
You will need clucene runtime and core libraries, we developed against 0.9.21b-2 but
|
||||
any 0.9 branch should work fine, let us know if you experience any issues. You may find
|
||||
that the libclucene0ldbl runtime is already installed, this is fine and typical since
|
||||
clucene is a very popular search library.
|
||||
|
||||
$ sudo apt-get install libclucene-dev
|
||||
$ sudo apt-get install libclucene0ldbl
|
||||
|
||||
By default, and this is deliberate, the clucene install places the config headers into
|
||||
a platform specific location. For my install I just copy the platform (linux) specific
|
||||
header config into the normal /usr/include/CLucene directory with the following:
|
||||
|
||||
$ sudo cp /usr/lib/CLucene/clucene-config.h /usr/include/CLucene
|
||||
|
||||
Next we need to comment out the two CLUCENE lines in gcconfig.pri and they should read:
|
||||
|
||||
CLUCENE_INCLUDE = /usr/include/CLucene
|
||||
CLUCENE_LIBS = -lclucene
|
||||
|
||||
$ make clean
|
||||
$ qmake
|
||||
$ make
|
||||
|
||||
|
||||
17
INSTALL-MAC
@@ -4,8 +4,8 @@
|
||||
|
||||
Mark Liversedge
|
||||
|
||||
Nov 2011
|
||||
Version 1.1
|
||||
Jan 2015
|
||||
Version 1.2
|
||||
|
||||
A walkthrough of building GoldenCheetah from scratch on Mac OSX. This was performed
|
||||
on Mac OSX Lion (10.7) but the instructions are largely the same for all versions of
|
||||
@@ -25,7 +25,6 @@ CONTENTS
|
||||
- libkml
|
||||
- libusb
|
||||
- libical
|
||||
- libclucene
|
||||
|
||||
|
||||
1. BASIC INSTALLATION WITH MANDATORY DEPENDENCIES
|
||||
@@ -297,15 +296,3 @@ libical (0.46)
|
||||
first run autogen.sh
|
||||
then
|
||||
./configure CFLAGS="-isysroot /Developer/SDKs/MacOSX10.7.sdk -arch x86_64" --disable-dependency-tracking
|
||||
|
||||
2.7 clucene
|
||||
-----------
|
||||
|
||||
DO NOT USE THE MACPORTS VERSION (0.9.23) IT DOES NOT WORK.
|
||||
|
||||
git clone git://clucene.git.sourceforge.net/gitroot/clucene/clucene
|
||||
cmake -G "Unix Makefiles"
|
||||
make
|
||||
sudo make install
|
||||
|
||||
will install clucene into /usr/local/include/clucene and /usr/local/lib
|
||||
|
||||
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/WASP Packet Protocol.pdf
Normal file
BIN
doc/contrib/WKO File Format.docx
Normal file
BIN
doc/design/refresh events-v311.png
Normal file
|
After Width: | Height: | Size: 173 KiB |
BIN
doc/user/Convert_Texinfo_to_GitHub_MD.exe
Normal file
@@ -1,7 +1,7 @@
|
||||
This is GC3-FAQ.info, produced by makeinfo version 4.13 from
|
||||
This is GC3-FAQ.info, produced by makeinfo version 5.2 from
|
||||
GC3-FAQ.texinfo.
|
||||
|
||||
This manual is for Golden Cheetah, version 3.0.
|
||||
This manual is for Golden Cheetah, version 3.1.
|
||||
|
||||
Copyright (C) 2013 Mark Liversedge
|
||||
|
||||
@@ -11,7 +11,7 @@ File: GC3-FAQ.info, Node: Top, Next: Top, Prev: Top
|
||||
title
|
||||
*****
|
||||
|
||||
This manual is for GoldenCheetah, version 3.0.
|
||||
This manual is for GoldenCheetah, version 3.1.
|
||||
|
||||
* Menu:
|
||||
|
||||
@@ -33,29 +33,30 @@ File: GC3-FAQ.info, Node: MOST COMMON QUESTIONS OF ALL, Next: GENERAL, Prev:
|
||||
1.1 How do I override / manually enter TSS for a ride?
|
||||
======================================================
|
||||
|
||||
The details chart on the analysis view allows you to override metrics
|
||||
on the metrics tab. By default the most common metrics are listed,
|
||||
including average HR, distance and so on. From v3.0 the default setup
|
||||
The details chart on the analysis view allows you to override metrics on
|
||||
the metrics tab. By default the most common metrics are listed,
|
||||
including average HR, distance and so on. From v3.1 the default setup
|
||||
will also include TSS as a metric you can override here.
|
||||
|
||||
If the metric is not there you will need to configure GoldenCheetah to
|
||||
allow it to be shown. This is simple to do and described in 3.9 below.
|
||||
The 3.1 upgrade process should have added it to the Metric tab if it was
|
||||
not already there.
|
||||
|
||||
1.2 How do I add or remove a chart?
|
||||
===================================
|
||||
|
||||
To add a new chart to the view you can select from the + menu on the
|
||||
right hand side of the scope bar (the scope bar is underneath the
|
||||
toolbar and lets you select from Home, Analysis, Train etc).
|
||||
To add a new chart to the view you can select from the hamburger menu on
|
||||
the right hand side of the chart bar.
|
||||
|
||||
Depending upon which view you are on the charts available will differ.
|
||||
For example realtime plots only appear on the Train view, whilst charts
|
||||
that work with individual rides will only appear on the analysis view.
|
||||
|
||||
To remove a chart, when you mouse over a chart (in tabbed or tiled
|
||||
mode) a small triangle will appear in the top left of the chart. This
|
||||
is a menu drop down, if you click on it you will see a `Close' option.
|
||||
This is the option to remove (close) the chart.
|
||||
To remove a chart, when you mouse over a chart (in tabbed or tiled mode)
|
||||
the word 'More...' will appear in the top left of the chart. This is a
|
||||
menu drop down, if you click on it you will see a 'Close' option. This
|
||||
is the option to remove (close) the chart.
|
||||
|
||||
1.3 Can I enter my weight and track/plot it?
|
||||
============================================
|
||||
@@ -63,16 +64,16 @@ This is the option to remove (close) the chart.
|
||||
Weight can be maintained in 3 ways;
|
||||
|
||||
* Every athlete is setup with a weight value - this is the fallback
|
||||
value should no other weight measure be available. It can be
|
||||
found under preferences and athlete.
|
||||
value should no other weight measure be available. It can be found
|
||||
under preferences and athlete.
|
||||
|
||||
* The 'Weight' field can be maintained in the details screen. This
|
||||
is found on the 'Workout' tab in the details screen by
|
||||
default. Any entry here will be used for this ride ONLY.
|
||||
* The 'Weight' field can be maintained in the details screen. This
|
||||
is found on the 'Workout' tab in the details screen by default.
|
||||
Any entry here will be used for this ride ONLY.
|
||||
|
||||
* You can download weight from a withings scale. This is performed
|
||||
manually via the menu option Tools->Get Withings Data. This is
|
||||
then used to update the local measures database.
|
||||
* You can download weight from a withings scale. This is performed
|
||||
manually via the menu option Tools->Get Withings Data. This is
|
||||
then used to update the local measures database.
|
||||
|
||||
When calculating W/KG the Activity value is used if present, if not we
|
||||
then fall back to the last Withing measure that was collected, and if
|
||||
@@ -85,20 +86,25 @@ plotted separately in the LTM plots.
|
||||
1.4 How do I plot x sec power best?
|
||||
===================================
|
||||
|
||||
As of v3.0 it is still not possible to plot custom durations for power
|
||||
bests. We are looking to add this in version 3.1, but for now you can
|
||||
only plot 1s, 5s, 10s, 15s, 20s, 30s, 1min, 2min, 5min, 10min, 20min,
|
||||
30min and 60min bests.
|
||||
In v3.1 it is now possible to plot custom durations for any data series
|
||||
on a metric trends chart in the Trends view. You will need to add a
|
||||
curve for the data series and select 'Best' instead of 'Metric' or
|
||||
'Estimate' on the curve settings.
|
||||
|
||||
For v3.0 or earlier it is still not possible to plot custom durations
|
||||
for power bests. We are looking to add this in version 3.1, but for now
|
||||
you can only plot 1s, 5s, 10s, 15s, 20s, 30s, 1min, 2min, 5min, 10min,
|
||||
20min, 30min and 60min bests.
|
||||
|
||||
1.5 I can't find Aerolab / Performance Manager?
|
||||
===============================================
|
||||
|
||||
By default we do not add these charts to the layout. Aerolab can be
|
||||
added to the Analysis view via the '+' menu found to the right hand
|
||||
side of the GoldenCheetah scope bar.
|
||||
By default we do not add these charts to the layout. Aerolab can be
|
||||
added to the Analysis view via the '+' menu found to the right hand side
|
||||
of the GoldenCheetah scope bar.
|
||||
|
||||
Similarly, the Performance manager can be added to the Home layout via
|
||||
the '+' menu. We may deprecate this chart in the near future since the
|
||||
the '+' menu. We may deprecate this chart in the near future since the
|
||||
LTM charts can be used to plot a PMC and we expect to implement an
|
||||
interactive PMC for planning in v3.1.
|
||||
|
||||
@@ -107,31 +113,31 @@ interactive PMC for planning in v3.1.
|
||||
|
||||
It has been deprecated since the Diary view allows you to summarise by
|
||||
day, week and month and add charts to the view that summarise for the
|
||||
selection. As the weekly summary was fixed on specific charts and did
|
||||
not handle other selections (e.g. monthly) it has been deprecated in
|
||||
selection. As the weekly summary was fixed on specific charts and did
|
||||
not handle other selections (e.g. monthly) it has been deprecated in
|
||||
view of the diary view.
|
||||
|
||||
At present you can treat the Diary view as you would have the weekly
|
||||
summary - they offer the same functionality. We expect the diary view
|
||||
summary - they offer the same functionality. We expect the diary view
|
||||
to extend to planned workouts when we implement planning functionality
|
||||
in v3.1.
|
||||
|
||||
1.7 Where are all the chart settings?
|
||||
=====================================
|
||||
|
||||
All chart settings can be found under the drop down menu that appears
|
||||
in the top left hand corner of a chart when you mouse over it. They
|
||||
will appear as a popup dialog box.
|
||||
All chart settings can be found under the drop down menu that appears in
|
||||
the top left hand corner of a chart when you mouse over it, titled
|
||||
'More...'. They will appear as a popup dialog box.
|
||||
|
||||
Additionally, when you move the cursor towards the title of a chart in
|
||||
a view that is tabbed (not tiled) then a small selection of the most
|
||||
Additionally, when you move the cursor towards the title of a chart in a
|
||||
view that is tabbed (not tiled) then a small selection of the most
|
||||
important settings for the chart will appear for convenience.
|
||||
|
||||
1.8 Where is the preferences / options panel?
|
||||
=============================================
|
||||
|
||||
On a Mac the configurations page can be found under 'GoldenCheetah ->
|
||||
Preferences' on the main menu. Whilst on all other platforms it is
|
||||
Preferences' on the main menu. Whilst on all other platforms it is
|
||||
found via 'Tools -> Options'.
|
||||
|
||||
We do this to match the general guidelines for the operating system.
|
||||
@@ -142,15 +148,35 @@ We do this to match the general guidelines for the operating system.
|
||||
Activities are coloured according to keywords embedded in their details
|
||||
(metadata) you can configure the field that is used and the values that
|
||||
are matched and the colours they are shown in from the preferences pane
|
||||
via the 'Data Fields' toolbar option then select Notes Processing. The
|
||||
via the 'Data Fields' toolbar option then select Notes Processing. The
|
||||
keywords and related words are scanned for to determine if the
|
||||
associated colour should be used for this ride.
|
||||
|
||||
They are processed in the order they are defined with the first match
|
||||
being returned. Take care when using values such as 'TT' and 'race'
|
||||
since these can also be part of an English word (e.g. ATTEMPT contains
|
||||
being returned. Take care when using values such as 'TT' and 'race'
|
||||
since these can also be part of an English word (e.g. ATTEMPT contains
|
||||
'TT' and graceful contains 'race'.
|
||||
|
||||
1.10 GoldenCheetah doesn't find my PowerTap on Ubuntu Linux.
|
||||
============================================================
|
||||
|
||||
If you're using the USB cradle (as opposed to the older, serial one),
|
||||
the FTDI driver sometimes conflicts with the braille terminal in the
|
||||
default Ubuntu installation. Try unplugging the PT cradle from the
|
||||
computer and uninstalling brltty: sudo apt-get remove brltty Then plug
|
||||
the device back in and it should work.
|
||||
|
||||
1.11 GoldenCheetah.dmg installation didn't seem to work.
|
||||
========================================================
|
||||
|
||||
Are you running OS X Snow Leopard (10.6) or later? You need to be. If
|
||||
you are, and you're still having this problem, open Terminal (in
|
||||
Applications -> Utilities) and type this at the prompt:
|
||||
|
||||
/Applications/GoldenCheetah.app/Contents/MacOS/GoldenCheetah then press
|
||||
<return> and send an email to the mailing list with whatever it prints
|
||||
out. We'll help you debug it.
|
||||
|
||||
|
||||
File: GC3-FAQ.info, Node: GENERAL, Next: METRICS, Prev: MOST COMMON QUESTIONS OF ALL, Up: Top
|
||||
|
||||
@@ -161,31 +187,31 @@ File: GC3-FAQ.info, Node: GENERAL, Next: METRICS, Prev: MOST COMMON QUESTIONS
|
||||
==========================
|
||||
|
||||
GoldenCheetah is primarily a program for cyclists that own a power
|
||||
meter. It allows them to record, track and review their performance
|
||||
against recorded data. It also allows you to ride your turbo and
|
||||
meter. It allows them to record, track and review their performance
|
||||
against recorded data. It also allows you to ride your turbo and
|
||||
collect data as you ride.
|
||||
|
||||
If you do not have a power meter then some of the functionality will
|
||||
not be of use to you as a cyclist. But you can still record and track
|
||||
progress. We support HR based TRIMP metrics for a HR based PMC for
|
||||
If you do not have a power meter then some of the functionality will not
|
||||
be of use to you as a cyclist. But you can still record and track
|
||||
progress. We support HR based TRIMP metrics for a HR based PMC for
|
||||
example.
|
||||
|
||||
2.2 What is a good book or resource on training with power?
|
||||
===========================================================
|
||||
|
||||
Unquestionably the bible for working with a power meter is Training and
|
||||
Racing with a Power Meter by Hunter Allan and Andy Coggan. Make sure
|
||||
Racing with a Power Meter by Hunter Allan and Andy Coggan. Make sure
|
||||
you look at the 2nd edition since it is revised quite dramatically.
|
||||
Whilst it is heavily biased towards WKO+ as a software package most of
|
||||
Whilst it is heavily biased towards WKO+ as a software package most of
|
||||
the functions of note are also available in GoldenCheetah.
|
||||
|
||||
2.3 Where can I download the installer for GoldenCheetah ?
|
||||
==========================================================
|
||||
|
||||
Stable releases are available from `http://www.goldencheetah.org'
|
||||
whilst the latest and greatest code build is available from
|
||||
`http://goldencheetah.stand2surf.net'. Development builds are for the
|
||||
brave, since they may contain bugs. In reality the development builds
|
||||
Stable releases are available from <http://www.goldencheetah.org> whilst
|
||||
the latest and greatest code build is available from
|
||||
<http://goldencheetah.stand2surf.net>. Development builds are for the
|
||||
brave, since they may contain bugs. In reality the development builds
|
||||
are a changing feast and often contain latest fixes too.
|
||||
|
||||
2.4 Where can I get the source code?
|
||||
@@ -193,23 +219,23 @@ are a changing feast and often contain latest fixes too.
|
||||
|
||||
The GoldenCheetah source code is hosted on github and can be cloned
|
||||
using the following url;
|
||||
`git://github.com/GoldenCheetah/GoldenCheetah.git'
|
||||
'git://github.com/GoldenCheetah/GoldenCheetah.git'
|
||||
|
||||
2.5 I am a triathlete is GoldenCheetah appropriate for me?
|
||||
==========================================================
|
||||
|
||||
GoldenCheetah is not a multi-sport program. For tracking cycling
|
||||
performance it is a good choice. But if you are looking for running and
|
||||
GoldenCheetah is not a multi-sport program. For tracking cycling
|
||||
performance it is a good choice. But if you are looking for running and
|
||||
swimming metrics and tracking then these features are not available at
|
||||
present. It is an excellent choice for analysing cycling aspects of
|
||||
present. It is an excellent choice for analysing cycling aspects of
|
||||
triathlon, or working on the trainer.
|
||||
|
||||
2.6 Is there a mailing list?
|
||||
============================
|
||||
|
||||
The mailing list for GoldenCheetah users is maintained via Google
|
||||
Groups at
|
||||
`http://groups.google.com/forum/?fromgroups=#forum/golden-cheetah-users'
|
||||
The mailing list for GoldenCheetah users is maintained via Google Groups
|
||||
at
|
||||
<http://groups.google.com/forum/?fromgroups=#forum/golden-cheetah-users>
|
||||
the first post you make is moderated and may take a while to appear.
|
||||
Once your first post is made you can make future posts without
|
||||
moderation.
|
||||
@@ -217,16 +243,16 @@ moderation.
|
||||
2.7 How do I report a bug or request a new feature?
|
||||
===================================================
|
||||
|
||||
We use Github issues to record bugs and feature requests. You will need
|
||||
We use Github issues to record bugs and feature requests. You will need
|
||||
to create an account on github and then post a new request or bug at
|
||||
`http://www.github.com/GoldenCheetah/GoldenCheetah/issues'
|
||||
<http://www.github.com/GoldenCheetah/GoldenCheetah/issues>
|
||||
|
||||
2.8 How can I contribute?
|
||||
=========================
|
||||
|
||||
Patches are most welcome via the mailing list or a pull request in
|
||||
github. Of equal importance is the timely reporting of bugs and help in
|
||||
testing fixes. We also desperately need volunteers to translate into
|
||||
github. Of equal importance is the timely reporting of bugs and help in
|
||||
testing fixes. We also desperately need volunteers to translate into
|
||||
non-English languages and help with writing documentation including the
|
||||
maintenance of this FAQ.
|
||||
|
||||
@@ -236,8 +262,8 @@ list.
|
||||
2.9 Can I donate to the project?
|
||||
================================
|
||||
|
||||
We are an open source project. Our software is developed by a
|
||||
community. We do not have any facility to collect funding or spend it!
|
||||
We are an open source project. Our software is developed by a
|
||||
community. We do not have any facility to collect funding or spend it!
|
||||
We would rather you spread the word if you think our software is good,
|
||||
and maybe help out with documentation, tutorials or translations if you
|
||||
can.
|
||||
@@ -251,70 +277,70 @@ File: GC3-FAQ.info, Node: METRICS, Next: DATA, Prev: GENERAL, Up: Top
|
||||
3.1 What is the difference between xPower, NP and Daniels EqP?
|
||||
==============================================================
|
||||
|
||||
They all serve the same purpose - to express the variable power you
|
||||
have generated over a given period of time as a single value. This is
|
||||
so you can quantify the intensity of the ride and therefore the
|
||||
training stress of the ride.
|
||||
They all serve the same purpose - to express the variable power you have
|
||||
generated over a given period of time as a single value. This is so you
|
||||
can quantify the intensity of the ride and therefore the training stress
|
||||
of the ride.
|
||||
|
||||
In practice, NP and xPower are largely the same, whilst Daniels EqP
|
||||
place much higher emphasise on upper intensity work. For more info on
|
||||
place much higher emphasise on upper intensity work. For more info on
|
||||
xPower see Dr Skiba's paper on BikeScore
|
||||
`http://www.physfarm.com/bikescore.pdf'
|
||||
<http://www.physfarm.com/bikescore.pdf>
|
||||
|
||||
3.2 What is the difference between CP and FTP?
|
||||
==============================================
|
||||
|
||||
CP is a shorthand for CP60 in GoldenCheetah, and is computed using the
|
||||
Scherer/Monod protocol using 3 and 20 minutes. Functional Threshold
|
||||
Power (FTP) is an actual measure of the power an athlete sustains for
|
||||
60 minutes.
|
||||
Scherer/Monod protocol using 3 and 20 minutes. Functional Threshold
|
||||
Power (FTP) is an actual measure of the power an athlete sustains for 60
|
||||
minutes.
|
||||
|
||||
Since it is very difficult for an athlete to maintain the desired
|
||||
intensity FTP 'reality' tends to result in a number that is much lower
|
||||
than CP 'theory'. Often users will consider the two as the same.
|
||||
than CP 'theory'. Often users will consider the two as the same.
|
||||
|
||||
In GC we compute TSS and BikeScore using your 'CP' value. If you set it
|
||||
to your FTP value TSS will be accurate, BikeScore is likely to be
|
||||
lower. And if you set it to your CP value BikeScore will be accurate,
|
||||
but TSS will be overstated.
|
||||
In GC we compute TSS and BikeScore using your 'CP' value. If you set it
|
||||
to your FTP value TSS will be accurate, BikeScore is likely to be lower.
|
||||
And if you set it to your CP value BikeScore will be accurate, but TSS
|
||||
will be overstated.
|
||||
|
||||
3.3 Why does my CP chart show higher watts for a longer duration?
|
||||
=================================================================
|
||||
|
||||
A higher power average for a longer time is possible if an effort has
|
||||
been "book ended". If, for example, you did a massive 30 second
|
||||
effort, followed by freewheeling for 29:30 then another massive 30
|
||||
second effort, then your best average for a continuous 30 minutes would
|
||||
in fact be lower that your best average for a continuous 30minutes and
|
||||
30 seconds. (Thanks for Jon Hill from the Golden Cheetah Users mailing
|
||||
been "book ended". If, for example, you did a massive 30 second effort,
|
||||
followed by freewheeling for 29:30 then another massive 30 second
|
||||
effort, then your best average for a continuous 30 minutes would in fact
|
||||
be lower that your best average for a continuous 30minutes and 30
|
||||
seconds. (Thanks for Jon Hill from the Golden Cheetah Users mailing
|
||||
list for this example).
|
||||
|
||||
3.4 Can I set a different CP/FTP for different reasons e.g. CP/FTP on a trainer?
|
||||
================================================================================
|
||||
|
||||
We allow you to override the CP value for a specific ride by setting
|
||||
the "CP" field to the value you wish to use for the ride in question.
|
||||
We do not have a concept of 'separate' Cps for different purposes - you
|
||||
will need to specify the CP when the data is imported into GC. But this
|
||||
We allow you to override the CP value for a specific ride by setting the
|
||||
"CP" field to the value you wish to use for the ride in question. We do
|
||||
not have a concept of 'separate' Cps for different purposes - you will
|
||||
need to specify the CP when the data is imported into GC. But this
|
||||
allows you to make manual adjustments.
|
||||
|
||||
We provide this functionality at user request - we do not endorse the
|
||||
concept of multiple CP values. But we do recognise the ongoing debate
|
||||
concept of multiple CP values. But we do recognise the ongoing debate
|
||||
regarding physiological stress from working on a trainer vs on the road.
|
||||
|
||||
3.5 How do I seed the CTL for my PMC?
|
||||
=====================================
|
||||
|
||||
You can seed the starting CTL (we call it LTS, for long term stress)
|
||||
when you define a season. That way it is re-usable in a number of
|
||||
places. To do this you edit the season (date range) in the Home View
|
||||
when you define a season. That way it is re-usable in a number of
|
||||
places. To do this you edit the season (date range) in the Home View
|
||||
and can set the Starting LTS.
|
||||
|
||||
3.6 Why is elevation different in GoldenCheetah to my other training software / website?
|
||||
========================================================================================
|
||||
|
||||
Different programs will use different hysteresis values to smooth the
|
||||
small changes in altitude. In GC we use a hysteresis value of 3m.
|
||||
small changes in altitude. In GC we use a hysteresis value of 3m.
|
||||
|
||||
If this is of great concern you can adjust the hysteresis value in
|
||||
preferences under the general tab.
|
||||
@@ -322,70 +348,70 @@ preferences under the general tab.
|
||||
3.7 Why is a metric e.g. TSS or average power different in GoldenCheetah to Garmin Connect?
|
||||
===========================================================================================
|
||||
|
||||
The algorithms for calculating TSS, AP etc are static. They are
|
||||
The algorithms for calculating TSS, AP etc are static. They are
|
||||
implemented exactly the same way in GoldenCheetah, Garmin Connect,
|
||||
TrainingPeaks etc. The algorithms are extremely simple and not prone to
|
||||
TrainingPeaks etc. The algorithms are extremely simple and not prone to
|
||||
difficulty in implementation.
|
||||
|
||||
However, how each application treats pauses and stops or loss of data
|
||||
accounts for most differences. In GoldenCheetah we always calculate
|
||||
AP,TSS etc including stop time. Other applications choose to ignore or
|
||||
accounts for most differences. In GoldenCheetah we always calculate
|
||||
AP,TSS etc including stop time. Other applications choose to ignore or
|
||||
smooth segments of short duration.
|
||||
|
||||
In addition, if there are anomalies in your data, with large gaps or
|
||||
even time going backwards, this will drastically affect GoldenCheetah's
|
||||
calculations.
|
||||
|
||||
We NEVER attempt to interpret data anomalies - if the results are not
|
||||
as you would expect you will need to correct the data. We do not
|
||||
'silently' fix the data for you. There is no secret sauce in
|
||||
We NEVER attempt to interpret data anomalies - if the results are not as
|
||||
you would expect you will need to correct the data. We do not
|
||||
'silently' fix the data for you. There is no secret sauce in
|
||||
GoldenCheetah, we are open and transparent with your data.
|
||||
|
||||
3.8 How do I set the metrics shown for intervals in the various summaries?
|
||||
==========================================================================
|
||||
|
||||
In the GoldenCheetah preference pane under the Metrics tab you can
|
||||
choose the metrics that will be shown in the ride summary charts and
|
||||
the metrics that will be shown in the interval summary in the analysis
|
||||
choose the metrics that will be shown in the ride summary charts and the
|
||||
metrics that will be shown in the interval summary in the analysis
|
||||
sidebar.
|
||||
|
||||
3.9 How do I add a metric to the details screen (so I can override it) ?
|
||||
========================================================================
|
||||
|
||||
If the metric you want (e.g. TSS) is not shown then you will need to
|
||||
add it via the GoldenCheetah preferences pane. On Mac this is from the
|
||||
menu option GoldenCheetah->Preferences whilst on Windows and Linux it
|
||||
is under Tools->Options.
|
||||
If the metric you want (e.g. TSS) is not shown then you will need to
|
||||
add it via the GoldenCheetah preferences pane. On Mac this is from the
|
||||
menu option GoldenCheetah->Preferences whilst on Windows and Linux it is
|
||||
under Tools->Options.
|
||||
|
||||
You will need to select 'Data Fields' option from preferences toolbar
|
||||
and then the 'fields' tab. You will see a list of fields that are
|
||||
associated with a particular screen tab. If you scroll down you should
|
||||
and then the 'fields' tab. You will see a list of fields that are
|
||||
associated with a particular screen tab. If you scroll down you should
|
||||
find entries for the 'Metrics' screen tab, you can insert a new entry
|
||||
here with the '+' button. You should make sure the new entry is called
|
||||
here with the '+' button. You should make sure the new entry is called
|
||||
exactly the same thing as the metric in question.
|
||||
|
||||
For 'TSS' this is relatively straight forward. For others, e.g.
|
||||
For 'TSS' this is relatively straight forward. For others, e.g.
|
||||
'Average Heart Rate' you must make sure that the name includes spaces
|
||||
etc. Once your metric has been added to the configuration you should
|
||||
etc. Once your metric has been added to the configuration you should
|
||||
save that and return to the details screen where you can now maintain
|
||||
it.
|
||||
|
||||
If you are creating a manual entry then there is no 'details' tab in
|
||||
the dialog. Once you have created the entry (and again in this case TSS
|
||||
can be entered in the dialog) you should go to the details tab to
|
||||
maintain any other specific fields. The manual entry dialog is designed
|
||||
to be simple and accept only the most common of entries.
|
||||
If you are creating a manual entry then there is no 'details' tab in the
|
||||
dialog. Once you have created the entry (and again in this case TSS can
|
||||
be entered in the dialog) you should go to the details tab to maintain
|
||||
any other specific fields. The manual entry dialog is designed to be
|
||||
simple and accept only the most common of entries.
|
||||
|
||||
3.10 Can you calculate gradient, virtual power or other derived series from the ride data?
|
||||
==========================================================================================
|
||||
|
||||
Not in 3.0. We may introduce derived data series in the future.
|
||||
Not in 3.1. We plan to extend this functionality in v3.2.
|
||||
|
||||
3.11 Can I export metrics or access the metric database GC uses?
|
||||
================================================================
|
||||
|
||||
The metrics are stored within a Sqlite 3 Database called 'metricDBv3'
|
||||
that can be found in the athlete directory. You can use any Sqlite 3
|
||||
that can be found in the athlete directory. You can use any Sqlite 3
|
||||
tools to query and work with the db.
|
||||
|
||||
Alternatively you can export the db in its entirety using the
|
||||
@@ -408,19 +434,19 @@ To join two rides together (making one longer ride from two rides) you
|
||||
can copy rows in the activity editor and paste special in the ride
|
||||
editor (right click) and then select append mode.
|
||||
|
||||
If you wish to merge rides, that is much harder and would need to be
|
||||
performed outside of GC or by cutting and pasting columns in the
|
||||
activity editor.
|
||||
If you wish to merge rides, in v3.1 there is a new Activity->Merge
|
||||
wizard that will walk you through merging ride files and also provide
|
||||
the ability to synchronise timestamps.
|
||||
|
||||
4.2 How can I find 'spikes' or specific values in activity data?
|
||||
================================================================
|
||||
|
||||
The activity editor has a function to find data on its toolbar. You can
|
||||
The activity editor has a function to find data on its toolbar. You can
|
||||
specify a range or upper or lower limit and find values less than,
|
||||
greater than or between a range of values.
|
||||
|
||||
Additionally, the editor will scan the file looking for anomalies -
|
||||
where the data appears to be out of normal ranges. These are shown with
|
||||
where the data appears to be out of normal ranges. These are shown with
|
||||
a wiggly red line in the editor and can also be listed by clicking on
|
||||
the anomalies icon on the editor toolbar.
|
||||
|
||||
@@ -430,24 +456,24 @@ anomalies in the currently selected ride.
|
||||
4.3 How can I fix 'spikes' or 'anomalies' in activity data?
|
||||
===========================================================
|
||||
|
||||
You can either manually edit the values in the activity editor (there
|
||||
is full undo and redo in the editor). Or you can use the fix tools that
|
||||
You can either manually edit the values in the activity editor (there is
|
||||
full undo and redo in the editor). Or you can use the fix tools that
|
||||
are listed under the tool menu option (fix power spikes, fix gaps in
|
||||
recording, fix gps errors, fix torque.
|
||||
|
||||
Each of the fix tools opens a dialog that displays texts to explain
|
||||
what the fix tool does.
|
||||
Each of the fix tools opens a dialog that displays texts to explain what
|
||||
the fix tool does.
|
||||
|
||||
4.4 How can I add/remove a field to edit on the details screen?
|
||||
===============================================================
|
||||
|
||||
The fields (metadata) that is editable can be configured in the
|
||||
preferences pane under the data fields tab. Where no screen is
|
||||
preferences pane under the data fields tab. Where no screen is
|
||||
specified (its left blank) it will not be made available.
|
||||
|
||||
GoldenCheetah ships with a number of fields defined in the config but
|
||||
with no screen set. If you wish to use them simply set the screen tab
|
||||
to the tab you would like it to be shown on. To remove a field set the
|
||||
to the tab you would like it to be shown on. To remove a field set the
|
||||
field tab to blank.
|
||||
|
||||
4.5 What are 'special fields' ?
|
||||
@@ -459,10 +485,9 @@ purposes.
|
||||
|
||||
Some examples include;
|
||||
|
||||
Weight - used in W/KG calculations, Sport and Workout code are used
|
||||
when exporting to other file formats, Identifier is used to assign a
|
||||
UUID to the activity when it is uploaded to online services and so
|
||||
on.
|
||||
Weight - used in W/KG calculations, Sport and Workout code are used when
|
||||
exporting to other file formats, Identifier is used to assign a UUID to
|
||||
the activity when it is uploaded to online services and so on.
|
||||
|
||||
There is a full list of special fields and their meaning in the Golden
|
||||
Cheetah user guide appendices.
|
||||
@@ -470,8 +495,8 @@ Cheetah user guide appendices.
|
||||
4.6 How do I find/add/sort/delete/edit intervals ?
|
||||
==================================================
|
||||
|
||||
The context menu (on the right hand side of the splitter handle) for
|
||||
the interval sidebar in Analysis view contains a number of options for
|
||||
The context menu (on the right hand side of the splitter handle) for the
|
||||
interval sidebar in Analysis view contains a number of options for
|
||||
working with intervals.
|
||||
|
||||
Additionally, you can click and drag on the performance (aka ride) plot
|
||||
@@ -486,13 +511,13 @@ Activity->Export allows you to export the activity to csv, fitlog, gc
|
||||
4.8 Can I use GC to convert data from one format to another on the command line?
|
||||
================================================================================
|
||||
|
||||
No. It is something we may add in v3.1
|
||||
No. It is something we may add in v3.2
|
||||
|
||||
4.9 Can I delete an athlete and all his/her data?
|
||||
=================================================
|
||||
|
||||
No. It must be done manually by removing the athlete directory via the
|
||||
operating system. Please ensure you do this when GoldenCheetah is not
|
||||
No. It must be done manually by removing the athlete directory via the
|
||||
operating system. Please ensure you do this when GoldenCheetah is not
|
||||
running.
|
||||
|
||||
|
||||
@@ -505,7 +530,7 @@ File: GC3-FAQ.info, Node: UPLOADING AND DOWNLOADING, Next: SEASONS AND EVENTS,
|
||||
==================================================
|
||||
|
||||
The Sport field in TrainingPeaks must have very specific values,
|
||||
although this is not documented in the XML Schema. We recommend using a
|
||||
although this is not documented in the XML Schema. We recommend using a
|
||||
sport of "Bike" if you plan on uploading rides to training peaks.
|
||||
|
||||
5.2 Why does download from TrainingPeaks say I need a premium account?
|
||||
@@ -514,48 +539,32 @@ sport of "Bike" if you plan on uploading rides to training peaks.
|
||||
Training Peaks only allow paid up members to get access to their data.
|
||||
If you are using a free service they do not let you retrieve your data.
|
||||
|
||||
5.3 Upload/Download with Strava fails?
|
||||
======================================
|
||||
|
||||
Strava have switched off their v1 and v2 APIs before providing access
|
||||
to their v3 APIs. We have requested access to the new v3 API but it has
|
||||
not been granted. In the meantime to upload to Strava you can send an
|
||||
email to <upload@strava.com> from you registered email account
|
||||
attaching the ride in a format Strava supports.
|
||||
|
||||
We remain committed to helping cyclists download their power data to
|
||||
the computer of their choice, analyze it in whatever way they see fit,
|
||||
and share their methods of analysis with others.
|
||||
|
||||
We will be deprecating support for Strava upload/download in v3 SP1 and
|
||||
have no immediate plans to provide support for it in the future.
|
||||
|
||||
5.4 What settings do I need to get GoldenCheetah to upload to my Google Calendar?
|
||||
5.3 What settings do I need to get GoldenCheetah to upload to my Google Calendar?
|
||||
=================================================================================
|
||||
|
||||
The upload to Google Calendar uses their CalDAV API, and as such needs
|
||||
to specify a collection. This means when entering the details in the
|
||||
to specify a collection. This means when entering the details in the
|
||||
passwords pane of preferences you should use the following for the
|
||||
caldav url:
|
||||
|
||||
`https://www.google.com/calendar/dav/xxxx@gmail.com/events/'
|
||||
<https://www.google.com/calendar/dav/xxxx@gmail.com/events/>
|
||||
|
||||
Where xxxx is your username. The username will need to be repeated in
|
||||
Where xxxx is your username. The username will need to be repeated in
|
||||
the username field and obviously set the password too.
|
||||
|
||||
5.5 When setting up my Withings wifi scales where do I get the userid and key ?
|
||||
5.4 When setting up my Withings wifi scales where do I get the userid and key ?
|
||||
===============================================================================
|
||||
|
||||
You will need to login to your Withings account
|
||||
(`http://my.withings.com') and click on the `share' button at the top
|
||||
of the dashboard. From there you will get a popup box with lots of
|
||||
(<http://my.withings.com>) and click on the 'share' button at the top of
|
||||
the dashboard. From there you will get a popup box with lots of
|
||||
options.
|
||||
|
||||
If you click on `share on my website' you will be greeted with a number
|
||||
of code snippets you can embed in a web page. If you look closely in
|
||||
the top right hand corner there will be a box containing the user id
|
||||
and public key. These are the two values you need to enter into the
|
||||
options dialog.
|
||||
If you click on 'share on my website' you will be greeted with a number
|
||||
of code snippets you can embed in a web page. If you look closely in
|
||||
the top right hand corner there will be a box containing the user id and
|
||||
public key. These are the two values you need to enter into the options
|
||||
dialog.
|
||||
|
||||
You will now be able to retrieve withings data via the tools menu.
|
||||
|
||||
@@ -568,31 +577,31 @@ File: GC3-FAQ.info, Node: SEASONS AND EVENTS, Next: CHARTS, Prev: UPLOADING A
|
||||
6.1 Why are there different types of seasons?
|
||||
=============================================
|
||||
|
||||
This is to help with planning functions. As of v3 there is no real
|
||||
This is to help with planning functions. As of v3 there is no real
|
||||
distinction made. Adhoc seasons are expected to be used solely as date
|
||||
ranges and have no associated plan. Whilst other season types may
|
||||
contain plans. This is only relevant for planning functions that are
|
||||
contain plans. This is only relevant for planning functions that are
|
||||
not available yet.
|
||||
|
||||
6.2 What is event used for?
|
||||
===========================
|
||||
|
||||
It is only used to annotate a LTM chart - so you can show an 'event'
|
||||
that happened at a particular date. There are no rules about what
|
||||
constitutes and event. It could be a race, a training camp or just a
|
||||
day that was particularly meaningful e.g. illness, crash.
|
||||
that happened at a particular date. There are no rules about what
|
||||
constitutes and event. It could be a race, a training camp or just a
|
||||
day that was particularly meaningful e.g. illness, crash.
|
||||
|
||||
6.3 How do create/edit/delete seasons and events?
|
||||
=================================================
|
||||
|
||||
Seasons and Events are created and edited in the sidebar for the Home
|
||||
view. Seasons are listed under date ranges, whilst events are listed
|
||||
under the events sidebar item. In both cases they can be created and
|
||||
view. Seasons are listed under date ranges, whilst events are listed
|
||||
under the events sidebar item. In both cases they can be created and
|
||||
deleted from the sidebar item's drop down menu.
|
||||
|
||||
Please note that in v3.0 events can only be created when a user season
|
||||
is selected, since events are associated with a particular season. This
|
||||
constraint will be removed in v3.1.
|
||||
Please note that in v3.1 events can only be created when a user season
|
||||
is selected, since events are associated with a particular season. This
|
||||
constraint will be removed in v3.2.
|
||||
|
||||
|
||||
File: GC3-FAQ.info, Node: CHARTS, Next: INDEX, Prev: SEASONS AND EVENTS, Up: Top
|
||||
@@ -610,85 +619,70 @@ similarly 'This' 'month' and prior '2' is a month 2 months ago, whilst
|
||||
|
||||
'This' 'month' prior and 0 is just this month.
|
||||
|
||||
7.2 How does the mean max chart calculate CP when showing power?
|
||||
================================================================
|
||||
|
||||
The CP algorithm searches your best power for two durations; for
|
||||
anaerobic efforts it looks between 15s and 1min, for aerobic it looks
|
||||
for best efforts between 10mins and an hour.
|
||||
|
||||
Once it has found these two best values it will curve fit the two to
|
||||
enable the 60min value to be extracted. Bear in mind this is a
|
||||
theoretical number and as described above is applicable to the
|
||||
BikeScore algorithm. The value for FTP that the TSS algorithm requires
|
||||
is simply the highest value for 60mins for the time period, assuming
|
||||
you have performed a 60minute test recently.
|
||||
|
||||
7.3 How should I use Aerolab?
|
||||
7.2 How should I use Aerolab?
|
||||
=============================
|
||||
|
||||
The following is a brief piece of advice from Robert Chung, from a
|
||||
discussion on the Golden Cheetah Users mailing list:
|
||||
|
||||
Ideally, you'll want calm conditions (both in terms of wind and
|
||||
traffic) but here's a quickie test you can do just to get a handle
|
||||
on what to do. Try to find a loop without stop signs, or an
|
||||
out-and-back with maybe a little dip or something in the middle. Make
|
||||
sure you won't get hit by a car and have good sight lines. I just go
|
||||
around my block a few times. Do a loop in the drops, then another
|
||||
loop faster, then a loop slower; then repeat with your hands on the
|
||||
hoods.
|
||||
Ideally, you'll want calm conditions (both in terms of wind and traffic)
|
||||
but here's a quickie test you can do just to get a handle on what to do.
|
||||
Try to find a loop without stop signs, or an out-and-back with maybe a
|
||||
little dip or something in the middle. Make sure you won't get hit by a
|
||||
car and have good sight lines. I just go around my block a few times.
|
||||
Do a loop in the drops, then another loop faster, then a loop slower;
|
||||
then repeat with your hands on the hoods.
|
||||
|
||||
Weigh yourself and the bike and ballpark the air density.
|
||||
|
||||
See whether you can come close to modeling the "true" elevation profile
|
||||
by sliding the CdA slider around. Even with this informal test, as
|
||||
long as the wind isn't blowing too hard, you ought to be able to
|
||||
see a difference between the loops where you were in the drops and
|
||||
the loops where you on the hoods, and to spot little bumps and dips in
|
||||
the road.
|
||||
by sliding the CdA slider around. Even with this informal test, as long
|
||||
as the wind isn't blowing too hard, you ought to be able to see a
|
||||
difference between the loops where you were in the drops and the loops
|
||||
where you on the hoods, and to spot little bumps and dips in the road.
|
||||
|
||||
There is also an overview of Virtual Elevation to measure aerodynamics
|
||||
in this YouTube video from the power seminar at Interbike 2011 given by
|
||||
Jim Meyer the founder of Quarq:
|
||||
|
||||
`http://www.youtube.com/watch?v=b8tJnFE_BFg&feature=youtu.be&t=27m58s'
|
||||
<http://www.youtube.com/watch?v=b8tJnFE_BFg&feature=youtu.be&t=27m58s>
|
||||
|
||||
Finally, Robert Chung's original paper is included in the docs section
|
||||
of the GoldenCheetah repository, you can it up here (click on 'View
|
||||
Raw' to download):
|
||||
of the GoldenCheetah repository, you can it up here (click on 'View Raw'
|
||||
to download):
|
||||
|
||||
`https://github.com/GoldenCheetah/GoldenCheetah/blob/master/doc/contrib/ChungVE.pdf'
|
||||
<https://github.com/GoldenCheetah/GoldenCheetah/blob/master/doc/contrib/ChungVE.pdf>
|
||||
|
||||
7.4 My map doesn't show?
|
||||
7.3 My map doesn't show?
|
||||
========================
|
||||
|
||||
This is most likely because you have a proxy that requires
|
||||
authentication or session details. We do not have sophisticated support
|
||||
for internet proxy servers. We will re-use the operating system
|
||||
authentication or session details. We do not have sophisticated support
|
||||
for internet proxy servers. We will re-use the operating system
|
||||
settings where they are configured.
|
||||
|
||||
7.5 What is the treemap plot used for?
|
||||
7.4 What is the treemap plot used for?
|
||||
======================================
|
||||
|
||||
Typically it is used to visualise where you spend your time or where
|
||||
you get best results. It is not particularly useful if you do not
|
||||
maintain details for each ride e.g. workout code, sport et al.
|
||||
Typically it is used to visualise where you spend your time or where you
|
||||
get best results. It is not particularly useful if you do not maintain
|
||||
details for each ride e.g. workout code, sport et al.
|
||||
|
||||
7.6 Can I change the colors in plot x ?
|
||||
7.5 Can I change the colors in plot x ?
|
||||
=======================================
|
||||
|
||||
With the exception of the Long Term Metric plots the colours on the
|
||||
charts are configured in the GoldenCheetah preferences pane.
|
||||
charts are configured in the GoldenCheetah preferences pane. It is
|
||||
possible to apply a theme or change each individual color.
|
||||
|
||||
We want to use the same colours to plot each data series across the
|
||||
charts, so you can change them globally.
|
||||
|
||||
The only colours you cannot change are the colours assigned to
|
||||
intervals when plotting them on scatterplot or PfPv. These colours are
|
||||
assigned according to their sequence.
|
||||
The only colours you cannot change are the colours assigned to intervals
|
||||
when plotting them on scatterplot or PfPv. These colours are assigned
|
||||
according to their sequence.
|
||||
|
||||
7.7 How do you zoom in on a chart?
|
||||
7.6 How do you zoom in on a chart?
|
||||
==================================
|
||||
|
||||
You can zoom in on the distribution, scatterplot and PfPv charts by
|
||||
@@ -699,17 +693,17 @@ bottom of the chart (if you select the full plot in the chart settings).
|
||||
|
||||
There are no other zoom options for the other charts.
|
||||
|
||||
7.8 I zoomed in but can't zoom out?
|
||||
7.7 I zoomed in but can't zoom out?
|
||||
===================================
|
||||
|
||||
Right click will zoom back out to the previous zoom level (in the case
|
||||
of zooming multiple times). If you select another activity the chart
|
||||
will return to fully zoomed out.
|
||||
|
||||
7.9 GoldenCheetah is saying there is no data for a chart, but I'm sure there is?
|
||||
7.8 GoldenCheetah is saying there is no data for a chart, but I'm sure there is?
|
||||
================================================================================
|
||||
|
||||
You should check in the editor if the data series is present. if the
|
||||
You should check in the editor if the data series is present. if the
|
||||
activity is a manual activity entry it will contain no data.
|
||||
|
||||
|
||||
@@ -722,106 +716,118 @@ Index
|
||||
* Menu:
|
||||
|
||||
* add: MOST COMMON QUESTIONS OF ALL.
|
||||
(line 20)
|
||||
(line 22)
|
||||
* adhoc: SEASONS AND EVENTS. (line 9)
|
||||
* Aerolab <1>: CHARTS. (line 33)
|
||||
* Aerolab: MOST COMMON QUESTIONS OF ALL.
|
||||
(line 69)
|
||||
* algorithm: CHARTS. (line 19)
|
||||
(line 75)
|
||||
* Aerolab <1>: CHARTS. (line 19)
|
||||
* anomalies: DATA. (line 23)
|
||||
* anomalies <1>: DATA. (line 38)
|
||||
* AP: METRICS. (line 80)
|
||||
* best: MOST COMMON QUESTIONS OF ALL.
|
||||
(line 61)
|
||||
(line 62)
|
||||
* bug: GENERAL. (line 66)
|
||||
* Chung: CHARTS. (line 33)
|
||||
* cervo: MOST COMMON QUESTIONS OF ALL.
|
||||
(line 136)
|
||||
* Chung: CHARTS. (line 19)
|
||||
* clone: GENERAL. (line 40)
|
||||
* colour <1>: CHARTS. (line 84)
|
||||
* colour: MOST COMMON QUESTIONS OF ALL.
|
||||
(line 115)
|
||||
(line 121)
|
||||
* colour <1>: CHARTS. (line 68)
|
||||
* contribute: GENERAL. (line 73)
|
||||
* CP <1>: CHARTS. (line 19)
|
||||
* CP: METRICS. (line 22)
|
||||
* CSV: DATA. (line 88)
|
||||
* CP <1>: METRICS. (line 39)
|
||||
* CP <2>: METRICS. (line 50)
|
||||
* CSV: DATA. (line 87)
|
||||
* CTL: METRICS. (line 63)
|
||||
* cycle: SEASONS AND EVENTS. (line 9)
|
||||
* Daniels: METRICS. (line 9)
|
||||
* donate: GENERAL. (line 85)
|
||||
* download: GENERAL. (line 31)
|
||||
* download <1>: UPLOADING AND DOWNLOADING.
|
||||
(line 16)
|
||||
* download: GENERAL. (line 31)
|
||||
* elevation: METRICS. (line 71)
|
||||
* EqP: METRICS. (line 9)
|
||||
* event: SEASONS AND EVENTS. (line 18)
|
||||
* event <1>: SEASONS AND EVENTS. (line 26)
|
||||
* feature: GENERAL. (line 66)
|
||||
* FITLOG: DATA. (line 88)
|
||||
* FITLOG: DATA. (line 87)
|
||||
* FTP: METRICS. (line 22)
|
||||
* FTP <1>: METRICS. (line 50)
|
||||
* Garmin Connect: METRICS. (line 80)
|
||||
* github: GENERAL. (line 40)
|
||||
* Google: UPLOADING AND DOWNLOADING.
|
||||
(line 38)
|
||||
(line 22)
|
||||
* install: GENERAL. (line 31)
|
||||
* join: DATA. (line 9)
|
||||
* JSON: DATA. (line 88)
|
||||
* JSON: DATA. (line 87)
|
||||
* LTS: METRICS. (line 63)
|
||||
* mail: GENERAL. (line 56)
|
||||
* map: CHARTS. (line 69)
|
||||
* map: CHARTS. (line 53)
|
||||
* merge: DATA. (line 9)
|
||||
* month: CHARTS. (line 9)
|
||||
* NP: METRICS. (line 9)
|
||||
* options: MOST COMMON QUESTIONS OF ALL.
|
||||
(line 106)
|
||||
(line 112)
|
||||
* override: METRICS. (line 110)
|
||||
* PMC <1>: METRICS. (line 63)
|
||||
* PMC: MOST COMMON QUESTIONS OF ALL.
|
||||
(line 69)
|
||||
(line 75)
|
||||
* PMC <1>: METRICS. (line 63)
|
||||
* powertap: MOST COMMON QUESTIONS OF ALL.
|
||||
(line 136)
|
||||
* preferences: MOST COMMON QUESTIONS OF ALL.
|
||||
(line 106)
|
||||
(line 112)
|
||||
* prior: CHARTS. (line 9)
|
||||
* PWX: DATA. (line 88)
|
||||
* PWX: DATA. (line 87)
|
||||
* remove: MOST COMMON QUESTIONS OF ALL.
|
||||
(line 20)
|
||||
(line 22)
|
||||
* report: GENERAL. (line 66)
|
||||
* season: SEASONS AND EVENTS. (line 9)
|
||||
* season <1>: SEASONS AND EVENTS. (line 26)
|
||||
* settings: MOST COMMON QUESTIONS OF ALL.
|
||||
(line 95)
|
||||
(line 101)
|
||||
* source: GENERAL. (line 40)
|
||||
* spikes: DATA. (line 23)
|
||||
* spikes <1>: DATA. (line 38)
|
||||
* split: DATA. (line 9)
|
||||
* Strava: UPLOADING AND DOWNLOADING.
|
||||
(line 22)
|
||||
* TCX: DATA. (line 88)
|
||||
* TCX: DATA. (line 87)
|
||||
* trainer: METRICS. (line 50)
|
||||
* TrainingPeaks: UPLOADING AND DOWNLOADING.
|
||||
(line 9)
|
||||
* treemap: CHARTS. (line 77)
|
||||
* TrainingPeaks <1>: UPLOADING AND DOWNLOADING.
|
||||
(line 16)
|
||||
* treemap: CHARTS. (line 61)
|
||||
* triathlete: GENERAL. (line 47)
|
||||
* TSS <1>: METRICS. (line 80)
|
||||
* TSS: MOST COMMON QUESTIONS OF ALL.
|
||||
(line 9)
|
||||
* unzoom: CHARTS. (line 108)
|
||||
* TSS <1>: METRICS. (line 80)
|
||||
* unzoom: CHARTS. (line 93)
|
||||
* upload: UPLOADING AND DOWNLOADING.
|
||||
(line 9)
|
||||
* VE: CHARTS. (line 33)
|
||||
* usb: MOST COMMON QUESTIONS OF ALL.
|
||||
(line 136)
|
||||
* VE: CHARTS. (line 19)
|
||||
* weekly summary: MOST COMMON QUESTIONS OF ALL.
|
||||
(line 81)
|
||||
(line 87)
|
||||
* weight: MOST COMMON QUESTIONS OF ALL.
|
||||
(line 36)
|
||||
(line 37)
|
||||
* Withings: UPLOADING AND DOWNLOADING.
|
||||
(line 51)
|
||||
(line 35)
|
||||
* xPower: METRICS. (line 9)
|
||||
* zoom: CHARTS. (line 97)
|
||||
* zoom: CHARTS. (line 82)
|
||||
* zoom <1>: CHARTS. (line 93)
|
||||
|
||||
|
||||
|
||||
Tag Table:
|
||||
Node: Top164
|
||||
Node: MOST COMMON QUESTIONS OF ALL609
|
||||
Node: GENERAL6062
|
||||
Node: METRICS9684
|
||||
Node: DATA16676
|
||||
Node: UPLOADING AND DOWNLOADING20606
|
||||
Node: SEASONS AND EVENTS23387
|
||||
Node: CHARTS24784
|
||||
Node: INDEX29585
|
||||
Node: Top163
|
||||
Node: MOST COMMON QUESTIONS OF ALL608
|
||||
Node: GENERAL7263
|
||||
Node: METRICS10899
|
||||
Node: DATA17912
|
||||
Node: UPLOADING AND DOWNLOADING21867
|
||||
Node: SEASONS AND EVENTS23922
|
||||
Node: CHARTS25327
|
||||
Node: INDEX29480
|
||||
|
||||
End Tag Table
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
@paragraphindent 0
|
||||
|
||||
@copying
|
||||
This manual is for Golden Cheetah, version 3.0.
|
||||
This manual is for Golden Cheetah, version 3.1.
|
||||
|
||||
Copyright @copyright{} 2013 Mark Liversedge
|
||||
@end copying
|
||||
@@ -35,7 +35,7 @@ Copyright @copyright{} 2013 Mark Liversedge
|
||||
@node Top,Top,Top,
|
||||
@top title
|
||||
|
||||
This manual is for GoldenCheetah, version 3.0.
|
||||
This manual is for GoldenCheetah, version 3.1.
|
||||
@end ifnottex
|
||||
|
||||
@menu
|
||||
@@ -58,24 +58,24 @@ This manual is for GoldenCheetah, version 3.0.
|
||||
|
||||
The details chart on the analysis view allows you to override metrics on the metrics tab.
|
||||
By default the most common metrics are listed, including average HR, distance and so on.
|
||||
From v3.0 the default setup will also include TSS as a metric you can override here.
|
||||
From v3.1 the default setup will also include TSS as a metric you can override here.
|
||||
|
||||
If the metric is not there you will need to configure GoldenCheetah to allow it to be shown.
|
||||
This is simple to do and described in 3.9 below.
|
||||
This is simple to do and described in 3.9 below. The 3.1 upgrade process should have added it
|
||||
to the Metric tab if it was not already there.
|
||||
|
||||
@section How do I add or remove a chart?
|
||||
@cindex add
|
||||
@cindex remove
|
||||
|
||||
To add a new chart to the view you can select from the + menu on the right hand side of
|
||||
the scope bar (the scope bar is underneath the toolbar and lets you select from Home,
|
||||
Analysis, Train etc).
|
||||
To add a new chart to the view you can select from the hamburger menu on the right hand side of
|
||||
the chart bar.
|
||||
|
||||
Depending upon which view you are on the charts available will differ. For example realtime
|
||||
plots only appear on the Train view, whilst charts that work with individual rides will only
|
||||
appear on the analysis view.
|
||||
|
||||
To remove a chart, when you mouse over a chart (in tabbed or tiled mode) a small triangle
|
||||
To remove a chart, when you mouse over a chart (in tabbed or tiled mode) the word 'More...'
|
||||
will appear in the top left of the chart. This is a menu drop down, if you click on it
|
||||
you will see a `Close' option. This is the option to remove (close) the chart.
|
||||
|
||||
@@ -110,7 +110,11 @@ the LTM plots.
|
||||
@section How do I plot x sec power best?
|
||||
@cindex best
|
||||
|
||||
As of v3.0 it is still not possible to plot custom durations for power bests. We are
|
||||
In v3.1 it is now possible to plot custom durations for any data series on a metric
|
||||
trends chart in the Trends view. You will need to add a curve for the data series
|
||||
and select `Best' instead of `Metric' or `Estimate' on the curve settings.
|
||||
|
||||
For v3.0 or earlier it is still not possible to plot custom durations for power bests. We are
|
||||
looking to add this in version 3.1, but for now you can only plot 1s, 5s, 10s, 15s, 20s,
|
||||
30s, 1min, 2min, 5min, 10min, 20min, 30min and 60min bests.
|
||||
|
||||
@@ -147,7 +151,7 @@ implement planning functionality in v3.1.
|
||||
@cindex settings
|
||||
|
||||
All chart settings can be found under the drop down menu that appears in the top left hand
|
||||
corner of a chart when you mouse over it. They will appear as a popup dialog box.
|
||||
corner of a chart when you mouse over it, titled `More...'. They will appear as a popup dialog box.
|
||||
|
||||
Additionally, when you move the cursor towards the title of a chart in a view that is tabbed
|
||||
(not tiled) then a small selection of the most important settings for the chart will appear
|
||||
@@ -175,7 +179,23 @@ They are processed in the order they are defined with the first match being retu
|
||||
care when using values such as 'TT' and 'race' since these can also be part of an English
|
||||
word (e.g. ATTEMPT contains 'TT' and graceful contains 'race'.
|
||||
|
||||
@section GoldenCheetah doesn't find my PowerTap on Ubuntu Linux.
|
||||
@cindex powertap
|
||||
@cindex cervo
|
||||
@cindex usb
|
||||
|
||||
If you're using the USB cradle (as opposed to the older, serial one), the FTDI driver sometimes
|
||||
conflicts with the braille terminal in the default Ubuntu installation. Try unplugging the PT cradle
|
||||
from the computer and uninstalling brltty: sudo apt-get remove brltty
|
||||
Then plug the device back in and it should work.
|
||||
|
||||
@section GoldenCheetah.dmg installation didn't seem to work.
|
||||
|
||||
Are you running OS X Snow Leopard (10.6) or later? You need to be. If you are, and you're still
|
||||
having this problem, open Terminal (in Applications -> Utilities) and type this at the prompt:
|
||||
|
||||
/Applications/GoldenCheetah.app/Contents/MacOS/GoldenCheetah then press <return>
|
||||
and send an email to the mailing list with whatever it prints out. We'll help you debug it.
|
||||
|
||||
@node GENERAL,METRICS,MOST COMMON QUESTIONS OF ALL,Top
|
||||
@chapter GENERAL
|
||||
@@ -417,7 +437,7 @@ dialog is designed to be simple and accept only the most common of entries.
|
||||
|
||||
@section Can you calculate gradient, virtual power or other derived series from the ride data?
|
||||
|
||||
Not in 3.0. We may introduce derived data series in the future.
|
||||
Not in 3.1. We plan to extend this functionality in v3.2.
|
||||
|
||||
|
||||
|
||||
@@ -447,8 +467,8 @@ To join two rides together (making one longer ride from two rides) you can copy
|
||||
in the activity editor and paste special in the ride editor (right click) and then select
|
||||
append mode.
|
||||
|
||||
If you wish to merge rides, that is much harder and would need to be performed outside
|
||||
of GC or by cutting and pasting columns in the activity editor.
|
||||
If you wish to merge rides, in v3.1 there is a new Activity->Merge wizard that will walk
|
||||
you through merging ride files and also provide the ability to synchronise timestamps.
|
||||
|
||||
|
||||
|
||||
@@ -532,7 +552,7 @@ Training Peaks PWX or Garmin TCX format.
|
||||
|
||||
@section Can I use GC to convert data from one format to another on the command line?
|
||||
|
||||
No. It is something we may add in v3.1
|
||||
No. It is something we may add in v3.2
|
||||
|
||||
|
||||
|
||||
@@ -567,22 +587,6 @@ using a free service they do not let you retrieve your data.
|
||||
|
||||
|
||||
|
||||
@section Upload/Download with Strava fails?
|
||||
@cindex Strava
|
||||
|
||||
Strava have switched off their v1 and v2 APIs before providing access to their
|
||||
v3 APIs. We have requested access to the new v3 API but it has not been granted.
|
||||
In the meantime to upload to Strava you can send an email to @email{upload@@strava.com}
|
||||
from you registered email account attaching the ride in a format Strava supports.
|
||||
|
||||
We remain committed to helping cyclists download their power data
|
||||
to the computer of their choice, analyze it in whatever way they see fit, and
|
||||
share their methods of analysis with others.
|
||||
|
||||
We will be deprecating support for Strava upload/download in v3 SP1 and have no
|
||||
immediate plans to provide support for it in the future.
|
||||
|
||||
|
||||
@section What settings do I need to get GoldenCheetah to upload to my Google Calendar?
|
||||
@cindex Google
|
||||
|
||||
@@ -643,8 +647,8 @@ Seasons and Events are created and edited in the sidebar for the Home view. Seas
|
||||
listed under date ranges, whilst events are listed under the events sidebar item. In
|
||||
both cases they can be created and deleted from the sidebar item's drop down menu.
|
||||
|
||||
Please note that in v3.0 events can only be created when a user season is selected, since
|
||||
events are associated with a particular season. This constraint will be removed in v3.1.
|
||||
Please note that in v3.1 events can only be created when a user season is selected, since
|
||||
events are associated with a particular season. This constraint will be removed in v3.2.
|
||||
|
||||
@node CHARTS,INDEX,SEASONS AND EVENTS,Top
|
||||
@chapter CHARTS
|
||||
@@ -663,22 +667,6 @@ prior '2' is a month 2 months ago, whilst 'This' 'month' and prior '1' is last m
|
||||
|
||||
|
||||
|
||||
@section How does the mean max chart calculate CP when showing power?
|
||||
@cindex CP
|
||||
@cindex algorithm
|
||||
|
||||
The CP algorithm searches your best power for two durations; for anaerobic efforts it
|
||||
looks between 15s and 1min, for aerobic it looks for best efforts between 10mins and
|
||||
an hour.
|
||||
|
||||
Once it has found these two best values it will curve fit the two to enable the
|
||||
60min value to be extracted. Bear in mind this is a theoretical number and as described
|
||||
above is applicable to the BikeScore algorithm. The value for FTP that the TSS algorithm
|
||||
requires is simply the highest value for 60mins for the time period, assuming you have
|
||||
performed a 60minute test recently.
|
||||
|
||||
|
||||
|
||||
@section How should I use Aerolab?
|
||||
@cindex Aerolab
|
||||
@cindex Chung
|
||||
@@ -736,7 +724,8 @@ e.g. workout code, sport et al.
|
||||
@cindex colour
|
||||
|
||||
With the exception of the Long Term Metric plots the colours on the charts are
|
||||
configured in the GoldenCheetah preferences pane.
|
||||
configured in the GoldenCheetah preferences pane. It is possible to apply a theme
|
||||
or change each individual color.
|
||||
|
||||
We want to use the same colours to plot each data series across the charts, so you
|
||||
can change them globally.
|
||||
|
||||
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.
|
||||
|
||||
270
doc/user/GC31-Release.info
Normal file
@@ -0,0 +1,270 @@
|
||||
This is GC31-Release.info, produced by makeinfo version 5.2 from
|
||||
GC31-Release.texinfo.
|
||||
|
||||
|
||||
File: GC31-Release.info, Node: Top, Next: Top, Prev: Top
|
||||
|
||||
title
|
||||
*****
|
||||
|
||||
These release notes are for GoldenCheetah, version 3.1.
|
||||
|
||||
* Menu:
|
||||
|
||||
* WHATS NEW:: What's new in V3.1
|
||||
* CONTRIBUTORS:: List of Contributors to V3.1
|
||||
|
||||
|
||||
File: GC31-Release.info, Node: WHATS NEW, Next: CONTRIBUTORS, Prev: CONTRIBUTORS, Up: Top
|
||||
|
||||
1 Whats New
|
||||
***********
|
||||
|
||||
1.1 Major new features; Compare, Share and Merge
|
||||
================================================
|
||||
|
||||
We have added a new feature to enable comparing rides and intervals
|
||||
across all the charts where it is sensible to try; performance plot, cp
|
||||
chart, histogram and QA charts all support compare. Additionally it is
|
||||
possible to compare trends across different seasons as well as
|
||||
histograms. And of course, these are also possible across athletes; so
|
||||
you can compare one athletes season or ride with another athletes season
|
||||
or ride.
|
||||
|
||||
Wherever it is sensible to compare things, we think it is now possible
|
||||
to compare things.
|
||||
|
||||
We have also unified upload to "cloud" across Strava, RideWithGPS and
|
||||
Cycling Analytics. With a single click you can upload to all services.
|
||||
We do not currently support Garmin Connect as they have closed their
|
||||
system and only work with commercial partners - for this reason we
|
||||
recommend storing data outside for future data security.
|
||||
|
||||
Lastly, it is now possible to merge data from different sources into a
|
||||
single ridefile. This is particularly useful when working with
|
||||
multipled devices or integrating data from devices like the Moxy SM02
|
||||
monitor.
|
||||
|
||||
1.2 General Enhancements
|
||||
========================
|
||||
|
||||
We have made the following general / UI enhancements:
|
||||
|
||||
* Open Athletes in Tabs - it is possible to open up all your athletes
|
||||
within a single window and switch tabs.
|
||||
|
||||
* ChartBar - the chartbar has become a toolbar item and is
|
||||
scrollable. This dramatically increases the screen estate
|
||||
available for displaying charts and data but also makes the UI less
|
||||
'quirky' and align more to typical desktop application styles.
|
||||
|
||||
* Themes and better support for color customisation - we now have
|
||||
much more sophisticated support for color customisation and support
|
||||
across all the charts. Themes allow you to switch between light on
|
||||
dark and dark on light setups quickly and easily.
|
||||
|
||||
* Improved Interactivity - mouse over interactivity has been extended
|
||||
over the ride list and most charts for faster exploration of data
|
||||
and to provide a more fluid and dynamic user experience. This
|
||||
extendes to isolating curves within a chart by hovering over the
|
||||
axis labels and automatically selecting intervals as you hover over
|
||||
their data in the QA and ride charts.
|
||||
|
||||
* Autofilter in Trends view - as well as advance data filtering
|
||||
within chart setup and the toolbar search box we have now added
|
||||
autofilters in the trends sidebar to make it simple to filter data
|
||||
based upon metadata e.g. all running files or rides on your TT
|
||||
bike.
|
||||
|
||||
* Specify athlete library location - You can now specify where data
|
||||
is stored to make it easier to integrate with backup or other
|
||||
synchronisation tools.
|
||||
|
||||
* Improved Dropbox support (CRC) - We will check the data within a
|
||||
ride has changed (as opposed to its timestamp) before refreshing
|
||||
metrics. This is to remove unneccessary metric refreshes when
|
||||
copying data between computers or synchronising using tools like
|
||||
Dropbox.
|
||||
|
||||
* Find intervals via matches, hills etc - The find intervals dialog
|
||||
will now find hills as well as sustained efforts using W'
|
||||
consumption (see support for W'bal).
|
||||
|
||||
1.3 Enhanced Device Support
|
||||
===========================
|
||||
|
||||
We have fixed or enhanced device support for:
|
||||
|
||||
* Fixed up Tacx Fortius Support - Dave Waterworth has updated the
|
||||
original beta code for Fortius support to now make the Fortius and
|
||||
fully supported device in train view.
|
||||
|
||||
* Joule GPS updates - the latest firmware is now supported and no
|
||||
longer crashes GC (!).
|
||||
|
||||
* FIT ride file updates - better support for custom FIT sections that
|
||||
are being used by vendors to suport localised data.
|
||||
|
||||
* Pedal Smoothness / Torque Effectiveness support - the Rotor and
|
||||
Vector data series are now extracted and stored in ridefiles and
|
||||
can be plotted alongside all the other ride data series on
|
||||
performance, scatter and histogram plots.
|
||||
|
||||
* Moxy support - we have added support for the Moxy SM02 monitor and
|
||||
can be imported and merged with ride data using the new merge
|
||||
dialog.
|
||||
|
||||
1.4 New Metrics Implemented
|
||||
===========================
|
||||
|
||||
We have implemented a lot of new science in 3.1 and along with that
|
||||
there are a lot of associated metrics:
|
||||
|
||||
* Plot bests - It is now possible to plot user-defined durations for
|
||||
power bests. For example it is now possible to plot 13s power
|
||||
best, but we have extended this to cover all ride data series, so
|
||||
you can plot best durations for heartrate, speed, cadence and so on
|
||||
within a metric trends chart. This feature has been the most
|
||||
requested feature since LTM was implemeted in 2010, so we've
|
||||
finally got there.
|
||||
|
||||
* Plot Model Estimates - With the new PD models we also derive
|
||||
estimates for W', CP et al using each of the models. These can
|
||||
then be plotted; an example 'CP History' plot in the trends view is
|
||||
provide as an example.
|
||||
|
||||
* W'bal implemented with metrics - The W'bal data series is derived
|
||||
from power data and can be plotted alongside all other ride data.
|
||||
It has also been implemented within the erg plot to assess ERG
|
||||
workouts before attempting them.
|
||||
|
||||
* TISS implemented - An an Ae TISS have been implemented and can be
|
||||
plotted as data series within a ride but also as inputs into a PMC
|
||||
chart. An example 'Stress' chart is provided to plot these in the
|
||||
Trends and Rides view.
|
||||
|
||||
* aPower - We have implemented Altitude Power to adjust recorded
|
||||
power to take into account the effect of altitude on vo2max and
|
||||
thus power output. This can be plotted alongside all other ride
|
||||
data series.
|
||||
|
||||
* Polarised Zones - Histogram chart will now plot power histograms in
|
||||
Polarised Zones as well as the more familar Coggan 7 levels.
|
||||
|
||||
* Pacing Index / Fatigue Index - Experimentally added to help review
|
||||
interval efforts.
|
||||
|
||||
* W' work - To compliment W'bal and Work metrics we now isolate and
|
||||
can track how much W' energy is being expended. This is closely
|
||||
related to tracking Anaerobic training.
|
||||
|
||||
* Average Pedal Smoothness / Torque Efficiency - the Rotor/Vector
|
||||
metrics can be plotted alongside ride data but also as average
|
||||
metrics to track across weeks, months and seasons.
|
||||
|
||||
1.5 Chart Enhancements
|
||||
======================
|
||||
|
||||
We have made significant changes across all the charts in 3.1. These
|
||||
have been added to support the new models and science and also to try
|
||||
and enhance the utility and user experience.
|
||||
|
||||
* LTM Chart - It is now possible to select charts via a Chart
|
||||
selection sidebar thus reducing the number of charts needed to be
|
||||
pre-configured on the chart bar. We have also tidied up the LTM
|
||||
settings dialog and improved the UX for setting up charts in the
|
||||
first place. To support the new compare mode we have also added a
|
||||
Stack mode and a Data table mode to look at series in isolation or
|
||||
just review the numbers. It is also now possible to export the
|
||||
chart data to manipulate or analyse in other tools. Lastly, we
|
||||
have also added Labels and Quadratic trend lines to create charts
|
||||
that are more readable without resorting to tooltips and guess
|
||||
work.
|
||||
|
||||
* CP Chart - The critical power chart has seen a lot of new features
|
||||
added both to support the new PD models but also to provide the
|
||||
possibility to plot and compare intervals. The key new features
|
||||
include User selectable CP models and the ability to fine tune the
|
||||
search intervals used by each of the 4 models. It is also now
|
||||
possible to plot rates of change for power, heartrate etc and also
|
||||
to plot heat and heat by age. You can also plot a ride as
|
||||
percentge of best or as a centile. And as with the LTM charts it
|
||||
is also possible to export the PD data and model to review and
|
||||
assess in other tools.
|
||||
|
||||
* Ride Chart - It is now possible to plot lots of derived series; NP,
|
||||
W'bal, xPower, Delta etc and also to plot each series in its own
|
||||
chart with all series shown as a 'stack'. We have also finally
|
||||
added the ability to create and edit reference lines for power and
|
||||
have added an overlay to display interval data as you hover or
|
||||
select them in the plot.
|
||||
|
||||
* Summary Chart - It is mostly unchanged but will now also support
|
||||
displaying user defined metrics for Athlete Bests for the date
|
||||
range selected. It will also show model estimates that apply to
|
||||
the ride or for the date range being summarised.
|
||||
|
||||
1.6 Code refactoring and 300 issues fixed
|
||||
=========================================
|
||||
|
||||
Since we release 3.0 in June 2013 we've been busily updating the code to
|
||||
fix lots and lots of nits and errors, but also slowly adjusting the code
|
||||
to provide a better platform for new features.
|
||||
|
||||
We have deferred almost all features related to indoor training to a
|
||||
release 3.11 that is planned for the beginning of 2015 with development
|
||||
starting in August 2014.
|
||||
|
||||
However, some of the (boring, tehcnical) foundational things that
|
||||
changed in 3.1 include:
|
||||
|
||||
* QT 5.3 is now supported; so QT video support, QML, Qt Json, faster
|
||||
webkit and for the future, possible support for IOS and Android
|
||||
devices.
|
||||
|
||||
* QWT 6.1 with multiaxis is now supported; lots of bug fixes and
|
||||
better rendering on retina and high resolution displays.
|
||||
|
||||
* CP chart and AllPlot chart refactored to make it possible to extend
|
||||
functionality e.g. for new PD models and derived data series.
|
||||
|
||||
Some of the functionality that has been fixed include reinstated support
|
||||
for Strava and Twitter. We also have better native support for
|
||||
look-and-feel differences across the three platforms we currently
|
||||
support (Mac, Linux, Windows).
|
||||
|
||||
We have also adjusted the startup mechanism to make it possible to
|
||||
select a different athlete or create a new one if recovering from a
|
||||
fatal crash.
|
||||
|
||||
|
||||
File: GC31-Release.info, Node: CONTRIBUTORS, Next: WHATS NEW, Prev: WHATS NEW, Up: Top
|
||||
|
||||
2 Contributors
|
||||
**************
|
||||
|
||||
2.1 Credits and Contributors
|
||||
============================
|
||||
|
||||
The main contributors continue to be Mark, Damien and Gareth, but a few
|
||||
new contributors have joined the team in the last year and the future
|
||||
looks promising. A particular shout out is deserved for Joern
|
||||
Rischmuller who has updated the GC Wiki to cover all functionality - so
|
||||
for the first time we have comprehensive user documentation.
|
||||
|
||||
The following have all made a contribution to 3.1:
|
||||
|
||||
Alejandro Martinez, Bruno Fernandez-Ruiz, Christian Stade-Schuldt,
|
||||
Damien Grauser, Dave Waterworth, Eric Johnson, Gareth Coco, Ilja Booij,
|
||||
Jaime Jofre, Joern Rischmuller, Jon Beverley, Jon Escombe, KURASHIKI
|
||||
Satoru, Mark Liversedge, Rainer Clasen, Ralf Spenneberg, Simon Egli,
|
||||
Stig B. Dørmænen, Tom Weichmann, Walter Bürki and Alex Delli.
|
||||
|
||||
|
||||
|
||||
Tag Table:
|
||||
Node: Top88
|
||||
Node: WHATS NEW312
|
||||
Node: CONTRIBUTORS10389
|
||||
|
||||
End Tag Table
|
||||
BIN
doc/user/GC31-Release.pdf
Normal file
245
doc/user/GC31-Release.texinfo
Normal file
@@ -0,0 +1,245 @@
|
||||
\input texinfo @c -*-texinfo-*-
|
||||
@ifnotinfo
|
||||
@input palatino
|
||||
@end ifnotinfo
|
||||
@c %**start of header
|
||||
@setfilename Release Notes.texinfo
|
||||
@settitle Golden Cheetah v3.1 Release Notes
|
||||
@c %**end of header
|
||||
@paragraphindent 0
|
||||
|
||||
@titlepage
|
||||
@title Golden Cheetah v3.1 Release Notes
|
||||
@c @subtitle subtitle-if-any
|
||||
@c @subtitle second-subtitle
|
||||
@author Mark Liversedge
|
||||
|
||||
@end titlepage
|
||||
|
||||
@c So the toc is printed at the start.
|
||||
@contents
|
||||
|
||||
@ifnottex
|
||||
@node Top,Top,Top,
|
||||
@top title
|
||||
|
||||
These release notes are for GoldenCheetah, version 3.1.
|
||||
@end ifnottex
|
||||
|
||||
@menu
|
||||
* WHATS NEW:: What's new in V3.1
|
||||
* CONTRIBUTORS:: List of Contributors to V3.1
|
||||
@end menu
|
||||
|
||||
@node WHATS NEW,CONTRIBUTORS,CONTRIBUTORS,Top
|
||||
@chapter Whats New
|
||||
|
||||
@section Major new features; Compare, Share and Merge
|
||||
|
||||
We have added a new feature to enable comparing rides and intervals across all
|
||||
the charts where it is sensible to try; performance plot, cp chart, histogram
|
||||
and QA charts all support compare. Additionally it is possible to compare
|
||||
trends across different seasons as well as histograms. And of course, these are
|
||||
also possible across athletes; so you can compare one athletes season or ride
|
||||
with another athletes season or ride.
|
||||
|
||||
Wherever it is sensible to compare things, we think it is now possible to compare things.
|
||||
|
||||
We have also unified upload to "cloud" across Strava, RideWithGPS and Cycling
|
||||
Analytics. With a single click you can upload to all services. We do not currently
|
||||
support Garmin Connect as they have closed their system and only work with commercial
|
||||
partners - for this reason we recommend storing data outside for future data security.
|
||||
|
||||
Lastly, it is now possible to merge data from different sources into a single ridefile.
|
||||
This is particularly useful when working with multipled devices or integrating data
|
||||
from devices like the Moxy SM02 monitor.
|
||||
|
||||
@section General Enhancements
|
||||
|
||||
We have made the following general / UI enhancements:
|
||||
|
||||
@itemize @bullet
|
||||
@item Open Athletes in Tabs - it is possible to open up all your athletes within a
|
||||
single window and switch tabs.
|
||||
|
||||
@item ChartBar - the chartbar has become a toolbar item and is scrollable. This
|
||||
dramatically increases the screen estate available for displaying charts and data
|
||||
but also makes the UI less `quirky' and align more to typical desktop application
|
||||
styles.
|
||||
|
||||
@item Themes and better support for color customisation - we now have much more sophisticated
|
||||
support for color customisation and support across all the charts. Themes allow you
|
||||
to switch between light on dark and dark on light setups quickly and easily.
|
||||
|
||||
@item Improved Interactivity - mouse over interactivity has been extended over the ride
|
||||
list and most charts for faster exploration of data and to provide a more fluid and
|
||||
dynamic user experience. This extendes to isolating curves within a chart by hovering
|
||||
over the axis labels and automatically selecting intervals as you hover over their data
|
||||
in the QA and ride charts.
|
||||
|
||||
@item Autofilter in Trends view - as well as advance data filtering within chart setup and
|
||||
the toolbar search box we have now added autofilters in the trends sidebar to make it
|
||||
simple to filter data based upon metadata e.g. all running files or rides on your TT bike.
|
||||
|
||||
@item Specify athlete library location - You can now specify where data is stored to make
|
||||
it easier to integrate with backup or other synchronisation tools.
|
||||
|
||||
@item Improved Dropbox support (CRC) - We will check the data within a ride has changed
|
||||
(as opposed to its timestamp) before refreshing metrics. This is to remove unneccessary
|
||||
metric refreshes when copying data between computers or synchronising using tools like
|
||||
Dropbox.
|
||||
|
||||
@item Find intervals via matches, hills etc - The find intervals dialog will now find
|
||||
hills as well as sustained efforts using W' consumption (see support for W'bal).
|
||||
|
||||
@end itemize
|
||||
|
||||
@section Enhanced Device Support
|
||||
|
||||
We have fixed or enhanced device support for:
|
||||
|
||||
@itemize @bullet
|
||||
|
||||
@item Fixed up Tacx Fortius Support - Dave Waterworth has updated the original beta code
|
||||
for Fortius support to now make the Fortius and fully supported device in train view.
|
||||
|
||||
@item Joule GPS updates - the latest firmware is now supported and no longer crashes GC (!).
|
||||
|
||||
@item FIT ride file updates - better support for custom FIT sections that are being used
|
||||
by vendors to suport localised data.
|
||||
|
||||
@item Pedal Smoothness / Torque Effectiveness support - the Rotor and Vector data series
|
||||
are now extracted and stored in ridefiles and can be plotted alongside all the other ride
|
||||
data series on performance, scatter and histogram plots.
|
||||
|
||||
@item Moxy support - we have added support for the Moxy SM02 monitor and can be imported
|
||||
and merged with ride data using the new merge dialog.
|
||||
|
||||
@end itemize
|
||||
|
||||
@section New Metrics Implemented
|
||||
|
||||
We have implemented a lot of new science in 3.1 and along with that
|
||||
there are a lot of associated metrics:
|
||||
|
||||
@itemize @bullet
|
||||
|
||||
@item Plot bests - It is now possible to plot user-defined durations for power bests.
|
||||
For example it is now possible to plot 13s power best, but we have extended this to
|
||||
cover all ride data series, so you can plot best durations for heartrate, speed, cadence
|
||||
and so on within a metric trends chart. This feature has been the most requested feature
|
||||
since LTM was implemeted in 2010, so we've finally got there.
|
||||
|
||||
@item Plot Model Estimates - With the new PD models we also derive estimates for W', CP et al using
|
||||
each of the models. These can then be plotted; an example `CP History' plot in the trends view
|
||||
is provide as an example.
|
||||
|
||||
@item W'bal implemented with metrics - The W'bal data series is derived from power data and
|
||||
can be plotted alongside all other ride data. It has also been implemented within the erg
|
||||
plot to assess ERG workouts before attempting them.
|
||||
|
||||
@item TISS implemented - An an Ae TISS have been implemented and can be plotted as data series
|
||||
within a ride but also as inputs into a PMC chart. An example `Stress' chart is provided to
|
||||
plot these in the Trends and Rides view.
|
||||
|
||||
@item aPower - We have implemented Altitude Power to adjust recorded power to take into
|
||||
account the effect of altitude on vo2max and thus power output. This can be plotted alongside
|
||||
all other ride data series.
|
||||
|
||||
@item Polarised Zones - Histogram chart will now plot power histograms in Polarised Zones as well
|
||||
as the more familar Coggan 7 levels.
|
||||
|
||||
@item Pacing Index / Fatigue Index - Experimentally added to help review interval efforts.
|
||||
|
||||
@item W' work - To compliment W'bal and Work metrics we now isolate and can track how much
|
||||
W' energy is being expended. This is closely related to tracking Anaerobic training.
|
||||
|
||||
@item Average Pedal Smoothness / Torque Efficiency - the Rotor/Vector metrics can be plotted
|
||||
alongside ride data but also as average metrics to track across weeks, months and seasons.
|
||||
|
||||
@end itemize
|
||||
|
||||
@section Chart Enhancements
|
||||
|
||||
We have made significant changes across all the charts in 3.1. These have been added
|
||||
to support the new models and science and also to try and enhance the utility and
|
||||
user experience.
|
||||
|
||||
@itemize @bullet
|
||||
|
||||
@item LTM Chart - It is now possible to select charts via a Chart selection sidebar thus
|
||||
reducing the number of charts needed to be pre-configured on the chart bar. We have also
|
||||
tidied up the LTM settings dialog and improved the UX for setting up charts in the first place.
|
||||
To support the new compare mode we have also added a Stack mode and a Data table mode to
|
||||
look at series in isolation or just review the numbers. It is also now possible to export
|
||||
the chart data to manipulate or analyse in other tools. Lastly, we have also added Labels
|
||||
and Quadratic trend lines to create charts that are more readable without resorting to
|
||||
tooltips and guess work.
|
||||
|
||||
@item CP Chart - The critical power chart has seen a lot of new features added both to
|
||||
support the new PD models but also to provide the possibility to plot and compare intervals.
|
||||
The key new features include User selectable CP models and the ability to fine tune the
|
||||
search intervals used by each of the 4 models. It is also now possible to plot rates of change
|
||||
for power, heartrate etc and also to plot heat and heat by age. You can also plot a ride as
|
||||
percentge of best or as a centile. And as with the LTM charts it is also possible to export
|
||||
the PD data and model to review and assess in other tools.
|
||||
|
||||
@item Ride Chart - It is now possible to plot lots of derived series; NP, W'bal, xPower, Delta etc
|
||||
and also to plot each series in its own chart with all series shown as a 'stack'. We have also
|
||||
finally added the ability to create and edit reference lines for power and have added an overlay
|
||||
to display interval data as you hover or select them in the plot.
|
||||
|
||||
@item Summary Chart - It is mostly unchanged but will now also support displaying user
|
||||
defined metrics for Athlete Bests for the date range selected. It will also show model
|
||||
estimates that apply to the ride or for the date range being summarised.
|
||||
|
||||
@end itemize
|
||||
|
||||
@section Code refactoring and 300 issues fixed
|
||||
|
||||
Since we release 3.0 in June 2013 we've been busily updating the
|
||||
code to fix lots and lots of nits and errors, but also slowly adjusting
|
||||
the code to provide a better platform for new features.
|
||||
|
||||
We have deferred almost all features related to indoor training to a
|
||||
release 3.11 that is planned for the beginning of 2015 with development
|
||||
starting in August 2014.
|
||||
|
||||
However, some of the (boring, tehcnical) foundational things that changed in 3.1 include:
|
||||
|
||||
@itemize @bullet
|
||||
@item QT 5.3 is now supported; so QT video support, QML, Qt Json, faster
|
||||
webkit and for the future, possible support for IOS and Android devices.
|
||||
|
||||
@item QWT 6.1 with multiaxis is now supported; lots of bug fixes and better
|
||||
rendering on retina and high resolution displays.
|
||||
|
||||
@item CP chart and AllPlot chart refactored to make it possible to extend
|
||||
functionality e.g. for new PD models and derived data series.
|
||||
|
||||
@end itemize
|
||||
|
||||
Some of the functionality that has been fixed include reinstated support
|
||||
for Strava and Twitter. We also have better native support for look-and-feel
|
||||
differences across the three platforms we currently support (Mac, Linux, Windows).
|
||||
|
||||
We have also adjusted the startup mechanism to make it possible to select a
|
||||
different athlete or create a new one if recovering from a fatal crash.
|
||||
|
||||
@node CONTRIBUTORS,WHATS NEW,WHATS NEW,Top
|
||||
@chapter Contributors
|
||||
|
||||
@section Credits and Contributors
|
||||
|
||||
The main contributors continue to be Mark, Damien and Gareth, but a few new contributors
|
||||
have joined the team in the last year and the future looks promising. A particular shout
|
||||
out is deserved for Joern Rischmuller who has updated the GC Wiki to cover all functionality --
|
||||
so for the first time we have comprehensive user documentation.
|
||||
|
||||
The following have all made a contribution to 3.1:
|
||||
|
||||
Alejandro Martinez, Bruno Fernandez-Ruiz, Christian Stade-Schuldt, Damien Grauser, Dave Waterworth, Eric Johnson,
|
||||
Gareth Coco, Ilja Booij, Jaime Jofre, Joern Rischmuller, Jon Beverley, Jon Escombe, KURASHIKI Satoru, Mark Liversedge,
|
||||
Rainer Clasen, Ralf Spenneberg, Simon Egli, Stig B. Dørmænen, Tom Weichmann, Walter Bürki and Alex Delli.
|
||||
|
||||
@bye
|
||||
@@ -12,7 +12,7 @@ clean:
|
||||
|
||||
MANUAL: GC3-Manual.pdf
|
||||
FAQ: GC3-FAQ.pdf GC3-FAQ.info
|
||||
RELEASE: GC3-Release.pdf GC3-Release.info
|
||||
RELEASE: GC3-Release.pdf GC3-Release.info GC31-Release.pdf GC31-Release.info
|
||||
|
||||
## The basic commands, good on Linux/Mac
|
||||
## need mingw on Windows
|
||||
|
||||
BIN
doc/wiki/2d_Plot.jpg
Normal file
|
After Width: | Height: | Size: 431 KiB |
BIN
doc/wiki/3d_Plot.jpg
Normal file
|
After Width: | Height: | Size: 162 KiB |
BIN
doc/wiki/Activity_3d-analyis-layer.gif
Normal file
|
After Width: | Height: | Size: 578 KiB |
BIN
doc/wiki/Activity_3d-rotate.gif
Normal file
|
After Width: | Height: | Size: 2.7 MiB |
BIN
doc/wiki/Activity_Details-Extra.jpg
Normal file
|
After Width: | Height: | Size: 87 KiB |
BIN
doc/wiki/Activity_Details-Metric.jpg
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
doc/wiki/Activity_Details-Workout-Config.jpg
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
doc/wiki/Activity_Details-Workout.jpg
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
doc/wiki/Activity_Editor-Context_1st_Column.jpg
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
doc/wiki/Activity_Editor-Context_Data.jpg
Normal file
|
After Width: | Height: | Size: 127 KiB |
BIN
doc/wiki/Activity_Editor-Context_Header_Row.jpg
Normal file
|
After Width: | Height: | Size: 110 KiB |
BIN
doc/wiki/Activity_Editor-Icons.jpg
Normal file
|
After Width: | Height: | Size: 8.1 KiB |
BIN
doc/wiki/Activity_Editor-View.jpg
Normal file
|
After Width: | Height: | Size: 344 KiB |
BIN
doc/wiki/Activity_Histogram.jpg
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
doc/wiki/AddChart_NewChart_Name.jpg
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
doc/wiki/Aerolab.jpg
Normal file
|
After Width: | Height: | Size: 152 KiB |
BIN
doc/wiki/ChartsBar_Activities.jpg
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
doc/wiki/ChartsBar_Activities_More.GIF
Normal file
|
After Width: | Height: | Size: 3.9 MiB |
BIN
doc/wiki/ChartsBar_Activities_More.jpg
Normal file
|
After Width: | Height: | Size: 154 KiB |
BIN
doc/wiki/ChartsGeneral_DateRange.jpg
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
doc/wiki/CollectionTree_ActivityPopup.jpg
Normal file
|
After Width: | Height: | Size: 165 KiB |
BIN
doc/wiki/CollectionTree_First.jpg
Normal file
|
After Width: | Height: | Size: 140 KiB |
BIN
doc/wiki/CollectionTree_Second.jpg
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
doc/wiki/ComparePane_DragDrop.gif
Normal file
|
After Width: | Height: | Size: 224 KiB |
BIN
doc/wiki/ComparePane_Pane.jpg
Normal file
|
After Width: | Height: | Size: 80 KiB |
BIN
doc/wiki/CriticalMeanMaximal_Basic.jpg
Normal file
|
After Width: | Height: | Size: 244 KiB |
BIN
doc/wiki/CriticalMeanMaximal_CP_Model_Extended.jpg
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
doc/wiki/CriticalMeanMaximal_Speed.jpg
Normal file
|
After Width: | Height: | Size: 212 KiB |
BIN
doc/wiki/Date_Range-Add_Season1.jpg
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
doc/wiki/Date_Range-Add_Season2.jpg
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
doc/wiki/Date_Range-Add_Season3.jpg
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
doc/wiki/Date_Range-Add_Season_Details.jpg
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
doc/wiki/Distribution - Activity Data Samples.jpg
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
doc/wiki/Distribution - Activity Metrics.jpg
Normal file
|
After Width: | Height: | Size: 181 KiB |
BIN
doc/wiki/Event-Add.jpg
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
doc/wiki/Event-Menu.jpg
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
doc/wiki/Event_Details.jpg
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
doc/wiki/Filters_Manage.jpg
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
doc/wiki/Filters_Settings.jpg
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
doc/wiki/FirstSteps_DownloadDialog.JPG
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
doc/wiki/FirstSteps_ImportFilesDialog.JPG
Normal file
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 67 KiB |
BIN
doc/wiki/FirstSteps_YourFirstAthlete_ChooseAnAthlete.JPG
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
doc/wiki/FirstSteps_YourFirstAthlete_NewAthlete.JPG
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
doc/wiki/GC_logo.png
Normal file
|
After Width: | Height: | Size: 236 KiB |
BIN
doc/wiki/GC_logo_small.png
Normal file
|
After Width: | Height: | Size: 4.0 KiB |
BIN
doc/wiki/HR_vs_Power.jpg
Normal file
|
After Width: | Height: | Size: 323 KiB |
BIN
doc/wiki/HR_vs_Power_Colors.jpg
Normal file
|
After Width: | Height: | Size: 50 KiB |