Compare commits
960 Commits
chartEndWo
...
ifit-virtu
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8500a80c4a | ||
|
|
c7b18ad25c | ||
|
|
07825071a0 | ||
|
|
8209913fc2 | ||
|
|
991b8158da | ||
|
|
570de82a40 | ||
|
|
3fc10b5cac | ||
|
|
4b20fbace2 | ||
|
|
356f2ef74e | ||
|
|
5248915cf2 | ||
|
|
e5e035bac8 | ||
|
|
96b24e9efb | ||
|
|
e48384766a | ||
|
|
02d04e66c4 | ||
|
|
0a19faae97 | ||
|
|
9204814253 | ||
|
|
6719c63988 | ||
|
|
d00a7e28dd | ||
|
|
4af6c13e8d | ||
|
|
9b51d4ad7a | ||
|
|
6e0e0a83cb | ||
|
|
d5ff9c7d54 | ||
|
|
9021ce09ee | ||
|
|
c3d37341f7 | ||
|
|
8138793f0c | ||
|
|
00f2d0d346 | ||
|
|
dc3bf136f4 | ||
|
|
b6584df35e | ||
|
|
4a0037a7ea | ||
|
|
a879d88de4 | ||
|
|
d26d0b9143 | ||
|
|
f6ed1f2222 | ||
|
|
558e8f04e8 | ||
|
|
b0e6b9c2d2 | ||
|
|
030bfabc03 | ||
|
|
75f646f16c | ||
|
|
0a72b53709 | ||
|
|
b106423172 | ||
|
|
df3d64c157 | ||
|
|
112a1d89ba | ||
|
|
8396a93c78 | ||
|
|
a18db100d8 | ||
|
|
0ab0640ca1 | ||
|
|
738923112d | ||
|
|
6dec1eda02 | ||
|
|
e686b0eb86 | ||
|
|
e5168660c2 | ||
|
|
f2a36fdb87 | ||
|
|
720c7281e5 | ||
|
|
b54bdbf63b | ||
|
|
b879b2c77b | ||
|
|
a3da393867 | ||
|
|
94208393d0 | ||
|
|
d4b1f43490 | ||
|
|
3709eff914 | ||
|
|
920f190312 | ||
|
|
c71be122f3 | ||
|
|
7197c52aa3 | ||
|
|
420bc7bcaa | ||
|
|
89e926398d | ||
|
|
a3b6f7fb24 | ||
|
|
042bef7fb5 | ||
|
|
1ba4537895 | ||
|
|
b6072b7292 | ||
|
|
c9ee2ff7bd | ||
|
|
538dc24720 | ||
|
|
df838eb43a | ||
|
|
cfaeb29532 | ||
|
|
ec4ca01925 | ||
|
|
4621798e21 | ||
|
|
82302a2433 | ||
|
|
78f82e3242 | ||
|
|
8c33989ef1 | ||
|
|
7172b4923a | ||
|
|
910dddacfe | ||
|
|
205643455f | ||
|
|
05fc8f33d1 | ||
|
|
ee7e1a58bf | ||
|
|
dad035b3a6 | ||
|
|
ffaf599ba1 | ||
|
|
47fd5e6292 | ||
|
|
ba853da6d4 | ||
|
|
394579959f | ||
|
|
4ac19cae05 | ||
|
|
68d6b9b135 | ||
|
|
a14004dedb | ||
|
|
0784d86937 | ||
|
|
8d52318999 | ||
|
|
318273518a | ||
|
|
232b80107d | ||
|
|
86971a4e41 | ||
|
|
a1c00de35a | ||
|
|
77552e0712 | ||
|
|
b2447ea662 | ||
|
|
c75a974631 | ||
|
|
57e0028102 | ||
|
|
e19ed7024c | ||
|
|
cc36ec311a | ||
|
|
83b5308362 | ||
|
|
0ba33f9ca5 | ||
|
|
538d6a2268 | ||
|
|
0e9eae9a82 | ||
|
|
ba58071860 | ||
|
|
009a5f4d5e | ||
|
|
f28bfb4510 | ||
|
|
d34f623351 | ||
|
|
6e4314199e | ||
|
|
3f5d546330 | ||
|
|
cca7cbf3ca | ||
|
|
748efbbfa7 | ||
|
|
7126dd3aad | ||
|
|
438d2ae692 | ||
|
|
0820dbaa9b | ||
|
|
7003238b9f | ||
|
|
a6c4a6149e | ||
|
|
72c3ae9e0c | ||
|
|
dc1f1d4708 | ||
|
|
02e2cfba89 | ||
|
|
0880d74d59 | ||
|
|
6b0d80eaa9 | ||
|
|
702377a51b | ||
|
|
b856266541 | ||
|
|
e41e3b6da0 | ||
|
|
355bbdf142 | ||
|
|
5635ca7578 | ||
|
|
c7540800f7 | ||
|
|
a5aabd55a9 | ||
|
|
df6d2a35ff | ||
|
|
32a7b6c17d | ||
|
|
a77a92050a | ||
|
|
3ea4b7bf4b | ||
|
|
b6c8f2b1e9 | ||
|
|
a10c21308a | ||
|
|
9d8f892281 | ||
|
|
67ab0819d8 | ||
|
|
5cef83e154 | ||
|
|
78ac1a1796 | ||
|
|
28d8004c48 | ||
|
|
de3180eda1 | ||
|
|
498fc7dd75 | ||
|
|
8bed45c5f7 | ||
|
|
fde62a4ea5 | ||
|
|
8e08c6f1a9 | ||
|
|
2e38126db7 | ||
|
|
a9c15dc01b | ||
|
|
b5abd12f0b | ||
|
|
3992db23a3 | ||
|
|
ea37fc9a95 | ||
|
|
48ab156806 | ||
|
|
1fd360890a | ||
|
|
2a4bdf3e5d | ||
|
|
48dff276d4 | ||
|
|
a63df2d7df | ||
|
|
58e55f93c7 | ||
|
|
5ce5064a5c | ||
|
|
2c19c8d6d0 | ||
|
|
4ea1438fca | ||
|
|
7d41a96a4d | ||
|
|
704474abfa | ||
|
|
1dfe4703ad | ||
|
|
4555128053 | ||
|
|
14c0558a20 | ||
|
|
4746946fd4 | ||
|
|
45598f1eec | ||
|
|
806ff8fb87 | ||
|
|
c1a316ca92 | ||
|
|
af66a2b721 | ||
|
|
bfdeb68547 | ||
|
|
3a8890e7d3 | ||
|
|
02d1710d0b | ||
|
|
c9389b5695 | ||
|
|
35012c5a27 | ||
|
|
d91422e941 | ||
|
|
fbfcd27d24 | ||
|
|
8921df2456 | ||
|
|
ea04cfcf3c | ||
|
|
4ac88d9a6b | ||
|
|
ce40298233 | ||
|
|
08609ba15e | ||
|
|
c715ecd338 | ||
|
|
e2f5cd1d64 | ||
|
|
f5cfc652a0 | ||
|
|
474fc20f57 | ||
|
|
366d630624 | ||
|
|
d224e0d080 | ||
|
|
3b81361985 | ||
|
|
864b77cb82 | ||
|
|
383375cf32 | ||
|
|
260a15a7cd | ||
|
|
d5f76a0f63 | ||
|
|
f539205b80 | ||
|
|
35ec3f98eb | ||
|
|
745e668a65 | ||
|
|
ae09fce946 | ||
|
|
9c326df399 | ||
|
|
a5b925102b | ||
|
|
8c6ba43c68 | ||
|
|
6bf6418d40 | ||
|
|
94605bb43a | ||
|
|
79d0624aa9 | ||
|
|
d876aa1ef1 | ||
|
|
61008fee00 | ||
|
|
d01c574b2a | ||
|
|
5158019b71 | ||
|
|
787f7a7224 | ||
|
|
583a96eac0 | ||
|
|
146dd36057 | ||
|
|
9ad12425a4 | ||
|
|
9370ef5a96 | ||
|
|
feecaa2903 | ||
|
|
eae02cde6c | ||
|
|
76e538b409 | ||
|
|
3b32acdea8 | ||
|
|
88df1c21cf | ||
|
|
6fa069f01e | ||
|
|
3615b8803d | ||
|
|
9cea2af9e5 | ||
|
|
75a7eb091d | ||
|
|
b6ad3d4e53 | ||
|
|
7c6ac30901 | ||
|
|
ba675eec53 | ||
|
|
1a053da9d2 | ||
|
|
043287e35a | ||
|
|
edf9506add | ||
|
|
3708ce4221 | ||
|
|
bbb480dc4c | ||
|
|
02bd338313 | ||
|
|
cca373feac | ||
|
|
22a83fbd6d | ||
|
|
54adf49e54 | ||
|
|
0ca579bf79 | ||
|
|
aef9b14a94 | ||
|
|
9fcd10af8f | ||
|
|
8c1a7748c1 | ||
|
|
227336a4e1 | ||
|
|
08572901d4 | ||
|
|
f3e6dd7d1d | ||
|
|
e4fe5b5b8a | ||
|
|
74fdfc0708 | ||
|
|
238e53eb6e | ||
|
|
c80ea07744 | ||
|
|
ff2ae76704 | ||
|
|
8679c97056 | ||
|
|
e78b0075b1 | ||
|
|
2bb5a588c6 | ||
|
|
f99beb2d0b | ||
|
|
7528b50859 | ||
|
|
2d51f0f97f | ||
|
|
9e77ee43e2 | ||
|
|
e7b2b38bcb | ||
|
|
20c4c910d8 | ||
|
|
06e429dfc3 | ||
|
|
6aee0fc9d5 | ||
|
|
b9cd9174ae | ||
|
|
ccfccc5e44 | ||
|
|
7c12e2517d | ||
|
|
48514d291b | ||
|
|
18bed54d22 | ||
|
|
45a1e9b3e0 | ||
|
|
2cb1af8a7e | ||
|
|
919334b760 | ||
|
|
55cc618b49 | ||
|
|
74a4197633 | ||
|
|
9557371eb5 | ||
|
|
040c1186ca | ||
|
|
a1ddfb9ad2 | ||
|
|
2aab5d4cb1 | ||
|
|
87c7467a86 | ||
|
|
039c3d4898 | ||
|
|
d40cd62561 | ||
|
|
48a6d01bfc | ||
|
|
005ae5811a | ||
|
|
ceb8624714 | ||
|
|
3ef3a10644 | ||
|
|
f1daca6c8b | ||
|
|
da9db072b2 | ||
|
|
619c4315cd | ||
|
|
a59e168fdf | ||
|
|
ddb5d33958 | ||
|
|
dfe51dcd20 | ||
|
|
7548ef10a0 | ||
|
|
45a5865cf4 | ||
|
|
19fe6f5358 | ||
|
|
46fb18164c | ||
|
|
c7c7598372 | ||
|
|
9d80eaeaa5 | ||
|
|
f23a8d4d42 | ||
|
|
fb4a071ed6 | ||
|
|
f7f96a1576 | ||
|
|
7642019bf7 | ||
|
|
216440520f | ||
|
|
4d17d622ae | ||
|
|
0e7e97392c | ||
|
|
214552fd62 | ||
|
|
ad4ba14de4 | ||
|
|
ea1b5bde3a | ||
|
|
2de08020d6 | ||
|
|
16a1930c5a | ||
|
|
cfa591c554 | ||
|
|
57d76426f8 | ||
|
|
5ef2244e1e | ||
|
|
ebb22ca471 | ||
|
|
80888d28dd | ||
|
|
f0851029d4 | ||
|
|
0898857774 | ||
|
|
93c52bc6d8 | ||
|
|
2f4ebe9be6 | ||
|
|
0de592fd08 | ||
|
|
fd00c7403b | ||
|
|
4a6f000d29 | ||
|
|
f6f52e51dc | ||
|
|
191aae3f52 | ||
|
|
3439f35f8b | ||
|
|
ec31bd7866 | ||
|
|
1274c4eb95 | ||
|
|
bb2b9a68fe | ||
|
|
c2c8b5ecac | ||
|
|
18c75e85b9 | ||
|
|
b34cf53081 | ||
|
|
e87a7a1ead | ||
|
|
33c8475c0a | ||
|
|
5d4c6f9a01 | ||
|
|
6ff36286d9 | ||
|
|
53bdf4212a | ||
|
|
9908ac7826 | ||
|
|
325ebba4bb | ||
|
|
a044a678af | ||
|
|
eca2c24baf | ||
|
|
075098a5cf | ||
|
|
466b65f19b | ||
|
|
a7ccdddd0f | ||
|
|
df20418f55 | ||
|
|
2bb88d57c8 | ||
|
|
d026338c35 | ||
|
|
95f72ac42d | ||
|
|
323b513506 | ||
|
|
44d627ff0c | ||
|
|
22a1ec1dae | ||
|
|
93ff403026 | ||
|
|
8631920c87 | ||
|
|
4a08813385 | ||
|
|
7a19facf9c | ||
|
|
5562cbcc77 | ||
|
|
40b18c4812 | ||
|
|
6453810d10 | ||
|
|
1cf924bbb8 | ||
|
|
dffd40ebf1 | ||
|
|
551af58c33 | ||
|
|
c6f95fab7e | ||
|
|
8e79672ae7 | ||
|
|
46dac997fa | ||
|
|
b22f8f18e7 | ||
|
|
11faeb3e4d | ||
|
|
a9251e1b24 | ||
|
|
435c7ec43b | ||
|
|
bc897d8af3 | ||
|
|
f4f155705d | ||
|
|
c5d9b5fc1f | ||
|
|
8629f10f6c | ||
|
|
587b342569 | ||
|
|
77dfe4189a | ||
|
|
8e7482c900 | ||
|
|
bed8bdd374 | ||
|
|
a1fa1a2e3c | ||
|
|
bbeb9daeb4 | ||
|
|
0aa151cc42 | ||
|
|
1626124e97 | ||
|
|
27f382f27f | ||
|
|
6d3e2d62a5 | ||
|
|
50991b7873 | ||
|
|
0ca2bf3454 | ||
|
|
c7fbcbb936 | ||
|
|
0dc6d9cd78 | ||
|
|
02595aef9d | ||
|
|
96ba44c307 | ||
|
|
2a34efb80c | ||
|
|
9938033b23 | ||
|
|
9af290951e | ||
|
|
ad95d66493 | ||
|
|
81a8b5a5a7 | ||
|
|
a411abfbfd | ||
|
|
4bd3b9f681 | ||
|
|
206c7243fd | ||
|
|
c7d8274bcb | ||
|
|
0cf7a428f7 | ||
|
|
38cf157431 | ||
|
|
3cfaa407e8 | ||
|
|
098db6c2e2 | ||
|
|
40067c31a0 | ||
|
|
472b3b0ba5 | ||
|
|
998c2b9975 | ||
|
|
32a044d2a1 | ||
|
|
c37a962f27 | ||
|
|
4c274f42a8 | ||
|
|
fe56376510 | ||
|
|
25e20017e4 | ||
|
|
efd558b390 | ||
|
|
4684ece812 | ||
|
|
67ce88dd5d | ||
|
|
780dd28810 | ||
|
|
cec40fe20c | ||
|
|
0e3cbe546b | ||
|
|
a97a0656cc | ||
|
|
cbef476e84 | ||
|
|
51f520d655 | ||
|
|
969a4d2964 | ||
|
|
e29225e451 | ||
|
|
99918571d3 | ||
|
|
75b5aa9a3f | ||
|
|
572743203f | ||
|
|
6c95df9155 | ||
|
|
e26f1613e7 | ||
|
|
a29c0818ed | ||
|
|
f1764681a8 | ||
|
|
5ba2060672 | ||
|
|
7366020800 | ||
|
|
9c421368a2 | ||
|
|
b858072e76 | ||
|
|
0a4a16cd45 | ||
|
|
a9fb6bbc0d | ||
|
|
52467a3ab6 | ||
|
|
b2ef9b31a2 | ||
|
|
07898eeb8b | ||
|
|
1f908ca202 | ||
|
|
179cf4fbc5 | ||
|
|
4d49a2b2c7 | ||
|
|
63aabb70e7 | ||
|
|
f58259f1b2 | ||
|
|
ce45c71fe8 | ||
|
|
bf628b4fc8 | ||
|
|
920dcca45a | ||
|
|
c7d410617c | ||
|
|
b5258b1793 | ||
|
|
88f399248d | ||
|
|
a166004204 | ||
|
|
c7588619dd | ||
|
|
3f3013f86a | ||
|
|
d8c4e14fd4 | ||
|
|
46b646a6da | ||
|
|
ef46bf0e23 | ||
|
|
476b1d6689 | ||
|
|
77493fae47 | ||
|
|
39ea444a3d | ||
|
|
6fe7892ae5 | ||
|
|
cf2967ece5 | ||
|
|
7d5847057d | ||
|
|
90b2188fe1 | ||
|
|
677dd4a735 | ||
|
|
2143281c00 | ||
|
|
a2154a5d42 | ||
|
|
11981729b1 | ||
|
|
a7fce387bd | ||
|
|
870d392a1c | ||
|
|
9f2a223df5 | ||
|
|
69fdd79e50 | ||
|
|
f5fbbbf8e5 | ||
|
|
e136cc520f | ||
|
|
e71269b68b | ||
|
|
cac547a136 | ||
|
|
7d5310395d | ||
|
|
b4d6921058 | ||
|
|
bfe7c62e07 | ||
|
|
a7ff674621 | ||
|
|
b4aa37da0d | ||
|
|
92c9e5ef9c | ||
|
|
1d3077530d | ||
|
|
c043fe2ea1 | ||
|
|
5549685e9c | ||
|
|
a246c9aee5 | ||
|
|
c5d064c993 | ||
|
|
c40a559ebb | ||
|
|
2eda4b2261 | ||
|
|
92e34178ce | ||
|
|
b5656f67a9 | ||
|
|
3030428313 | ||
|
|
daa7f4e409 | ||
|
|
0e3814cde3 | ||
|
|
3a6560c32d | ||
|
|
f01b961725 | ||
|
|
dfc71b7218 | ||
|
|
2f390f5fc4 | ||
|
|
86e972a455 | ||
|
|
b858e7bc7a | ||
|
|
f3f60155f3 | ||
|
|
c4155dc754 | ||
|
|
f14f86d0c9 | ||
|
|
4975b9feae | ||
|
|
f16d59b282 | ||
|
|
efcb51b2be | ||
|
|
b1c14be958 | ||
|
|
7f57b8281c | ||
|
|
63b8028bca | ||
|
|
d0de5b9aa9 | ||
|
|
81334fb13b | ||
|
|
838252ccc0 | ||
|
|
a398a46680 | ||
|
|
8e7c3f352d | ||
|
|
126b23e4a3 | ||
|
|
cac7ea79bd | ||
|
|
14c7679965 | ||
|
|
36260ee130 | ||
|
|
1ac2118813 | ||
|
|
b58bfe67b1 | ||
|
|
c7bd4ca848 | ||
|
|
23bac30309 | ||
|
|
8d2b9dde08 | ||
|
|
dfb23aba50 | ||
|
|
4e10950c39 | ||
|
|
966e09a284 | ||
|
|
982833642b | ||
|
|
0613a9f690 | ||
|
|
b77b81590d | ||
|
|
53a62e02b1 | ||
|
|
6f31e657db | ||
|
|
4d01f534db | ||
|
|
24eb35c60e | ||
|
|
236bbfe78a | ||
|
|
e333bbc073 | ||
|
|
9daa3c4dba | ||
|
|
752e6de22b | ||
|
|
9c4628f077 | ||
|
|
1a80a0fea6 | ||
|
|
27b69d2b72 | ||
|
|
4008fb8191 | ||
|
|
b116a63532 | ||
|
|
849ad687df | ||
|
|
baea835b20 | ||
|
|
69c23950fd | ||
|
|
bf39e4ba5a | ||
|
|
bfaa25d0a2 | ||
|
|
85fa16d4f0 | ||
|
|
0fabddefc9 | ||
|
|
2a1fbcd93e | ||
|
|
bfbe705dd2 | ||
|
|
6b0ccc4ff7 | ||
|
|
1757d403cd | ||
|
|
5fc1a83a52 | ||
|
|
aed3e35da2 | ||
|
|
45950b2339 | ||
|
|
d7d2240c14 | ||
|
|
dec1119b29 | ||
|
|
7b01a1ee52 | ||
|
|
fffe1c0628 | ||
|
|
24b829053c | ||
|
|
b994c606e8 | ||
|
|
ae7c2a281e | ||
|
|
db80470acc | ||
|
|
5806ded842 | ||
|
|
40b5a9148c | ||
|
|
1322f8618b | ||
|
|
6b44a88f50 | ||
|
|
a4e3601e32 | ||
|
|
e127394988 | ||
|
|
30926058f2 | ||
|
|
36bcfb2b40 | ||
|
|
b5c37a0454 | ||
|
|
dda503e4c2 | ||
|
|
dad2ebad86 | ||
|
|
840ba2d45f | ||
|
|
5d1f895793 | ||
|
|
8bd70eb227 | ||
|
|
3bfa5fde00 | ||
|
|
d22ce79f73 | ||
|
|
fc568b1c8d | ||
|
|
ae8d5f960a | ||
|
|
46e693148f | ||
|
|
117d160ed5 | ||
|
|
87d08452c0 | ||
|
|
12bbdb3caa | ||
|
|
5a4600732c | ||
|
|
e5ab7fb8b8 | ||
|
|
cf0e76eb5d | ||
|
|
aa1025dc78 | ||
|
|
b97b805d9c | ||
|
|
cbf642e9c7 | ||
|
|
02c093a020 | ||
|
|
0b87993c9c | ||
|
|
82502c1f57 | ||
|
|
836b5a9c6a | ||
|
|
5d09ec0056 | ||
|
|
242ca69574 | ||
|
|
af70bccafa | ||
|
|
f6ad122e12 | ||
|
|
e296960798 | ||
|
|
0bf6f79340 | ||
|
|
929219771d | ||
|
|
539edc2c38 | ||
|
|
4206cefdad | ||
|
|
542e7f1517 | ||
|
|
6e4b7f0e43 | ||
|
|
dea68cef94 | ||
|
|
8f7c243f69 | ||
|
|
4856c9444e | ||
|
|
b09c4b66fc | ||
|
|
14046ba3e3 | ||
|
|
947f3f39d8 | ||
|
|
0f3b899a92 | ||
|
|
2d84f7e186 | ||
|
|
d42f295e83 | ||
|
|
a67996cd8a | ||
|
|
7c19613b24 | ||
|
|
d02eb70412 | ||
|
|
27a22eceb3 | ||
|
|
cff64b71bc | ||
|
|
fb93a6610c | ||
|
|
412d8e2da7 | ||
|
|
3c40972a20 | ||
|
|
bf4c21a098 | ||
|
|
e8fd1e18fe | ||
|
|
a98e96d036 | ||
|
|
5dfffae8a0 | ||
|
|
6578cd9365 | ||
|
|
9097c2a1c4 | ||
|
|
6e60fb6002 | ||
|
|
d3585052c5 | ||
|
|
c2ffd3e426 | ||
|
|
afcaa5e894 | ||
|
|
0800bb4345 | ||
|
|
369abeac1b | ||
|
|
9c8ea4e422 | ||
|
|
a540114d13 | ||
|
|
e7b27a46e7 | ||
|
|
fad04cde91 | ||
|
|
9e24ac97a6 | ||
|
|
7347383c21 | ||
|
|
5e084a0367 | ||
|
|
eeda71e51a | ||
|
|
c3be99e606 | ||
|
|
32e25f0f55 | ||
|
|
d78d6c70b9 | ||
|
|
6b43f948d5 | ||
|
|
ecd7c659ed | ||
|
|
5563bb9d97 | ||
|
|
450e52f492 | ||
|
|
06863c7c62 | ||
|
|
b2969f1e85 | ||
|
|
ff2ef58424 | ||
|
|
87cddeca88 | ||
|
|
0c523dcbc9 | ||
|
|
7ac3a6684d | ||
|
|
cd9518d41c | ||
|
|
da140a5e6a | ||
|
|
3f863165bf | ||
|
|
2c2f70398f | ||
|
|
e85135261f | ||
|
|
6aac31b4d9 | ||
|
|
247db96d58 | ||
|
|
c79ee60464 | ||
|
|
b6ecc93c5d | ||
|
|
355969b10f | ||
|
|
00974411ab | ||
|
|
35422aeab1 | ||
|
|
f7763b289f | ||
|
|
6c73b2ffe0 | ||
|
|
117f049944 | ||
|
|
02fdd72f28 | ||
|
|
c21fab6c64 | ||
|
|
807f3a385d | ||
|
|
7f297b7700 | ||
|
|
1f62e9529e | ||
|
|
5d9f6b1245 | ||
|
|
8ed26c96d4 | ||
|
|
d21395da8a | ||
|
|
ab0e5f9cd2 | ||
|
|
58896be47a | ||
|
|
3f874a61e2 | ||
|
|
a3fcc47bfd | ||
|
|
5f0ca8682a | ||
|
|
a7ac55ec80 | ||
|
|
537531db09 | ||
|
|
5c71609523 | ||
|
|
8e3670be65 | ||
|
|
f4d9475d21 | ||
|
|
f794f98859 | ||
|
|
28a3c7c94c | ||
|
|
3b86cd966d | ||
|
|
7fc3ef2359 | ||
|
|
e3ecec04c7 | ||
|
|
b0a929bfe3 | ||
|
|
1e7b093941 | ||
|
|
98ea1f19e1 | ||
|
|
3e2bdec819 | ||
|
|
dd4273bb76 | ||
|
|
d1fdbb88a6 | ||
|
|
bcdd25f18e | ||
|
|
06d2f4517f | ||
|
|
21d1d3f204 | ||
|
|
79e9b2660a | ||
|
|
32b39a8578 | ||
|
|
f44ac930e9 | ||
|
|
851def48bb | ||
|
|
f9449f57a8 | ||
|
|
dcbc4497c2 | ||
|
|
6672725dfa | ||
|
|
5a95c4c1da | ||
|
|
e4463d3dad | ||
|
|
a542662da2 | ||
|
|
33479ad88a | ||
|
|
d702d2d9b8 | ||
|
|
d3ea8d651a | ||
|
|
9b15d0d98a | ||
|
|
4db3c92bd4 | ||
|
|
89f082c55d | ||
|
|
1c8cece6cf | ||
|
|
747049761c | ||
|
|
1eb9f11434 | ||
|
|
71f0e56728 | ||
|
|
6ec9be0a8f | ||
|
|
aa2bb93d52 | ||
|
|
901b126f49 | ||
|
|
6fefb6485a | ||
|
|
e1f3d1d0bd | ||
|
|
e88be3c23a | ||
|
|
63d1299b07 | ||
|
|
f793521ce3 | ||
|
|
908313c594 | ||
|
|
fa86c3ca04 | ||
|
|
3d2d9dac0b | ||
|
|
90ab5e1c5b | ||
|
|
f93b053de5 | ||
|
|
403beca71f | ||
|
|
80c2a741b2 | ||
|
|
4465ad7488 | ||
|
|
4d34780319 | ||
|
|
21a153fc5a | ||
|
|
305a01b7e0 | ||
|
|
af7380940a | ||
|
|
cce631c366 | ||
|
|
b0efda1f02 | ||
|
|
63d033d48f | ||
|
|
094ec5cfdd | ||
|
|
f35a1a9ec9 | ||
|
|
7d1986f962 | ||
|
|
04b394303e | ||
|
|
7d3bf6863e | ||
|
|
f0ed3044ab | ||
|
|
136f957833 | ||
|
|
a4a79069c7 | ||
|
|
d247cb4830 | ||
|
|
35a2798541 | ||
|
|
c62ba5850e | ||
|
|
91483c8867 | ||
|
|
a2c331c4fa | ||
|
|
9021b2ffa3 | ||
|
|
ba1b74f872 | ||
|
|
a7f8699a30 | ||
|
|
5cf915fed1 | ||
|
|
47beb070cd | ||
|
|
c257601916 | ||
|
|
0ca3ba87f9 | ||
|
|
e586dea477 | ||
|
|
1d2a8bc7e1 | ||
|
|
b493124644 | ||
|
|
7d6f16ad61 | ||
|
|
b2c7da5111 | ||
|
|
7cf1d6a3bf | ||
|
|
a2c0009a8c | ||
|
|
25983aa7e2 | ||
|
|
7790a1bc66 | ||
|
|
88fe1e6c81 | ||
|
|
f4951befd4 | ||
|
|
ee12336b90 | ||
|
|
c1259cf0ab | ||
|
|
ce1308b5ee | ||
|
|
83c3387eb2 | ||
|
|
22152ddf10 | ||
|
|
0cb759f771 | ||
|
|
4facb2c26a | ||
|
|
dae2d78d6e | ||
|
|
85c9baeb50 | ||
|
|
18dd8dc911 | ||
|
|
8ed312cd0a | ||
|
|
5ecebc506f | ||
|
|
1f68727c79 | ||
|
|
997b919ee6 | ||
|
|
33be574d54 | ||
|
|
8b3ae1a700 | ||
|
|
b3fbf34e89 | ||
|
|
cc842e55c7 | ||
|
|
2710cac480 | ||
|
|
6594ed1ae2 | ||
|
|
884bc2ca0a | ||
|
|
d58475a61d | ||
|
|
843138f82a | ||
|
|
390c5fa915 | ||
|
|
5ecf34c524 | ||
|
|
7964c6247d | ||
|
|
be29c27c80 | ||
|
|
ad7dea821d | ||
|
|
dfe4d8df0a | ||
|
|
f02cfddb10 | ||
|
|
52378cfed3 | ||
|
|
788bf68705 | ||
|
|
2c6dd1a02d | ||
|
|
c281f9dfb4 | ||
|
|
64b3ee35f4 | ||
|
|
8f7d417cd6 | ||
|
|
eae8c0ab72 | ||
|
|
ad4ec969a1 | ||
|
|
98b078f9c7 | ||
|
|
dc75e8e469 | ||
|
|
f0dea27ab3 | ||
|
|
3d3cbe8632 | ||
|
|
ebdbcfa946 | ||
|
|
48255659ad | ||
|
|
0770a3d7f4 | ||
|
|
2403e463f4 | ||
|
|
af6f169bd9 | ||
|
|
2d144fefd4 | ||
|
|
ba3b262f34 | ||
|
|
8a26cb4a97 | ||
|
|
4f23227de4 | ||
|
|
f532de8c62 | ||
|
|
87b1a84043 | ||
|
|
8128b8b15b | ||
|
|
b3e95de924 | ||
|
|
1081c63b72 | ||
|
|
cdc66ae76a | ||
|
|
10ce2d9c1f | ||
|
|
7da452c4ea | ||
|
|
57bba4152c | ||
|
|
aadb3dd743 | ||
|
|
e6cc2341b7 | ||
|
|
2b3f135443 | ||
|
|
f61f1ed91f | ||
|
|
318eade1b7 | ||
|
|
48d9af6e96 | ||
|
|
d1923ee4e7 | ||
|
|
af2ecf5fbd | ||
|
|
383ff90871 | ||
|
|
e19dccd908 | ||
|
|
ebe4e8e31c | ||
|
|
f865f5ddf2 | ||
|
|
ed4722cb20 | ||
|
|
e3058bb621 | ||
|
|
1d197c15f5 | ||
|
|
8c8de54553 | ||
|
|
90763b7135 | ||
|
|
2e79664b82 | ||
|
|
c2e4060d56 | ||
|
|
e38c9d790c | ||
|
|
6c9b5fb660 | ||
|
|
3205869ab0 | ||
|
|
417ae3c9d8 | ||
|
|
12956df6b5 | ||
|
|
373e7aa505 | ||
|
|
eef3239a37 | ||
|
|
21c26e095e | ||
|
|
e337242d0a | ||
|
|
56cf4b4b9b | ||
|
|
69b270aef6 | ||
|
|
40c9bfb3ac | ||
|
|
0924595b69 | ||
|
|
93debf2557 | ||
|
|
51c43c2a24 | ||
|
|
b33ee84d99 | ||
|
|
9fbd14130c | ||
|
|
0d8e5fb414 | ||
|
|
6e7f42c26d | ||
|
|
6e4c835b51 | ||
|
|
acf4b3678b | ||
|
|
7f11cced2c | ||
|
|
756d78546c | ||
|
|
dd304f684a | ||
|
|
4c0af00c97 | ||
|
|
799795323c | ||
|
|
446a23519e | ||
|
|
5be4bb8206 | ||
|
|
8f318ef4f7 | ||
|
|
f3b6bfee4c | ||
|
|
b79d6ee1ec | ||
|
|
7d0589723f | ||
|
|
0bfc857b7f | ||
|
|
78b2219f48 | ||
|
|
4e8cc48c66 | ||
|
|
bac6043ff1 | ||
|
|
3032e3069e | ||
|
|
3c803d87d1 | ||
|
|
aa631ff2a6 | ||
|
|
124ec4ca4c | ||
|
|
7f419c85ce | ||
|
|
ecaf0a044d | ||
|
|
0b3f05d5c3 | ||
|
|
8dedb81e7a | ||
|
|
33669f3722 | ||
|
|
5952b953cf | ||
|
|
44616bfbac | ||
|
|
8267c62e1b | ||
|
|
f4bf40e8a7 | ||
|
|
0f030e3b2e | ||
|
|
e96aa4036f | ||
|
|
8d66f13600 | ||
|
|
8f07094067 | ||
|
|
57645bbf05 | ||
|
|
60e096d14c | ||
|
|
54f9e59e61 | ||
|
|
43daabd397 | ||
|
|
40092e9727 | ||
|
|
48b67cdb96 | ||
|
|
028ce80766 | ||
|
|
4be34fd1f6 | ||
|
|
16229bcb46 | ||
|
|
51106cb293 | ||
|
|
ed0b1be6c4 | ||
|
|
8a7f3193aa | ||
|
|
054fe59ddb | ||
|
|
e94bdde451 | ||
|
|
78dfb415bb | ||
|
|
1c81291d5d | ||
|
|
c56b9ea3d3 | ||
|
|
617ee0a32c | ||
|
|
9b1f5dfd6d | ||
|
|
97b446ec7f | ||
|
|
4b230e856c | ||
|
|
42b798eb05 | ||
|
|
2e8ca637a9 | ||
|
|
c16bfffb36 | ||
|
|
667b847f24 | ||
|
|
6aa479de65 | ||
|
|
79afb5c22e | ||
|
|
b634efd179 | ||
|
|
da3ad44097 | ||
|
|
b02074e7d7 | ||
|
|
e30266863a | ||
|
|
97e6f8449d | ||
|
|
5b4ff32501 | ||
|
|
7441c50dfa | ||
|
|
3983af0ead | ||
|
|
03a0690e39 | ||
|
|
4fd51423c0 | ||
|
|
a8bb3a7cb5 | ||
|
|
277febac16 | ||
|
|
f0956f47b4 | ||
|
|
5df686c1a5 | ||
|
|
7f13505f54 | ||
|
|
a897514fbb | ||
|
|
4b36a51861 | ||
|
|
07a7966879 | ||
|
|
14190a771e | ||
|
|
d9d92ff955 | ||
|
|
eb3d5983be | ||
|
|
87a4c9511c | ||
|
|
a393e8767a | ||
|
|
2417b85f64 | ||
|
|
a18e2b771b | ||
|
|
ba268cf97c | ||
|
|
e0a695be01 | ||
|
|
b1ceae9136 | ||
|
|
ff8a3dc340 | ||
|
|
686c3eb6f0 | ||
|
|
d3cebaa79e | ||
|
|
a6585e8b58 | ||
|
|
ff5143894c | ||
|
|
b717818616 | ||
|
|
3a099f89f4 | ||
|
|
aafec8f292 | ||
|
|
ba611c908e | ||
|
|
05b34fd935 | ||
|
|
961c070011 | ||
|
|
0d4f038a26 |
5
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -32,5 +32,10 @@ If applicable, add screenshots to help explain your problem.
|
||||
- OS: [e.g. iOS8.1]
|
||||
- Version [e.g. 22]
|
||||
|
||||
**Append a debug log**
|
||||
|
||||
Follow this guide https://github.com/cagnulein/qdomyos-zwift/wiki/How-do-i-get-the-debug-log-in-case-something-doesn't-work%3F
|
||||
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
|
||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: "[REQ]"
|
||||
labels: enhancement
|
||||
assignees: cagnulein
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
43
.github/workflows/main.yml
vendored
@@ -2,13 +2,19 @@
|
||||
|
||||
name: CI
|
||||
|
||||
env:
|
||||
DISPLAY: ':99'
|
||||
|
||||
# Controls when the action will run. Triggers the workflow on push or pull request
|
||||
# events but only for the master branch
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches: [ master ]
|
||||
branches: [ master, github-workflow-playground ]
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
schedule:
|
||||
- cron: "0 */12 * * *"
|
||||
|
||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||
jobs:
|
||||
@@ -33,28 +39,39 @@ jobs:
|
||||
# path: '${{ github.workspace }}/output/android/'
|
||||
# key: ${{ runner.os }}-QtCache-Android
|
||||
|
||||
- name: Xvfb install and run
|
||||
run: |
|
||||
sudo apt-get install -y xvfb
|
||||
Xvfb -ac ${{ env.DISPLAY }} -screen 0 1280x780x24 &
|
||||
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
# Runs a set of commands using the runners shell
|
||||
- name: Install Qt Linux Desktop
|
||||
uses: jurplel/install-qt-action@v2
|
||||
- name: Checkout submodule repo
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
version: '5.12.9'
|
||||
host: 'linux'
|
||||
target: 'desktop'
|
||||
modules: 'qtcharts debug_info qtnetworkauth'
|
||||
dir: '${{ github.workspace }}/output/linux-desktop/'
|
||||
# cached: ${{ steps.cache-qt-linux-desktop.outputs.cache-hit }}
|
||||
repository: bluetiger9/SmtpClient-for-Qt
|
||||
path: "src/smtpclient/"
|
||||
|
||||
- name: Install packages required to run QZ inside workflow
|
||||
run: sudo apt update -y && sudo apt-get install -y qt5-default libqt5bluetooth5 libqt5widgets5 libqt5positioning5 libqt5xml5 qtconnectivity5-dev qtpositioning5-dev libqt5charts5-dev libqt5charts5 qt5-default libqt5networkauth5-dev libqt5websockets5* libxcb-randr0-dev libxcb-xtest0-dev libxcb-xinerama0-dev libxcb-shape0-dev libxcb-xkb-dev
|
||||
|
||||
- name: Compile Linux Desktop
|
||||
run: cd src; qmake; make -j4
|
||||
run: cd src; qmake; make -j8
|
||||
|
||||
- name: Archive linux-desktop binary
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: linux-desktop-binary
|
||||
path: src/qdomyos-zwift
|
||||
path: src/qdomyos-zwift
|
||||
|
||||
# - name: Test Peloton API
|
||||
# if: github.event_name == 'push' || github.event_name == 'schedule'
|
||||
# run: cd /home/runner/work/qdomyos-zwift/qdomyos-zwift/src/; ./qdomyos-zwift -test-peloton -peloton-username ${{ secrets.peloton_username }} -peloton-password ${{ secrets.peloton_password }}
|
||||
# timeout-minutes: 2
|
||||
|
||||
# - name: Test Home Fitness Buddy API
|
||||
# run: cd /home/runner/work/qdomyos-zwift/qdomyos-zwift/src/; ./qdomyos-zwift -test-hfb
|
||||
# timeout-minutes: 2
|
||||
|
||||
# - uses: actions/checkout@v2
|
||||
# with:
|
||||
|
||||
16
.gitignore
vendored
@@ -13,7 +13,23 @@ src/qdomyos-zwift
|
||||
src/ui_charts.h
|
||||
src/ui_mainwindow.h
|
||||
|
||||
src/build/*
|
||||
src/build/*
|
||||
|
||||
src/debug-*
|
||||
|
||||
*.swo
|
||||
*.swp
|
||||
|
||||
template-examples/youtube-viewer/node_modules/*
|
||||
template-examples/youtube-viewer/*.json
|
||||
template-examples/youtube-viewer/.eslintrc.js
|
||||
template-examples/youtube-viewer/.jshintrc
|
||||
template-examples/youtube-viewer/debug.js
|
||||
|
||||
|
||||
template-examples/train-program-saver/node_modules/*
|
||||
template-examples/train-program-saver/*.json
|
||||
template-examples/train-program-saver/.eslintrc.js
|
||||
template-examples/train-program-saver/.jshintrc
|
||||
template-examples/train-program-saver/debug.js
|
||||
|
||||
3
.gitmodules
vendored
@@ -1,3 +1,6 @@
|
||||
[submodule "android_openssl"]
|
||||
path = android_openssl
|
||||
url = https://github.com/KDAB/android_openssl.git
|
||||
[submodule "src/smtpclient"]
|
||||
path = src/smtpclient
|
||||
url = https://github.com/bluetiger9/SmtpClient-for-Qt.git
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
# qdomyos-zwift
|
||||
Zwift bridge for Treadmills and Bike!
|
||||
|
||||
## QZ is not affiliated with or endorsed by any subscription service or maker of exercise equipment.
|
||||
|
||||
[<img src="docs/img/google_play.png">](https://play.google.com/store/apps/details?id=org.cagnulen.qdomyoszwift&fbclid=IwAR3CVoYb0scvGf7gb0Y20VFh5Na5fDWwe7VACk-2c45Tm0x5s8sXpIGhGyw)
|
||||
[<img src="docs/img/app_store.png">](https://apps.apple.com/app/id1543684531?fbclid=IwAR10H6y3mEgwkTlGJON3e8voYOh2wt3kLFOpFzoIXaYZ_N0y0pDvKxHMUaM)
|
||||
<a href="https://www.buymeacoffee.com/cagnulein" target="_blank"><img src="https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png" alt="Buy Me A Coffee" style="height: 41px !important;width: 174px !important;box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;-webkit-box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;" ></a>
|
||||
|
||||
84
amazon-store/src/android/AndroidManifest.xml
Normal file
@@ -0,0 +1,84 @@
|
||||
<?xml version="1.0"?>
|
||||
<manifest package="org.cagnulen.qdomyoszwift" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="2.6.18" android:versionCode="128" android:installLocation="auto">
|
||||
<uses-feature android:name="android.hardware.bluetooth" android:required="true" />
|
||||
<uses-feature android:name="android.hardware.location" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.location.gps" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.location" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
|
||||
|
||||
|
||||
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
|
||||
<application android:hardwareAccelerated="true" android:debuggable="false" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="qdomyos-zwift" android:extractNativeLibs="true" android:icon="@drawable/icon">
|
||||
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="qdomyos-zwift" android:launchMode="singleTop">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
<!-- Application arguments -->
|
||||
<!-- meta-data android:name="android.app.arguments" android:value="arg1 arg2 arg3"/ -->
|
||||
<!-- Application arguments -->
|
||||
<meta-data android:name="android.app.lib_name" android:value="qdomyos-zwift"/>
|
||||
<meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/>
|
||||
<meta-data android:name="android.app.repository" android:value="default"/>
|
||||
<meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/>
|
||||
<meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
|
||||
<!-- Deploy Qt libs as part of package -->
|
||||
<meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/>
|
||||
<!-- Run with local libs -->
|
||||
<meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/>
|
||||
<meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
|
||||
<meta-data android:name="android.app.load_local_libs_resource_id" android:resource="@array/load_local_libs"/>
|
||||
<meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/>
|
||||
<meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/>
|
||||
<!-- Used to specify custom system library path to run with local system libs -->
|
||||
<!-- <meta-data android:name="android.app.system_libs_prefix" android:value="/system/lib/"/> -->
|
||||
<!-- Messages maps -->
|
||||
<meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
|
||||
<meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
|
||||
<meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
|
||||
<meta-data android:value="@string/unsupported_android_version" android:name="android.app.unsupported_android_version"/>
|
||||
<!-- Messages maps -->
|
||||
<!-- Splash screen -->
|
||||
<!-- Orientation-specific (portrait/landscape) data is checked first. If not available for current orientation,
|
||||
then android.app.splash_screen_drawable. For best results, use together with splash_screen_sticky and
|
||||
use hideSplashScreen() with a fade-out animation from Qt Android Extras to hide the splash screen when you
|
||||
are done populating your window with content. -->
|
||||
<!-- meta-data android:name="android.app.splash_screen_drawable_portrait" android:resource="@drawable/logo_portrait" / -->
|
||||
<!-- meta-data android:name="android.app.splash_screen_drawable_landscape" android:resource="@drawable/logo_landscape" / -->
|
||||
<!-- meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/ -->
|
||||
<!-- meta-data android:name="android.app.splash_screen_sticky" android:value="true"/ -->
|
||||
<!-- Splash screen -->
|
||||
<!-- Background running -->
|
||||
<!-- Warning: changing this value to true may cause unexpected crashes if the
|
||||
application still try to draw after
|
||||
"applicationStateChanged(Qt::ApplicationSuspended)"
|
||||
signal is sent! -->
|
||||
<meta-data android:name="android.app.background_running" android:value="true"/>
|
||||
<!-- Background running -->
|
||||
<!-- auto screen scale factor -->
|
||||
<meta-data android:name="android.app.auto_screen_scale_factor" android:value="full"/>
|
||||
<!-- auto screen scale factor -->
|
||||
<!-- extract android style -->
|
||||
<!-- available android:values :
|
||||
* default - In most cases this will be the same as "full", but it can also be something else if needed, e.g., for compatibility reasons
|
||||
* full - useful QWidget & Quick Controls 1 apps
|
||||
* minimal - useful for Quick Controls 2 apps, it is much faster than "full"
|
||||
* none - useful for apps that don't use any of the above Qt modules
|
||||
-->
|
||||
<meta-data android:name="android.app.extract_android_style" android:value="default"/>
|
||||
<!-- extract android style -->
|
||||
<meta-data android:name="com.amazon.input.cursor" android:value="pointer"/>
|
||||
</activity>
|
||||
<service android:name=".ChannelService"></service>
|
||||
<activity android:name="org.cagnulen.qdomyoszwift.MyActivity" />
|
||||
<!-- For adding service(s) please check: https://wiki.qt.io/AndroidServices -->
|
||||
</application>
|
||||
|
||||
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="29" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||
<uses-permission android:name="android.permission.BLUETOOTH"/>
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
|
||||
</manifest>
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17506" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
||||
<device id="retina6_1" orientation="portrait" appearance="light"/>
|
||||
<device id="ipad12_9rounded" orientation="landscape" layout="splitview2_3" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17505"/>
|
||||
@@ -13,32 +13,32 @@
|
||||
<objects>
|
||||
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="981" height="1024"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="obG-Y5-kRd">
|
||||
<rect key="frame" x="0.0" y="876" width="414" height="0.0"/>
|
||||
<rect key="frame" x="0.0" y="1004" width="981" height="0.0"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="launcher" translatesAutoresizingMaskIntoConstraints="NO" id="VVq-0c-S8O">
|
||||
<rect key="frame" x="20" y="348" width="374" height="201"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<rect key="frame" x="20" y="114" width="941" height="776"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
</imageView>
|
||||
</subviews>
|
||||
<viewLayoutGuide key="safeArea" id="Bcu-3y-fUS"/>
|
||||
<color key="backgroundColor" red="0.10980264100000001" green="0.11007446799999999" blue="0.1176523939" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="Bcu-3y-fUS" firstAttribute="centerX" secondItem="obG-Y5-kRd" secondAttribute="centerX" id="5cz-MP-9tL"/>
|
||||
<constraint firstItem="obG-Y5-kRd" firstAttribute="leading" secondItem="Bcu-3y-fUS" secondAttribute="leading" constant="20" symbolic="YES" id="SfN-ll-jLj"/>
|
||||
<constraint firstItem="obG-Y5-kRd" firstAttribute="leading" secondItem="Bcu-3y-fUS" secondAttribute="leading" symbolic="YES" id="SfN-ll-jLj"/>
|
||||
<constraint firstAttribute="bottom" secondItem="obG-Y5-kRd" secondAttribute="bottom" constant="20" id="Y44-ml-fuU"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="52.173913043478265" y="375"/>
|
||||
<point key="canvasLocation" x="50.625" y="373.75"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
<resources>
|
||||
|
||||
@@ -59,10 +59,19 @@ extension MainController {
|
||||
}
|
||||
|
||||
extension MainController: WorkoutTrackingDelegate {
|
||||
func didReceiveHealthKitDistanceCycling(_ distanceCycling: Double) {
|
||||
|
||||
}
|
||||
func didReceiveHealthKitActiveEnergyBurned(_ activeEnergyBurned: Double) {
|
||||
|
||||
}
|
||||
|
||||
func didReceiveHealthKitHeartRate(_ heartRate: Double) {
|
||||
heartRateLabel.setText("\(heartRate) BPM")
|
||||
WatchKitConnection.shared.sendMessage(message: ["heartRate":
|
||||
"\(heartRate)" as AnyObject])
|
||||
WorkoutTracking.distance = WatchKitConnection.distance
|
||||
WorkoutTracking.kcal = WatchKitConnection.kcal
|
||||
}
|
||||
|
||||
func didReceiveHealthKitStepCounts(_ stepCounts: Double) {
|
||||
|
||||
@@ -21,6 +21,8 @@ protocol WatchKitConnectionProtocol {
|
||||
|
||||
class WatchKitConnection: NSObject {
|
||||
static let shared = WatchKitConnection()
|
||||
public static var distance = 0.0
|
||||
public static var kcal = 0.0
|
||||
weak var delegate: WatchKitConnectionDelegate?
|
||||
|
||||
private override init() {
|
||||
@@ -59,6 +61,10 @@ extension WatchKitConnection: WatchKitConnectionProtocol {
|
||||
{
|
||||
validReachableSession?.sendMessage(message, replyHandler: { (result) in
|
||||
print(result)
|
||||
let dDistance = Double(result["distance"] as! Double)
|
||||
WatchKitConnection.distance = dDistance
|
||||
let dKcal = Double(result["kcal"] as! Double)
|
||||
WatchKitConnection.kcal = dKcal
|
||||
}, errorHandler: { (error) in
|
||||
print(error)
|
||||
})
|
||||
|
||||
455
build-qdomyos-zwift-Qt_5_15_2_for_iOS-Debug/watchkit Extension/WatchWorkoutTracking.swift
Normal file → Executable file
@@ -1,199 +1,256 @@
|
||||
//
|
||||
// WatchWorkoutTracking.swift
|
||||
// ElecDemo WatchKit Extension
|
||||
//
|
||||
// Created by NhatHM on 8/12/19.
|
||||
// Copyright © 2019 GST.PID. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import HealthKit
|
||||
|
||||
protocol WorkoutTrackingDelegate: class {
|
||||
func didReceiveHealthKitHeartRate(_ heartRate: Double)
|
||||
func didReceiveHealthKitStepCounts(_ stepCounts: Double)
|
||||
}
|
||||
|
||||
protocol WorkoutTrackingProtocol {
|
||||
static func authorizeHealthKit()
|
||||
func startWorkOut()
|
||||
func stopWorkOut()
|
||||
func fetchStepCounts()
|
||||
}
|
||||
|
||||
class WorkoutTracking: NSObject {
|
||||
static let shared = WorkoutTracking()
|
||||
let healthStore = HKHealthStore()
|
||||
let configuration = HKWorkoutConfiguration()
|
||||
var workoutSession: HKWorkoutSession!
|
||||
var workoutBuilder: HKLiveWorkoutBuilder!
|
||||
|
||||
weak var delegate: WorkoutTrackingDelegate?
|
||||
|
||||
override init() {
|
||||
super.init()
|
||||
}
|
||||
}
|
||||
|
||||
extension WorkoutTracking {
|
||||
private func handleSendStatisticsData(_ statistics: HKStatistics) {
|
||||
switch statistics.quantityType {
|
||||
case HKQuantityType.quantityType(forIdentifier: .heartRate):
|
||||
let heartRateUnit = HKUnit.count().unitDivided(by: HKUnit.minute())
|
||||
let value = statistics.mostRecentQuantity()?.doubleValue(for: heartRateUnit)
|
||||
let roundedValue = Double( round( 1 * value! ) / 1 )
|
||||
delegate?.didReceiveHealthKitHeartRate(roundedValue)
|
||||
|
||||
case HKQuantityType.quantityType(forIdentifier: .stepCount):
|
||||
guard let stepCounts = HKQuantityType.quantityType(forIdentifier: .stepCount) else {
|
||||
return
|
||||
}
|
||||
let startOfDay = Calendar.current.startOfDay(for: Date())
|
||||
let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: Date(), options: .strictStartDate)
|
||||
|
||||
let query = HKStatisticsQuery(quantityType: stepCounts, quantitySamplePredicate: predicate, options: .cumulativeSum) { [weak self] (_, result, error) in
|
||||
guard let weakSelf = self else {
|
||||
return
|
||||
}
|
||||
var resultCount = 0.0
|
||||
guard let result = result else {
|
||||
print("Failed to fetch steps rate")
|
||||
return
|
||||
}
|
||||
|
||||
if let sum = result.sumQuantity() {
|
||||
resultCount = sum.doubleValue(for: HKUnit.count())
|
||||
weakSelf.delegate?.didReceiveHealthKitStepCounts(resultCount)
|
||||
} else {
|
||||
print("Failed to fetch steps rate 2")
|
||||
}
|
||||
}
|
||||
healthStore.execute(query)
|
||||
return
|
||||
default:
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
private func configWorkout() {
|
||||
configuration.activityType = .cycling
|
||||
configuration.locationType = .indoor
|
||||
|
||||
do {
|
||||
workoutSession = try HKWorkoutSession(healthStore: healthStore, configuration: configuration)
|
||||
workoutBuilder = workoutSession?.associatedWorkoutBuilder()
|
||||
} catch {
|
||||
return
|
||||
}
|
||||
|
||||
workoutSession.delegate = self
|
||||
workoutBuilder.delegate = self
|
||||
|
||||
workoutBuilder.dataSource = HKLiveWorkoutDataSource(healthStore: healthStore, workoutConfiguration: configuration)
|
||||
}
|
||||
}
|
||||
|
||||
extension WorkoutTracking: WorkoutTrackingProtocol {
|
||||
static func authorizeHealthKit() {
|
||||
if HKHealthStore.isHealthDataAvailable() {
|
||||
let infoToRead = Set([
|
||||
HKSampleType.quantityType(forIdentifier: .stepCount)!,
|
||||
HKSampleType.quantityType(forIdentifier: .heartRate)!,
|
||||
HKSampleType.workoutType()
|
||||
])
|
||||
|
||||
let infoToShare = Set([
|
||||
HKSampleType.quantityType(forIdentifier: .stepCount)!,
|
||||
HKSampleType.quantityType(forIdentifier: .heartRate)!,
|
||||
HKSampleType.workoutType()
|
||||
])
|
||||
|
||||
HKHealthStore().requestAuthorization(toShare: infoToShare, read: infoToRead) { (success, error) in
|
||||
if success {
|
||||
print("Authorization healthkit success")
|
||||
} else if let error = error {
|
||||
print(error)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
print("HealthKit not avaiable")
|
||||
}
|
||||
}
|
||||
|
||||
func startWorkOut() {
|
||||
print("Start workout")
|
||||
configWorkout()
|
||||
workoutSession.startActivity(with: Date())
|
||||
workoutBuilder.beginCollection(withStart: Date()) { (success, error) in
|
||||
print(success)
|
||||
if let error = error {
|
||||
print(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func stopWorkOut() {
|
||||
print("Stop workout")
|
||||
workoutSession.stopActivity(with: Date())
|
||||
workoutSession.end()
|
||||
workoutBuilder.endCollection(withEnd: Date()) { (success, error) in
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
func fetchStepCounts() {
|
||||
guard let stepCounts = HKQuantityType.quantityType(forIdentifier: .stepCount) else {
|
||||
return
|
||||
}
|
||||
let startOfDay = Calendar.current.startOfDay(for: Date())
|
||||
let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: Date(), options: .strictStartDate)
|
||||
|
||||
let query = HKStatisticsQuery(quantityType: stepCounts, quantitySamplePredicate: predicate, options: .cumulativeSum) { [weak self] (_, result, error) in
|
||||
guard let weakSelf = self else {
|
||||
return
|
||||
}
|
||||
var resultCount = 0.0
|
||||
guard let result = result else {
|
||||
print("Failed to fetch steps rate")
|
||||
return
|
||||
}
|
||||
|
||||
if let sum = result.sumQuantity() {
|
||||
resultCount = sum.doubleValue(for: HKUnit.count())
|
||||
weakSelf.delegate?.didReceiveHealthKitStepCounts(resultCount)
|
||||
} else {
|
||||
print("Failed to fetch steps rate 2")
|
||||
}
|
||||
}
|
||||
healthStore.execute(query)
|
||||
}
|
||||
}
|
||||
|
||||
extension WorkoutTracking: HKLiveWorkoutBuilderDelegate {
|
||||
func workoutBuilder(_ workoutBuilder: HKLiveWorkoutBuilder, didCollectDataOf collectedTypes: Set<HKSampleType>) {
|
||||
print("GET DATA: \(Date())")
|
||||
for type in collectedTypes {
|
||||
guard let quantityType = type as? HKQuantityType else {
|
||||
return
|
||||
}
|
||||
|
||||
if let statistics = workoutBuilder.statistics(for: quantityType) {
|
||||
handleSendStatisticsData(statistics)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func workoutBuilderDidCollectEvent(_ workoutBuilder: HKLiveWorkoutBuilder) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
extension WorkoutTracking: HKWorkoutSessionDelegate {
|
||||
func workoutSession(_ workoutSession: HKWorkoutSession, didChangeTo toState: HKWorkoutSessionState, from fromState: HKWorkoutSessionState, date: Date) {
|
||||
|
||||
}
|
||||
|
||||
func workoutSession(_ workoutSession: HKWorkoutSession, didFailWithError error: Error) {
|
||||
|
||||
}
|
||||
}
|
||||
//
|
||||
// WatchWorkoutTracking.swift
|
||||
// ElecDemo WatchKit Extension
|
||||
//
|
||||
// Created by NhatHM on 8/12/19.
|
||||
// Copyright © 2019 GST.PID. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import HealthKit
|
||||
|
||||
protocol WorkoutTrackingDelegate: class {
|
||||
func didReceiveHealthKitHeartRate(_ heartRate: Double)
|
||||
func didReceiveHealthKitStepCounts(_ stepCounts: Double)
|
||||
func didReceiveHealthKitDistanceCycling(_ distanceCycling: Double)
|
||||
func didReceiveHealthKitActiveEnergyBurned(_ activeEnergyBurned: Double)
|
||||
}
|
||||
|
||||
protocol WorkoutTrackingProtocol {
|
||||
static func authorizeHealthKit()
|
||||
func startWorkOut()
|
||||
func stopWorkOut()
|
||||
func fetchStepCounts()
|
||||
}
|
||||
|
||||
class WorkoutTracking: NSObject {
|
||||
static let shared = WorkoutTracking()
|
||||
public static var distance = Double()
|
||||
public static var kcal = Double()
|
||||
let healthStore = HKHealthStore()
|
||||
let configuration = HKWorkoutConfiguration()
|
||||
var workoutSession: HKWorkoutSession!
|
||||
var workoutBuilder: HKLiveWorkoutBuilder!
|
||||
|
||||
weak var delegate: WorkoutTrackingDelegate?
|
||||
|
||||
override init() {
|
||||
super.init()
|
||||
}
|
||||
}
|
||||
|
||||
extension WorkoutTracking {
|
||||
private func handleSendStatisticsData(_ statistics: HKStatistics) {
|
||||
switch statistics.quantityType {
|
||||
case HKQuantityType.quantityType(forIdentifier: .distanceCycling):
|
||||
let distanceUnit = HKUnit.mile()
|
||||
let value = statistics.mostRecentQuantity()?.doubleValue(for: distanceUnit)
|
||||
let roundedValue = Double( round( 1 * value! ) / 1 )
|
||||
delegate?.didReceiveHealthKitDistanceCycling(roundedValue)
|
||||
|
||||
case HKQuantityType.quantityType(forIdentifier: .activeEnergyBurned):
|
||||
let energyUnit = HKUnit.kilocalorie()
|
||||
let value = statistics.mostRecentQuantity()?.doubleValue(for: energyUnit)
|
||||
let roundedValue = Double( round( 1 * value! ) / 1 )
|
||||
delegate?.didReceiveHealthKitActiveEnergyBurned(roundedValue)
|
||||
|
||||
case HKQuantityType.quantityType(forIdentifier: .heartRate):
|
||||
let heartRateUnit = HKUnit.count().unitDivided(by: HKUnit.minute())
|
||||
let value = statistics.mostRecentQuantity()?.doubleValue(for: heartRateUnit)
|
||||
let roundedValue = Double( round( 1 * value! ) / 1 )
|
||||
delegate?.didReceiveHealthKitHeartRate(roundedValue)
|
||||
|
||||
case HKQuantityType.quantityType(forIdentifier: .stepCount):
|
||||
guard let stepCounts = HKQuantityType.quantityType(forIdentifier: .stepCount) else {
|
||||
return
|
||||
}
|
||||
let startOfDay = Calendar.current.startOfDay(for: Date())
|
||||
let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: Date(), options: .strictStartDate)
|
||||
|
||||
let query = HKStatisticsQuery(quantityType: stepCounts, quantitySamplePredicate: predicate, options: .cumulativeSum) { [weak self] (_, result, error) in
|
||||
guard let weakSelf = self else {
|
||||
return
|
||||
}
|
||||
var resultCount = 0.0
|
||||
guard let result = result else {
|
||||
print("Failed to fetch steps rate")
|
||||
return
|
||||
}
|
||||
|
||||
if let sum = result.sumQuantity() {
|
||||
resultCount = sum.doubleValue(for: HKUnit.count())
|
||||
weakSelf.delegate?.didReceiveHealthKitStepCounts(resultCount)
|
||||
} else {
|
||||
print("Failed to fetch steps rate 2")
|
||||
}
|
||||
}
|
||||
healthStore.execute(query)
|
||||
return
|
||||
default:
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
private func configWorkout() {
|
||||
configuration.activityType = .cycling
|
||||
configuration.locationType = .indoor
|
||||
|
||||
do {
|
||||
workoutSession = try HKWorkoutSession(healthStore: healthStore, configuration: configuration)
|
||||
workoutBuilder = workoutSession?.associatedWorkoutBuilder()
|
||||
} catch {
|
||||
return
|
||||
}
|
||||
|
||||
workoutSession.delegate = self
|
||||
workoutBuilder.delegate = self
|
||||
|
||||
workoutBuilder.dataSource = HKLiveWorkoutDataSource(healthStore: healthStore, workoutConfiguration: configuration)
|
||||
}
|
||||
}
|
||||
|
||||
extension WorkoutTracking: WorkoutTrackingProtocol {
|
||||
static func authorizeHealthKit() {
|
||||
if HKHealthStore.isHealthDataAvailable() {
|
||||
let infoToRead = Set([
|
||||
HKSampleType.quantityType(forIdentifier: .stepCount)!,
|
||||
HKSampleType.quantityType(forIdentifier: .heartRate)!,
|
||||
/*HKSampleType.quantityType(forIdentifier: .distanceCycling)!,
|
||||
HKSampleType.quantityType(forIdentifier: .activeEnergyBurned)!,*/
|
||||
HKSampleType.workoutType()
|
||||
])
|
||||
|
||||
let infoToShare = Set([
|
||||
HKSampleType.quantityType(forIdentifier: .stepCount)!,
|
||||
HKSampleType.quantityType(forIdentifier: .heartRate)!,
|
||||
HKSampleType.quantityType(forIdentifier: .distanceCycling)!,
|
||||
HKSampleType.quantityType(forIdentifier: .activeEnergyBurned)!,
|
||||
HKSampleType.workoutType()
|
||||
])
|
||||
|
||||
HKHealthStore().requestAuthorization(toShare: infoToShare, read: infoToRead) { (success, error) in
|
||||
if success {
|
||||
print("Authorization healthkit success")
|
||||
} else if let error = error {
|
||||
print(error)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
print("HealthKit not avaiable")
|
||||
}
|
||||
}
|
||||
|
||||
func startWorkOut() {
|
||||
print("Start workout")
|
||||
configWorkout()
|
||||
workoutSession.startActivity(with: Date())
|
||||
workoutBuilder.beginCollection(withStart: Date()) { (success, error) in
|
||||
print(success)
|
||||
if let error = error {
|
||||
print(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func stopWorkOut() {
|
||||
print("Stop workout")
|
||||
workoutSession.stopActivity(with: Date())
|
||||
workoutSession.end()
|
||||
|
||||
guard let quantityType = HKQuantityType.quantityType(
|
||||
forIdentifier: .activeEnergyBurned) else {
|
||||
return
|
||||
}
|
||||
|
||||
let unit = HKUnit.kilocalorie()
|
||||
let totalEnergyBurned = WorkoutTracking.kcal
|
||||
let quantity = HKQuantity(unit: unit,
|
||||
doubleValue: totalEnergyBurned)
|
||||
|
||||
let sample = HKCumulativeQuantitySeriesSample(type: quantityType,
|
||||
quantity: quantity,
|
||||
start: workoutSession.startDate!,
|
||||
end: Date())
|
||||
|
||||
workoutBuilder.add([sample]) {(success, error) in}
|
||||
|
||||
guard let quantityTypeDistance = HKQuantityType.quantityType(
|
||||
forIdentifier: .distanceCycling) else {
|
||||
return
|
||||
}
|
||||
|
||||
let unitDistance = HKUnit.mile()
|
||||
let miles = WorkoutTracking.distance
|
||||
let quantityMiles = HKQuantity(unit: unitDistance,
|
||||
doubleValue: miles)
|
||||
|
||||
let sampleDistance = HKCumulativeQuantitySeriesSample(type: quantityTypeDistance,
|
||||
quantity: quantityMiles,
|
||||
start: workoutSession.startDate!,
|
||||
end: Date())
|
||||
|
||||
workoutBuilder.add([sample]) {(success, error) in}
|
||||
workoutBuilder.add([sampleDistance]) {(success, error) in}
|
||||
|
||||
workoutBuilder.endCollection(withEnd: Date()) { (success, error) in
|
||||
|
||||
}
|
||||
workoutBuilder.finishWorkout{ (success, error) in }
|
||||
}
|
||||
|
||||
func fetchStepCounts() {
|
||||
guard let stepCounts = HKQuantityType.quantityType(forIdentifier: .stepCount) else {
|
||||
return
|
||||
}
|
||||
let startOfDay = Calendar.current.startOfDay(for: Date())
|
||||
let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: Date(), options: .strictStartDate)
|
||||
|
||||
let query = HKStatisticsQuery(quantityType: stepCounts, quantitySamplePredicate: predicate, options: .cumulativeSum) { [weak self] (_, result, error) in
|
||||
guard let weakSelf = self else {
|
||||
return
|
||||
}
|
||||
var resultCount = 0.0
|
||||
guard let result = result else {
|
||||
print("Failed to fetch steps rate")
|
||||
return
|
||||
}
|
||||
|
||||
if let sum = result.sumQuantity() {
|
||||
resultCount = sum.doubleValue(for: HKUnit.count())
|
||||
weakSelf.delegate?.didReceiveHealthKitStepCounts(resultCount)
|
||||
} else {
|
||||
print("Failed to fetch steps rate 2")
|
||||
}
|
||||
}
|
||||
healthStore.execute(query)
|
||||
}
|
||||
}
|
||||
|
||||
extension WorkoutTracking: HKLiveWorkoutBuilderDelegate {
|
||||
func workoutBuilder(_ workoutBuilder: HKLiveWorkoutBuilder, didCollectDataOf collectedTypes: Set<HKSampleType>) {
|
||||
print("GET DATA: \(Date())")
|
||||
for type in collectedTypes {
|
||||
guard let quantityType = type as? HKQuantityType else {
|
||||
return
|
||||
}
|
||||
|
||||
if let statistics = workoutBuilder.statistics(for: quantityType) {
|
||||
handleSendStatisticsData(statistics)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func workoutBuilderDidCollectEvent(_ workoutBuilder: HKLiveWorkoutBuilder) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
extension WorkoutTracking: HKWorkoutSessionDelegate {
|
||||
func workoutSession(_ workoutSession: HKWorkoutSession, didChangeTo toState: HKWorkoutSessionState, from fromState: HKWorkoutSessionState, date: Date) {
|
||||
|
||||
}
|
||||
|
||||
func workoutSession(_ workoutSession: HKWorkoutSession, didFailWithError error: Error) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,6 +26,13 @@
|
||||
"scale" : "3x",
|
||||
"size" : "29x29"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"role" : "notificationCenter",
|
||||
"scale" : "2x",
|
||||
"size" : "33x33",
|
||||
"subtype" : "45mm"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"role" : "appLauncher",
|
||||
@@ -40,6 +47,13 @@
|
||||
"size" : "44x44",
|
||||
"subtype" : "40mm"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"role" : "appLauncher",
|
||||
"scale" : "2x",
|
||||
"size" : "46x46",
|
||||
"subtype" : "41mm"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"role" : "appLauncher",
|
||||
@@ -47,6 +61,13 @@
|
||||
"size" : "50x50",
|
||||
"subtype" : "44mm"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"role" : "appLauncher",
|
||||
"scale" : "2x",
|
||||
"size" : "51x51",
|
||||
"subtype" : "45mm"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"role" : "quickLook",
|
||||
@@ -68,6 +89,13 @@
|
||||
"size" : "108x108",
|
||||
"subtype" : "44mm"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"role" : "quickLook",
|
||||
"scale" : "2x",
|
||||
"size" : "117x117",
|
||||
"subtype" : "45mm"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch-marketing",
|
||||
"scale" : "1x",
|
||||
|
||||
|
Before Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 8.1 KiB |
|
Before Width: | Height: | Size: 8.1 KiB |
|
Before Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 8.5 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 16 KiB |
@@ -103,7 +103,7 @@
|
||||
"size" : "83.5x83.5"
|
||||
},
|
||||
{
|
||||
"filename" : "iTunesArtwork@2x.png",
|
||||
"filename" : "ItunesArtwork-1.png",
|
||||
"idiom" : "ios-marketing",
|
||||
"scale" : "1x",
|
||||
"size" : "1024x1024"
|
||||
@@ -138,6 +138,13 @@
|
||||
"scale" : "3x",
|
||||
"size" : "29x29"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"role" : "notificationCenter",
|
||||
"scale" : "2x",
|
||||
"size" : "33x33",
|
||||
"subtype" : "45mm"
|
||||
},
|
||||
{
|
||||
"filename" : "80x80-1.png",
|
||||
"idiom" : "watch",
|
||||
@@ -154,6 +161,13 @@
|
||||
"size" : "44x44",
|
||||
"subtype" : "40mm"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"role" : "appLauncher",
|
||||
"scale" : "2x",
|
||||
"size" : "46x46",
|
||||
"subtype" : "41mm"
|
||||
},
|
||||
{
|
||||
"filename" : "50@2x-1.png",
|
||||
"idiom" : "watch",
|
||||
@@ -162,6 +176,13 @@
|
||||
"size" : "50x50",
|
||||
"subtype" : "44mm"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"role" : "appLauncher",
|
||||
"scale" : "2x",
|
||||
"size" : "51x51",
|
||||
"subtype" : "45mm"
|
||||
},
|
||||
{
|
||||
"filename" : "86@2x-1.png",
|
||||
"idiom" : "watch",
|
||||
@@ -186,6 +207,13 @@
|
||||
"size" : "108x108",
|
||||
"subtype" : "44mm"
|
||||
},
|
||||
{
|
||||
"idiom" : "watch",
|
||||
"role" : "quickLook",
|
||||
"scale" : "2x",
|
||||
"size" : "117x117",
|
||||
"subtype" : "45mm"
|
||||
},
|
||||
{
|
||||
"filename" : "1024@1x.png",
|
||||
"idiom" : "watch-marketing",
|
||||
|
||||
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
@@ -8,9 +8,11 @@ Once you've installed QDomyos-Zwift, you can access the [operation guide](30_usa
|
||||
|
||||
```buildoutcfg
|
||||
$ sudo apt update && sudo apt upgrade # this is very important on raspberry pi: you need the bluetooth firmware updated!
|
||||
$ sudo apt install git libqt5bluetooth5 libqt5widgets5 libqt5positioning5 libqt5xml5 qtconnectivity5-dev qtpositioning5-dev libqt5charts5-dev libqt5charts5 qt5-default libqt5networkauth5-dev
|
||||
$ sudo sudo apt install git libqt5bluetooth5 libqt5widgets5 libqt5positioning5 libqt5xml5 qtconnectivity5-dev qtpositioning5-dev libqt5charts5-dev libqt5charts5 qt5-assistant libqt5networkauth5-dev libqt5websockets5-dev
|
||||
$ git clone https://github.com/cagnulein/qdomyos-zwift.git
|
||||
$ cd qdomyos-zwift
|
||||
$ git submodule update --init src/smtpclient/
|
||||
$ git submodule update --init src/qmdnsengine/
|
||||
$ cd src
|
||||
$ qmake
|
||||
$ make -j4
|
||||
@@ -100,12 +102,14 @@ This operation takes a moment to complete.
|
||||
|
||||
#### Install qdomyos-zwift from sources
|
||||
|
||||
`sudo apt install git libqt5bluetooth5 libqt5widgets5 libqt5positioning5 libqt5xml5 qtconnectivity5-dev qtpositioning5-dev libqt5charts5-dev libqt5charts5 qt5-default libqt5networkauth5-dev`
|
||||
`sudo apt install git libqt5bluetooth5 libqt5widgets5 libqt5positioning5 libqt5xml5 qtconnectivity5-dev qtpositioning5-dev libqt5charts5-dev libqt5charts5 qt5-assistant libqt5networkauth5-dev libqt5websockets5-dev`
|
||||
|
||||
`git clone https://github.com/cagnulein/qdomyos-zwift.git`
|
||||
`cd qdomyos-zwift`
|
||||
`cd src`
|
||||
`qmake`
|
||||
`git submodule update --init src/smtpclient/`
|
||||
`git submodule update --init src/qmdnsengine/`
|
||||
`cd src`
|
||||
`qmake`
|
||||
`make`
|
||||
|
||||
Please note :
|
||||
|
||||
220
docs/specs/org.bluetooth.characteristic.rower_data.xml
Normal file
@@ -0,0 +1,220 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--Copyright 2017 Bluetooth SIG, Inc. All rights reserved.-->
|
||||
<Characteristic xsi:noNamespaceSchemaLocation="http://schemas.bluetooth.org/Documents/characteristic.xsd"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
name="Rower Data" type="org.bluetooth.characteristic.rower_data"
|
||||
uuid="2AD1" last-modified="2017-02-14" approved="No">
|
||||
<InformativeText>
|
||||
<Summary>The Rower Data characteristic is used to send
|
||||
training-related data to the Client from a rower
|
||||
(Server).</Summary>
|
||||
</InformativeText>
|
||||
<Value>
|
||||
<Field name="Flags">
|
||||
<Requirement>Mandatory</Requirement>
|
||||
<Format>16bit</Format>
|
||||
<BitField>
|
||||
<Bit index="0" size="1" name="More Data">
|
||||
<Enumerations>
|
||||
<Enumeration key="0" value="False" requires="C1" />
|
||||
<Enumeration key="1" value="True" />
|
||||
</Enumerations>
|
||||
</Bit>
|
||||
<Bit index="1" size="1" name="Average Stroke present">
|
||||
<Enumerations>
|
||||
<Enumeration key="0" value="False" />
|
||||
<Enumeration key="1" value="True" requires="C2" />
|
||||
</Enumerations>
|
||||
</Bit>
|
||||
<Bit index="2" size="1" name="Total Distance Present">
|
||||
<Enumerations>
|
||||
<Enumeration key="0" value="False" />
|
||||
<Enumeration key="1" value="True" requires="C3" />
|
||||
</Enumerations>
|
||||
</Bit>
|
||||
<Bit index="3" size="1" name="Instantaneous Pace present">
|
||||
<Enumerations>
|
||||
<Enumeration key="0" value="False" />
|
||||
<Enumeration key="1" value="True" requires="C4" />
|
||||
</Enumerations>
|
||||
</Bit>
|
||||
<Bit index="4" size="1" name="Average Pace Present">
|
||||
<Enumerations>
|
||||
<Enumeration key="0" value="False" />
|
||||
<Enumeration key="1" value="True" requires="C5" />
|
||||
</Enumerations>
|
||||
</Bit>
|
||||
<Bit index="5" size="1" name="Instantaneous Power present">
|
||||
<Enumerations>
|
||||
<Enumeration key="0" value="False" />
|
||||
<Enumeration key="1" value="True" requires="C6" />
|
||||
</Enumerations>
|
||||
</Bit>
|
||||
<Bit index="6" size="1" name="Average Power present">
|
||||
<Enumerations>
|
||||
<Enumeration key="0" value="False" />
|
||||
<Enumeration key="1" value="True" requires="C7" />
|
||||
</Enumerations>
|
||||
</Bit>
|
||||
<Bit index="7" size="1" name="Resistance Level present">
|
||||
<Enumerations>
|
||||
<Enumeration key="0" value="False" />
|
||||
<Enumeration key="1" value="True" requires="C8" />
|
||||
</Enumerations>
|
||||
</Bit>
|
||||
<Bit index="8" size="1" name="Expended Energy present">
|
||||
<Enumerations>
|
||||
<Enumeration key="0" value="False" />
|
||||
<Enumeration key="1" value="True" requires="C9" />
|
||||
</Enumerations>
|
||||
</Bit>
|
||||
<Bit index="9" size="1" name="Heart Rate present">
|
||||
<Enumerations>
|
||||
<Enumeration key="0" value="False" />
|
||||
<Enumeration key="1" value="True" requires="C10" />
|
||||
</Enumerations>
|
||||
</Bit>
|
||||
<Bit index="10" size="1"
|
||||
name="Metabolic Equivalent present">
|
||||
<Enumerations>
|
||||
<Enumeration key="0" value="False" />
|
||||
<Enumeration key="1" value="True" requires="C11" />
|
||||
</Enumerations>
|
||||
</Bit>
|
||||
<Bit index="11" size="1" name="Elapsed Time present">
|
||||
<Enumerations>
|
||||
<Enumeration key="0" value="False" />
|
||||
<Enumeration key="1" value="True" requires="C12" />
|
||||
</Enumerations>
|
||||
</Bit>
|
||||
<Bit index="12" size="1" name="Remaining Time present">
|
||||
<Enumerations>
|
||||
<Enumeration key="0" value="False" />
|
||||
<Enumeration key="1" value="True" requires="C13" />
|
||||
</Enumerations>
|
||||
</Bit>
|
||||
<ReservedForFutureUse index="13" size="3" />
|
||||
</BitField>
|
||||
</Field>
|
||||
<Field name="Stroke Rate">
|
||||
<InformativeText>stroke/minute with a resolution of
|
||||
0.5</InformativeText>
|
||||
<Requirement>C1</Requirement>
|
||||
<Format>uint8</Format>
|
||||
<BinaryExponent>-1</BinaryExponent>
|
||||
<Unit>org.bluetooth.unit.stroke_per_minute</Unit>
|
||||
</Field>
|
||||
<Field name="Stroke Count">
|
||||
<InformativeText>Unitless with a resolution of
|
||||
1</InformativeText>
|
||||
<Requirement>C1</Requirement>
|
||||
<Format>uint16</Format>
|
||||
<Unit>org.bluetooth.unit.unitless</Unit>
|
||||
</Field>
|
||||
<Field name="Average Stroke Rate">
|
||||
<InformativeText>1/minute with a resolution of
|
||||
0.5</InformativeText>
|
||||
<Requirement>C2</Requirement>
|
||||
<Format>uint8</Format>
|
||||
<BinaryExponent>-1</BinaryExponent>
|
||||
<Unit>org.bluetooth.unit.stroke_per_minute</Unit>
|
||||
</Field>
|
||||
<Field name="Total Distance">
|
||||
<InformativeText>Meters with a resolution of
|
||||
1</InformativeText>
|
||||
<Requirement>C3</Requirement>
|
||||
<Format>uint24</Format>
|
||||
<Unit>org.bluetooth.unit.length.metre</Unit>
|
||||
</Field>
|
||||
<Field name="Instantaneous Pace">
|
||||
<InformativeText>Second with a resolution of
|
||||
1</InformativeText>
|
||||
<Requirement>C4</Requirement>
|
||||
<Format>uint16</Format>
|
||||
<Unit>org.bluetooth.unit.time.second</Unit>
|
||||
</Field>
|
||||
<Field name="Average Pace">
|
||||
<InformativeText>Second with a resolution of
|
||||
1</InformativeText>
|
||||
<Requirement>C5</Requirement>
|
||||
<Format>uint16</Format>
|
||||
<Unit>org.bluetooth.unit.time.second</Unit>
|
||||
</Field>
|
||||
<Field name="Instantaneous Power">
|
||||
<InformativeText>Watts with a resolution of
|
||||
1</InformativeText>
|
||||
<Requirement>C6</Requirement>
|
||||
<Format>sint16</Format>
|
||||
<Unit>org.bluetooth.unit.power.watt</Unit>
|
||||
</Field>
|
||||
<Field name="Average Power">
|
||||
<InformativeText>Watts with a resolution of
|
||||
1</InformativeText>
|
||||
<Requirement>C7</Requirement>
|
||||
<Format>sint16</Format>
|
||||
<Unit>org.bluetooth.unit.power.watt</Unit>
|
||||
</Field>
|
||||
<Field name="Resistance Level">
|
||||
<InformativeText>Unitless with a resolution of
|
||||
1</InformativeText>
|
||||
<Requirement>C8</Requirement>
|
||||
<Format>sint16</Format>
|
||||
<Unit>org.bluetooth.unit.unitless</Unit>
|
||||
</Field>
|
||||
<Field name="Total Energy">
|
||||
<InformativeText>Kilo Calorie with a resolution of
|
||||
1</InformativeText>
|
||||
<Requirement>C9</Requirement>
|
||||
<Format>uint16</Format>
|
||||
<Unit>org.bluetooth.unit.energy.kilogram_calorie</Unit>
|
||||
</Field>
|
||||
<Field name="Energy Per Hour">
|
||||
<InformativeText>Kilo Calorie with a resolution of
|
||||
1</InformativeText>
|
||||
<Requirement>C9</Requirement>
|
||||
<Format>uint16</Format>
|
||||
<Unit>org.bluetooth.unit.energy.kilogram_calorie</Unit>
|
||||
</Field>
|
||||
<Field name="Energy Per Minute">
|
||||
<InformativeText>Kilo Calorie with a resolution of
|
||||
1</InformativeText>
|
||||
<Requirement>C9</Requirement>
|
||||
<Format>uint8</Format>
|
||||
<Unit>org.bluetooth.unit.energy.kilogram_calorie</Unit>
|
||||
</Field>
|
||||
<Field name="Heart Rate">
|
||||
<InformativeText>Beats per minute with a resolution of
|
||||
1</InformativeText>
|
||||
<Requirement>C10</Requirement>
|
||||
<Format>uint8</Format>
|
||||
<Unit>org.bluetooth.unit.period.beats_per_minute</Unit>
|
||||
</Field>
|
||||
<Field name="Metabolic Equivalent">
|
||||
<InformativeText>Metabolic Equivalent with a resolution of
|
||||
0.1</InformativeText>
|
||||
<Requirement>C11</Requirement>
|
||||
<Format>uint8</Format>
|
||||
<DecimalExponent>-1</DecimalExponent>
|
||||
<Unit>org.bluetooth.unit.metabolic_equivalent</Unit>
|
||||
</Field>
|
||||
<Field name="Elapsed Time">
|
||||
<InformativeText>Second with a resolution of
|
||||
1</InformativeText>
|
||||
<Requirement>C12</Requirement>
|
||||
<Format>uint16</Format>
|
||||
<Unit>org.bluetooth.unit.time.second</Unit>
|
||||
</Field>
|
||||
<Field name="Remaining Time">
|
||||
<InformativeText>Second with a resolution of
|
||||
1</InformativeText>
|
||||
<Requirement>C13</Requirement>
|
||||
<Format>uint16</Format>
|
||||
<Unit>org.bluetooth.unit.time.second</Unit>
|
||||
</Field>
|
||||
</Value>
|
||||
<Note>The fields in the above table, reading from top to bottom,
|
||||
are shown in the order of LSO to MSO, where LSO = Least
|
||||
Significant Octet and MSO = Most Significant Octet. The Least
|
||||
Significant Octet represents the eight bits numbered 0 to
|
||||
7.</Note>
|
||||
</Characteristic>
|
||||
87
docs/specs/org.bluetooth.characteristic.rsc_measurement.xml
Normal file
@@ -0,0 +1,87 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--Copyright 2011 Bluetooth SIG, Inc. All rights reserved.-->
|
||||
<Characteristic xsi:noNamespaceSchemaLocation="http://schemas.bluetooth.org/Documents/characteristic.xsd"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
name="RSC Measurement"
|
||||
type="org.bluetooth.characteristic.rsc_measurement" uuid="2A53"
|
||||
last-modified="2012-09-29" approved="Yes">
|
||||
<InformativeText>
|
||||
<Summary>The RSC Measurement characteristic (RSC refers to
|
||||
Running Speed and Cadence) is a variable length structure
|
||||
containing a Flags field, an Instantaneous Speed field and an
|
||||
Instantaneous Cadence field and, based on the contents of the
|
||||
Flags field, may contain a Stride Length field and a Total
|
||||
Distance field.</Summary>
|
||||
</InformativeText>
|
||||
<Value>
|
||||
<Field name="Flags">
|
||||
<InformativeText>These flags define which data fields are
|
||||
present in the Characteristic value.</InformativeText>
|
||||
<Requirement>Mandatory</Requirement>
|
||||
<Format>8bit</Format>
|
||||
<BitField>
|
||||
<Bit index="0" size="1"
|
||||
name="Instantaneous Stride Length Present">
|
||||
<Enumerations>
|
||||
<Enumeration key="0" value="False" />
|
||||
<Enumeration key="1" value="True" requires="C1" />
|
||||
</Enumerations>
|
||||
</Bit>
|
||||
<Bit index="1" size="1" name="Total Distance Present">
|
||||
<Enumerations>
|
||||
<Enumeration key="0" value="False" />
|
||||
<Enumeration key="1" value="True" requires="C2" />
|
||||
</Enumerations>
|
||||
</Bit>
|
||||
<Bit index="2" size="1"
|
||||
name="Walking or Running Status bits">
|
||||
<Enumerations>
|
||||
<Enumeration key="0" value="Walking" />
|
||||
<Enumeration key="1" value="Running" />
|
||||
</Enumerations>
|
||||
</Bit>
|
||||
<ReservedForFutureUse index="3" size="5" />
|
||||
</BitField>
|
||||
</Field>
|
||||
<Field name="Instantaneous Speed">
|
||||
<InformativeText>Unit is in m/s with a resolution of 1/256
|
||||
s</InformativeText>
|
||||
<Requirement>Mandatory</Requirement>
|
||||
<Format>uint16</Format>
|
||||
<Unit>org.bluetooth.unit.velocity.metres_per_second</Unit>
|
||||
</Field>
|
||||
<Field name="Instantaneous Cadence">
|
||||
<InformativeText>Unit is in 1/minute (or RPM) with a
|
||||
resolutions of 1 1/min (or 1 RPM)</InformativeText>
|
||||
<Requirement>Mandatory</Requirement>
|
||||
<Format>uint8</Format>
|
||||
<Unit>
|
||||
org.bluetooth.unit.angular_velocity.revolution_per_minute</Unit>
|
||||
</Field>
|
||||
<Field name="Instantaneous Stride Length">
|
||||
<InformativeText>
|
||||
<p>C1: Field exists if the key of bit 0 of the Flags field
|
||||
is set to 1.</p>
|
||||
<p>- Unit is in meter with a resolution of 1/100 m (or
|
||||
centimeter).</p>
|
||||
</InformativeText>
|
||||
<Requirement>C1</Requirement>
|
||||
<Format>uint16</Format>
|
||||
<Unit>org.bluetooth.unit.length.meter</Unit>
|
||||
</Field>
|
||||
<Field name="Total Distance">
|
||||
<InformativeText>
|
||||
<p>C2: Field exists if the key of bit 1 of the Flags field
|
||||
is set to 1.</p>
|
||||
<p>- Unit is in meter with a resolution of 1/10 m (or
|
||||
decimeter).</p>
|
||||
</InformativeText>
|
||||
<Requirement>C2</Requirement>
|
||||
<Format>uint32</Format>
|
||||
<Unit>org.bluetooth.unit.length.meter</Unit>
|
||||
</Field>
|
||||
</Value>
|
||||
<Note>The fields in the above table are in the order of LSO to
|
||||
MSO. Where LSO = Least Significant Octet and MSO = Most
|
||||
Significant Octet.</Note>
|
||||
</Characteristic>
|
||||
161
docs/specs/org.bluetooth.service.running_speed_and_cadence.xml
Normal file
@@ -0,0 +1,161 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright 2011 Bluetooth SIG, Inc. All rights reserved. -->
|
||||
<Service xsi:noNamespaceSchemaLocation="http://schemas.bluetooth.org/Documents/service.xsd"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
name="Running Speed and Cadence"
|
||||
type="org.bluetooth.service.running_speed_and_cadence" uuid="1814"
|
||||
last-modified="2012-3-26" approved="Yes">
|
||||
<InformativeText>
|
||||
<Abstract>This service exposes speed, cadence and other data
|
||||
from a Running Speed and Cadence Sensor intended for fitness
|
||||
applications.</Abstract>
|
||||
<Summary>The Running Speed and Cadence (RSC) Service exposes
|
||||
speed, cadence and other data related to fitness applications
|
||||
such as the stride length and the total distance the user has
|
||||
traveled while using the Speed and Cadence Sensor
|
||||
(Server).</Summary>
|
||||
</InformativeText>
|
||||
<Dependencies>
|
||||
<Dependency>This service has no dependencies on other
|
||||
GATT-based services.</Dependency>
|
||||
</Dependencies>
|
||||
<GATTRequirements>
|
||||
<Requirement subProcedure="Write Characteristic Values">
|
||||
C1</Requirement>
|
||||
<Requirement subProcedure="Notifications">
|
||||
Mandatory</Requirement>
|
||||
<Requirement subProcedure="Indications">C1</Requirement>
|
||||
<Requirement subProcedure="Read Characteristic Descriptors">
|
||||
Mandatory</Requirement>
|
||||
<Requirement subProcedure="Write Characteristic Descriptors">
|
||||
Mandatory</Requirement>
|
||||
</GATTRequirements>
|
||||
<Note>C1: Mandatory if the SC Control Point characteristic is
|
||||
supported, otherwise excluded for this service.</Note>
|
||||
<Transports>
|
||||
<Classic>true</Classic>
|
||||
<LowEnergy>true</LowEnergy>
|
||||
</Transports>
|
||||
<ErrorCodes>
|
||||
<ErrorCode name="Procedure Already in Progress" code="0x80">A
|
||||
SC Control Point request cannot be serviced because a
|
||||
previously triggered SC Control Point operation is still in
|
||||
progress.</ErrorCode>
|
||||
<ErrorCode name="Client Characteristic Configuration descriptor improperly configured"
|
||||
code="0x81">The Client Characteristic Configuration descriptor
|
||||
is not configured according to the requirements of the
|
||||
service.</ErrorCode>
|
||||
</ErrorCodes>
|
||||
<Characteristics>
|
||||
<Characteristic name="RSC Measurement"
|
||||
type="org.bluetooth.characteristic.rsc_measurement">
|
||||
<InformativeText>The RSC Measurement characteristic is used
|
||||
to send speed and cadence measurements.</InformativeText>
|
||||
<Requirement>Mandatory</Requirement>
|
||||
<Properties>
|
||||
<Read>Excluded</Read>
|
||||
<Write>Excluded</Write>
|
||||
<WriteWithoutResponse>Excluded</WriteWithoutResponse>
|
||||
<SignedWrite>Excluded</SignedWrite>
|
||||
<ReliableWrite>Excluded</ReliableWrite>
|
||||
<Notify>Mandatory</Notify>
|
||||
<Indicate>Excluded</Indicate>
|
||||
<WritableAuxiliaries>Excluded</WritableAuxiliaries>
|
||||
<Broadcast>Excluded</Broadcast>
|
||||
</Properties>
|
||||
<Descriptors>
|
||||
<Descriptor name="Client Characteristic Configuration"
|
||||
type="org.bluetooth.descriptor.gatt.client_characteristic_configuration">
|
||||
|
||||
<Requirement>Mandatory</Requirement>
|
||||
<Properties>
|
||||
<Read>Mandatory</Read>
|
||||
<Write>Mandatory</Write>
|
||||
</Properties>
|
||||
</Descriptor>
|
||||
</Descriptors>
|
||||
</Characteristic>
|
||||
<Characteristic name="RSC Feature"
|
||||
type="org.bluetooth.characteristic.rsc_feature">
|
||||
<InformativeText>The RSC Feature characteristic is used to
|
||||
describe the supported features of the Server. Reserved for
|
||||
Future Use (RFU) bits in the SC Feature characteristic value
|
||||
are set to 0.</InformativeText>
|
||||
<Requirement>Mandatory</Requirement>
|
||||
<Properties>
|
||||
<Read>Mandatory</Read>
|
||||
<Write>Excluded</Write>
|
||||
<WriteWithoutResponse>Excluded</WriteWithoutResponse>
|
||||
<SignedWrite>Excluded</SignedWrite>
|
||||
<ReliableWrite>Excluded</ReliableWrite>
|
||||
<Notify>Excluded</Notify>
|
||||
<Indicate>Excluded</Indicate>
|
||||
<WritableAuxiliaries>Excluded</WritableAuxiliaries>
|
||||
<Broadcast>Excluded</Broadcast>
|
||||
</Properties>
|
||||
</Characteristic>
|
||||
<Characteristic name="Sensor Location"
|
||||
type="org.bluetooth.characteristic.sensor_location">
|
||||
<InformativeText>
|
||||
<p>The Sensor Location characteristic of the device is used
|
||||
to describe the physical location of the Server when
|
||||
correctly fitted.</p>
|
||||
<p>
|
||||
<b>C1:</b>Mandatory if the Multiple Sensor Location feature
|
||||
is supported, otherwise optional.</p>
|
||||
</InformativeText>
|
||||
<Requirement>C1</Requirement>
|
||||
<Properties>
|
||||
<Read>Mandatory</Read>
|
||||
<Write>Excluded</Write>
|
||||
<WriteWithoutResponse>Excluded</WriteWithoutResponse>
|
||||
<SignedWrite>Excluded</SignedWrite>
|
||||
<ReliableWrite>Excluded</ReliableWrite>
|
||||
<Notify>Excluded</Notify>
|
||||
<Indicate>Excluded</Indicate>
|
||||
<WritableAuxiliaries>Excluded</WritableAuxiliaries>
|
||||
<Broadcast>Excluded</Broadcast>
|
||||
</Properties>
|
||||
</Characteristic>
|
||||
<Characteristic name="SC Control Point"
|
||||
type="org.bluetooth.characteristic.sc_control_point">
|
||||
<InformativeText>
|
||||
<p>If the SC Control Point is supported, profiles utilizing
|
||||
this service are required to ensure that the Client
|
||||
configures the SC Control Point characteristic for
|
||||
indications (i.e. via the Client Characteristic
|
||||
Configuration descriptor) at the first connection.</p>
|
||||
<p>Support for this characteristic is mandatory if the
|
||||
Server supports Calibration Procedure, Total Distance or
|
||||
Multiple Sensor Locations features, otherwise it is
|
||||
excluded.</p>
|
||||
<p>
|
||||
<b>C2:</b>Mandatory if at least one SC Control Point
|
||||
procedure is supported, otherwise excluded.</p>
|
||||
</InformativeText>
|
||||
<Requirement>C2</Requirement>
|
||||
<Properties>
|
||||
<Read>Excluded</Read>
|
||||
<Write>Mandatory</Write>
|
||||
<WriteWithoutResponse>Excluded</WriteWithoutResponse>
|
||||
<SignedWrite>Excluded</SignedWrite>
|
||||
<ReliableWrite>Excluded</ReliableWrite>
|
||||
<Notify>Excluded</Notify>
|
||||
<Indicate>Mandatory</Indicate>
|
||||
<WritableAuxiliaries>Excluded</WritableAuxiliaries>
|
||||
<Broadcast>Excluded</Broadcast>
|
||||
</Properties>
|
||||
<Descriptors>
|
||||
<Descriptor name="Client Characteristic Configuration"
|
||||
type="org.bluetooth.descriptor.gatt.client_characteristic_configuration">
|
||||
|
||||
<Requirement>if_characteristic_supported</Requirement>
|
||||
<Properties>
|
||||
<Read>Mandatory</Read>
|
||||
<Write>Mandatory</Write>
|
||||
</Properties>
|
||||
</Descriptor>
|
||||
</Descriptors>
|
||||
</Characteristic>
|
||||
</Characteristics>
|
||||
</Service>
|
||||
BIN
icons/AppScreen/Android One Plus - 6.28_/screenshot1.-1jpg.jpg
Normal file
|
After Width: | Height: | Size: 135 KiB |
BIN
icons/AppScreen/Android One Plus - 6.28_/screenshot1.jpeg
Normal file
|
After Width: | Height: | Size: 180 KiB |
BIN
icons/AppScreen/Android One Plus - 6.28_/screenshot2-2.jpg
Normal file
|
After Width: | Height: | Size: 199 KiB |
BIN
icons/AppScreen/Android One Plus - 6.28_/screenshot2.jpeg
Normal file
|
After Width: | Height: | Size: 266 KiB |
BIN
icons/AppScreen/Android One Plus - 6.28_/screenshot3-3.jpg
Normal file
|
After Width: | Height: | Size: 199 KiB |
BIN
icons/AppScreen/Android One Plus - 6.28_/screenshot3.jpeg
Normal file
|
After Width: | Height: | Size: 264 KiB |
BIN
icons/AppScreen/Android One Plus - 6.28_/screenshot4-4.jpg
Normal file
|
After Width: | Height: | Size: 216 KiB |
BIN
icons/AppScreen/Android One Plus - 6.28_/screenshot4.jpeg
Normal file
|
After Width: | Height: | Size: 287 KiB |
BIN
icons/AppScreen/Android One Plus - 6.28_/screenshot5-5.jpg
Normal file
|
After Width: | Height: | Size: 187 KiB |
BIN
icons/AppScreen/Android One Plus - 6.28_/screenshot5.jpeg
Normal file
|
After Width: | Height: | Size: 249 KiB |
BIN
icons/AppScreen/Android Tablet - 10_/screenshot1.jpeg
Normal file
|
After Width: | Height: | Size: 200 KiB |
BIN
icons/AppScreen/Android Tablet - 10_/screenshot2.jpeg
Normal file
|
After Width: | Height: | Size: 240 KiB |
BIN
icons/AppScreen/Android Tablet - 10_/screenshot3.jpeg
Normal file
|
After Width: | Height: | Size: 251 KiB |
BIN
icons/AppScreen/Android Tablet - 10_/screenshot4.jpeg
Normal file
|
After Width: | Height: | Size: 297 KiB |
BIN
icons/AppScreen/Android Tablet - 10_/screenshot5.jpeg
Normal file
|
After Width: | Height: | Size: 254 KiB |
BIN
icons/AppScreen/iOS Phones - 6.5_/screenshot1.jpeg
Normal file
|
After Width: | Height: | Size: 281 KiB |
BIN
icons/AppScreen/iOS Phones - 6.5_/screenshot2.jpeg
Normal file
|
After Width: | Height: | Size: 327 KiB |
BIN
icons/AppScreen/iOS Phones - 6.5_/screenshot3.jpeg
Normal file
|
After Width: | Height: | Size: 326 KiB |
BIN
icons/AppScreen/iOS Phones - 6.5_/screenshot4.jpeg
Normal file
|
After Width: | Height: | Size: 417 KiB |
BIN
icons/AppScreen/iOS Phones - 6.5_/screenshot5.jpeg
Normal file
|
After Width: | Height: | Size: 310 KiB |
@@ -0,0 +1 @@
|
||||
#include "../../../../../../qthttpserver/src/httpserver/qabstracthttpserver_p.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "../../../../../../qthttpserver/src/httpserver/qhttpserver_p.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "../../../../../../qthttpserver/src/httpserver/qhttpserverliterals_p.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "../../../../../../qthttpserver/src/httpserver/qhttpserverrequest_p.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "../../../../../../qthttpserver/src/httpserver/qhttpserverresponder_p.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "../../../../../../qthttpserver/src/httpserver/qhttpserverresponse_p.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "../../../../../../qthttpserver/src/httpserver/qhttpserverrouter_p.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "../../../../../../qthttpserver/src/httpserver/qhttpserverrouterrule_p.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "qabstracthttpserver.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "qhttpserverfutureresponse.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "qhttpserver.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "qhttpserverviewtraits.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "qhttpserverfutureresponse.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "qhttpserverrequest.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "qhttpserverresponder.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "qhttpserverresponse.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "qhttpserverrouter.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "qhttpserverrouterrule.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "qhttpserverrouterviewtraits.h"
|
||||
@@ -0,0 +1,16 @@
|
||||
#ifndef QT_QTHTTPSERVER_MODULE_H
|
||||
#define QT_QTHTTPSERVER_MODULE_H
|
||||
#include <QtHttpServer/QtHttpServerDepends>
|
||||
#include "qthttpserverglobal.h"
|
||||
#include "qabstracthttpserver.h"
|
||||
#include "qhttpserver.h"
|
||||
#include "qhttpserverfutureresponse.h"
|
||||
#include "qhttpserverrequest.h"
|
||||
#include "qhttpserverresponder.h"
|
||||
#include "qhttpserverresponse.h"
|
||||
#include "qhttpserverrouter.h"
|
||||
#include "qhttpserverrouterrule.h"
|
||||
#include "qhttpserverrouterviewtraits.h"
|
||||
#include "qhttpserverviewtraits.h"
|
||||
#include "qthttpserverversion.h"
|
||||
#endif
|
||||
@@ -0,0 +1,8 @@
|
||||
/* This file was generated by qmake with the info from <root>/src/httpserver/httpserver.pro. */
|
||||
#ifdef __cplusplus /* create empty PCH in C mode */
|
||||
#include <QtNetwork/QtNetwork>
|
||||
#include <QtCore/QtCore>
|
||||
#include <QtWebSockets/QtWebSockets>
|
||||
#include <QtSslServer/QtSslServer>
|
||||
#include <QtConcurrent/QtConcurrent>
|
||||
#endif
|
||||
@@ -0,0 +1 @@
|
||||
#include "qthttpserverversion.h"
|
||||
@@ -0,0 +1,6 @@
|
||||
SYNCQT.HEADER_FILES = qabstracthttpserver.h qhttpserver.h qhttpserverfutureresponse.h qhttpserverrequest.h qhttpserverresponder.h qhttpserverresponse.h qhttpserverrouter.h qhttpserverrouterrule.h qhttpserverrouterviewtraits.h qhttpserverviewtraits.h qhttpserverviewtraits_impl.h qthttpserverglobal.h
|
||||
SYNCQT.GENERATED_HEADER_FILES = QAbstractHttpServer QHttpServer QFutureInterface QHttpServerFutureResponse QHttpServerRequest QHttpServerResponder QHttpServerResponse QHttpServerRouter QHttpServerRouterRule QHttpServerRouterViewTraits QHttpServerAfterRequestViewTraits qthttpserverversion.h QtHttpServerVersion QtHttpServer
|
||||
SYNCQT.PRIVATE_HEADER_FILES = qabstracthttpserver_p.h qhttpserver_p.h qhttpserverliterals_p.h qhttpserverrequest_p.h qhttpserverresponder_p.h qhttpserverresponse_p.h qhttpserverrouter_p.h qhttpserverrouterrule_p.h
|
||||
SYNCQT.QPA_HEADER_FILES =
|
||||
SYNCQT.CLEAN_HEADER_FILES = qabstracthttpserver.h qhttpserver.h qhttpserverfutureresponse.h qhttpserverrequest.h qhttpserverresponder.h qhttpserverresponse.h qhttpserverrouter.h qhttpserverrouterrule.h qhttpserverrouterviewtraits.h qhttpserverviewtraits.h qhttpserverviewtraits_impl.h qthttpserverglobal.h
|
||||
SYNCQT.INJECTIONS =
|
||||
@@ -0,0 +1 @@
|
||||
#include "../../../qthttpserver/src/httpserver/qabstracthttpserver.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "../../../qthttpserver/src/httpserver/qhttpserver.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "../../../qthttpserver/src/httpserver/qhttpserverfutureresponse.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "../../../qthttpserver/src/httpserver/qhttpserverrequest.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "../../../qthttpserver/src/httpserver/qhttpserverresponder.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "../../../qthttpserver/src/httpserver/qhttpserverresponse.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "../../../qthttpserver/src/httpserver/qhttpserverrouter.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "../../../qthttpserver/src/httpserver/qhttpserverrouterrule.h"
|
||||
@@ -0,0 +1 @@
|
||||
#include "../../../qthttpserver/src/httpserver/qhttpserverrouterviewtraits.h"
|
||||