mirror of
https://github.com/cagnulein/qdomyos-zwift.git
synced 2026-02-18 00:17:41 +01:00
Compare commits
805 Commits
android_pi
...
opencv_and
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a57408229b | ||
|
|
82578e4923 | ||
|
|
4682c2b172 | ||
|
|
64eace5ab9 | ||
|
|
b39b98b0d8 | ||
|
|
86e02be26e | ||
|
|
b00e77a4ea | ||
|
|
f80a8f4051 | ||
|
|
f45d3b9914 | ||
|
|
bcb102e0dc | ||
|
|
acee1b1301 | ||
|
|
0f9e7c0829 | ||
|
|
efd22aaee2 | ||
|
|
944d6d5ef2 | ||
|
|
14fb0a5cde | ||
|
|
da6faf18b5 | ||
|
|
6c662b20de | ||
|
|
75030bd25a | ||
|
|
a8b36057ce | ||
|
|
01e94e752c | ||
|
|
d83bcf984d | ||
|
|
ca93611acc | ||
|
|
9868a80be6 | ||
|
|
0d0db9fe3d | ||
|
|
09affb4dd1 | ||
|
|
ba1afdfa5a | ||
|
|
8ce3ae8ebd | ||
|
|
6778364353 | ||
|
|
1d4fa21899 | ||
|
|
fa94706754 | ||
|
|
3c5dc35675 | ||
|
|
bc5a1161df | ||
|
|
7e5ff25d39 | ||
|
|
0e46b52c64 | ||
|
|
377381bb64 | ||
|
|
85558eda35 | ||
|
|
8132e56483 | ||
|
|
ab86534f31 | ||
|
|
ab92d03891 | ||
|
|
cb2980741e | ||
|
|
8304f43bc5 | ||
|
|
7636f768f1 | ||
|
|
cdf8a95e30 | ||
|
|
13389afe77 | ||
|
|
8acfb6b764 | ||
|
|
4244ce79a0 | ||
|
|
907e96330f | ||
|
|
35136be5b9 | ||
|
|
6cd33f2ff9 | ||
|
|
7e52925242 | ||
|
|
98971bf036 | ||
|
|
51e97321ac | ||
|
|
d959c0bea2 | ||
|
|
875f283984 | ||
|
|
b4f378a8e9 | ||
|
|
22e50a7600 | ||
|
|
30f3b47a8c | ||
|
|
103f1675e6 | ||
|
|
db7bc008e4 | ||
|
|
e634348d75 | ||
|
|
8956957e4d | ||
|
|
f79b0074a8 | ||
|
|
34abdab013 | ||
|
|
b741378a0e | ||
|
|
5404a68689 | ||
|
|
73bc5691e8 | ||
|
|
de42318370 | ||
|
|
61acaf033a | ||
|
|
cd2592b14e | ||
|
|
b0ef38885b | ||
|
|
34a3e1067d | ||
|
|
b084afea11 | ||
|
|
46eb6b3776 | ||
|
|
23d646848e | ||
|
|
e78d4565bc | ||
|
|
9540bff975 | ||
|
|
4d5db2e3b3 | ||
|
|
20027b914e | ||
|
|
5764efd487 | ||
|
|
c427c72726 | ||
|
|
41be14bb8a | ||
|
|
2fcd6eb310 | ||
|
|
656d404582 | ||
|
|
548bdeb5e4 | ||
|
|
eaa5fca1fe | ||
|
|
c9778f918d | ||
|
|
de17acdfcf | ||
|
|
3f16b7d146 | ||
|
|
881e6db650 | ||
|
|
d27bccaea5 | ||
|
|
afde8ad8d5 | ||
|
|
d8d0613f6d | ||
|
|
e255267116 | ||
|
|
e7e79b1816 | ||
|
|
df09bd2a9c | ||
|
|
7ae17516f1 | ||
|
|
4f53e28cc4 | ||
|
|
08c9869c84 | ||
|
|
86bd39b370 | ||
|
|
1e68328c0f | ||
|
|
81d8950bb6 | ||
|
|
df109a620e | ||
|
|
fdc3e4166a | ||
|
|
144472c57f | ||
|
|
d23b36f267 | ||
|
|
47ed429773 | ||
|
|
f8a09dc301 | ||
|
|
c1b6b0e175 | ||
|
|
d2e007fb43 | ||
|
|
589dd85678 | ||
|
|
4f4c6cebf1 | ||
|
|
1688a571af | ||
|
|
018f96d243 | ||
|
|
428d7fee83 | ||
|
|
ffb09bf78d | ||
|
|
3a94929584 | ||
|
|
fea04b29a4 | ||
|
|
f7145710af | ||
|
|
e3ef341e60 | ||
|
|
b097e0898e | ||
|
|
8237c3c862 | ||
|
|
6d6bad02db | ||
|
|
9dd25f0d69 | ||
|
|
c84e16aed9 | ||
|
|
f10e68f47b | ||
|
|
07111d5a9e | ||
|
|
77a4d4224a | ||
|
|
bda145a29e | ||
|
|
54799c3519 | ||
|
|
1580471db8 | ||
|
|
0b918f1b44 | ||
|
|
a13719b0a0 | ||
|
|
90469409b7 | ||
|
|
e3474fa844 | ||
|
|
2da438778a | ||
|
|
2cf61c2ccf | ||
|
|
6b8b1c2f68 | ||
|
|
85b0bd5f74 | ||
|
|
bf53671dc7 | ||
|
|
86f4bdddd7 | ||
|
|
1096b08fdd | ||
|
|
5d1b115645 | ||
|
|
094c5a838d | ||
|
|
2488cc8758 | ||
|
|
8084b9f06b | ||
|
|
8b48707dfb | ||
|
|
0ad679e2f8 | ||
|
|
33a1202f5f | ||
|
|
776aee4902 | ||
|
|
c44f576876 | ||
|
|
a723dce8fc | ||
|
|
7329389ffc | ||
|
|
71647a8406 | ||
|
|
669a99e6cd | ||
|
|
49b0883e26 | ||
|
|
ec13911855 | ||
|
|
5b7422cff0 | ||
|
|
ee7b1ca1d5 | ||
|
|
b588037651 | ||
|
|
5a19c314ba | ||
|
|
4e06af6200 | ||
|
|
b6ffdb7145 | ||
|
|
02c7c2ff2a | ||
|
|
6369194167 | ||
|
|
fd8984f2ca | ||
|
|
328b2cadc1 | ||
|
|
8a9b5a3cc9 | ||
|
|
46792b3c4f | ||
|
|
5662f90e31 | ||
|
|
81c94738b0 | ||
|
|
b3874957ca | ||
|
|
7f16b04824 | ||
|
|
a3af5be2ce | ||
|
|
033ab6bd16 | ||
|
|
38df1caf10 | ||
|
|
ef909a35df | ||
|
|
65777dea2d | ||
|
|
f2554ad454 | ||
|
|
56c04335ae | ||
|
|
c5cf31b228 | ||
|
|
1b04588b4e | ||
|
|
c99c008b64 | ||
|
|
af2db915b4 | ||
|
|
1c2a220ae4 | ||
|
|
77cb8439c0 | ||
|
|
5f14e7aa22 | ||
|
|
e0ab1edbb6 | ||
|
|
ff09896cf4 | ||
|
|
a9a118d03a | ||
|
|
f3d6f13be9 | ||
|
|
f23ec88dfb | ||
|
|
9027eb961f | ||
|
|
6b637e1d92 | ||
|
|
e96eceb271 | ||
|
|
a77074a874 | ||
|
|
1927ad9577 | ||
|
|
f79fd80838 | ||
|
|
cfe05c76f4 | ||
|
|
4c8da03f19 | ||
|
|
7abf133a61 | ||
|
|
383ecc6381 | ||
|
|
dfd68c4445 | ||
|
|
cd689cb6fc | ||
|
|
43094f41e2 | ||
|
|
ad6d683b09 | ||
|
|
db5d177925 | ||
|
|
bfe6838acc | ||
|
|
4a061acbfb | ||
|
|
5326089804 | ||
|
|
42c6e35219 | ||
|
|
a9f86f78b4 | ||
|
|
3ce7828c8f | ||
|
|
cb821f65b8 | ||
|
|
cbc09609a0 | ||
|
|
0f8ad887dd | ||
|
|
5d7f688321 | ||
|
|
b904af9335 | ||
|
|
030689217c | ||
|
|
8f02feb172 | ||
|
|
27ee8d99d8 | ||
|
|
4fcb13b11b | ||
|
|
13d488025f | ||
|
|
c379985c68 | ||
|
|
50e4ff371f | ||
|
|
01749bad6e | ||
|
|
7ba1986929 | ||
|
|
0a52f15406 | ||
|
|
abd2e76f4f | ||
|
|
035d150c6d | ||
|
|
a29619feca | ||
|
|
964be4b5d1 | ||
|
|
d01be6384d | ||
|
|
0845406940 | ||
|
|
fd30c61124 | ||
|
|
a49b9b07ef | ||
|
|
af91761a23 | ||
|
|
32af96b05b | ||
|
|
658006a12a | ||
|
|
4451680cea | ||
|
|
beaab12894 | ||
|
|
cc74ef6fe4 | ||
|
|
958487b0e5 | ||
|
|
68d191d581 | ||
|
|
aca68b2a10 | ||
|
|
c3f013a69a | ||
|
|
c2dc509c97 | ||
|
|
520726f989 | ||
|
|
04c7837e35 | ||
|
|
e1b097837b | ||
|
|
b443b03d49 | ||
|
|
c8cf9367db | ||
|
|
1a7c0be896 | ||
|
|
bb219fdf9a | ||
|
|
d446186082 | ||
|
|
1bc00b4f9d | ||
|
|
28db6a7f70 | ||
|
|
a1ad083422 | ||
|
|
0132a3f38d | ||
|
|
1a6a06ead4 | ||
|
|
f34f373687 | ||
|
|
95327f6c1a | ||
|
|
93e60262d6 | ||
|
|
992ae1c88c | ||
|
|
5754e800d2 | ||
|
|
ee9491d5f6 | ||
|
|
789c911966 | ||
|
|
d95c6f86c7 | ||
|
|
4d7da98c7a | ||
|
|
193518c1c1 | ||
|
|
32aafc3d00 | ||
|
|
1ffd44ae91 | ||
|
|
d3c8441717 | ||
|
|
ca8638abe0 | ||
|
|
514ac12484 | ||
|
|
db5c4cc73e | ||
|
|
58f2934bb8 | ||
|
|
6c677a3a2b | ||
|
|
2b4d04acc0 | ||
|
|
3841918383 | ||
|
|
d843d09829 | ||
|
|
c1bceca06f | ||
|
|
ec7782b86f | ||
|
|
ae6505bdb4 | ||
|
|
3690120207 | ||
|
|
dfe8c59a91 | ||
|
|
e25abb0317 | ||
|
|
4dd02ad1b6 | ||
|
|
ef715f002b | ||
|
|
f02c2d4293 | ||
|
|
9a4baffe81 | ||
|
|
dd7e1b3861 | ||
|
|
7cffb2c51e | ||
|
|
d6e5accc84 | ||
|
|
900a7f2d94 | ||
|
|
dd6e0068ee | ||
|
|
fd9c3f414b | ||
|
|
dd692b5b04 | ||
|
|
1f83bc94f2 | ||
|
|
c7386511ea | ||
|
|
446c6ee027 | ||
|
|
e85a6bc090 | ||
|
|
2a84b6075e | ||
|
|
1ff6295aae | ||
|
|
70913cd7af | ||
|
|
3576eff46e | ||
|
|
49984654ea | ||
|
|
c7f17cd749 | ||
|
|
20af8dcfed | ||
|
|
1f113b0164 | ||
|
|
11d0a33374 | ||
|
|
e371d13f0f | ||
|
|
f5d201aed1 | ||
|
|
d561dfa318 | ||
|
|
ef095dc9f1 | ||
|
|
0db053b60a | ||
|
|
2eeba4f9a6 | ||
|
|
f4ccbfb33f | ||
|
|
32b9c2810f | ||
|
|
7abc3834aa | ||
|
|
51cf710b08 | ||
|
|
34ae065c2c | ||
|
|
cbf0b178d6 | ||
|
|
229b6a8e30 | ||
|
|
02cc189d72 | ||
|
|
af9d1d97a8 | ||
|
|
20b3263a5b | ||
|
|
f712b7bb92 | ||
|
|
38b69c20e1 | ||
|
|
5f99c1dd22 | ||
|
|
a715849756 | ||
|
|
16b62d8752 | ||
|
|
b68c166b01 | ||
|
|
c6aaaa6944 | ||
|
|
625e8c91eb | ||
|
|
4d81a51442 | ||
|
|
bbe3b4e369 | ||
|
|
e94e030a00 | ||
|
|
c9f8076a5e | ||
|
|
dbc1e43c2b | ||
|
|
b4ea2cd1c5 | ||
|
|
e2d0c9284a | ||
|
|
66bedca4a4 | ||
|
|
5a10627594 | ||
|
|
7465f71c74 | ||
|
|
8c58f03d82 | ||
|
|
e199ea3fc6 | ||
|
|
bbd37dc36c | ||
|
|
48646ec3bb | ||
|
|
dca0b1b917 | ||
|
|
db78365ffd | ||
|
|
1325b1cd29 | ||
|
|
43780a076f | ||
|
|
a374ebcf6e | ||
|
|
7ab1eac7fe | ||
|
|
d378ab23ea | ||
|
|
4c3566a156 | ||
|
|
51fb564640 | ||
|
|
ef40f29597 | ||
|
|
34db47f611 | ||
|
|
100d0b3f58 | ||
|
|
2a4b58634b | ||
|
|
95cb85fd88 | ||
|
|
ff1abb2b9f | ||
|
|
aa22225e5e | ||
|
|
b6b5d8ecba | ||
|
|
e9be1d8fb2 | ||
|
|
5bfa0b3312 | ||
|
|
7fd491e005 | ||
|
|
0717799d15 | ||
|
|
2c34d9001b | ||
|
|
61498cb6ef | ||
|
|
95ec82b641 | ||
|
|
c6a34c59d3 | ||
|
|
c9d243ab18 | ||
|
|
172440872a | ||
|
|
7ccbc07808 | ||
|
|
e02fb8e1c5 | ||
|
|
17b54a1963 | ||
|
|
5e7b208c92 | ||
|
|
78a652a512 | ||
|
|
9a49ef1e7f | ||
|
|
39f92a429a | ||
|
|
a70c79f144 | ||
|
|
278e209670 | ||
|
|
9fefde58ac | ||
|
|
7f26e63cd6 | ||
|
|
54beb7cc4e | ||
|
|
35d7e54871 | ||
|
|
5eb9de8c9b | ||
|
|
0f703cd836 | ||
|
|
9157e39ebd | ||
|
|
e9c76bde99 | ||
|
|
1398cb26fb | ||
|
|
35a986fdd0 | ||
|
|
3f8aa376a6 | ||
|
|
21a3ae6816 | ||
|
|
3da7ac198a | ||
|
|
36aed6c326 | ||
|
|
2a02eec288 | ||
|
|
0ca1a8caad | ||
|
|
13ea251697 | ||
|
|
9c0757986f | ||
|
|
81028fc111 | ||
|
|
1999bbaee0 | ||
|
|
12ad01ddde | ||
|
|
8b79b85f8c | ||
|
|
3e900c1a55 | ||
|
|
5f22107085 | ||
|
|
6354d20bc4 | ||
|
|
d1aeb30abb | ||
|
|
e2592896c6 | ||
|
|
d4305fa93a | ||
|
|
cc0051f7c3 | ||
|
|
56962545d8 | ||
|
|
7b128d2a8a | ||
|
|
a228f55a9a | ||
|
|
9ec12d5733 | ||
|
|
f460a9770a | ||
|
|
49bbbddbe2 | ||
|
|
f1b7daf34b | ||
|
|
e78434fbb3 | ||
|
|
397dcc7db8 | ||
|
|
c2b0ebb882 | ||
|
|
68a8169e0b | ||
|
|
5611be511f | ||
|
|
427b63b113 | ||
|
|
716a256cf4 | ||
|
|
8d123cec1a | ||
|
|
582c260dd9 | ||
|
|
7994c884ea | ||
|
|
58dbee1e15 | ||
|
|
5c2483b264 | ||
|
|
15d94329c2 | ||
|
|
77de4703d3 | ||
|
|
2318531980 | ||
|
|
993727d251 | ||
|
|
128ad2a84b | ||
|
|
9e8a8a18f2 | ||
|
|
19e05219f5 | ||
|
|
58376bff43 | ||
|
|
d4518fe018 | ||
|
|
d6258a5774 | ||
|
|
063ab524e6 | ||
|
|
fbf8fed94d | ||
|
|
bbf0ef11d4 | ||
|
|
1439f5d15a | ||
|
|
79aad21d26 | ||
|
|
062cac38f6 | ||
|
|
36046c00ad | ||
|
|
8e84d2bf95 | ||
|
|
66aaeb5c8b | ||
|
|
52c25f5fc7 | ||
|
|
ec457a18c2 | ||
|
|
eb00d52512 | ||
|
|
55ad2dbe3e | ||
|
|
2ea9ad2992 | ||
|
|
211024f67f | ||
|
|
3b7fa4f8a8 | ||
|
|
e3c0fc933a | ||
|
|
e4d2d7899b | ||
|
|
70e87ac6a3 | ||
|
|
9d6b53586a | ||
|
|
b35c41a319 | ||
|
|
010d0b0dcc | ||
|
|
a31c926a1a | ||
|
|
94c03ba9b4 | ||
|
|
bce965c6d6 | ||
|
|
74e5e04f0c | ||
|
|
159611da89 | ||
|
|
8cb9d24261 | ||
|
|
74cc93b91e | ||
|
|
85d622a1e3 | ||
|
|
9967550a41 | ||
|
|
bf41d8f1d7 | ||
|
|
f4999e3233 | ||
|
|
2b01877a7c | ||
|
|
d985b9a477 | ||
|
|
960aa7a17b | ||
|
|
42e7c3481e | ||
|
|
7404128eba | ||
|
|
f81f5354f6 | ||
|
|
b3e588cff5 | ||
|
|
a39597765c | ||
|
|
28f4bb04da | ||
|
|
80ab7a3877 | ||
|
|
5fcd1233c1 | ||
|
|
b894906f48 | ||
|
|
f998d7123f | ||
|
|
35c4ecc781 | ||
|
|
c98e0db8b0 | ||
|
|
0eead667a3 | ||
|
|
759dcf37c7 | ||
|
|
4f79679601 | ||
|
|
a834e6ea14 | ||
|
|
325963327e | ||
|
|
ef96f05127 | ||
|
|
d836883fc3 | ||
|
|
4abb1be184 | ||
|
|
8af0ca3350 | ||
|
|
c16e113290 | ||
|
|
6e92bcece2 | ||
|
|
f71a393c2b | ||
|
|
015bf842b0 | ||
|
|
cde122089e | ||
|
|
709ead19a3 | ||
|
|
8b4fe10f87 | ||
|
|
74d69f5d8f | ||
|
|
d7a8caa24c | ||
|
|
803291ba43 | ||
|
|
38f53fd1bf | ||
|
|
3d310bfd14 | ||
|
|
5cdad64d9c | ||
|
|
d3c2d15fc3 | ||
|
|
794cda41cc | ||
|
|
330359c446 | ||
|
|
c75906f766 | ||
|
|
a2d9994608 | ||
|
|
0a01f62f79 | ||
|
|
8888639bef | ||
|
|
5a114a7f8f | ||
|
|
53717078b9 | ||
|
|
d2c94da6bf | ||
|
|
320a40c65c | ||
|
|
9efb573f83 | ||
|
|
072024cee1 | ||
|
|
bf692fbcc0 | ||
|
|
2909a61a94 | ||
|
|
c06dc9c332 | ||
|
|
85ee8fae3c | ||
|
|
0f3f5d7db3 | ||
|
|
5d34e2e6eb | ||
|
|
679fec7e69 | ||
|
|
1cd68457a9 | ||
|
|
065494ae43 | ||
|
|
c59ee00d3e | ||
|
|
d504812655 | ||
|
|
06110e808d | ||
|
|
c27e7353b7 | ||
|
|
38ca4cbf33 | ||
|
|
f86604d7b2 | ||
|
|
7309df034e | ||
|
|
16180689ac | ||
|
|
880a8708f0 | ||
|
|
fbc68c5487 | ||
|
|
1540fd4fe3 | ||
|
|
9855b9e76f | ||
|
|
3ba1eaf92a | ||
|
|
474d519d85 | ||
|
|
3e8bbf57d2 | ||
|
|
80f6a5a9ee | ||
|
|
c1c1a07cd9 | ||
|
|
369eb4d101 | ||
|
|
115bdc1cb2 | ||
|
|
3b6b5a6721 | ||
|
|
24b680ca12 | ||
|
|
7c53a16e38 | ||
|
|
0eabe10ea1 | ||
|
|
c92b702b2e | ||
|
|
9068e82ae3 | ||
|
|
77ebbe7c6d | ||
|
|
8ec760855e | ||
|
|
5d1b399fa6 | ||
|
|
b6ebeadae2 | ||
|
|
c43dfaeb1f | ||
|
|
0f6caeff8a | ||
|
|
7191141177 | ||
|
|
256981dff7 | ||
|
|
ac8e295322 | ||
|
|
d772ae85bf | ||
|
|
83180f37ce | ||
|
|
af695b0aab | ||
|
|
68bf628cf3 | ||
|
|
c631511fc9 | ||
|
|
7a0ac82f0d | ||
|
|
f90e980a62 | ||
|
|
03b871143a | ||
|
|
c374cbeace | ||
|
|
df55d648c9 | ||
|
|
d18a2ebe38 | ||
|
|
bca55a68a1 | ||
|
|
a34d880ef3 | ||
|
|
1b07564429 | ||
|
|
53fd346348 | ||
|
|
11e037dd84 | ||
|
|
0869ad36c5 | ||
|
|
334e0cfd25 | ||
|
|
d2af89f693 | ||
|
|
2f832c65ed | ||
|
|
cb087ea4be | ||
|
|
72df934997 | ||
|
|
349b525295 | ||
|
|
3e58c2d681 | ||
|
|
e7748f943c | ||
|
|
03a755ee36 | ||
|
|
9ad1821194 | ||
|
|
04b16b5849 | ||
|
|
12c16b9634 | ||
|
|
4034109195 | ||
|
|
5355b43cdf | ||
|
|
ecbb40a375 | ||
|
|
6235d00c55 | ||
|
|
bff9f1a0a2 | ||
|
|
ecc6306b7d | ||
|
|
e9856d8b42 | ||
|
|
099bbf7d9c | ||
|
|
ba462a4d10 | ||
|
|
f953335bd2 | ||
|
|
3e60e0bd91 | ||
|
|
3e98e548be | ||
|
|
8021055345 | ||
|
|
3fdf890474 | ||
|
|
53e4e58c3f | ||
|
|
ad37d26815 | ||
|
|
a59321e7b8 | ||
|
|
e203fdaa67 | ||
|
|
81b95ac080 | ||
|
|
3ce3719630 | ||
|
|
5eaac9e509 | ||
|
|
65adba7285 | ||
|
|
03aadfa864 | ||
|
|
b3a83c13b3 | ||
|
|
a92e43ba4d | ||
|
|
bbf2fd54f3 | ||
|
|
2b110e7d9c | ||
|
|
ac3f2dd7f9 | ||
|
|
afda87f2b3 | ||
|
|
2689b01159 | ||
|
|
28c69284cf | ||
|
|
606aa28231 | ||
|
|
26e25914db | ||
|
|
6d83d67ec3 | ||
|
|
aad68cb1b9 | ||
|
|
959b2e1663 | ||
|
|
48b247fed6 | ||
|
|
a575776ea7 | ||
|
|
a394c7d075 | ||
|
|
1efad04a7c | ||
|
|
d6418d199f | ||
|
|
6915494594 | ||
|
|
44b278173d | ||
|
|
621de55f67 | ||
|
|
11f347276c | ||
|
|
d165382960 | ||
|
|
819ecaf133 | ||
|
|
b744ceb731 | ||
|
|
d706314802 | ||
|
|
c9e5c2f065 | ||
|
|
eadaf62064 | ||
|
|
ca9ada6d83 | ||
|
|
aa9948b4ba | ||
|
|
07a301f53c | ||
|
|
984a6395d0 | ||
|
|
50361e2b4f | ||
|
|
fb6478324b | ||
|
|
048edf2022 | ||
|
|
0985816c20 | ||
|
|
95e7ca1f6b | ||
|
|
f30e141d3f | ||
|
|
0bd4232d24 | ||
|
|
f56b12ae85 | ||
|
|
d98fccdf5a | ||
|
|
13b62ab0d0 | ||
|
|
a20f73dc1b | ||
|
|
dd84d2ce04 | ||
|
|
b304505a1b | ||
|
|
c6c2717bb5 | ||
|
|
61e539c822 | ||
|
|
5cfb8141af | ||
|
|
bb03d1c36a | ||
|
|
59c4249741 | ||
|
|
a44f52995d | ||
|
|
ac2848cb55 | ||
|
|
e8169806f9 | ||
|
|
8295ad654b | ||
|
|
6abcf8e536 | ||
|
|
8161aae3da | ||
|
|
36c1933192 | ||
|
|
0508d26796 | ||
|
|
67d2292680 | ||
|
|
873c4e8b72 | ||
|
|
1a3a10f636 | ||
|
|
a876959e79 | ||
|
|
138af1514a | ||
|
|
c9ec71ae02 | ||
|
|
e10e7e5cc7 | ||
|
|
e7ea68e766 | ||
|
|
2ccdbb1336 | ||
|
|
c3c43991f2 | ||
|
|
ef135f1ffe | ||
|
|
3294c9284b | ||
|
|
9f287ca8c7 | ||
|
|
cbacce66ca | ||
|
|
dac3a5323e | ||
|
|
d486d7e2a0 | ||
|
|
1c0e212125 | ||
|
|
146e1c5da4 | ||
|
|
d21e0da604 | ||
|
|
11864ed49d | ||
|
|
86c0db5612 | ||
|
|
b61b2132f9 | ||
|
|
66c963ec7c | ||
|
|
2505e49675 | ||
|
|
8e4d0dd49e | ||
|
|
919902f8bb | ||
|
|
020c1440d6 | ||
|
|
349f03b330 | ||
|
|
fd1224e7c9 | ||
|
|
672455c0d3 | ||
|
|
676f2f1f9a | ||
|
|
b94fa37aaf | ||
|
|
0af537701c | ||
|
|
d819781150 | ||
|
|
d9443cff54 | ||
|
|
92283b65ba | ||
|
|
497cbc67f1 | ||
|
|
3085d284f6 | ||
|
|
d39b51c389 | ||
|
|
590e42dc73 | ||
|
|
242ca22bc5 | ||
|
|
34f37bc70a | ||
|
|
43ae256c18 | ||
|
|
466be88bb9 | ||
|
|
ff7b7bbfe7 | ||
|
|
1d1c22b234 | ||
|
|
1b1850f82c | ||
|
|
e9942ca63d | ||
|
|
b87cf9162c | ||
|
|
8c11fe9ae1 | ||
|
|
4a1726df27 | ||
|
|
9f51255994 | ||
|
|
d2b3262edd | ||
|
|
3f7b085173 | ||
|
|
ed4cb797d4 | ||
|
|
d3bc3cdfaf | ||
|
|
db3f8c217b | ||
|
|
5cf4719de2 | ||
|
|
0ddfb3d910 | ||
|
|
47621150d3 | ||
|
|
d5ff290a8b | ||
|
|
4629a9ed04 | ||
|
|
92a2fb5854 | ||
|
|
3dedb4cb5e | ||
|
|
23ef0eab21 | ||
|
|
c72535e423 | ||
|
|
07a050d6c5 | ||
|
|
58c1ac9d5b | ||
|
|
0d2e53e6af | ||
|
|
581f2a4af1 | ||
|
|
009b569f25 | ||
|
|
d47364d344 | ||
|
|
61b011b3ce | ||
|
|
09d48c0bbf | ||
|
|
e184347f0e | ||
|
|
dc3f83093e | ||
|
|
0bf0466a11 | ||
|
|
2347b5633d | ||
|
|
7de641ce5c | ||
|
|
2e8189037c | ||
|
|
a54071f05d | ||
|
|
77e92f4e96 | ||
|
|
39e63a435f | ||
|
|
2218bb4489 | ||
|
|
dc85b4a35e | ||
|
|
75604aed8c | ||
|
|
029995d420 | ||
|
|
aec612614c | ||
|
|
2a4ca076cf | ||
|
|
e215918987 | ||
|
|
23e2a11b6b | ||
|
|
5f8a09d82e | ||
|
|
6e2107e82e | ||
|
|
af3ab73359 | ||
|
|
7d3828d3b9 | ||
|
|
a43b73fb9e | ||
|
|
bd102dee72 | ||
|
|
2634993a3a | ||
|
|
30f93ac439 | ||
|
|
337b06cce4 | ||
|
|
cc41d02607 | ||
|
|
4b7829e1f3 | ||
|
|
ac8fd15d0a | ||
|
|
b1a4b58ba2 | ||
|
|
3bd17743d2 | ||
|
|
e88e89c96b | ||
|
|
ae3a393038 | ||
|
|
12f2f2601c | ||
|
|
e42825b0ec | ||
|
|
eb7895bb48 | ||
|
|
1366c21891 | ||
|
|
341b0607fc | ||
|
|
e8a59937f6 | ||
|
|
20c69a374c | ||
|
|
3eb3dbecc8 | ||
|
|
f8a6e428ee | ||
|
|
196bfe351d | ||
|
|
5169cf78a4 | ||
|
|
11425ea861 | ||
|
|
d4a5604af6 | ||
|
|
b53ff4a516 | ||
|
|
1adf0b2e08 | ||
|
|
883c4c56d6 | ||
|
|
13a2c95671 | ||
|
|
48df8b3057 | ||
|
|
e771b4a62d | ||
|
|
c7bed0a259 |
454
.github/workflows/main.yml
vendored
454
.github/workflows/main.yml
vendored
@@ -4,6 +4,7 @@ name: CI
|
||||
|
||||
env:
|
||||
DISPLAY: ':99'
|
||||
ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
|
||||
|
||||
# Controls when the action will run. Triggers the workflow on push or pull request
|
||||
# events but only for the master branch
|
||||
@@ -13,13 +14,18 @@ on:
|
||||
branches: [ master, github-workflow-playground ]
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
schedule:
|
||||
- cron: "0 */12 * * *"
|
||||
# schedule:
|
||||
# - cron: "0 */12 * * *"
|
||||
|
||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||
jobs:
|
||||
window-build:
|
||||
runs-on: windows-latest
|
||||
strategy:
|
||||
matrix:
|
||||
config:
|
||||
- {python: true}
|
||||
- {python: false}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
@@ -36,7 +42,15 @@ jobs:
|
||||
with:
|
||||
repository: cagnulein/qmdnsengine
|
||||
path: "src/qmdnsengine/"
|
||||
ref: "zwift"
|
||||
ref: "zwift"
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
- name: Checkout submodule repo
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: google/googletest
|
||||
path: "tst/googletest/"
|
||||
ref: "release-1.12.1"
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
- name: Checkout submodule repo
|
||||
@@ -46,19 +60,40 @@ jobs:
|
||||
path: "src/MSIX-Toolkit/"
|
||||
ref: b82af826d29e93e4c85d34fad8a405b6c49905e7
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
- name: Checkout qHttpServer
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: qt-labs/qthttpserver
|
||||
path: "src/qthttpserver"
|
||||
|
||||
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: 3.10.11
|
||||
- name: download python and paddleocr
|
||||
run: |
|
||||
python -VV
|
||||
python -m pip install opencv-python
|
||||
python -m pip install pywin32
|
||||
python -m pip install paddlepaddle-gpu==2.4.2.post117 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html
|
||||
python -m pip install https://files.pythonhosted.org/packages/03/ac/13fbe0ebf110d57a89f055a292d4fe430fee3fb22c56f8c077e63e0c5a4e/paddlepaddle-2.4.2-cp310-cp310-win_amd64.whl
|
||||
python -m pip install paddleocr>=2.0.1
|
||||
if: matrix.config.python
|
||||
|
||||
- uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
install: mingw-w64-x86_64-toolchain
|
||||
install: mingw-w64-x86_64-toolchain mingw-w64-x86_64-qt5-webview
|
||||
msystem: mingw64
|
||||
release: false
|
||||
release: false
|
||||
|
||||
- name: Setup cmake
|
||||
uses: jwlawson/actions-setup-cmake@v1.9
|
||||
with:
|
||||
cmake-version: '3.20.x'
|
||||
cmake-version: '3.20.x'
|
||||
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v2
|
||||
uses: jurplel/install-qt-action@v3
|
||||
with:
|
||||
version: '5.15.2'
|
||||
host: 'windows'
|
||||
@@ -66,40 +101,177 @@ jobs:
|
||||
target: "desktop"
|
||||
arch: win64_mingw81
|
||||
dir: "${{github.workspace}}/qt/"
|
||||
install-deps: "true"
|
||||
install-deps: "true"
|
||||
cache: 'true'
|
||||
cache-key-prefix: 'install-qt-action-windows'
|
||||
|
||||
- name: download 3rd party files for qthttpserver
|
||||
run: |
|
||||
cp qHttpServerBin/5.15.2/headers/* src/qthttpserver/src/3rdparty/http-parser/
|
||||
|
||||
- name: Build qthttpserver
|
||||
run: |
|
||||
cd src\qthttpserver
|
||||
qmake
|
||||
make -j8
|
||||
make install
|
||||
cd ../..
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cd src
|
||||
run: |
|
||||
qmake
|
||||
cd src
|
||||
echo "#define STRAVA_SECRET_KEY ${{ secrets.strava_secret_key }}" > secret.h
|
||||
echo "#define SMTP_USERNAME ${{ secrets.smtp_username }}" >> secret.h
|
||||
echo "#define SMTP_PASSWORD ${{ secrets.smtp_password }}" >> secret.h
|
||||
echo "#define SMTP_SERVER ${{ secrets.smtp_server }}" >> secret.h
|
||||
echo "#define SMTP_USERNAME ${{ secrets.smtp_username }}" >> secret.h
|
||||
echo "#define SMTP_PASSWORD ${{ secrets.smtp_password }}" >> secret.h
|
||||
echo "#define SMTP_SERVER ${{ secrets.smtp_server }}" >> secret.h
|
||||
cd ..
|
||||
make -j8
|
||||
cd debug
|
||||
cd src/debug
|
||||
mkdir output
|
||||
mkdir appx
|
||||
cp qdomyos-zwift.exe output/
|
||||
cd output
|
||||
windeployqt --qmldir ../../ qdomyos-zwift.exe
|
||||
cp "${{github.workspace}}/qt/Qt/5.15.2/mingw81_64/bin/libwinpthread-1.dll" .
|
||||
cp "${{github.workspace}}/qt/Qt/5.15.2/mingw81_64/bin/libgcc_s_seh-1.dll" .
|
||||
cp "${{github.workspace}}/qt/Qt/5.15.2/mingw81_64/bin/libstdc++-6.dll" .
|
||||
cp ../../../icons/iOS/iTunesArtwork@2x.png .
|
||||
cp "C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/libwinpthread-1.dll" .
|
||||
cp "C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/libgcc_s_seh-1.dll" .
|
||||
cp "C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/libstdc++-6.dll" .
|
||||
cp ../../../icons/iOS/iTunesArtwork@2x.png .
|
||||
cp ../../AppxManifest.xml .
|
||||
cp ../../windows/*.py .
|
||||
mkdir adb
|
||||
mkdir python
|
||||
Copy-Item -Path C:\hostedtoolcache\windows\Python\3.10.11\x64 -Destination python -Recurse
|
||||
cp ../../adb/* adb/
|
||||
cd ..
|
||||
cd appx
|
||||
#../../MSIX-Toolkit/WindowsSDK/10/10.0.20348.0/x64/makeappx.exe pack /d ../output/ /p qz
|
||||
|
||||
#../../MSIX-Toolkit/WindowsSDK/10/10.0.20348.0/x64/makeappx.exe pack /d ../output/ /p qz
|
||||
if: matrix.config.python
|
||||
|
||||
- name: Build without python
|
||||
run: |
|
||||
qmake
|
||||
cd src
|
||||
echo "#define STRAVA_SECRET_KEY ${{ secrets.strava_secret_key }}" > secret.h
|
||||
echo "#define SMTP_USERNAME ${{ secrets.smtp_username }}" >> secret.h
|
||||
echo "#define SMTP_PASSWORD ${{ secrets.smtp_password }}" >> secret.h
|
||||
echo "#define SMTP_SERVER ${{ secrets.smtp_server }}" >> secret.h
|
||||
cd ..
|
||||
make -j8
|
||||
cd src/debug
|
||||
mkdir output
|
||||
mkdir appx
|
||||
cp qdomyos-zwift.exe output/
|
||||
cd output
|
||||
windeployqt --qmldir ../../ qdomyos-zwift.exe
|
||||
cp "C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/libwinpthread-1.dll" .
|
||||
cp "C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/libgcc_s_seh-1.dll" .
|
||||
cp "C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/libstdc++-6.dll" .
|
||||
cp ../../../icons/iOS/iTunesArtwork@2x.png .
|
||||
cp ../../AppxManifest.xml .
|
||||
mkdir adb
|
||||
cp ../../adb/* adb/
|
||||
cd ..
|
||||
cd appx
|
||||
#../../MSIX-Toolkit/WindowsSDK/10/10.0.20348.0/x64/makeappx.exe pack /d ../output/ /p qz
|
||||
if: matrix.config.python == false
|
||||
|
||||
- name: Zip artifact for deployment
|
||||
run: Compress-Archive src/debug/output release.zip
|
||||
|
||||
- name: Archive windows binary
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: windows-binary
|
||||
path: src/debug/output
|
||||
|
||||
path: release.zip
|
||||
if: matrix.config.python
|
||||
|
||||
- name: Archive windows binary
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: windows-binary-no-python
|
||||
path: release.zip
|
||||
if: ${{ ! matrix.config.python }}
|
||||
|
||||
# window-steam-build:
|
||||
# runs-on: windows-latest
|
||||
#
|
||||
# steps:
|
||||
# - uses: actions/checkout@v2
|
||||
# - name: Checkout submodule repo
|
||||
# uses: actions/checkout@v2
|
||||
# with:
|
||||
# repository: bluetiger9/SmtpClient-for-Qt
|
||||
# path: "src/smtpclient/"
|
||||
# ref: 3fa4a0fe5797070339422cf18b5e9ed8dcb91f9c
|
||||
#
|
||||
# - uses: actions/checkout@v2
|
||||
# - name: Checkout submodule repo
|
||||
# uses: actions/checkout@v2
|
||||
# with:
|
||||
# repository: cagnulein/qmdnsengine
|
||||
# path: "src/qmdnsengine/"
|
||||
# ref: "zwift"
|
||||
#
|
||||
# - uses: msys2/setup-msys2@v2
|
||||
# with:
|
||||
# install: mingw-w64-x86_64-toolchain
|
||||
# msystem: mingw64
|
||||
# release: false
|
||||
#
|
||||
# - name: Setup cmake
|
||||
# uses: jwlawson/actions-setup-cmake@v1.9
|
||||
# with:
|
||||
# cmake-version: '3.20.x'
|
||||
#
|
||||
# - name: Install Qt
|
||||
# uses: jurplel/install-qt-action@v2
|
||||
# with:
|
||||
# version: '5.15.2'
|
||||
# host: 'windows'
|
||||
# modules: 'qtnetworkauth qtcharts'
|
||||
# target: "desktop"
|
||||
# arch: win64_mingw81
|
||||
# dir: "${{github.workspace}}/qt/"
|
||||
# install-deps: "true"
|
||||
#
|
||||
# - name: Build
|
||||
# run: |
|
||||
# qmake
|
||||
# cd src
|
||||
# echo "#define STRAVA_SECRET_KEY ${{ secrets.strava_secret_key }}" > secret.h
|
||||
# echo "#define SMTP_USERNAME ${{ secrets.smtp_username }}" >> secret.h
|
||||
# echo "#define SMTP_PASSWORD ${{ secrets.smtp_password }}" >> secret.h
|
||||
# echo "#define SMTP_SERVER ${{ secrets.smtp_server }}" >> secret.h
|
||||
# echo "#define STEAM_STORE" >> secret.h
|
||||
# cd ..
|
||||
# make -j8
|
||||
# cd src/debug
|
||||
# mkdir output
|
||||
# mkdir appx
|
||||
# cp qdomyos-zwift.exe output/
|
||||
# cd output
|
||||
# windeployqt --qmldir ../../ qdomyos-zwift.exe
|
||||
# cp "${{github.workspace}}/qt/Qt/5.15.2/mingw81_64/bin/libwinpthread-1.dll" .
|
||||
# cp "${{github.workspace}}/qt/Qt/5.15.2/mingw81_64/bin/libgcc_s_seh-1.dll" .
|
||||
# cp "${{github.workspace}}/qt/Qt/5.15.2/mingw81_64/bin/libstdc++-6.dll" .
|
||||
#
|
||||
# - uses: game-ci/steam-deploy@v1
|
||||
# with:
|
||||
# username: ${{ secrets.STEAM_USERNAME }}
|
||||
# password: ${{ secrets.STEAM_PASSWORD }}
|
||||
# configVdf: ${{ secrets.STEAM_CONFIG_VDF}}
|
||||
# ssfnFileName: ${{ secrets.STEAM_SSFN_FILE_NAME }}
|
||||
# ssfnFileContents: ${{ secrets.STEAM_SSFN_FILE_CONTENTS }}
|
||||
# appId: 2267200
|
||||
# buildDescription: 2.12
|
||||
# rootPath: src/debug/output
|
||||
# depot1Path: ./
|
||||
# #depot2Path: StandaloneLinux64
|
||||
# releaseBranch: prerelease
|
||||
|
||||
# This workflow contains a single job called "build"
|
||||
build:
|
||||
linux-x86-build:
|
||||
# The type of runner that the job will run on
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
@@ -122,7 +294,7 @@ jobs:
|
||||
- name: Xvfb install and run
|
||||
run: |
|
||||
sudo apt-get install -y xvfb
|
||||
Xvfb -ac ${{ env.DISPLAY }} -screen 0 1280x780x24 &
|
||||
Xvfb -ac ${{ env.DISPLAY }} -screen 0 1280x780x24 &
|
||||
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
- uses: actions/checkout@v2
|
||||
@@ -131,7 +303,7 @@ jobs:
|
||||
with:
|
||||
repository: bluetiger9/SmtpClient-for-Qt
|
||||
path: "src/smtpclient/"
|
||||
ref: 3fa4a0fe5797070339422cf18b5e9ed8dcb91f9c
|
||||
ref: 3fa4a0fe5797070339422cf18b5e9ed8dcb91f9c
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
- name: Checkout submodule repo
|
||||
@@ -141,24 +313,63 @@ jobs:
|
||||
path: "src/qmdnsengine/"
|
||||
ref: "zwift"
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
- name: Checkout submodule repo
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: google/googletest
|
||||
path: "tst/googletest/"
|
||||
ref: "release-1.12.1"
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
- name: Checkout qHttpServer
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: qt-labs/qthttpserver
|
||||
path: "src/qthttpserver"
|
||||
|
||||
- name: Install packages required to run QZ inside workflow
|
||||
run: sudo apt update -y && sudo apt-get install -y qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtquickcontrols2-5-dev libqt5bluetooth5 libqt5widgets5 libqt5positioning5 libqt5xml5 qtconnectivity5-dev qtpositioning5-dev libqt5charts5-dev libqt5charts5 libqt5networkauth5-dev libqt5websockets5* libxcb-randr0-dev libxcb-xtest0-dev libxcb-xinerama0-dev libxcb-shape0-dev libxcb-xkb-dev
|
||||
|
||||
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v2
|
||||
uses: jurplel/install-qt-action@v3
|
||||
with:
|
||||
version: '5.15.2'
|
||||
host: 'linux'
|
||||
modules: 'qtnetworkauth qtcharts'
|
||||
|
||||
cache: 'true'
|
||||
cache-key-prefix: 'install-qt-action-linux'
|
||||
|
||||
- name: download 3rd party files for qthttpserver
|
||||
run: |
|
||||
cp qHttpServerBin/5.15.2/headers/* src/qthttpserver/src/3rdparty/http-parser/
|
||||
|
||||
- name: Build qthttpserver
|
||||
run: |
|
||||
cd src/qthttpserver
|
||||
qmake
|
||||
make -j8
|
||||
make install
|
||||
cd ../..
|
||||
|
||||
- name: Compile Linux Desktop
|
||||
run: cd src; qmake; make -j8
|
||||
|
||||
run: 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
|
||||
run: cd tst; GTEST_OUTPUT=xml:test-results/ GTEST_COLOR=1 ./qdomyos-zwift-tests; cd ..
|
||||
|
||||
- name: Upload test results
|
||||
uses: actions/upload-artifact@v2
|
||||
if: failure()
|
||||
with:
|
||||
name: test_results_xml
|
||||
path: tst/test-results/**/*.xml
|
||||
|
||||
# - name: Test Peloton API
|
||||
# if: github.event_name == 'push' || github.event_name == 'schedule'
|
||||
@@ -199,7 +410,7 @@ jobs:
|
||||
# modules: 'qtcharts debug_info'
|
||||
# dir: '${{ github.workspace }}/output/android/'
|
||||
# cached: ${{ steps.cache-qt-android.outputs.cache-hit }}
|
||||
|
||||
|
||||
# - name: Compile Android
|
||||
# run: cd src; qmake; make -j4
|
||||
|
||||
@@ -211,6 +422,183 @@ jobs:
|
||||
# target: 'desktop'
|
||||
# modules: 'qtcharts debug_info'
|
||||
# dir: '${{ github.workspace }}/output/macos/'
|
||||
|
||||
|
||||
# - name: Compile MacOS
|
||||
# run: cd src; qmake; make -j4
|
||||
|
||||
|
||||
# This workflow contains a single job called "build"
|
||||
android-build:
|
||||
# The type of runner that the job will run on
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||
steps:
|
||||
# - name: Cache Qt Linux Desktop
|
||||
# id: cache-qt-linux-desktop
|
||||
# uses: actions/cache@v1
|
||||
# with:
|
||||
# path: '${{ github.workspace }}/output/linux-desktop/'
|
||||
# key: ${{ runner.os }}-QtCache-Linux-Desktop
|
||||
|
||||
# - name: Cache Qt Linux Android
|
||||
# id: cache-qt-android
|
||||
# uses: actions/cache@v1
|
||||
# with:
|
||||
# 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
|
||||
- name: Checkout submodule repo
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: bluetiger9/SmtpClient-for-Qt
|
||||
path: "src/smtpclient/"
|
||||
ref: 3fa4a0fe5797070339422cf18b5e9ed8dcb91f9c
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
- name: Checkout submodule repo
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: cagnulein/qmdnsengine
|
||||
path: "src/qmdnsengine/"
|
||||
ref: "zwift"
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
- name: Checkout submodule repo
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: google/googletest
|
||||
path: "tst/googletest/"
|
||||
ref: "release-1.12.1"
|
||||
|
||||
- name: Install packages required to run QZ inside workflow
|
||||
run: sudo apt update -y && sudo apt-get install -y qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtquickcontrols2-5-dev libqt5bluetooth5 libqt5widgets5 libqt5positioning5 libqt5xml5 qtconnectivity5-dev qtpositioning5-dev libqt5charts5-dev libqt5charts5 libqt5networkauth5-dev libqt5websockets5* libxcb-randr0-dev libxcb-xtest0-dev libxcb-xinerama0-dev libxcb-shape0-dev libxcb-xkb-dev
|
||||
|
||||
# - 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:
|
||||
# repository: nttld/setup-ndk
|
||||
# path: setup-ndk
|
||||
# The packages.json in nttld/setup-ndk has already been updated,
|
||||
# https://github.com/nttld/setup-ndk/commit/831db5b02a0f0cab80614619efe461a3dcc140e6
|
||||
# but `dist/*` has not been rebuilt yet. Build it.
|
||||
# https://github.com/nttld/setup-ndk/tree/main/dist
|
||||
# - name: Locally rebuilt setup-ndk
|
||||
# run: |
|
||||
# npm -prefix ./setup-ndk install
|
||||
# npm -prefix ./setup-ndk run all
|
||||
# Install using locally rebuilt setup-ndk
|
||||
# - name: Setup Android NDK r21d
|
||||
# uses: ./setup-ndk
|
||||
#- uses: nttld/setup-ndk@v1
|
||||
# with:
|
||||
# ndk-version: r21d
|
||||
|
||||
# waiting github.com/jurplel/install-qt-action/issues/63
|
||||
- name: Install Qt Android
|
||||
uses: jurplel/install-qt-action@v3
|
||||
with:
|
||||
version: '5.15.2'
|
||||
host: 'linux'
|
||||
target: 'android'
|
||||
arch: 'android'
|
||||
modules: 'qtcharts qtnetworkauth'
|
||||
dir: '${{ github.workspace }}/output/android/'
|
||||
cache: 'true'
|
||||
cache-key-prefix: 'install-qt-action-android'
|
||||
|
||||
- name: Install Java
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'temurin' # See 'Supported distributions' for available options
|
||||
java-version: '11'
|
||||
|
||||
- name: Set Android NDK 21 && build
|
||||
run: |
|
||||
# Install NDK 21 after GitHub update
|
||||
# https://github.com/actions/virtual-environments/issues/5595
|
||||
ANDROID_ROOT="/usr/local/lib/android"
|
||||
ANDROID_SDK_ROOT="${ANDROID_ROOT}/sdk"
|
||||
SDKMANAGER="${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager"
|
||||
echo "y" | $SDKMANAGER "ndk;21.4.7075529"
|
||||
export ANDROID_NDK="${ANDROID_SDK_ROOT}/ndk-bundle"
|
||||
export ANDROID_NDK_ROOT="${ANDROID_NDK}"
|
||||
|
||||
ln -sfn $ANDROID_SDK_ROOT/ndk/21.4.7075529 $ANDROID_NDK
|
||||
rm -rf /usr/local/lib/android/sdk/ndk/25.1.8937393
|
||||
qmake -spec android-clang 'ANDROID_ABIS=armeabi-v7a arm64-v8a x86 x86_64' 'ANDROID_NDK_ROOT=/usr/local/lib/android/sdk/ndk/21.4.7075529' && make -j4 && make INSTALL_ROOT=${{ github.workspace }}/output/android/ install
|
||||
|
||||
- name: Build APK (not usable for production due to unpatched QT library)
|
||||
run: cd src; androiddeployqt --input android-qdomyos-zwift-deployment-settings.json --output ${{ github.workspace }}/output/android/ --android-platform android-31 --gradle --aab
|
||||
|
||||
ios-build:
|
||||
# The type of runner that the job will run on
|
||||
runs-on: macos-latest
|
||||
|
||||
steps:
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
- uses: actions/checkout@v2
|
||||
- name: Checkout submodule repo
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: bluetiger9/SmtpClient-for-Qt
|
||||
path: "src/smtpclient/"
|
||||
ref: 3fa4a0fe5797070339422cf18b5e9ed8dcb91f9c
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
- name: Checkout submodule repo
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: cagnulein/qmdnsengine
|
||||
path: "src/qmdnsengine/"
|
||||
ref: "zwift"
|
||||
|
||||
- uses: actions/checkout@v2
|
||||
- name: Checkout submodule repo
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: google/googletest
|
||||
path: "tst/googletest/"
|
||||
ref: "release-1.12.1"
|
||||
|
||||
- name: Install Qt iOS
|
||||
uses: jurplel/install-qt-action@v3
|
||||
with:
|
||||
version: '5.15.2'
|
||||
host: 'mac'
|
||||
target: 'ios'
|
||||
modules: 'qtcharts qtnetworkauth'
|
||||
dir: '${{ github.workspace }}/output/ios/'
|
||||
cache: 'true'
|
||||
cache-key-prefix: 'install-qt-action-ios'
|
||||
|
||||
- name: fix qt
|
||||
run: find ${{ github.workspace }}/output/ios/ -name 'ios.conf' -exec sed -i '' 's/ios-simulator/iphonesimulator/g' {} \;
|
||||
|
||||
- name: fix qt
|
||||
run: find ${{ github.workspace }}/output/ios/ -name 'devices.py' -exec sed -i '' 's/\/usr\/bin\/python/\/usr\/bin\/python3/g' {} \;
|
||||
|
||||
- name: fix qt
|
||||
run: find ./ -name 'qdomyos-zwift-lib.pro' -exec sed -i '' 's/TARGET = qdomyos-zwift/TARGET = qdomyoszwift/g' {} \;
|
||||
|
||||
- name: patching qt for bluetooth
|
||||
run: cp qt-patches/ios/5.15.2/binary/*.* ${{ github.workspace }}/output/ios/Qt/5.15.2/ios/lib/
|
||||
|
||||
- name: Build
|
||||
run: qmake CONFIG+=debug && make -j4
|
||||
|
||||
|
||||
5
.gitignore
vendored
5
.gitignore
vendored
@@ -25,7 +25,6 @@ src/secret.h
|
||||
|
||||
build-qdomyos-zwift-Android_Qt_5_15_2_Clang_Multi_Abi-Debug/*
|
||||
**/node_modules/*
|
||||
*.pro.user
|
||||
|
||||
template-examples/youtube-viewer/node_modules/*
|
||||
template-examples/youtube-viewer/*.json
|
||||
@@ -40,9 +39,13 @@ template-examples/train-program-saver/.eslintrc.js
|
||||
template-examples/train-program-saver/.jshintrc
|
||||
template-examples/train-program-saver/debug.js
|
||||
|
||||
google_test/*
|
||||
|
||||
# Qt-es
|
||||
*.pro.user
|
||||
*build-*
|
||||
!build-qdomyos-zwift-Qt_*_for_iOS-Debug # Needed for Apple Watch
|
||||
src/inner_templates/googlemaps/cesium-key.js
|
||||
*.autosave
|
||||
.vscode/settings.json
|
||||
/tst/Devices/.vs
|
||||
|
||||
4
.gitmodules
vendored
4
.gitmodules
vendored
@@ -9,3 +9,7 @@
|
||||
path = src/qmdnsengine
|
||||
url = https://github.com/cagnulein/qmdnsengine.git
|
||||
branch = zwift
|
||||
[submodule "tst/googletest"]
|
||||
path = tst/googletest
|
||||
url = https://github.com/google/googletest.git
|
||||
branch = tags/release-1.12.1
|
||||
|
||||
128
CODE_OF_CONDUCT.md
Normal file
128
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,128 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, religion, or sexual identity
|
||||
and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the
|
||||
overall community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery, and sexual attention or
|
||||
advances of any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or email
|
||||
address, without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official e-mail address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at
|
||||
roberto.viola83@gmail.com.
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series
|
||||
of actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or
|
||||
permanent ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within
|
||||
the community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 2.0, available at
|
||||
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||
|
||||
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||
enforcement ladder](https://github.com/mozilla/diversity).
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
https://www.contributor-covenant.org/faq. Translations are available at
|
||||
https://www.contributor-covenant.org/translations.
|
||||
437
QZ_ESP32/QZ_ESP32.ino
Normal file
437
QZ_ESP32/QZ_ESP32.ino
Normal file
@@ -0,0 +1,437 @@
|
||||
/** NimBLE_Server Demo:
|
||||
*
|
||||
This is working to broadcast Power and Cadence under the Cycling Power Service Profile
|
||||
Data tested against Edge and Phone
|
||||
*
|
||||
*/
|
||||
#include <Arduino.h>
|
||||
#include <NimBLEDevice.h>
|
||||
|
||||
short powerInstantaneous = 0;
|
||||
short cadenceInstantaneous = 0;
|
||||
short speedInstantaneous = 0;
|
||||
float powerScale = 1.28; // incoming power is multiplied by this value for correction
|
||||
short resistance = 0; //Not currently doing anything with this value after receiving it
|
||||
bool notify = false;
|
||||
|
||||
// Define stuff for the Client that will receive data from Fitness Machine
|
||||
// The remote service we wish to connect to.
|
||||
static BLEUUID serviceUUID("1826"); // Fitness Machine
|
||||
// The characteristic of the remote service we are interested in.
|
||||
static BLEUUID charUUID("2ad2"); // Indoor Bike (Fitness Machine)
|
||||
|
||||
|
||||
static BLEUUID HRserviceUUID("180D"); // HR Service
|
||||
static BLEUUID HRcharUUID("2a37"); // HR Measuremente
|
||||
|
||||
static boolean doConnect = false;
|
||||
static boolean connected = false;
|
||||
static boolean doScan = false;
|
||||
static BLERemoteCharacteristic *pRemoteCharacteristic;
|
||||
static BLEAdvertisedDevice *myDevice;
|
||||
/*
|
||||
* Server Stuff
|
||||
*/
|
||||
static NimBLEServer *pServer;
|
||||
/** None of these are required as they will be handled by the library with defaults. **
|
||||
** Remove as you see fit for your needs */
|
||||
class ServerCallbacks : public NimBLEServerCallbacks
|
||||
{
|
||||
void onConnect(NimBLEServer *pServer)
|
||||
{
|
||||
Serial.println("Client connected");
|
||||
Serial.println("Multi-connect support: start advertising");
|
||||
NimBLEDevice::startAdvertising();
|
||||
};
|
||||
/** Alternative onConnect() method to extract details of the connection.
|
||||
* See: src/ble_gap.h for the details of the ble_gap_conn_desc struct.
|
||||
*/
|
||||
void onConnect(NimBLEServer *pServer, ble_gap_conn_desc *desc)
|
||||
{
|
||||
Serial.print("Client address: ");
|
||||
Serial.println(NimBLEAddress(desc->peer_ota_addr).toString().c_str());
|
||||
/** We can use the connection handle here to ask for different connection parameters.
|
||||
* Args: connection handle, min connection interval, max connection interval
|
||||
* latency, supervision timeout.
|
||||
* Units; Min/Max Intervals: 1.25 millisecond increments.
|
||||
* Latency: number of intervals allowed to skip.
|
||||
* Timeout: 10 millisecond increments, try for 5x interval time for best results.
|
||||
*/
|
||||
pServer->updateConnParams(desc->conn_handle, 24, 48, 0, 60);
|
||||
};
|
||||
void onDisconnect(NimBLEServer *pServer)
|
||||
{
|
||||
Serial.println("Client disconnected - start advertising");
|
||||
NimBLEDevice::startAdvertising();
|
||||
};
|
||||
void onMTUChange(uint16_t MTU, ble_gap_conn_desc *desc)
|
||||
{
|
||||
Serial.printf("MTU updated: %u for connection ID: %u\n", MTU, desc->conn_handle);
|
||||
};
|
||||
};
|
||||
|
||||
/** Handler class for characteristic actions */
|
||||
class CharacteristicCallbacks : public NimBLECharacteristicCallbacks
|
||||
{
|
||||
void onRead(NimBLECharacteristic *pCharacteristic)
|
||||
{
|
||||
Serial.print(pCharacteristic->getUUID().toString().c_str());
|
||||
Serial.print(": onRead(), value: ");
|
||||
Serial.println(pCharacteristic->getValue().c_str());
|
||||
};
|
||||
|
||||
void onWrite(NimBLECharacteristic *pCharacteristic)
|
||||
{
|
||||
Serial.print(pCharacteristic->getUUID().toString().c_str());
|
||||
Serial.print(": onWrite(), value: ");
|
||||
Serial.println(pCharacteristic->getValue().c_str());
|
||||
};
|
||||
/** Called before notification or indication is sent,
|
||||
* the value can be changed here before sending if desired.
|
||||
*/
|
||||
void onNotify(NimBLECharacteristic *pCharacteristic)
|
||||
{
|
||||
Serial.println("Sending notification to clients");
|
||||
};
|
||||
|
||||
/** The status returned in status is defined in NimBLECharacteristic.h.
|
||||
* The value returned in code is the NimBLE host return code.
|
||||
*/
|
||||
void onStatus(NimBLECharacteristic *pCharacteristic, Status status, int code)
|
||||
{
|
||||
String str = ("Notification/Indication status code: ");
|
||||
str += status;
|
||||
str += ", return code: ";
|
||||
str += code;
|
||||
str += ", ";
|
||||
str += NimBLEUtils::returnCodeToString(code);
|
||||
Serial.println(str);
|
||||
};
|
||||
|
||||
void onSubscribe(NimBLECharacteristic *pCharacteristic, ble_gap_conn_desc *desc, uint16_t subValue)
|
||||
{
|
||||
String str = "Client ID: ";
|
||||
str += desc->conn_handle;
|
||||
str += " Address: ";
|
||||
str += std::string(NimBLEAddress(desc->peer_ota_addr)).c_str();
|
||||
if (subValue == 0)
|
||||
{
|
||||
str += " Unsubscribed to ";
|
||||
}
|
||||
else if (subValue == 1)
|
||||
{
|
||||
str += " Subscribed to notifications for ";
|
||||
}
|
||||
else if (subValue == 2)
|
||||
{
|
||||
str += " Subscribed to indications for ";
|
||||
}
|
||||
else if (subValue == 3)
|
||||
{
|
||||
str += " Subscribed to notifications and indications for ";
|
||||
}
|
||||
str += std::string(pCharacteristic->getUUID()).c_str();
|
||||
|
||||
Serial.println(str);
|
||||
};
|
||||
};
|
||||
|
||||
/** Handler class for descriptor actions */
|
||||
class DescriptorCallbacks : public NimBLEDescriptorCallbacks
|
||||
{
|
||||
void onWrite(NimBLEDescriptor *pDescriptor)
|
||||
{
|
||||
std::string dscVal((char *)pDescriptor->getValue(), pDescriptor->getLength());
|
||||
Serial.print("Descriptor witten value:");
|
||||
Serial.println(dscVal.c_str());
|
||||
};
|
||||
|
||||
void onRead(NimBLEDescriptor *pDescriptor)
|
||||
{
|
||||
Serial.print(pDescriptor->getUUID().toString().c_str());
|
||||
Serial.println(" Descriptor read");
|
||||
};
|
||||
};
|
||||
/*
|
||||
* Client Stuff
|
||||
*/
|
||||
// This callback is for when data is received from Server
|
||||
static void notifyCallback(
|
||||
BLERemoteCharacteristic *pBLERemoteCharacteristic,
|
||||
uint8_t *pData,
|
||||
size_t length,
|
||||
bool isNotify)
|
||||
{
|
||||
powerInstantaneous = pData[8] | pData[9] << 8; // 2 bytes of power
|
||||
cadenceInstantaneous = 60; //(pData[4] | pData[5] << 8) / 2; // 2 bytes of power in 0.5 resolution RPM, convert to RPM
|
||||
resistance = pData[6]; // 1 byte of resistance
|
||||
Serial.printf("Power = %d | Cadence = %d | Resistance = %d\n", powerInstantaneous, cadenceInstantaneous, resistance);
|
||||
}
|
||||
|
||||
/** None of these are required as they will be handled by the library with defaults. **
|
||||
** Remove as you see fit for your needs */
|
||||
class MyClientCallback : public BLEClientCallbacks
|
||||
{
|
||||
void onConnect(BLEClient *pclient)
|
||||
{
|
||||
}
|
||||
|
||||
void onDisconnect(BLEClient *pclient)
|
||||
{
|
||||
connected = false;
|
||||
Serial.println("onDisconnect");
|
||||
}
|
||||
};
|
||||
|
||||
bool connectToServer()
|
||||
{
|
||||
Serial.print("Forming a connection to ");
|
||||
Serial.println(myDevice->getAddress().toString().c_str());
|
||||
|
||||
BLEClient *pClient = BLEDevice::createClient();
|
||||
Serial.println(" - Created client");
|
||||
|
||||
pClient->setClientCallbacks(new MyClientCallback());
|
||||
|
||||
// Connect to the remove BLE Server.
|
||||
pClient->connect(myDevice); // if you pass BLEAdvertisedDevice instead of address, it will be recognized type of peer device address (public or private)
|
||||
Serial.println(" - Connected to server");
|
||||
|
||||
// Obtain a reference to the service we are after in the remote BLE server.
|
||||
BLERemoteService *pRemoteService = pClient->getService(serviceUUID);
|
||||
if (pRemoteService == nullptr)
|
||||
{
|
||||
Serial.print("Failed to find our service UUID: ");
|
||||
Serial.println(serviceUUID.toString().c_str());
|
||||
pClient->disconnect();
|
||||
return false;
|
||||
}
|
||||
Serial.println(" - Found our service");
|
||||
|
||||
// Obtain a reference to the characteristic in the service of the remote BLE server.
|
||||
pRemoteCharacteristic = pRemoteService->getCharacteristic(charUUID);
|
||||
if (pRemoteCharacteristic == nullptr)
|
||||
{
|
||||
Serial.print("Failed to find our characteristic UUID: ");
|
||||
Serial.println(charUUID.toString().c_str());
|
||||
pClient->disconnect();
|
||||
return false;
|
||||
}
|
||||
Serial.println(" - Found our characteristic");
|
||||
|
||||
// Read the value of the characteristic.
|
||||
if (pRemoteCharacteristic->canRead())
|
||||
{
|
||||
std::string value = pRemoteCharacteristic->readValue();
|
||||
Serial.print("The characteristic value was: ");
|
||||
Serial.println(value.c_str());
|
||||
}
|
||||
|
||||
if (pRemoteCharacteristic->canNotify())
|
||||
pRemoteCharacteristic->registerForNotify(notifyCallback);
|
||||
|
||||
connected = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Scan for BLE servers and find the first one that advertises the service we are looking for.
|
||||
*/
|
||||
class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks
|
||||
{
|
||||
/**
|
||||
* Called for each advertising BLE server.
|
||||
*/
|
||||
|
||||
/*** Only a reference to the advertised device is passed now
|
||||
void onResult(BLEAdvertisedDevice advertisedDevice) { **/
|
||||
void onResult(BLEAdvertisedDevice *advertisedDevice)
|
||||
{
|
||||
Serial.print("BLE Advertised Device found: ");
|
||||
Serial.println(advertisedDevice->toString().c_str());
|
||||
|
||||
// We have found a device, let us now see if it contains the service we are looking for.
|
||||
/********************************************************************************
|
||||
if (advertisedDevice.haveServiceUUID() && advertisedDevice.isAdvertisingService(serviceUUID)) {
|
||||
********************************************************************************/
|
||||
if (advertisedDevice->haveServiceUUID() && advertisedDevice->isAdvertisingService(serviceUUID))
|
||||
{
|
||||
|
||||
BLEDevice::getScan()->stop();
|
||||
/*******************************************************************
|
||||
myDevice = new BLEAdvertisedDevice(advertisedDevice);
|
||||
*******************************************************************/
|
||||
myDevice = advertisedDevice; /** Just save the reference now, no need to copy the object */
|
||||
doConnect = true;
|
||||
doScan = true;
|
||||
|
||||
} // Found our server
|
||||
} // onResult
|
||||
}; // MyAdvertisedDeviceCallbacks
|
||||
|
||||
//delays for X ms, should not block execution
|
||||
void softDelay(unsigned long delayTime)
|
||||
{
|
||||
unsigned long startTime = millis();
|
||||
while ((millis() - startTime) < delayTime)
|
||||
{
|
||||
//wait
|
||||
}
|
||||
}
|
||||
|
||||
/** Define callback instances globally to use for multiple Characteristics \ Descriptors */
|
||||
// This section is for the Server that will broadcast the data as Cycling Power
|
||||
static DescriptorCallbacks dscCallbacks;
|
||||
static CharacteristicCallbacks chrCallbacks;
|
||||
NimBLECharacteristic *CyclingPowerFeature = NULL;
|
||||
NimBLECharacteristic *CyclingPowerMeasurement = NULL;
|
||||
NimBLECharacteristic *CyclingPowerSensorLocation = NULL;
|
||||
NimBLECharacteristic *HRMeasurement = NULL;
|
||||
unsigned char bleBuffer[8];
|
||||
unsigned char slBuffer[1];
|
||||
unsigned char fBuffer[4];
|
||||
unsigned short revolutions = 0;
|
||||
unsigned short timestamp = 0;
|
||||
unsigned short flags = 0x20;
|
||||
byte sensorlocation = 0x0D;
|
||||
long lastNotify = 0;
|
||||
long lastRevolution = 0;
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println("Starting NimBLE Server");
|
||||
|
||||
/** sets device name */
|
||||
NimBLEDevice::init("QZESP");
|
||||
/** Optional: set the transmit power, default is 3db */
|
||||
NimBLEDevice::setPower(ESP_PWR_LVL_P9); /** +9db */
|
||||
|
||||
pServer = NimBLEDevice::createServer();
|
||||
pServer->setCallbacks(new ServerCallbacks());
|
||||
|
||||
fBuffer[0] = 0x00;
|
||||
fBuffer[1] = 0x00;
|
||||
fBuffer[2] = 0x00;
|
||||
fBuffer[3] = 0x08;
|
||||
|
||||
slBuffer[0] = sensorlocation & 0xff;
|
||||
|
||||
NimBLEService *pDeadService = pServer->createService("1818");
|
||||
CyclingPowerFeature = pDeadService->createCharacteristic(
|
||||
"2A65",
|
||||
NIMBLE_PROPERTY::READ);
|
||||
CyclingPowerSensorLocation = pDeadService->createCharacteristic(
|
||||
"2A5D",
|
||||
NIMBLE_PROPERTY::READ);
|
||||
CyclingPowerMeasurement = pDeadService->createCharacteristic(
|
||||
"2A63",
|
||||
NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::NOTIFY);
|
||||
|
||||
CyclingPowerFeature->setValue(fBuffer, 4);
|
||||
CyclingPowerSensorLocation->setValue(slBuffer, 1);
|
||||
CyclingPowerMeasurement->setValue(slBuffer, 1);
|
||||
|
||||
/** Start the services when finished creating all Characteristics and Descriptors */
|
||||
pDeadService->start();
|
||||
|
||||
#if 0
|
||||
// HR service
|
||||
NimBLEService *pHRService = pServer->createService("180D");
|
||||
HRMeasurement = pHRService->createCharacteristic(
|
||||
"2A37",
|
||||
NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::NOTIFY);
|
||||
|
||||
HRMeasurement->setValue(fBuffer, 2);
|
||||
|
||||
/** Start the services when finished creating all Characteristics and Descriptors */
|
||||
pHRService->start();
|
||||
#endif
|
||||
|
||||
NimBLEAdvertising *pAdvertising = NimBLEDevice::getAdvertising();
|
||||
/** Add the services to the advertisement data **/
|
||||
// pAdvertising->addServiceUUID(pHRService->getUUID());
|
||||
pAdvertising->addServiceUUID(pDeadService->getUUID());
|
||||
pAdvertising->setScanResponse(true);
|
||||
pAdvertising->start();
|
||||
|
||||
Serial.println("Advertising Started");
|
||||
|
||||
Serial.println("Starting Arduino BLE Client application...");
|
||||
BLEDevice::init("");
|
||||
|
||||
// Retrieve a Scanner and set the callback we want to use to be informed when we
|
||||
// have detected a new device. Specify that we want active scanning and start the
|
||||
// scan to run for 5 seconds.
|
||||
BLEScan *pBLEScan = BLEDevice::getScan();
|
||||
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
|
||||
pBLEScan->setInterval(1349);
|
||||
pBLEScan->setWindow(449);
|
||||
pBLEScan->setActiveScan(true);
|
||||
pBLEScan->start(5, false);
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
// If the flag "doConnect" is true then we have scanned for and found the desired
|
||||
// BLE Server with which we wish to connect. Now we connect to it. Once we are
|
||||
// connected we set the connected flag to be true.
|
||||
if (doConnect == true)
|
||||
{
|
||||
if (connectToServer())
|
||||
{
|
||||
Serial.println("We are now connected to the BLE Server.");
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("We have failed to connect to the server; there is nothing more we will do.");
|
||||
}
|
||||
doConnect = false;
|
||||
}
|
||||
// If we are connected to a peer BLE Server, update the characteristic each time we are reached
|
||||
// with the current time since boot.
|
||||
if (connected)
|
||||
{
|
||||
//Stuff to do when connected to Client
|
||||
}
|
||||
else if (doScan)
|
||||
{
|
||||
BLEDevice::getScan()->start(0); // this is just sample to start scan after disconnect, most likely there is better way to do it in arduino
|
||||
}
|
||||
|
||||
// convert RPM to timestamp
|
||||
if (cadenceInstantaneous != 0 && (millis()) >= (lastRevolution + (60000 / cadenceInstantaneous)))
|
||||
{
|
||||
revolutions++; // One crank revolution should have passed, add one revolution
|
||||
timestamp = (unsigned short)(((millis() * 1024) / 1000) % 65536); // create timestamp and format
|
||||
lastRevolution = millis();
|
||||
}
|
||||
|
||||
if (millis() - lastNotify >= 1000) // do this every second
|
||||
{
|
||||
//if (pServer->getConnectedCount() > 0)
|
||||
{
|
||||
bleBuffer[0] = flags & 0xff;
|
||||
bleBuffer[1] = (flags >> 8) & 0xff;
|
||||
bleBuffer[2] = powerInstantaneous & 0xff;
|
||||
bleBuffer[3] = (powerInstantaneous >> 8) & 0xff;
|
||||
bleBuffer[4] = revolutions & 0xff;
|
||||
bleBuffer[5] = (revolutions >> 8) & 0xff;
|
||||
bleBuffer[6] = timestamp & 0xff;
|
||||
bleBuffer[7] = (timestamp >> 8) & 0xff;
|
||||
CyclingPowerMeasurement->setValue(bleBuffer, 8);
|
||||
CyclingPowerMeasurement->notify();
|
||||
|
||||
/*bleBuffer[0] = 0;
|
||||
bleBuffer[1] = powerInstantaneous;
|
||||
|
||||
HRMeasurement->setValue(bleBuffer, 2);
|
||||
HRMeasurement->notify();*/
|
||||
lastNotify = millis();
|
||||
}
|
||||
}
|
||||
/*if (pServer->getConnectedCount() == 0)
|
||||
{
|
||||
powerInstantaneous = 0;
|
||||
}*/
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 46;
|
||||
objectVersion = 52;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXAggregateTarget section */
|
||||
@@ -143,6 +143,9 @@
|
||||
87083D9626678EFA0072410D /* zwiftworkout.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87083D9526678EFA0072410D /* zwiftworkout.cpp */; };
|
||||
87097D2F275EA9A30020EE6F /* sportsplusbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87097D2D275EA9A20020EE6F /* sportsplusbike.cpp */; };
|
||||
87097D31275EA9AF0020EE6F /* moc_sportsplusbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87097D30275EA9AE0020EE6F /* moc_sportsplusbike.cpp */; };
|
||||
8710706C29C48AEA0094D0F3 /* handleurl.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8710706B29C48AEA0094D0F3 /* handleurl.cpp */; };
|
||||
8710706E29C48AF30094D0F3 /* moc_handleurl.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8710706D29C48AF30094D0F3 /* moc_handleurl.cpp */; };
|
||||
8710707329C4A5E70094D0F3 /* GarminConnect.swift in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8710707229C4A5E70094D0F3 /* GarminConnect.swift */; };
|
||||
871189132893C930006A04D1 /* libQt5Multimedia.a in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 871189122893C92F006A04D1 /* libQt5Multimedia.a */; };
|
||||
871189152893CB52006A04D1 /* libdeclarative_multimedia.a in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 871189142893CB51006A04D1 /* libdeclarative_multimedia.a */; };
|
||||
871189172893CC45006A04D1 /* libQt5MultimediaQuick.a in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 871189162893CC44006A04D1 /* libQt5MultimediaQuick.a */; };
|
||||
@@ -171,6 +174,8 @@
|
||||
872A20DC28C5F5CE0037774D /* moc_faketreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 872A20DB28C5F5CE0037774D /* moc_faketreadmill.cpp */; };
|
||||
872BAB4E261750EE006A59AB /* libQt5Charts.a in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 872BAB4D261750EE006A59AB /* libQt5Charts.a */; };
|
||||
872BAB50261751FB006A59AB /* libqtchartsqml2.a in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 872BAB4F261751FB006A59AB /* libqtchartsqml2.a */; };
|
||||
872DCC392A18D4A800EC9F68 /* virtualdevice.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 872DCC382A18D4A800EC9F68 /* virtualdevice.cpp */; };
|
||||
872DCC3B2A18D4C000EC9F68 /* moc_virtualdevice.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 872DCC3A2A18D4C000EC9F68 /* moc_virtualdevice.cpp */; };
|
||||
873063BE259DF20000DA0F44 /* heartratebelt.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 873063BC259DF20000DA0F44 /* heartratebelt.cpp */; };
|
||||
873063C0259DF2C500DA0F44 /* moc_heartratebelt.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 873063BF259DF2C500DA0F44 /* moc_heartratebelt.cpp */; };
|
||||
87310B1E266FBB59008BA0D6 /* smartrowrower.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87310B1B266FBB54008BA0D6 /* smartrowrower.cpp */; };
|
||||
@@ -238,6 +243,8 @@
|
||||
873CD22D27EF8E4B000131BC /* iosinapppurchaseproduct.mm in Compile Sources */ = {isa = PBXBuildFile; fileRef = 873CD22927EF8E4B000131BC /* iosinapppurchaseproduct.mm */; };
|
||||
873CD22F27EF8EC1000131BC /* StoreKit.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 873CD22E27EF8EC1000131BC /* StoreKit.framework */; };
|
||||
873CD23027EF8EF5000131BC /* iosinapppurchasetransaction.mm in Compile Sources */ = {isa = PBXBuildFile; fileRef = 873CD22727EF8E4B000131BC /* iosinapppurchasetransaction.mm */; };
|
||||
873D388B29B0D745006A2611 /* ConnectIQ.xcframework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 873D388A29B0D744006A2611 /* ConnectIQ.xcframework */; };
|
||||
873D388C29B0D745006A2611 /* ConnectIQ.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 873D388A29B0D744006A2611 /* ConnectIQ.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
873F022F274BE471002D0349 /* mcfbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 873F022D274BE471002D0349 /* mcfbike.cpp */; };
|
||||
873F0231274BE47D002D0349 /* moc_mcfbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 873F0230274BE47D002D0349 /* moc_mcfbike.cpp */; };
|
||||
87420DF6269D770F000C5EC6 /* libQt5WebView.a in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 87420DF5269D770F000C5EC6 /* libQt5WebView.a */; };
|
||||
@@ -249,6 +256,8 @@
|
||||
87440FBF2640292900E4DC0B /* moc_fitplusbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87440FBE2640292900E4DC0B /* moc_fitplusbike.cpp */; };
|
||||
87473A9627ECA9EE00C203F5 /* proformrower.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87473A9527ECA9EE00C203F5 /* proformrower.cpp */; };
|
||||
87473A9827ECAA0500C203F5 /* moc_proformrower.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87473A9727ECAA0500C203F5 /* moc_proformrower.cpp */; };
|
||||
874D272029AFA11F0007C079 /* apexbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 874D271E29AFA11F0007C079 /* apexbike.cpp */; };
|
||||
874D272229AFA13B0007C079 /* moc_apexbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 874D272129AFA13B0007C079 /* moc_apexbike.cpp */; };
|
||||
8752B4CD27F43D9200E2EC6C /* qz.storekit in Copy Bundle Resources */ = {isa = PBXBuildFile; fileRef = 8752B4CC27F43D9200E2EC6C /* qz.storekit */; };
|
||||
87540FAD2848FD70005E0D44 /* libqtexttospeech_speechios.a in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 87540FAC2848FD70005E0D44 /* libqtexttospeech_speechios.a */; };
|
||||
8754D24C27F786F0003D7054 /* virtualrower.swift in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8754D24B27F786F0003D7054 /* virtualrower.swift */; };
|
||||
@@ -293,6 +302,8 @@
|
||||
876F9B61275385D8006AE6FA /* moc_fitmetria_fanfit.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 876F9B60275385D8006AE6FA /* moc_fitmetria_fanfit.cpp */; };
|
||||
8772A0E625E43ADB0080718C /* trxappgateusbbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8772A0E525E43ADA0080718C /* trxappgateusbbike.cpp */; };
|
||||
8772A0E825E43AE70080718C /* moc_trxappgateusbbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8772A0E725E43AE70080718C /* moc_trxappgateusbbike.cpp */; };
|
||||
8775008329E876F8008E48B7 /* iconceptelliptical.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8775008129E876F7008E48B7 /* iconceptelliptical.cpp */; };
|
||||
8775008529E87713008E48B7 /* moc_iconceptelliptical.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8775008429E87712008E48B7 /* moc_iconceptelliptical.cpp */; };
|
||||
877A080D2893DC4300C0F0AB /* CoreVideo.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 879F74122893D705009A64C8 /* CoreVideo.framework */; };
|
||||
877A7609269D8E9F0024DD2C /* WebKit.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 877A7608269D8E9F0024DD2C /* WebKit.framework */; };
|
||||
877FBA29276E684500F6C0C9 /* bowflextreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 877FBA27276E684400F6C0C9 /* bowflextreadmill.cpp */; };
|
||||
@@ -313,6 +324,8 @@
|
||||
878A331D25AB50C300BD13E1 /* moc_yesoulbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 878A331B25AB50C200BD13E1 /* moc_yesoulbike.cpp */; };
|
||||
878C9E6928B77E7C00669129 /* nordictrackifitadbbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 878C9E6828B77E7B00669129 /* nordictrackifitadbbike.cpp */; };
|
||||
878C9E6B28B77E9800669129 /* moc_nordictrackifitadbbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 878C9E6A28B77E9800669129 /* moc_nordictrackifitadbbike.cpp */; };
|
||||
878D83742A1F33C600D7F004 /* bkoolbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 878D83732A1F33C600D7F004 /* bkoolbike.cpp */; };
|
||||
878D83762A1F33D900D7F004 /* moc_bkoolbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 878D83752A1F33D900D7F004 /* moc_bkoolbike.cpp */; };
|
||||
87900DC6268B672E000CB351 /* renphobike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87900DC5268B672E000CB351 /* renphobike.cpp */; };
|
||||
87900DC8268B673C000CB351 /* moc_renphobike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87900DC7268B673C000CB351 /* moc_renphobike.cpp */; };
|
||||
8790FDDF277B0ABA00247550 /* nautilustreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8790FDDD277B0ABA00247550 /* nautilustreadmill.cpp */; };
|
||||
@@ -323,6 +336,7 @@
|
||||
87917A7728E768D200F8D9AC /* Client.swift in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87917A7228E768D200F8D9AC /* Client.swift */; };
|
||||
8791A8AA25C8603F003B50B2 /* moc_inspirebike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8791A8A925C8603F003B50B2 /* moc_inspirebike.cpp */; };
|
||||
8791A8AB25C861BD003B50B2 /* inspirebike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8791A8A825C8602A003B50B2 /* inspirebike.cpp */; };
|
||||
87943AB429E0215D007575F2 /* localipaddress.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87943AB229E0215D007575F2 /* localipaddress.cpp */; };
|
||||
87958F1927628D4500124B24 /* elitesterzosmart.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87958F1827628D4500124B24 /* elitesterzosmart.cpp */; };
|
||||
87958F1B27628D5400124B24 /* moc_elitesterzosmart.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87958F1A27628D5400124B24 /* moc_elitesterzosmart.cpp */; };
|
||||
8798C8872733E103003148B3 /* strydrunpowersensor.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8798C8862733E103003148B3 /* strydrunpowersensor.cpp */; };
|
||||
@@ -338,10 +352,14 @@
|
||||
879F740F2893D592009A64C8 /* libqtmedia_audioengine.a in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 879F740E2893D591009A64C8 /* libqtmedia_audioengine.a */; };
|
||||
879F74112893D5B8009A64C8 /* libqavfcamera.a in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 879F74102893D5B7009A64C8 /* libqavfcamera.a */; };
|
||||
879F74152893D732009A64C8 /* CoreMedia.framework in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 879F74142893D732009A64C8 /* CoreMedia.framework */; };
|
||||
87A0771029B641D600A368BF /* wahookickrheadwind.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87A0770F29B641D500A368BF /* wahookickrheadwind.cpp */; };
|
||||
87A0771229B6420200A368BF /* moc_wahookickrheadwind.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87A0771129B6420200A368BF /* moc_wahookickrheadwind.cpp */; };
|
||||
87A0C4BB262329A600121A76 /* npecablebike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87A0C4B7262329A600121A76 /* npecablebike.cpp */; };
|
||||
87A0C4BC262329A600121A76 /* cscbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87A0C4B9262329A600121A76 /* cscbike.cpp */; };
|
||||
87A0C4BF262329B500121A76 /* moc_cscbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87A0C4BD262329B500121A76 /* moc_cscbike.cpp */; };
|
||||
87A0C4C0262329B500121A76 /* moc_npecablebike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87A0C4BE262329B500121A76 /* moc_npecablebike.cpp */; };
|
||||
87A0D7522A3A4518005147F2 /* fakerower.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87A0D7502A3A4517005147F2 /* fakerower.cpp */; };
|
||||
87A0D7542A3A4547005147F2 /* moc_fakerower.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87A0D7532A3A4547005147F2 /* moc_fakerower.cpp */; };
|
||||
87A18F072660D5C1002D7C96 /* ftmsrower.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87A18F052660D5C0002D7C96 /* ftmsrower.cpp */; };
|
||||
87A18F092660D5D9002D7C96 /* moc_ftmsrower.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87A18F082660D5D9002D7C96 /* moc_ftmsrower.cpp */; };
|
||||
87A3BC222656429600D302E3 /* rower.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87A3BC1F2656429400D302E3 /* rower.cpp */; };
|
||||
@@ -352,6 +370,8 @@
|
||||
87ADD2BB27634C1500B7A0AB /* technogymmyruntreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87ADD2B927634C1400B7A0AB /* technogymmyruntreadmill.cpp */; };
|
||||
87ADD2BD27634C2100B7A0AB /* moc_technogymmyruntreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87ADD2BC27634C2100B7A0AB /* moc_technogymmyruntreadmill.cpp */; };
|
||||
87AE0CB227760DCB00E547E9 /* virtualtreadmill_zwift.swift in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87AE0CB127760DCB00E547E9 /* virtualtreadmill_zwift.swift */; };
|
||||
87B187BB29B8C552007EEF9D /* ziprotreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87B187B929B8C552007EEF9D /* ziprotreadmill.cpp */; };
|
||||
87B187BD29B8C577007EEF9D /* moc_ziprotreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87B187BC29B8C577007EEF9D /* moc_ziprotreadmill.cpp */; };
|
||||
87B617EC25F25FED0094A1CB /* screencapture.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87B617E725F25FEC0094A1CB /* screencapture.cpp */; };
|
||||
87B617ED25F25FED0094A1CB /* fitshowtreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87B617EA25F25FED0094A1CB /* fitshowtreadmill.cpp */; };
|
||||
87B617EE25F25FED0094A1CB /* snodebike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87B617EB25F25FED0094A1CB /* snodebike.cpp */; };
|
||||
@@ -360,8 +380,12 @@
|
||||
87B617F425F260150094A1CB /* moc_screencapture.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87B617F125F260150094A1CB /* moc_screencapture.cpp */; };
|
||||
87BB1774269E983200F46A1C /* moc_webserverinfosender.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87BB1773269E983200F46A1C /* moc_webserverinfosender.cpp */; };
|
||||
87BB1776269E987100F46A1C /* libQt5HttpServer.a in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 87BB1775269E987000F46A1C /* libQt5HttpServer.a */; };
|
||||
87BCE6BD29F28F72001F70EB /* ypooelliptical.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87BCE6BC29F28F72001F70EB /* ypooelliptical.cpp */; };
|
||||
87BCE6BF29F28F95001F70EB /* moc_ypooelliptical.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87BCE6BE29F28F94001F70EB /* moc_ypooelliptical.cpp */; };
|
||||
87BE6FDC272D2A3100C35795 /* horizongr7bike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87BE6FDA272D2A3100C35795 /* horizongr7bike.cpp */; };
|
||||
87BE6FDE272D2A3E00C35795 /* moc_horizongr7bike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87BE6FDD272D2A3E00C35795 /* moc_horizongr7bike.cpp */; };
|
||||
87BF116D298E28CA00B5B6E7 /* pelotonbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87BF116C298E28CA00B5B6E7 /* pelotonbike.cpp */; };
|
||||
87BF116F298E28EC00B5B6E7 /* moc_pelotonbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87BF116E298E28EC00B5B6E7 /* moc_pelotonbike.cpp */; };
|
||||
87C481FA26DFA7C3006211AD /* eliterizer.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87C481F926DFA7C3006211AD /* eliterizer.cpp */; };
|
||||
87C481FC26DFA7D1006211AD /* moc_eliterizer.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87C481FB26DFA7D1006211AD /* moc_eliterizer.cpp */; };
|
||||
87C5F0B526285E5F0067A1B5 /* mimemessage.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87C5F09726285E5A0067A1B5 /* mimemessage.cpp */; };
|
||||
@@ -405,6 +429,7 @@
|
||||
87D269A325F535340076AA48 /* moc_skandikawiribike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87D269A125F535300076AA48 /* moc_skandikawiribike.cpp */; };
|
||||
87D269A425F535340076AA48 /* moc_m3ibike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87D269A225F535300076AA48 /* moc_m3ibike.cpp */; };
|
||||
87D44181269DE979003263D5 /* webserverinfosender.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87D44180269DE979003263D5 /* webserverinfosender.cpp */; };
|
||||
87D4693629B64D8100C9A382 /* ios_app_delegate.mm in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87D4693529B64D8100C9A382 /* ios_app_delegate.mm */; };
|
||||
87D5DC402823047D008CCDE7 /* truetreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87D5DC3E2823047D008CCDE7 /* truetreadmill.cpp */; };
|
||||
87D5DC4228230496008CCDE7 /* moc_truetreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87D5DC4128230496008CCDE7 /* moc_truetreadmill.cpp */; };
|
||||
87D91F9A2800B9970026D43C /* proformwifibike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87D91F992800B9970026D43C /* proformwifibike.cpp */; };
|
||||
@@ -449,6 +474,8 @@
|
||||
87F02E4029178524000DB52C /* octaneelliptical.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87F02E3E29178523000DB52C /* octaneelliptical.cpp */; };
|
||||
87F02E4229178545000DB52C /* moc_octaneelliptical.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87F02E4129178545000DB52C /* moc_octaneelliptical.cpp */; };
|
||||
87F1179E26A5FBDE00541B3A /* libqtwebview_darwin.a in Link Binary With Libraries */ = {isa = PBXBuildFile; fileRef = 87420DF7269D7CE1000C5EC6 /* libqtwebview_darwin.a */; };
|
||||
87F4FB5A29D550C00061BB4A /* schwinn170bike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87F4FB5829D550BF0061BB4A /* schwinn170bike.cpp */; };
|
||||
87F4FB5C29D550E00061BB4A /* moc_schwinn170bike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87F4FB5B29D550DF0061BB4A /* moc_schwinn170bike.cpp */; };
|
||||
87F527BE28EEB5AA00A9F8D5 /* qzsettings.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87F527BC28EEB5AA00A9F8D5 /* qzsettings.cpp */; };
|
||||
87F93427278E0EC00088B596 /* domyosrower.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87F93426278E0EC00088B596 /* domyosrower.cpp */; };
|
||||
87F93429278E0ECF0088B596 /* moc_domyosrower.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87F93428278E0ECF0088B596 /* moc_domyosrower.cpp */; };
|
||||
@@ -578,6 +605,7 @@
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 10;
|
||||
files = (
|
||||
873D388C29B0D745006A2611 /* ConnectIQ.xcframework in Embed Frameworks */,
|
||||
);
|
||||
name = "Embed Frameworks";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@@ -814,6 +842,10 @@
|
||||
87097D2D275EA9A20020EE6F /* sportsplusbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sportsplusbike.cpp; path = ../src/sportsplusbike.cpp; sourceTree = "<group>"; };
|
||||
87097D2E275EA9A20020EE6F /* sportsplusbike.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sportsplusbike.h; path = ../src/sportsplusbike.h; sourceTree = "<group>"; };
|
||||
87097D30275EA9AE0020EE6F /* moc_sportsplusbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_sportsplusbike.cpp; sourceTree = "<group>"; };
|
||||
8710706A29C48AE90094D0F3 /* handleurl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = handleurl.h; path = ../src/handleurl.h; sourceTree = "<group>"; };
|
||||
8710706B29C48AEA0094D0F3 /* handleurl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = handleurl.cpp; path = ../src/handleurl.cpp; sourceTree = "<group>"; };
|
||||
8710706D29C48AF30094D0F3 /* moc_handleurl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_handleurl.cpp; sourceTree = "<group>"; };
|
||||
8710707229C4A5E70094D0F3 /* GarminConnect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = GarminConnect.swift; path = ../src/ios/GarminConnect.swift; sourceTree = "<group>"; };
|
||||
871189122893C92F006A04D1 /* libQt5Multimedia.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQt5Multimedia.a; path = ../../Qt/5.15.2/ios/lib/libQt5Multimedia.a; sourceTree = "<group>"; };
|
||||
871189142893CB51006A04D1 /* libdeclarative_multimedia.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libdeclarative_multimedia.a; path = ../../Qt/5.15.2/ios/qml/QtMultimedia/libdeclarative_multimedia.a; sourceTree = "<group>"; };
|
||||
871189162893CC44006A04D1 /* libQt5MultimediaQuick.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQt5MultimediaQuick.a; path = ../../Qt/5.15.2/ios/lib/libQt5MultimediaQuick.a; sourceTree = "<group>"; };
|
||||
@@ -854,6 +886,9 @@
|
||||
872A20DB28C5F5CE0037774D /* moc_faketreadmill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_faketreadmill.cpp; sourceTree = "<group>"; };
|
||||
872BAB4D261750EE006A59AB /* libQt5Charts.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQt5Charts.a; path = ../../Qt/5.15.2/ios/lib/libQt5Charts.a; sourceTree = "<group>"; };
|
||||
872BAB4F261751FB006A59AB /* libqtchartsqml2.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libqtchartsqml2.a; path = ../../Qt/5.15.2/ios/qml/QtCharts/libqtchartsqml2.a; sourceTree = "<group>"; };
|
||||
872DCC372A18D4A800EC9F68 /* virtualdevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = virtualdevice.h; path = ../src/virtualdevice.h; sourceTree = "<group>"; };
|
||||
872DCC382A18D4A800EC9F68 /* virtualdevice.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = virtualdevice.cpp; path = ../src/virtualdevice.cpp; sourceTree = "<group>"; };
|
||||
872DCC3A2A18D4C000EC9F68 /* moc_virtualdevice.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_virtualdevice.cpp; sourceTree = "<group>"; };
|
||||
873063BC259DF20000DA0F44 /* heartratebelt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = heartratebelt.cpp; path = ../src/heartratebelt.cpp; sourceTree = "<group>"; };
|
||||
873063BD259DF20000DA0F44 /* heartratebelt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = heartratebelt.h; path = ../src/heartratebelt.h; sourceTree = "<group>"; };
|
||||
873063BF259DF2C500DA0F44 /* moc_heartratebelt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_heartratebelt.cpp; sourceTree = "<group>"; };
|
||||
@@ -956,6 +991,7 @@
|
||||
873CD22927EF8E4B000131BC /* iosinapppurchaseproduct.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = iosinapppurchaseproduct.mm; path = ../src/purchasing/ios/iosinapppurchaseproduct.mm; sourceTree = "<group>"; };
|
||||
873CD22A27EF8E4B000131BC /* iosinapppurchasetransaction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iosinapppurchasetransaction.h; path = ../src/purchasing/ios/iosinapppurchasetransaction.h; sourceTree = "<group>"; };
|
||||
873CD22E27EF8EC1000131BC /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; };
|
||||
873D388A29B0D744006A2611 /* ConnectIQ.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ConnectIQ.xcframework; path = ../src/ConnectIQ/iOS/ConnectIQ.xcframework; sourceTree = "<group>"; };
|
||||
873F022D274BE471002D0349 /* mcfbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mcfbike.cpp; path = ../src/mcfbike.cpp; sourceTree = "<group>"; };
|
||||
873F022E274BE471002D0349 /* mcfbike.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mcfbike.h; path = ../src/mcfbike.h; sourceTree = "<group>"; };
|
||||
873F0230274BE47D002D0349 /* moc_mcfbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_mcfbike.cpp; sourceTree = "<group>"; };
|
||||
@@ -973,6 +1009,9 @@
|
||||
87473A9427ECA9EE00C203F5 /* proformrower.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = proformrower.h; path = ../src/proformrower.h; sourceTree = "<group>"; };
|
||||
87473A9527ECA9EE00C203F5 /* proformrower.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = proformrower.cpp; path = ../src/proformrower.cpp; sourceTree = "<group>"; };
|
||||
87473A9727ECAA0500C203F5 /* moc_proformrower.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_proformrower.cpp; sourceTree = "<group>"; };
|
||||
874D271E29AFA11F0007C079 /* apexbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = apexbike.cpp; path = ../src/apexbike.cpp; sourceTree = "<group>"; };
|
||||
874D271F29AFA11F0007C079 /* apexbike.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = apexbike.h; path = ../src/apexbike.h; sourceTree = "<group>"; };
|
||||
874D272129AFA13B0007C079 /* moc_apexbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_apexbike.cpp; sourceTree = "<group>"; };
|
||||
8752B4CC27F43D9200E2EC6C /* qz.storekit */ = {isa = PBXFileReference; lastKnownFileType = text; path = qz.storekit; sourceTree = "<group>"; };
|
||||
87540FAC2848FD70005E0D44 /* libqtexttospeech_speechios.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libqtexttospeech_speechios.a; path = ../../Qt/5.15.2/ios/plugins/texttospeech/libqtexttospeech_speechios.a; sourceTree = "<group>"; };
|
||||
8754D24B27F786F0003D7054 /* virtualrower.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = virtualrower.swift; path = ../src/ios/virtualrower.swift; sourceTree = "<group>"; };
|
||||
@@ -1043,6 +1082,9 @@
|
||||
8772A0E425E43AD90080718C /* trxappgateusbbike.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = trxappgateusbbike.h; path = ../src/trxappgateusbbike.h; sourceTree = "<group>"; };
|
||||
8772A0E525E43ADA0080718C /* trxappgateusbbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = trxappgateusbbike.cpp; path = ../src/trxappgateusbbike.cpp; sourceTree = "<group>"; };
|
||||
8772A0E725E43AE70080718C /* moc_trxappgateusbbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_trxappgateusbbike.cpp; sourceTree = "<group>"; };
|
||||
8775008129E876F7008E48B7 /* iconceptelliptical.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = iconceptelliptical.cpp; path = ../src/iconceptelliptical.cpp; sourceTree = "<group>"; };
|
||||
8775008229E876F7008E48B7 /* iconceptelliptical.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iconceptelliptical.h; path = ../src/iconceptelliptical.h; sourceTree = "<group>"; };
|
||||
8775008429E87712008E48B7 /* moc_iconceptelliptical.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_iconceptelliptical.cpp; sourceTree = "<group>"; };
|
||||
877A7606269D8E0F0024DD2C /* libqtwebview_darwin_debug.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libqtwebview_darwin_debug.a; path = ../../Qt/5.15.2/ios/plugins/webview/libqtwebview_darwin_debug.a; sourceTree = "<group>"; };
|
||||
877A7608269D8E9F0024DD2C /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
|
||||
877FBA27276E684400F6C0C9 /* bowflextreadmill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bowflextreadmill.cpp; path = ../src/bowflextreadmill.cpp; sourceTree = "<group>"; };
|
||||
@@ -1073,6 +1115,9 @@
|
||||
878C9E6728B77E7B00669129 /* nordictrackifitadbbike.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = nordictrackifitadbbike.h; path = ../src/nordictrackifitadbbike.h; sourceTree = "<group>"; };
|
||||
878C9E6828B77E7B00669129 /* nordictrackifitadbbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = nordictrackifitadbbike.cpp; path = ../src/nordictrackifitadbbike.cpp; sourceTree = "<group>"; };
|
||||
878C9E6A28B77E9800669129 /* moc_nordictrackifitadbbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_nordictrackifitadbbike.cpp; sourceTree = "<group>"; };
|
||||
878D83722A1F33C600D7F004 /* bkoolbike.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bkoolbike.h; path = ../src/bkoolbike.h; sourceTree = "<group>"; };
|
||||
878D83732A1F33C600D7F004 /* bkoolbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bkoolbike.cpp; path = ../src/bkoolbike.cpp; sourceTree = "<group>"; };
|
||||
878D83752A1F33D900D7F004 /* moc_bkoolbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_bkoolbike.cpp; sourceTree = "<group>"; };
|
||||
87900DC4268B672E000CB351 /* renphobike.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = renphobike.h; path = ../src/renphobike.h; sourceTree = "<group>"; };
|
||||
87900DC5268B672E000CB351 /* renphobike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = renphobike.cpp; path = ../src/renphobike.cpp; sourceTree = "<group>"; };
|
||||
87900DC7268B673C000CB351 /* moc_renphobike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_renphobike.cpp; sourceTree = "<group>"; };
|
||||
@@ -1086,6 +1131,8 @@
|
||||
8791A8A725C8602A003B50B2 /* inspirebike.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = inspirebike.h; path = ../src/inspirebike.h; sourceTree = "<group>"; };
|
||||
8791A8A825C8602A003B50B2 /* inspirebike.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = inspirebike.cpp; path = ../src/inspirebike.cpp; sourceTree = "<group>"; };
|
||||
8791A8A925C8603F003B50B2 /* moc_inspirebike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_inspirebike.cpp; sourceTree = "<group>"; };
|
||||
87943AB229E0215D007575F2 /* localipaddress.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = localipaddress.cpp; path = ../src/localipaddress.cpp; sourceTree = "<group>"; };
|
||||
87943AB329E0215D007575F2 /* localipaddress.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = localipaddress.h; path = ../src/localipaddress.h; sourceTree = "<group>"; };
|
||||
87958F1727628D4500124B24 /* elitesterzosmart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = elitesterzosmart.h; path = ../src/elitesterzosmart.h; sourceTree = "<group>"; };
|
||||
87958F1827628D4500124B24 /* elitesterzosmart.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = elitesterzosmart.cpp; path = ../src/elitesterzosmart.cpp; sourceTree = "<group>"; };
|
||||
87958F1A27628D5400124B24 /* moc_elitesterzosmart.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_elitesterzosmart.cpp; sourceTree = "<group>"; };
|
||||
@@ -1106,12 +1153,18 @@
|
||||
879F74102893D5B7009A64C8 /* libqavfcamera.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libqavfcamera.a; path = ../../Qt/5.15.2/ios/plugins/mediaservice/libqavfcamera.a; sourceTree = "<group>"; };
|
||||
879F74122893D705009A64C8 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; };
|
||||
879F74142893D732009A64C8 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
|
||||
87A0770E29B641D500A368BF /* wahookickrheadwind.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wahookickrheadwind.h; path = ../src/wahookickrheadwind.h; sourceTree = "<group>"; };
|
||||
87A0770F29B641D500A368BF /* wahookickrheadwind.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = wahookickrheadwind.cpp; path = ../src/wahookickrheadwind.cpp; sourceTree = "<group>"; };
|
||||
87A0771129B6420200A368BF /* moc_wahookickrheadwind.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_wahookickrheadwind.cpp; sourceTree = "<group>"; };
|
||||
87A0C4B7262329A600121A76 /* npecablebike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = npecablebike.cpp; path = ../src/npecablebike.cpp; sourceTree = "<group>"; };
|
||||
87A0C4B8262329A600121A76 /* cscbike.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cscbike.h; path = ../src/cscbike.h; sourceTree = "<group>"; };
|
||||
87A0C4B9262329A600121A76 /* cscbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cscbike.cpp; path = ../src/cscbike.cpp; sourceTree = "<group>"; };
|
||||
87A0C4BA262329A600121A76 /* npecablebike.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = npecablebike.h; path = ../src/npecablebike.h; sourceTree = "<group>"; };
|
||||
87A0C4BD262329B500121A76 /* moc_cscbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_cscbike.cpp; sourceTree = "<group>"; };
|
||||
87A0C4BE262329B500121A76 /* moc_npecablebike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_npecablebike.cpp; sourceTree = "<group>"; };
|
||||
87A0D7502A3A4517005147F2 /* fakerower.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fakerower.cpp; path = ../src/fakerower.cpp; sourceTree = "<group>"; };
|
||||
87A0D7512A3A4517005147F2 /* fakerower.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fakerower.h; path = ../src/fakerower.h; sourceTree = "<group>"; };
|
||||
87A0D7532A3A4547005147F2 /* moc_fakerower.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_fakerower.cpp; sourceTree = "<group>"; };
|
||||
87A18F052660D5C0002D7C96 /* ftmsrower.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ftmsrower.cpp; path = ../src/ftmsrower.cpp; sourceTree = "<group>"; };
|
||||
87A18F062660D5C1002D7C96 /* ftmsrower.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ftmsrower.h; path = ../src/ftmsrower.h; sourceTree = "<group>"; };
|
||||
87A18F082660D5D9002D7C96 /* moc_ftmsrower.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_ftmsrower.cpp; sourceTree = "<group>"; };
|
||||
@@ -1130,6 +1183,9 @@
|
||||
87ADD2BA27634C1400B7A0AB /* technogymmyruntreadmill.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = technogymmyruntreadmill.h; path = ../src/technogymmyruntreadmill.h; sourceTree = "<group>"; };
|
||||
87ADD2BC27634C2100B7A0AB /* moc_technogymmyruntreadmill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_technogymmyruntreadmill.cpp; sourceTree = "<group>"; };
|
||||
87AE0CB127760DCB00E547E9 /* virtualtreadmill_zwift.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = virtualtreadmill_zwift.swift; path = ../src/ios/virtualtreadmill_zwift.swift; sourceTree = "<group>"; };
|
||||
87B187B929B8C552007EEF9D /* ziprotreadmill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ziprotreadmill.cpp; path = ../src/ziprotreadmill.cpp; sourceTree = "<group>"; };
|
||||
87B187BA29B8C552007EEF9D /* ziprotreadmill.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ziprotreadmill.h; path = ../src/ziprotreadmill.h; sourceTree = "<group>"; };
|
||||
87B187BC29B8C577007EEF9D /* moc_ziprotreadmill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_ziprotreadmill.cpp; sourceTree = "<group>"; };
|
||||
87B617E625F25FEC0094A1CB /* fitshowtreadmill.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fitshowtreadmill.h; path = ../src/fitshowtreadmill.h; sourceTree = "<group>"; };
|
||||
87B617E725F25FEC0094A1CB /* screencapture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = screencapture.cpp; path = ../src/screencapture.cpp; sourceTree = "<group>"; };
|
||||
87B617E825F25FEC0094A1CB /* screencapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = screencapture.h; path = ../src/screencapture.h; sourceTree = "<group>"; };
|
||||
@@ -1141,9 +1197,15 @@
|
||||
87B617F125F260150094A1CB /* moc_screencapture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_screencapture.cpp; sourceTree = "<group>"; };
|
||||
87BB1773269E983200F46A1C /* moc_webserverinfosender.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_webserverinfosender.cpp; sourceTree = "<group>"; };
|
||||
87BB1775269E987000F46A1C /* libQt5HttpServer.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libQt5HttpServer.a; path = ../../Qt/5.15.2/ios/lib/libQt5HttpServer.a; sourceTree = "<group>"; };
|
||||
87BCE6BB29F28F72001F70EB /* ypooelliptical.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ypooelliptical.h; path = ../src/ypooelliptical.h; sourceTree = "<group>"; };
|
||||
87BCE6BC29F28F72001F70EB /* ypooelliptical.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ypooelliptical.cpp; path = ../src/ypooelliptical.cpp; sourceTree = "<group>"; };
|
||||
87BCE6BE29F28F94001F70EB /* moc_ypooelliptical.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_ypooelliptical.cpp; sourceTree = "<group>"; };
|
||||
87BE6FDA272D2A3100C35795 /* horizongr7bike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = horizongr7bike.cpp; path = ../src/horizongr7bike.cpp; sourceTree = "<group>"; };
|
||||
87BE6FDB272D2A3100C35795 /* horizongr7bike.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = horizongr7bike.h; path = ../src/horizongr7bike.h; sourceTree = "<group>"; };
|
||||
87BE6FDD272D2A3E00C35795 /* moc_horizongr7bike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_horizongr7bike.cpp; sourceTree = "<group>"; };
|
||||
87BF116B298E28CA00B5B6E7 /* pelotonbike.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pelotonbike.h; path = ../src/pelotonbike.h; sourceTree = "<group>"; };
|
||||
87BF116C298E28CA00B5B6E7 /* pelotonbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pelotonbike.cpp; path = ../src/pelotonbike.cpp; sourceTree = "<group>"; };
|
||||
87BF116E298E28EC00B5B6E7 /* moc_pelotonbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_pelotonbike.cpp; sourceTree = "<group>"; };
|
||||
87C481F826DFA7C3006211AD /* eliterizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eliterizer.h; path = ../src/eliterizer.h; sourceTree = "<group>"; };
|
||||
87C481F926DFA7C3006211AD /* eliterizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = eliterizer.cpp; path = ../src/eliterizer.cpp; sourceTree = "<group>"; };
|
||||
87C481FB26DFA7D1006211AD /* moc_eliterizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_eliterizer.cpp; sourceTree = "<group>"; };
|
||||
@@ -1210,6 +1272,7 @@
|
||||
87D269A125F535300076AA48 /* moc_skandikawiribike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_skandikawiribike.cpp; sourceTree = "<group>"; };
|
||||
87D269A225F535300076AA48 /* moc_m3ibike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_m3ibike.cpp; sourceTree = "<group>"; };
|
||||
87D44180269DE979003263D5 /* webserverinfosender.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = webserverinfosender.cpp; path = ../src/webserverinfosender.cpp; sourceTree = "<group>"; };
|
||||
87D4693529B64D8100C9A382 /* ios_app_delegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ios_app_delegate.mm; path = ../src/ios/ios_app_delegate.mm; sourceTree = "<group>"; };
|
||||
87D5DC3E2823047D008CCDE7 /* truetreadmill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = truetreadmill.cpp; path = ../src/truetreadmill.cpp; sourceTree = "<group>"; };
|
||||
87D5DC3F2823047D008CCDE7 /* truetreadmill.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = truetreadmill.h; path = ../src/truetreadmill.h; sourceTree = "<group>"; };
|
||||
87D5DC4128230496008CCDE7 /* moc_truetreadmill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_truetreadmill.cpp; sourceTree = "<group>"; };
|
||||
@@ -1273,6 +1336,9 @@
|
||||
87F02E3E29178523000DB52C /* octaneelliptical.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = octaneelliptical.cpp; path = ../src/octaneelliptical.cpp; sourceTree = "<group>"; };
|
||||
87F02E3F29178524000DB52C /* octaneelliptical.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = octaneelliptical.h; path = ../src/octaneelliptical.h; sourceTree = "<group>"; };
|
||||
87F02E4129178545000DB52C /* moc_octaneelliptical.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_octaneelliptical.cpp; sourceTree = "<group>"; };
|
||||
87F4FB5829D550BF0061BB4A /* schwinn170bike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = schwinn170bike.cpp; path = ../src/schwinn170bike.cpp; sourceTree = "<group>"; };
|
||||
87F4FB5929D550BF0061BB4A /* schwinn170bike.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = schwinn170bike.h; path = ../src/schwinn170bike.h; sourceTree = "<group>"; };
|
||||
87F4FB5B29D550DF0061BB4A /* moc_schwinn170bike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_schwinn170bike.cpp; sourceTree = "<group>"; };
|
||||
87F527BC28EEB5AA00A9F8D5 /* qzsettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = qzsettings.cpp; path = ../src/qzsettings.cpp; sourceTree = "<group>"; };
|
||||
87F527BD28EEB5AA00A9F8D5 /* qzsettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = qzsettings.h; path = ../src/qzsettings.h; sourceTree = "<group>"; };
|
||||
87F93425278E0EC00088B596 /* domyosrower.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = domyosrower.h; path = ../src/domyosrower.h; sourceTree = "<group>"; };
|
||||
@@ -1582,6 +1648,7 @@
|
||||
023642106C14651D2E1F4D5D /* dialogplugin in Link Binary With Libraries */,
|
||||
133CA0345CD2BFB03079A655 /* qmlfolderlistmodelplugin in Link Binary With Libraries */,
|
||||
4AAA7380490CBDBAA8587CFA /* qmlsettingsplugin in Link Binary With Libraries */,
|
||||
873D388B29B0D745006A2611 /* ConnectIQ.xcframework in Link Binary With Libraries */,
|
||||
3BD5A5F95DF5239184791B58 /* dialogsprivateplugin in Link Binary With Libraries */,
|
||||
EF98F8C34BE322582E9B73D7 /* qtquickcontrolsplugin in Link Binary With Libraries */,
|
||||
7C8D236C48F2964061C3457C /* widgetsplugin in Link Binary With Libraries */,
|
||||
@@ -1654,6 +1721,17 @@
|
||||
25B08E2869634E9BCBA333A2 /* Generated Sources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
87A0D7532A3A4547005147F2 /* moc_fakerower.cpp */,
|
||||
878D83752A1F33D900D7F004 /* moc_bkoolbike.cpp */,
|
||||
872DCC3A2A18D4C000EC9F68 /* moc_virtualdevice.cpp */,
|
||||
87BCE6BE29F28F94001F70EB /* moc_ypooelliptical.cpp */,
|
||||
8775008429E87712008E48B7 /* moc_iconceptelliptical.cpp */,
|
||||
8710706D29C48AF30094D0F3 /* moc_handleurl.cpp */,
|
||||
87F4FB5B29D550DF0061BB4A /* moc_schwinn170bike.cpp */,
|
||||
87B187BC29B8C577007EEF9D /* moc_ziprotreadmill.cpp */,
|
||||
87A0771129B6420200A368BF /* moc_wahookickrheadwind.cpp */,
|
||||
874D272129AFA13B0007C079 /* moc_apexbike.cpp */,
|
||||
87BF116E298E28EC00B5B6E7 /* moc_pelotonbike.cpp */,
|
||||
87CF516A293C87AF00A7CABC /* moc_characteristicwriteprocessore005.cpp */,
|
||||
87E2F85E291ED315002BDC65 /* moc_lifefitnesstreadmill.cpp */,
|
||||
87F02E4129178545000DB52C /* moc_octaneelliptical.cpp */,
|
||||
@@ -1811,6 +1889,31 @@
|
||||
2EB56BE3C2D93CDAB0C52E67 /* Sources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
87A0D7502A3A4517005147F2 /* fakerower.cpp */,
|
||||
87A0D7512A3A4517005147F2 /* fakerower.h */,
|
||||
878D83732A1F33C600D7F004 /* bkoolbike.cpp */,
|
||||
878D83722A1F33C600D7F004 /* bkoolbike.h */,
|
||||
872DCC382A18D4A800EC9F68 /* virtualdevice.cpp */,
|
||||
872DCC372A18D4A800EC9F68 /* virtualdevice.h */,
|
||||
87BCE6BC29F28F72001F70EB /* ypooelliptical.cpp */,
|
||||
87BCE6BB29F28F72001F70EB /* ypooelliptical.h */,
|
||||
8775008129E876F7008E48B7 /* iconceptelliptical.cpp */,
|
||||
8775008229E876F7008E48B7 /* iconceptelliptical.h */,
|
||||
87943AB229E0215D007575F2 /* localipaddress.cpp */,
|
||||
87943AB329E0215D007575F2 /* localipaddress.h */,
|
||||
8710706B29C48AEA0094D0F3 /* handleurl.cpp */,
|
||||
8710706A29C48AE90094D0F3 /* handleurl.h */,
|
||||
87D4693529B64D8100C9A382 /* ios_app_delegate.mm */,
|
||||
87F4FB5829D550BF0061BB4A /* schwinn170bike.cpp */,
|
||||
87F4FB5929D550BF0061BB4A /* schwinn170bike.h */,
|
||||
87B187B929B8C552007EEF9D /* ziprotreadmill.cpp */,
|
||||
87B187BA29B8C552007EEF9D /* ziprotreadmill.h */,
|
||||
87A0770F29B641D500A368BF /* wahookickrheadwind.cpp */,
|
||||
87A0770E29B641D500A368BF /* wahookickrheadwind.h */,
|
||||
874D271E29AFA11F0007C079 /* apexbike.cpp */,
|
||||
874D271F29AFA11F0007C079 /* apexbike.h */,
|
||||
87BF116C298E28CA00B5B6E7 /* pelotonbike.cpp */,
|
||||
87BF116B298E28CA00B5B6E7 /* pelotonbike.h */,
|
||||
8767EF1D29448D6700810C0F /* characteristicwriteprocessor.cpp */,
|
||||
87CF5167293C879700A7CABC /* characteristicwriteprocessore005.cpp */,
|
||||
87CF5168293C879700A7CABC /* characteristicwriteprocessore005.h */,
|
||||
@@ -2142,6 +2245,7 @@
|
||||
68418A2D51B69FC30BF5A41C /* virtualbike.h */,
|
||||
35E903698E72424585D33829 /* virtualtreadmill.h */,
|
||||
C8CE72E7B224D8B886614E3F /* domyosbike.h */,
|
||||
8710707229C4A5E70094D0F3 /* GarminConnect.swift */,
|
||||
);
|
||||
name = Sources;
|
||||
sourceTree = "<group>";
|
||||
@@ -2234,6 +2338,7 @@
|
||||
AF39DD055C3EF8226FBE929D /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
873D388A29B0D744006A2611 /* ConnectIQ.xcframework */,
|
||||
879F74142893D732009A64C8 /* CoreMedia.framework */,
|
||||
879F74122893D705009A64C8 /* CoreVideo.framework */,
|
||||
879F74102893D5B7009A64C8 /* libqavfcamera.a */,
|
||||
@@ -2844,6 +2949,7 @@
|
||||
87D269A425F535340076AA48 /* moc_m3ibike.cpp in Compile Sources */,
|
||||
EA780CE97E201242E33E6EEE /* bike.cpp in Compile Sources */,
|
||||
8738249827E646E3004F1B46 /* dirconmanager.cpp in Compile Sources */,
|
||||
87D4693629B64D8100C9A382 /* ios_app_delegate.mm in Compile Sources */,
|
||||
87C5F0D926285E7E0067A1B5 /* moc_mimeattachment.cpp in Compile Sources */,
|
||||
87B617F225F260150094A1CB /* moc_fitshowtreadmill.cpp in Compile Sources */,
|
||||
87473A9627ECA9EE00C203F5 /* proformrower.cpp in Compile Sources */,
|
||||
@@ -2865,6 +2971,7 @@
|
||||
87FFA13927BBE40A00924E4E /* moc_solebike.cpp in Compile Sources */,
|
||||
F1F4043967BC815770C8BEEA /* domyostreadmill.cpp in Compile Sources */,
|
||||
87C5F0BF26285E5F0067A1B5 /* smtpclient.cpp in Compile Sources */,
|
||||
87BF116F298E28EC00B5B6E7 /* moc_pelotonbike.cpp in Compile Sources */,
|
||||
873CD20827EF8D8A000131BC /* inappstore.cpp in Compile Sources */,
|
||||
87FA11AB27C5ECD1008AC5D1 /* ultrasportbike.cpp in Compile Sources */,
|
||||
87C5F0D826285E7E0067A1B5 /* moc_quotedprintable.cpp in Compile Sources */,
|
||||
@@ -2897,12 +3004,14 @@
|
||||
873063C0259DF2C500DA0F44 /* moc_heartratebelt.cpp in Compile Sources */,
|
||||
DD5ED224478CB82859C61B9F /* fit_buffered_record_mesg_broadcaster.cpp in Compile Sources */,
|
||||
87368825259C602800C71C7E /* watchAppStart.swift in Compile Sources */,
|
||||
87BCE6BF29F28F95001F70EB /* moc_ypooelliptical.cpp in Compile Sources */,
|
||||
876ED21925C3E9000065F3DC /* moc_ftmsbike.cpp in Compile Sources */,
|
||||
87C5F0BD26285E5F0067A1B5 /* chronobike.cpp in Compile Sources */,
|
||||
872A20DA28C5EC380037774D /* faketreadmill.cpp in Compile Sources */,
|
||||
87900DC8268B673C000CB351 /* moc_renphobike.cpp in Compile Sources */,
|
||||
87CC3B9E25A08812001EC5A8 /* moc_elliptical.cpp in Compile Sources */,
|
||||
876BFC9C27BE35C5001D7645 /* proformelliptical.cpp in Compile Sources */,
|
||||
878D83762A1F33D900D7F004 /* moc_bkoolbike.cpp in Compile Sources */,
|
||||
E7F190E59DC975BA4CA65F0C /* fit_crc.cpp in Compile Sources */,
|
||||
87A18F092660D5D9002D7C96 /* moc_ftmsrower.cpp in Compile Sources */,
|
||||
DA1DC0B761BD7A3004BCF43D /* fit_date_time.cpp in Compile Sources */,
|
||||
@@ -2930,8 +3039,12 @@
|
||||
87646C2227B5065100F82131 /* moc_bhfitnesselliptical.cpp in Compile Sources */,
|
||||
873824B127E64706004F1B46 /* moc_browser_p.cpp in Compile Sources */,
|
||||
873824B627E64707004F1B46 /* moc_hostname_p.cpp in Compile Sources */,
|
||||
87A0D7542A3A4547005147F2 /* moc_fakerower.cpp in Compile Sources */,
|
||||
873824EA27E647A8004F1B46 /* browser.cpp in Compile Sources */,
|
||||
87E34C2B2886F95400CEDE4B /* octanetreadmill.cpp in Compile Sources */,
|
||||
87A0D7522A3A4518005147F2 /* fakerower.cpp in Compile Sources */,
|
||||
87B187BB29B8C552007EEF9D /* ziprotreadmill.cpp in Compile Sources */,
|
||||
87BF116D298E28CA00B5B6E7 /* pelotonbike.cpp in Compile Sources */,
|
||||
87DAE16A26E9FF5000B0527E /* moc_kingsmithr2treadmill.cpp in Compile Sources */,
|
||||
87D91F9C2800B9B90026D43C /* moc_proformwifibike.cpp in Compile Sources */,
|
||||
87C5F0D226285E7E0067A1B5 /* moc_mimemultipart.cpp in Compile Sources */,
|
||||
@@ -2959,6 +3072,7 @@
|
||||
876ED21625C3E8DE0065F3DC /* schwinnic4bike.cpp in Compile Sources */,
|
||||
879E5AAA289C05A500FEA38A /* moc_proformwifitreadmill.cpp in Compile Sources */,
|
||||
87D269A325F535340076AA48 /* moc_skandikawiribike.cpp in Compile Sources */,
|
||||
87F4FB5C29D550E00061BB4A /* moc_schwinn170bike.cpp in Compile Sources */,
|
||||
87C5F0C226285E5F0067A1B5 /* emailaddress.cpp in Compile Sources */,
|
||||
873824AF27E64706004F1B46 /* moc_characteristicwriteprocessor2ad9.cpp in Compile Sources */,
|
||||
25F2400F80DAFBD41FE5CC75 /* fit_field.cpp in Compile Sources */,
|
||||
@@ -2985,12 +3099,14 @@
|
||||
FE77C778768741F1A161682E /* fit_mesg_definition.cpp in Compile Sources */,
|
||||
875F69B926342E8D0009FD78 /* spirittreadmill.cpp in Compile Sources */,
|
||||
87DF68B825E2673B00FCDA46 /* eslinkertreadmill.cpp in Compile Sources */,
|
||||
87BCE6BD29F28F72001F70EB /* ypooelliptical.cpp in Compile Sources */,
|
||||
87C7074327E4CF5900E79C46 /* keepbike.cpp in Compile Sources */,
|
||||
878C9E6928B77E7C00669129 /* nordictrackifitadbbike.cpp in Compile Sources */,
|
||||
8798C8892733E10E003148B3 /* moc_strydrunpowersensor.cpp in Compile Sources */,
|
||||
8781907E2615089D0085E656 /* peloton.cpp in Compile Sources */,
|
||||
2B800DC34C91D8B080DEFBE8 /* fit_mesg_with_event_broadcaster.cpp in Compile Sources */,
|
||||
6DC5D7C695B8763F9E2E029F /* fit_profile.cpp in Compile Sources */,
|
||||
8710706C29C48AEA0094D0F3 /* handleurl.cpp in Compile Sources */,
|
||||
87C5F0B726285E5F0067A1B5 /* mimecontentformatter.cpp in Compile Sources */,
|
||||
23191C28CB29474279752FD3 /* fit_protocol_validator.cpp in Compile Sources */,
|
||||
275D55B5D956B2E5F1B7E46E /* fit_unicode.cpp in Compile Sources */,
|
||||
@@ -2999,6 +3115,7 @@
|
||||
87061399286D8D6500D2446E /* moc_wobjectdefs.cpp in Compile Sources */,
|
||||
873824BA27E64707004F1B46 /* moc_server_p.cpp in Compile Sources */,
|
||||
87958F1927628D4500124B24 /* elitesterzosmart.cpp in Compile Sources */,
|
||||
87943AB429E0215D007575F2 /* localipaddress.cpp in Compile Sources */,
|
||||
87EB917627EE5FB3002535E1 /* nautilusbike.cpp in Compile Sources */,
|
||||
ACB47DC464A2BC9D39C544AD /* gpx.cpp in Compile Sources */,
|
||||
6361329E515248BB41640C07 /* homeform.cpp in Compile Sources */,
|
||||
@@ -3026,11 +3143,13 @@
|
||||
E40895A73216AC52D35083D9 /* signalhandler.cpp in Compile Sources */,
|
||||
873CD22427EF8E18000131BC /* inappproductqmltype.cpp in Compile Sources */,
|
||||
87DF68BF25E2675100FCDA46 /* moc_schwinnic4bike.cpp in Compile Sources */,
|
||||
8710707329C4A5E70094D0F3 /* GarminConnect.swift in Compile Sources */,
|
||||
BE1D17BBF32F04829E1B3767 /* toorxtreadmill.cpp in Compile Sources */,
|
||||
879A38C8281BD83300F78B2A /* characteristicnotifier2ad9.cpp in Compile Sources */,
|
||||
4697729B15991E98D6A2533D /* treadmill.cpp in Compile Sources */,
|
||||
87C481FC26DFA7D1006211AD /* moc_eliterizer.cpp in Compile Sources */,
|
||||
20AA270C9F447F42F5DC2FF2 /* trainprogram.cpp in Compile Sources */,
|
||||
8710706E29C48AF30094D0F3 /* moc_handleurl.cpp in Compile Sources */,
|
||||
87F93429278E0ECF0088B596 /* moc_domyosrower.cpp in Compile Sources */,
|
||||
87C5F0C026285E5F0067A1B5 /* mimepart.cpp in Compile Sources */,
|
||||
47E45EE0BB22C1E4332F1D1D /* trxappgateusbtreadmill.cpp in Compile Sources */,
|
||||
@@ -3048,6 +3167,7 @@
|
||||
87C5F0CF26285E7E0067A1B5 /* moc_mimepart.cpp in Compile Sources */,
|
||||
87EB918A27EE5FE7002535E1 /* qdomyoszwift_qmltyperegistrations.cpp in Compile Sources */,
|
||||
87182A0B276BBB1200141463 /* moc_virtualrower.cpp in Compile Sources */,
|
||||
872DCC3B2A18D4C000EC9F68 /* moc_virtualdevice.cpp in Compile Sources */,
|
||||
0317752B0C295CAB82D37E45 /* virtualtreadmill.cpp in Compile Sources */,
|
||||
8742C2B427C92C48007D3FA0 /* moc_wahookickrsnapbike.cpp in Compile Sources */,
|
||||
878531692711A3EC004B153D /* moc_fakebike.cpp in Compile Sources */,
|
||||
@@ -3056,12 +3176,14 @@
|
||||
87097D31275EA9AF0020EE6F /* moc_sportsplusbike.cpp in Compile Sources */,
|
||||
87819080261508B10085E656 /* moc_peloton.cpp in Compile Sources */,
|
||||
7EC1321DD83EAAFAA2B7109C /* domyosbike.cpp in Compile Sources */,
|
||||
8775008529E87713008E48B7 /* moc_iconceptelliptical.cpp in Compile Sources */,
|
||||
614192CB787D12C3E98ADE55 /* lockscreen.mm in Compile Sources */,
|
||||
87A0C4BB262329A600121A76 /* npecablebike.cpp in Compile Sources */,
|
||||
873CD22D27EF8E4B000131BC /* iosinapppurchaseproduct.mm in Compile Sources */,
|
||||
873CD20727EF8D8A000131BC /* inappproduct.cpp in Compile Sources */,
|
||||
87A3BC26265642A300D302E3 /* moc_rower.cpp in Compile Sources */,
|
||||
87EFE45B27A51901006EA1C3 /* moc_nautiluselliptical.cpp in Compile Sources */,
|
||||
872DCC392A18D4A800EC9F68 /* virtualdevice.cpp in Compile Sources */,
|
||||
0F974CB18B3E792B42270F19 /* FitDecode.mm in Compile Sources */,
|
||||
87440FBF2640292900E4DC0B /* moc_fitplusbike.cpp in Compile Sources */,
|
||||
87B617EC25F25FED0094A1CB /* screencapture.cpp in Compile Sources */,
|
||||
@@ -3101,6 +3223,7 @@
|
||||
87D2699F25F535200076AA48 /* m3ibike.cpp in Compile Sources */,
|
||||
87917A7528E768D200F8D9AC /* Connection.swift in Compile Sources */,
|
||||
87FFA13727BBE3FF00924E4E /* solebike.cpp in Compile Sources */,
|
||||
87F4FB5A29D550C00061BB4A /* schwinn170bike.cpp in Compile Sources */,
|
||||
7352E0F0EE5366AC809B9D64 /* qrc_qml.cpp in Compile Sources */,
|
||||
873824E727E647A8004F1B46 /* record.cpp in Compile Sources */,
|
||||
B38F3288D4AE4025465C1953 /* moc_bike.cpp in Compile Sources */,
|
||||
@@ -3136,6 +3259,7 @@
|
||||
E8B499F921FB0AB55C7A8A8B /* moc_gpx.cpp in Compile Sources */,
|
||||
87E6A85825B5C88E00371D28 /* moc_flywheelbike.cpp in Compile Sources */,
|
||||
8754D24C27F786F0003D7054 /* virtualrower.swift in Compile Sources */,
|
||||
878D83742A1F33C600D7F004 /* bkoolbike.cpp in Compile Sources */,
|
||||
873824B727E64707004F1B46 /* moc_characteristicwriteprocessor.cpp in Compile Sources */,
|
||||
87310B1F266FBB59008BA0D6 /* homefitnessbuddy.cpp in Compile Sources */,
|
||||
140BAAA8823E05940EF35A38 /* moc_treadmill.cpp in Compile Sources */,
|
||||
@@ -3152,8 +3276,12 @@
|
||||
87D269A025F535200076AA48 /* skandikawiribike.cpp in Compile Sources */,
|
||||
8738249427E646E3004F1B46 /* characteristicnotifier2a5b.cpp in Compile Sources */,
|
||||
8768D1FB285081FE00F58E3A /* nordictrackifitadbtreadmill.cpp in Compile Sources */,
|
||||
8775008329E876F8008E48B7 /* iconceptelliptical.cpp in Compile Sources */,
|
||||
87B187BD29B8C577007EEF9D /* moc_ziprotreadmill.cpp in Compile Sources */,
|
||||
877FBA2B276E684E00F6C0C9 /* moc_bowflextreadmill.cpp in Compile Sources */,
|
||||
874D272229AFA13B0007C079 /* moc_apexbike.cpp in Compile Sources */,
|
||||
8738248127E646C1004F1B46 /* characteristicnotifier2ad2.cpp in Compile Sources */,
|
||||
87A0771029B641D600A368BF /* wahookickrheadwind.cpp in Compile Sources */,
|
||||
8791A8AB25C861BD003B50B2 /* inspirebike.cpp in Compile Sources */,
|
||||
876BFC9D27BE35C5001D7645 /* bowflext216treadmill.cpp in Compile Sources */,
|
||||
871235C126B297720012D0F2 /* moc_kingsmithr1protreadmill.cpp in Compile Sources */,
|
||||
@@ -3168,6 +3296,7 @@
|
||||
87A0C4C0262329B500121A76 /* moc_npecablebike.cpp in Compile Sources */,
|
||||
87DAE16B26E9FF5000B0527E /* moc_solef80treadmill.cpp in Compile Sources */,
|
||||
8762D50F2601F7EA00F6F049 /* M3iNS.mm in Compile Sources */,
|
||||
874D272029AFA11F0007C079 /* apexbike.cpp in Compile Sources */,
|
||||
8798C8872733E103003148B3 /* strydrunpowersensor.cpp in Compile Sources */,
|
||||
87C5F0B626285E5F0067A1B5 /* quotedprintable.cpp in Compile Sources */,
|
||||
87310B23266FBB78008BA0D6 /* moc_smartrowrower.cpp in Compile Sources */,
|
||||
@@ -3180,6 +3309,7 @@
|
||||
74C43649C9C4E2E5F9378019 /* moc_domyosbike.cpp in Compile Sources */,
|
||||
87E0761D277A081A00FDA0F9 /* technogymmyruntreadmillrfcomm.cpp in Compile Sources */,
|
||||
873824B327E64707004F1B46 /* moc_dirconprocessor.cpp in Compile Sources */,
|
||||
87A0771229B6420200A368BF /* moc_wahookickrheadwind.cpp in Compile Sources */,
|
||||
87EB918827EE5FE7002535E1 /* moc_inappstoreqmltype.cpp in Compile Sources */,
|
||||
87083D9626678EFA0072410D /* zwiftworkout.cpp in Compile Sources */,
|
||||
87C5F0B826285E5F0067A1B5 /* stagesbike.cpp in Compile Sources */,
|
||||
@@ -3532,11 +3662,11 @@
|
||||
buildSettings = {
|
||||
APPLICATION_EXTENSION_API_ONLY = NO;
|
||||
"ARCHS[sdk=iphoneos*]" = arm64;
|
||||
"ARCHS[sdk=iphonesimulator*]" = x86_64;
|
||||
"ARCHS[sdk=iphonesimulator*]" = "$(ARCHS_STANDARD)";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CODE_SIGN_ENTITLEMENTS = "../src/ios/qdomyos-zwift.entitlements";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 2.12.10;
|
||||
CURRENT_PROJECT_VERSION = 612;
|
||||
DEVELOPMENT_TEAM = 6335M7T29D;
|
||||
ENABLE_BITCODE = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
@@ -3611,7 +3741,7 @@
|
||||
/Users/cagnulein/Qt/5.15.2/ios/plugins/playlistformats,
|
||||
/Users/cagnulein/Qt/5.15.2/ios/plugins/audio,
|
||||
);
|
||||
MARKETING_VERSION = 2.12;
|
||||
MARKETING_VERSION = 2.13;
|
||||
OTHER_CFLAGS = (
|
||||
"-pipe",
|
||||
"-g",
|
||||
@@ -3700,11 +3830,11 @@
|
||||
buildSettings = {
|
||||
APPLICATION_EXTENSION_API_ONLY = NO;
|
||||
"ARCHS[sdk=iphoneos*]" = arm64;
|
||||
"ARCHS[sdk=iphonesimulator*]" = x86_64;
|
||||
"ARCHS[sdk=iphonesimulator*]" = "$(ARCHS_STANDARD)";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CODE_SIGN_ENTITLEMENTS = "../src/ios/qdomyos-zwift.entitlements";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 2.12.10;
|
||||
CURRENT_PROJECT_VERSION = 612;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
DEVELOPMENT_TEAM = 6335M7T29D;
|
||||
ENABLE_BITCODE = NO;
|
||||
@@ -3781,7 +3911,7 @@
|
||||
/Users/cagnulein/Qt/5.15.2/ios/plugins/playlistformats,
|
||||
/Users/cagnulein/Qt/5.15.2/ios/plugins/audio,
|
||||
);
|
||||
MARKETING_VERSION = 2.12;
|
||||
MARKETING_VERSION = 2.13;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
OTHER_CFLAGS = (
|
||||
"-pipe",
|
||||
@@ -3908,7 +4038,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = "watchkit Extension/WatchKit Extension.entitlements";
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 2.12.10;
|
||||
CURRENT_PROJECT_VERSION = 612;
|
||||
DEVELOPMENT_TEAM = 6335M7T29D;
|
||||
ENABLE_BITCODE = YES;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
@@ -3928,8 +4058,12 @@
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IBSC_MODULE = watchkit_Extension;
|
||||
INFOPLIST_FILE = watchkit/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
|
||||
MARKETING_VERSION = 2.12;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
"@loader_path/../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 2.13;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
OTHER_CODE_SIGN_FLAGS = "--generate-entitlement-der";
|
||||
@@ -4000,7 +4134,7 @@
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = "watchkit Extension/WatchKit Extension.entitlements";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 2.12.10;
|
||||
CURRENT_PROJECT_VERSION = 612;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = 6335M7T29D;
|
||||
ENABLE_BITCODE = YES;
|
||||
@@ -4016,8 +4150,12 @@
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IBSC_MODULE = watchkit_Extension;
|
||||
INFOPLIST_FILE = watchkit/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
|
||||
MARKETING_VERSION = 2.12;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
"@loader_path/../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 2.13;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
OTHER_CODE_SIGN_FLAGS = "--generate-entitlement-der";
|
||||
@@ -4037,8 +4175,9 @@
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = watchos;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "watchkit-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 4;
|
||||
VALIDATE_PRODUCT = YES;
|
||||
@@ -4087,7 +4226,7 @@
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = "watchkit Extension/WatchKit Extension.entitlements";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 2.12.10;
|
||||
CURRENT_PROJECT_VERSION = 612;
|
||||
DEVELOPMENT_ASSET_PATHS = "\"watchkit Extension/Preview Content\"";
|
||||
ENABLE_BITCODE = YES;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
@@ -4127,8 +4266,12 @@
|
||||
../../Qt/5.15.2/ios/include/QtMultimedia,
|
||||
);
|
||||
INFOPLIST_FILE = "watchkit Extension/Info.plist";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
||||
MARKETING_VERSION = 2.12;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 2.13;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
OTHER_CODE_SIGN_FLAGS = "--generate-entitlement-der";
|
||||
@@ -4197,7 +4340,7 @@
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = "watchkit Extension/WatchKit Extension.entitlements";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 2.12.10;
|
||||
CURRENT_PROJECT_VERSION = 612;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_ASSET_PATHS = "\"watchkit Extension/Preview Content\"";
|
||||
ENABLE_BITCODE = YES;
|
||||
@@ -4233,8 +4376,12 @@
|
||||
../../Qt/5.15.2/ios/include/QtMultimedia,
|
||||
);
|
||||
INFOPLIST_FILE = "watchkit Extension/Info.plist";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
||||
MARKETING_VERSION = 2.12;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 2.13;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
OTHER_CODE_SIGN_FLAGS = "--generate-entitlement-der";
|
||||
@@ -4254,7 +4401,8 @@
|
||||
PRODUCT_NAME = "${TARGET_NAME}";
|
||||
SDKROOT = watchos;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 4;
|
||||
VALIDATE_PRODUCT = YES;
|
||||
|
||||
@@ -87,8 +87,6 @@
|
||||
</RemoteRunnable>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "876E4E102594747F00BD5714"
|
||||
BuildableName = "watchkit.app"
|
||||
BlueprintName = "watchkit"
|
||||
ReferencedContainer = "container:qdomyoszwift.xcodeproj">
|
||||
|
||||
15
defaults.pri
Normal file
15
defaults.pri
Normal file
@@ -0,0 +1,15 @@
|
||||
QT += gui bluetooth widgets xml positioning quick networkauth websockets texttospeech location multimedia
|
||||
QTPLUGIN += qavfmediaplayer
|
||||
QT+= charts
|
||||
|
||||
unix:android: QT += androidextras gui-private
|
||||
|
||||
android: include(android_openssl/openssl.pri)
|
||||
|
||||
INCLUDEPATH += $$PWD/src/qmdnsengine/src/include
|
||||
|
||||
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/src/android
|
||||
|
||||
ANDROID_ABIS = armeabi-v7a arm64-v8a x86 x86_64
|
||||
|
||||
#QMAKE_CXXFLAGS += -Werror=suggest-override
|
||||
@@ -4,17 +4,20 @@ QDomyos-Zwift can be installed from source on MacOs, Linux, Android and IOS.
|
||||
|
||||
Once you've installed QDomyos-Zwift, you can access the [operation guide](30_usage.md) for more information.
|
||||
|
||||
These instructions build the app itself, not the test project.
|
||||
|
||||
## On a Linux System (from source)
|
||||
|
||||
```buildoutcfg
|
||||
$ sudo apt update && sudo apt upgrade # this is very important on raspberry pi: you need the bluetooth firmware updated!
|
||||
$ sudo apt install git qtquickcontrols2-5-dev libqt5bluetooth5 libqt5widgets5 libqt5positioning5 libqt5xml5 qtconnectivity5-dev qtpositioning5-dev libqt5charts5-dev libqt5charts5 qt5-assistant libqt5networkauth5-dev libqt5websockets5-dev qml-module* libqt5texttospeech5-dev libqt5texttospeech5 libqt5location5-plugins qtlocation5-dev qtmultimedia5-dev libqt5multimediawidgets5 libqt5multimedia5-plugins libqt5multimedia5
|
||||
$ sudo apt install git qtquickcontrols2-5-dev libqt5bluetooth5 libqt5widgets5 libqt5positioning5 libqt5xml5 qtconnectivity5-dev qtpositioning5-dev libqt5charts5-dev libqt5charts5 qt5-assistant libqt5networkauth5-dev libqt5websockets5-dev qml-module* libqt5texttospeech5-dev libqt5texttospeech5 libqt5location5-plugins qtlocation5-dev qtmultimedia5-dev libqt5multimediawidgets5 libqt5multimedia5-plugins libqt5multimedia5 g++ make
|
||||
$ git clone https://github.com/cagnulein/qdomyos-zwift.git
|
||||
$ cd qdomyos-zwift
|
||||
$ git submodule update --init src/smtpclient/
|
||||
$ git submodule update --init src/qmdnsengine/
|
||||
$ git submodule update --init tst/googletest/
|
||||
$ cd src
|
||||
$ qmake
|
||||
$ qmake qdomyos-zwift.pro
|
||||
$ make -j4
|
||||
$ sudo ./qdomyos-zwift
|
||||
```
|
||||
@@ -102,15 +105,17 @@ 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-assistant libqt5networkauth5-dev libqt5websockets5-dev qtmultimedia5-dev libqt5multimediawidgets5 libqt5multimedia5-plugins libqt5multimedia5 qtlocation5-dev qtquickcontrols2-5-dev libqt5texttospeech5-dev libqt5texttospeech5`
|
||||
|
||||
`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`
|
||||
```bash
|
||||
sudo apt install git libqt5bluetooth5 libqt5widgets5 libqt5positioning5 libqt5xml5 qtconnectivity5-dev qtpositioning5-dev libqt5charts5-dev libqt5charts5 qt5-assistant libqt5networkauth5-dev libqt5websockets5-dev qtmultimedia5-dev libqt5multimediawidgets5 libqt5multimedia5-plugins libqt5multimedia5 qtlocation5-dev qtquickcontrols2-5-dev libqt5texttospeech5-dev libqt5texttospeech5 g++ make
|
||||
git clone https://github.com/cagnulein/qdomyos-zwift.git
|
||||
cd qdomyos-zwift
|
||||
git submodule update --init src/smtpclient/
|
||||
git submodule update --init src/qmdnsengine/
|
||||
git submodule update --init tst/googletest/
|
||||
cd src
|
||||
qmake qdomyos-zwift.pro
|
||||
make
|
||||
```
|
||||
|
||||
Please note :
|
||||
- Don't build the application with `-j4` option (this will fail)
|
||||
|
||||
@@ -36,7 +36,7 @@ An android device is required for this operation.
|
||||
8. Disable the option Enable Bluetooth HCI snoop log
|
||||
9. in Developer Options: Bug report->Full report
|
||||
10. wait a random amount of time (10-20 seconds)
|
||||
11. A notification will appear at the top of the device. Click on it, share, email it to yourself
|
||||
11. A notification will appear at the top of the device. Click on it, share, email it to yourself. If it doesn't appear you need to use ADB to pull the file from the phone itself
|
||||
12. You'll get a zip file with the entire report. In the FS/Data/Log/bt directory of the zipfile is the file you want.
|
||||
13. attach the log file in a new issue with a short description of the steps you did in the app when you used it
|
||||
|
||||
|
||||
2575
qHttpServerBin/5.15.2/headers/http_parser.c
Normal file
2575
qHttpServerBin/5.15.2/headers/http_parser.c
Normal file
File diff suppressed because it is too large
Load Diff
449
qHttpServerBin/5.15.2/headers/http_parser.h
Normal file
449
qHttpServerBin/5.15.2/headers/http_parser.h
Normal file
@@ -0,0 +1,449 @@
|
||||
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
#ifndef http_parser_h
|
||||
#define http_parser_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Also update SONAME in the Makefile whenever you change these. */
|
||||
#define HTTP_PARSER_VERSION_MAJOR 2
|
||||
#define HTTP_PARSER_VERSION_MINOR 9
|
||||
#define HTTP_PARSER_VERSION_PATCH 4
|
||||
|
||||
#include <stddef.h>
|
||||
#if defined(_WIN32) && !defined(__MINGW32__) && \
|
||||
(!defined(_MSC_VER) || _MSC_VER<1600) && !defined(__WINE__)
|
||||
#include <BaseTsd.h>
|
||||
typedef __int8 int8_t;
|
||||
typedef unsigned __int8 uint8_t;
|
||||
typedef __int16 int16_t;
|
||||
typedef unsigned __int16 uint16_t;
|
||||
typedef __int32 int32_t;
|
||||
typedef unsigned __int32 uint32_t;
|
||||
typedef __int64 int64_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
#elif (defined(__sun) || defined(__sun__)) && defined(__SunOS_5_9)
|
||||
#include <sys/inttypes.h>
|
||||
#else
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
/* Compile with -DHTTP_PARSER_STRICT=0 to make less checks, but run
|
||||
* faster
|
||||
*/
|
||||
#ifndef HTTP_PARSER_STRICT
|
||||
# define HTTP_PARSER_STRICT 1
|
||||
#endif
|
||||
|
||||
/* Maximium header size allowed. If the macro is not defined
|
||||
* before including this header then the default is used. To
|
||||
* change the maximum header size, define the macro in the build
|
||||
* environment (e.g. -DHTTP_MAX_HEADER_SIZE=<value>). To remove
|
||||
* the effective limit on the size of the header, define the macro
|
||||
* to a very large number (e.g. -DHTTP_MAX_HEADER_SIZE=0x7fffffff)
|
||||
*/
|
||||
#ifndef HTTP_MAX_HEADER_SIZE
|
||||
# define HTTP_MAX_HEADER_SIZE (80*1024)
|
||||
#endif
|
||||
|
||||
typedef struct http_parser http_parser;
|
||||
typedef struct http_parser_settings http_parser_settings;
|
||||
|
||||
|
||||
/* Callbacks should return non-zero to indicate an error. The parser will
|
||||
* then halt execution.
|
||||
*
|
||||
* The one exception is on_headers_complete. In a HTTP_RESPONSE parser
|
||||
* returning '1' from on_headers_complete will tell the parser that it
|
||||
* should not expect a body. This is used when receiving a response to a
|
||||
* HEAD request which may contain 'Content-Length' or 'Transfer-Encoding:
|
||||
* chunked' headers that indicate the presence of a body.
|
||||
*
|
||||
* Returning `2` from on_headers_complete will tell parser that it should not
|
||||
* expect neither a body nor any futher responses on this connection. This is
|
||||
* useful for handling responses to a CONNECT request which may not contain
|
||||
* `Upgrade` or `Connection: upgrade` headers.
|
||||
*
|
||||
* http_data_cb does not return data chunks. It will be called arbitrarily
|
||||
* many times for each string. E.G. you might get 10 callbacks for "on_url"
|
||||
* each providing just a few characters more data.
|
||||
*/
|
||||
typedef int (*http_data_cb) (http_parser*, const char *at, size_t length);
|
||||
typedef int (*http_cb) (http_parser*);
|
||||
|
||||
|
||||
/* Status Codes */
|
||||
#define HTTP_STATUS_MAP(XX) \
|
||||
XX(100, CONTINUE, Continue) \
|
||||
XX(101, SWITCHING_PROTOCOLS, Switching Protocols) \
|
||||
XX(102, PROCESSING, Processing) \
|
||||
XX(200, OK, OK) \
|
||||
XX(201, CREATED, Created) \
|
||||
XX(202, ACCEPTED, Accepted) \
|
||||
XX(203, NON_AUTHORITATIVE_INFORMATION, Non-Authoritative Information) \
|
||||
XX(204, NO_CONTENT, No Content) \
|
||||
XX(205, RESET_CONTENT, Reset Content) \
|
||||
XX(206, PARTIAL_CONTENT, Partial Content) \
|
||||
XX(207, MULTI_STATUS, Multi-Status) \
|
||||
XX(208, ALREADY_REPORTED, Already Reported) \
|
||||
XX(226, IM_USED, IM Used) \
|
||||
XX(300, MULTIPLE_CHOICES, Multiple Choices) \
|
||||
XX(301, MOVED_PERMANENTLY, Moved Permanently) \
|
||||
XX(302, FOUND, Found) \
|
||||
XX(303, SEE_OTHER, See Other) \
|
||||
XX(304, NOT_MODIFIED, Not Modified) \
|
||||
XX(305, USE_PROXY, Use Proxy) \
|
||||
XX(307, TEMPORARY_REDIRECT, Temporary Redirect) \
|
||||
XX(308, PERMANENT_REDIRECT, Permanent Redirect) \
|
||||
XX(400, BAD_REQUEST, Bad Request) \
|
||||
XX(401, UNAUTHORIZED, Unauthorized) \
|
||||
XX(402, PAYMENT_REQUIRED, Payment Required) \
|
||||
XX(403, FORBIDDEN, Forbidden) \
|
||||
XX(404, NOT_FOUND, Not Found) \
|
||||
XX(405, METHOD_NOT_ALLOWED, Method Not Allowed) \
|
||||
XX(406, NOT_ACCEPTABLE, Not Acceptable) \
|
||||
XX(407, PROXY_AUTHENTICATION_REQUIRED, Proxy Authentication Required) \
|
||||
XX(408, REQUEST_TIMEOUT, Request Timeout) \
|
||||
XX(409, CONFLICT, Conflict) \
|
||||
XX(410, GONE, Gone) \
|
||||
XX(411, LENGTH_REQUIRED, Length Required) \
|
||||
XX(412, PRECONDITION_FAILED, Precondition Failed) \
|
||||
XX(413, PAYLOAD_TOO_LARGE, Payload Too Large) \
|
||||
XX(414, URI_TOO_LONG, URI Too Long) \
|
||||
XX(415, UNSUPPORTED_MEDIA_TYPE, Unsupported Media Type) \
|
||||
XX(416, RANGE_NOT_SATISFIABLE, Range Not Satisfiable) \
|
||||
XX(417, EXPECTATION_FAILED, Expectation Failed) \
|
||||
XX(421, MISDIRECTED_REQUEST, Misdirected Request) \
|
||||
XX(422, UNPROCESSABLE_ENTITY, Unprocessable Entity) \
|
||||
XX(423, LOCKED, Locked) \
|
||||
XX(424, FAILED_DEPENDENCY, Failed Dependency) \
|
||||
XX(426, UPGRADE_REQUIRED, Upgrade Required) \
|
||||
XX(428, PRECONDITION_REQUIRED, Precondition Required) \
|
||||
XX(429, TOO_MANY_REQUESTS, Too Many Requests) \
|
||||
XX(431, REQUEST_HEADER_FIELDS_TOO_LARGE, Request Header Fields Too Large) \
|
||||
XX(451, UNAVAILABLE_FOR_LEGAL_REASONS, Unavailable For Legal Reasons) \
|
||||
XX(500, INTERNAL_SERVER_ERROR, Internal Server Error) \
|
||||
XX(501, NOT_IMPLEMENTED, Not Implemented) \
|
||||
XX(502, BAD_GATEWAY, Bad Gateway) \
|
||||
XX(503, SERVICE_UNAVAILABLE, Service Unavailable) \
|
||||
XX(504, GATEWAY_TIMEOUT, Gateway Timeout) \
|
||||
XX(505, HTTP_VERSION_NOT_SUPPORTED, HTTP Version Not Supported) \
|
||||
XX(506, VARIANT_ALSO_NEGOTIATES, Variant Also Negotiates) \
|
||||
XX(507, INSUFFICIENT_STORAGE, Insufficient Storage) \
|
||||
XX(508, LOOP_DETECTED, Loop Detected) \
|
||||
XX(510, NOT_EXTENDED, Not Extended) \
|
||||
XX(511, NETWORK_AUTHENTICATION_REQUIRED, Network Authentication Required) \
|
||||
|
||||
enum http_status
|
||||
{
|
||||
#define XX(num, name, string) HTTP_STATUS_##name = num,
|
||||
HTTP_STATUS_MAP(XX)
|
||||
#undef XX
|
||||
};
|
||||
|
||||
|
||||
/* Request Methods */
|
||||
#define HTTP_METHOD_MAP(XX) \
|
||||
XX(0, DELETE, DELETE) \
|
||||
XX(1, GET, GET) \
|
||||
XX(2, HEAD, HEAD) \
|
||||
XX(3, POST, POST) \
|
||||
XX(4, PUT, PUT) \
|
||||
/* pathological */ \
|
||||
XX(5, CONNECT, CONNECT) \
|
||||
XX(6, OPTIONS, OPTIONS) \
|
||||
XX(7, TRACE, TRACE) \
|
||||
/* WebDAV */ \
|
||||
XX(8, COPY, COPY) \
|
||||
XX(9, LOCK, LOCK) \
|
||||
XX(10, MKCOL, MKCOL) \
|
||||
XX(11, MOVE, MOVE) \
|
||||
XX(12, PROPFIND, PROPFIND) \
|
||||
XX(13, PROPPATCH, PROPPATCH) \
|
||||
XX(14, SEARCH, SEARCH) \
|
||||
XX(15, UNLOCK, UNLOCK) \
|
||||
XX(16, BIND, BIND) \
|
||||
XX(17, REBIND, REBIND) \
|
||||
XX(18, UNBIND, UNBIND) \
|
||||
XX(19, ACL, ACL) \
|
||||
/* subversion */ \
|
||||
XX(20, REPORT, REPORT) \
|
||||
XX(21, MKACTIVITY, MKACTIVITY) \
|
||||
XX(22, CHECKOUT, CHECKOUT) \
|
||||
XX(23, MERGE, MERGE) \
|
||||
/* upnp */ \
|
||||
XX(24, MSEARCH, M-SEARCH) \
|
||||
XX(25, NOTIFY, NOTIFY) \
|
||||
XX(26, SUBSCRIBE, SUBSCRIBE) \
|
||||
XX(27, UNSUBSCRIBE, UNSUBSCRIBE) \
|
||||
/* RFC-5789 */ \
|
||||
XX(28, PATCH, PATCH) \
|
||||
XX(29, PURGE, PURGE) \
|
||||
/* CalDAV */ \
|
||||
XX(30, MKCALENDAR, MKCALENDAR) \
|
||||
/* RFC-2068, section 19.6.1.2 */ \
|
||||
XX(31, LINK, LINK) \
|
||||
XX(32, UNLINK, UNLINK) \
|
||||
/* icecast */ \
|
||||
XX(33, SOURCE, SOURCE) \
|
||||
|
||||
enum http_method
|
||||
{
|
||||
#define XX(num, name, string) HTTP_##name = num,
|
||||
HTTP_METHOD_MAP(XX)
|
||||
#undef XX
|
||||
};
|
||||
|
||||
|
||||
enum http_parser_type { HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH };
|
||||
|
||||
|
||||
/* Flag values for http_parser.flags field */
|
||||
enum flags
|
||||
{ F_CHUNKED = 1 << 0
|
||||
, F_CONNECTION_KEEP_ALIVE = 1 << 1
|
||||
, F_CONNECTION_CLOSE = 1 << 2
|
||||
, F_CONNECTION_UPGRADE = 1 << 3
|
||||
, F_TRAILING = 1 << 4
|
||||
, F_UPGRADE = 1 << 5
|
||||
, F_SKIPBODY = 1 << 6
|
||||
, F_CONTENTLENGTH = 1 << 7
|
||||
};
|
||||
|
||||
|
||||
/* Map for errno-related constants
|
||||
*
|
||||
* The provided argument should be a macro that takes 2 arguments.
|
||||
*/
|
||||
#define HTTP_ERRNO_MAP(XX) \
|
||||
/* No error */ \
|
||||
XX(OK, "success") \
|
||||
\
|
||||
/* Callback-related errors */ \
|
||||
XX(CB_message_begin, "the on_message_begin callback failed") \
|
||||
XX(CB_url, "the on_url callback failed") \
|
||||
XX(CB_header_field, "the on_header_field callback failed") \
|
||||
XX(CB_header_value, "the on_header_value callback failed") \
|
||||
XX(CB_headers_complete, "the on_headers_complete callback failed") \
|
||||
XX(CB_body, "the on_body callback failed") \
|
||||
XX(CB_message_complete, "the on_message_complete callback failed") \
|
||||
XX(CB_status, "the on_status callback failed") \
|
||||
XX(CB_chunk_header, "the on_chunk_header callback failed") \
|
||||
XX(CB_chunk_complete, "the on_chunk_complete callback failed") \
|
||||
\
|
||||
/* Parsing-related errors */ \
|
||||
XX(INVALID_EOF_STATE, "stream ended at an unexpected time") \
|
||||
XX(HEADER_OVERFLOW, \
|
||||
"too many header bytes seen; overflow detected") \
|
||||
XX(CLOSED_CONNECTION, \
|
||||
"data received after completed connection: close message") \
|
||||
XX(INVALID_VERSION, "invalid HTTP version") \
|
||||
XX(INVALID_STATUS, "invalid HTTP status code") \
|
||||
XX(INVALID_METHOD, "invalid HTTP method") \
|
||||
XX(INVALID_URL, "invalid URL") \
|
||||
XX(INVALID_HOST, "invalid host") \
|
||||
XX(INVALID_PORT, "invalid port") \
|
||||
XX(INVALID_PATH, "invalid path") \
|
||||
XX(INVALID_QUERY_STRING, "invalid query string") \
|
||||
XX(INVALID_FRAGMENT, "invalid fragment") \
|
||||
XX(LF_EXPECTED, "LF character expected") \
|
||||
XX(INVALID_HEADER_TOKEN, "invalid character in header") \
|
||||
XX(INVALID_CONTENT_LENGTH, \
|
||||
"invalid character in content-length header") \
|
||||
XX(UNEXPECTED_CONTENT_LENGTH, \
|
||||
"unexpected content-length header") \
|
||||
XX(INVALID_CHUNK_SIZE, \
|
||||
"invalid character in chunk size header") \
|
||||
XX(INVALID_CONSTANT, "invalid constant string") \
|
||||
XX(INVALID_INTERNAL_STATE, "encountered unexpected internal state")\
|
||||
XX(STRICT, "strict mode assertion failed") \
|
||||
XX(PAUSED, "parser is paused") \
|
||||
XX(UNKNOWN, "an unknown error occurred") \
|
||||
XX(INVALID_TRANSFER_ENCODING, \
|
||||
"request has invalid transfer-encoding") \
|
||||
|
||||
|
||||
/* Define HPE_* values for each errno value above */
|
||||
#define HTTP_ERRNO_GEN(n, s) HPE_##n,
|
||||
enum http_errno {
|
||||
HTTP_ERRNO_MAP(HTTP_ERRNO_GEN)
|
||||
};
|
||||
#undef HTTP_ERRNO_GEN
|
||||
|
||||
|
||||
/* Get an http_errno value from an http_parser */
|
||||
#define HTTP_PARSER_ERRNO(p) ((enum http_errno) (p)->http_errno)
|
||||
|
||||
|
||||
struct http_parser {
|
||||
/** PRIVATE **/
|
||||
unsigned int type : 2; /* enum http_parser_type */
|
||||
unsigned int flags : 8; /* F_* values from 'flags' enum; semi-public */
|
||||
unsigned int state : 7; /* enum state from http_parser.c */
|
||||
unsigned int header_state : 7; /* enum header_state from http_parser.c */
|
||||
unsigned int index : 5; /* index into current matcher */
|
||||
unsigned int uses_transfer_encoding : 1; /* Transfer-Encoding header is present */
|
||||
unsigned int allow_chunked_length : 1; /* Allow headers with both
|
||||
* `Content-Length` and
|
||||
* `Transfer-Encoding: chunked` set */
|
||||
unsigned int lenient_http_headers : 1;
|
||||
|
||||
uint32_t nread; /* # bytes read in various scenarios */
|
||||
uint64_t content_length; /* # bytes in body. `(uint64_t) -1` (all bits one)
|
||||
* if no Content-Length header.
|
||||
*/
|
||||
|
||||
/** READ-ONLY **/
|
||||
unsigned short http_major;
|
||||
unsigned short http_minor;
|
||||
unsigned int status_code : 16; /* responses only */
|
||||
unsigned int method : 8; /* requests only */
|
||||
unsigned int http_errno : 7;
|
||||
|
||||
/* 1 = Upgrade header was present and the parser has exited because of that.
|
||||
* 0 = No upgrade header present.
|
||||
* Should be checked when http_parser_execute() returns in addition to
|
||||
* error checking.
|
||||
*/
|
||||
unsigned int upgrade : 1;
|
||||
|
||||
/** PUBLIC **/
|
||||
void *data; /* A pointer to get hook to the "connection" or "socket" object */
|
||||
};
|
||||
|
||||
|
||||
struct http_parser_settings {
|
||||
http_cb on_message_begin;
|
||||
http_data_cb on_url;
|
||||
http_data_cb on_status;
|
||||
http_data_cb on_header_field;
|
||||
http_data_cb on_header_value;
|
||||
http_cb on_headers_complete;
|
||||
http_data_cb on_body;
|
||||
http_cb on_message_complete;
|
||||
/* When on_chunk_header is called, the current chunk length is stored
|
||||
* in parser->content_length.
|
||||
*/
|
||||
http_cb on_chunk_header;
|
||||
http_cb on_chunk_complete;
|
||||
};
|
||||
|
||||
|
||||
enum http_parser_url_fields
|
||||
{ UF_SCHEMA = 0
|
||||
, UF_HOST = 1
|
||||
, UF_PORT = 2
|
||||
, UF_PATH = 3
|
||||
, UF_QUERY = 4
|
||||
, UF_FRAGMENT = 5
|
||||
, UF_USERINFO = 6
|
||||
, UF_MAX = 7
|
||||
};
|
||||
|
||||
|
||||
/* Result structure for http_parser_parse_url().
|
||||
*
|
||||
* Callers should index into field_data[] with UF_* values iff field_set
|
||||
* has the relevant (1 << UF_*) bit set. As a courtesy to clients (and
|
||||
* because we probably have padding left over), we convert any port to
|
||||
* a uint16_t.
|
||||
*/
|
||||
struct http_parser_url {
|
||||
uint16_t field_set; /* Bitmask of (1 << UF_*) values */
|
||||
uint16_t port; /* Converted UF_PORT string */
|
||||
|
||||
struct {
|
||||
uint16_t off; /* Offset into buffer in which field starts */
|
||||
uint16_t len; /* Length of run in buffer */
|
||||
} field_data[UF_MAX];
|
||||
};
|
||||
|
||||
|
||||
/* Returns the library version. Bits 16-23 contain the major version number,
|
||||
* bits 8-15 the minor version number and bits 0-7 the patch level.
|
||||
* Usage example:
|
||||
*
|
||||
* unsigned long version = http_parser_version();
|
||||
* unsigned major = (version >> 16) & 255;
|
||||
* unsigned minor = (version >> 8) & 255;
|
||||
* unsigned patch = version & 255;
|
||||
* printf("http_parser v%u.%u.%u\n", major, minor, patch);
|
||||
*/
|
||||
unsigned long http_parser_version(void);
|
||||
|
||||
void http_parser_init(http_parser *parser, enum http_parser_type type);
|
||||
|
||||
|
||||
/* Initialize http_parser_settings members to 0
|
||||
*/
|
||||
void http_parser_settings_init(http_parser_settings *settings);
|
||||
|
||||
|
||||
/* Executes the parser. Returns number of parsed bytes. Sets
|
||||
* `parser->http_errno` on error. */
|
||||
size_t http_parser_execute(http_parser *parser,
|
||||
const http_parser_settings *settings,
|
||||
const char *data,
|
||||
size_t len);
|
||||
|
||||
|
||||
/* If http_should_keep_alive() in the on_headers_complete or
|
||||
* on_message_complete callback returns 0, then this should be
|
||||
* the last message on the connection.
|
||||
* If you are the server, respond with the "Connection: close" header.
|
||||
* If you are the client, close the connection.
|
||||
*/
|
||||
int http_should_keep_alive(const http_parser *parser);
|
||||
|
||||
/* Returns a string version of the HTTP method. */
|
||||
const char *http_method_str(enum http_method m);
|
||||
|
||||
/* Returns a string version of the HTTP status code. */
|
||||
const char *http_status_str(enum http_status s);
|
||||
|
||||
/* Return a string name of the given error */
|
||||
const char *http_errno_name(enum http_errno err);
|
||||
|
||||
/* Return a string description of the given error */
|
||||
const char *http_errno_description(enum http_errno err);
|
||||
|
||||
/* Initialize all http_parser_url members to 0 */
|
||||
void http_parser_url_init(struct http_parser_url *u);
|
||||
|
||||
/* Parse a URL; return nonzero on failure */
|
||||
int http_parser_parse_url(const char *buf, size_t buflen,
|
||||
int is_connect,
|
||||
struct http_parser_url *u);
|
||||
|
||||
/* Pause or un-pause the parser; a nonzero value pauses */
|
||||
void http_parser_pause(http_parser *parser, int paused);
|
||||
|
||||
/* Checks if this is the final chunk of the body. */
|
||||
int http_body_is_final(const http_parser *parser);
|
||||
|
||||
/* Change the maximum header size provided at compile time. */
|
||||
void http_parser_set_max_header_size(uint32_t size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
24
qdomyos-zwift.pro
Normal file
24
qdomyos-zwift.pro
Normal file
@@ -0,0 +1,24 @@
|
||||
TEMPLATE = subdirs
|
||||
CONFIG+=ordered
|
||||
|
||||
!ios: !android: {
|
||||
SUBDIRS = \
|
||||
src/qdomyos-zwift-lib.pro \
|
||||
src/qdomyos-zwift.pro \
|
||||
tst/qdomyos-zwift-tests.pro
|
||||
|
||||
tst.depends = src/qdomyos-zwift-lib.pro
|
||||
}
|
||||
|
||||
android: {
|
||||
SUBDIRS = \
|
||||
src/qdomyos-zwift.pro
|
||||
}
|
||||
|
||||
ios: {
|
||||
SUBDIRS = \
|
||||
src/qdomyos-zwift-lib.pro \
|
||||
src/qdomyos-zwift.pro
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,12 @@ ColumnLayout {
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: chartJscheckStartFromWeb
|
||||
interval: 200; running: true; repeat: true
|
||||
onTriggered: {if(rootItem.startRequested) {rootItem.startRequested = false; rootItem.stopRequested = false; stackView.pop(); }}
|
||||
}
|
||||
|
||||
Button {
|
||||
id: closeButton
|
||||
height: 50
|
||||
|
||||
1063
src/Computrainer.cpp
Normal file
1063
src/Computrainer.cpp
Normal file
File diff suppressed because it is too large
Load Diff
215
src/Computrainer.h
Normal file
215
src/Computrainer.h
Normal file
@@ -0,0 +1,215 @@
|
||||
/*
|
||||
* Copyright (c) 2009 Mark Liversedge (liversedge@gmail.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc., 51
|
||||
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
// I have consciously avoided putting things like data logging, lap marking,
|
||||
// intervals or any load management functions in this class. It is restricted
|
||||
// to controlling an reading telemetry from the device
|
||||
//
|
||||
// I expect higher order classes to implement such functions whilst
|
||||
// other devices (e.g. ANT+ devices) may be implemented with the same basic
|
||||
// interface
|
||||
//
|
||||
// I have avoided a base abstract class at this stage since I am uncertain
|
||||
// what core methods would be required by say, ANT+ or Tacx devices
|
||||
|
||||
#ifndef _Computrainer_h
|
||||
#define _Computrainer_h 1
|
||||
|
||||
#include <QDebug>
|
||||
#include <QFile>
|
||||
#include <QMutex>
|
||||
#include <QString>
|
||||
#include <QThread>
|
||||
|
||||
#ifdef WIN32
|
||||
#include <windef.h>
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
#include <winbase.h>
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <sys/ioctl.h>
|
||||
#include <termios.h> // unix!!
|
||||
#include <unistd.h> // unix!!
|
||||
#ifndef N_TTY // for OpenBSD, this is a hack XXX
|
||||
#define N_TTY 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef Q_OS_ANDROID
|
||||
#include "keepawakehelper.h"
|
||||
#include <QAndroidJniObject>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
/* Some CT Microcontroller / Protocol Constants */
|
||||
|
||||
/* read timeouts in microseconds */
|
||||
#define CT_READTIMEOUT 1000
|
||||
#define CT_WRITETIMEOUT 2000
|
||||
|
||||
// message type
|
||||
#define CT_SPEED 0x01
|
||||
#define CT_POWER 0x02
|
||||
#define CT_HEARTRATE 0x03
|
||||
#define CT_CADENCE 0x06
|
||||
#define CT_RRC 0x09
|
||||
#define CT_SENSOR 0x0b
|
||||
|
||||
// buttons
|
||||
#define CT_RESET 0x01
|
||||
#define CT_F1 0x02
|
||||
#define CT_F3 0x04
|
||||
#define CT_PLUS 0x08
|
||||
#define CT_F2 0x10
|
||||
#define CT_MINUS 0x20
|
||||
#define CT_SSS 0x40 // spinscan sync is not a button!
|
||||
#define CT_NONE 0x80
|
||||
|
||||
/* Device operation mode */
|
||||
#define CT_ERGOMODE 0x01
|
||||
#define CT_SSMODE 0x02
|
||||
#define CT_CALIBRATE 0x04
|
||||
|
||||
/* UI operation mode */
|
||||
#define UI_MANUAL 0x01 // using +/- keys to adjust
|
||||
#define UI_ERG 0x02 // running an erg file!
|
||||
|
||||
/* Control status */
|
||||
#define CT_RUNNING 0x01
|
||||
#define CT_PAUSED 0x02
|
||||
|
||||
/* default operation mode */
|
||||
#define DEFAULT_MODE CT_ERGOMODE
|
||||
#define DEFAULT_LOAD 100.00
|
||||
#define DEFAULT_GRADIENT 2.00
|
||||
|
||||
class Computrainer : public QThread {
|
||||
|
||||
public:
|
||||
Computrainer(QObject *parent = 0, QString deviceFilename = 0); // pass device
|
||||
~Computrainer();
|
||||
|
||||
QObject *parent;
|
||||
|
||||
// HIGH-LEVEL FUNCTIONS
|
||||
int start(); // Calls QThread to start
|
||||
int restart(); // restart after paused
|
||||
int pause(); // pauses data collection, inbound telemetry is discarded
|
||||
int stop(); // stops data collection thread
|
||||
int quit(int error); // called by thread before exiting
|
||||
bool discover(QString deviceFilename); // confirm CT is attached to device
|
||||
|
||||
// SET
|
||||
void setDevice(QString deviceFilename); // setup the device filename
|
||||
void setLoad(double load); // set the load to generate in ERGOMODE
|
||||
void setGradient(double gradient); // set the load to generate in SSMODE
|
||||
void setMode(int mode,
|
||||
double load = DEFAULT_LOAD, // set mode to CT_ERGOMODE or CT_SSMODE
|
||||
double gradient = DEFAULT_GRADIENT);
|
||||
|
||||
// GET TELEMETRY AND STATUS
|
||||
// direct access to class variables is not allowed because we need to use wait conditions
|
||||
// to sync data read/writes between the run() thread and the main gui thread
|
||||
bool isCalibrated();
|
||||
bool isHRConnected();
|
||||
bool isCADConnected();
|
||||
void getTelemetry(double &Power, double &HeartRate, double &Cadence, double &Speed, double &RRC, bool &calibration,
|
||||
int &Buttons, uint8_t *ss, int &Status);
|
||||
void getSpinScan(double spinData[]);
|
||||
int getMode();
|
||||
double getGradient();
|
||||
double getLoad();
|
||||
|
||||
private:
|
||||
void run() override; // called by start to kick off the CT comtrol thread
|
||||
|
||||
// 56 bytes comprise of 8 7byte command messages, where
|
||||
// the last is the set load / gradient respectively
|
||||
uint8_t ERGO_Command[56], SS_Command[56];
|
||||
|
||||
// Utility and BG Thread functions
|
||||
int openPort();
|
||||
int closePort();
|
||||
|
||||
// Protocol encoding
|
||||
void prepareCommand(int mode, double value); // sets up the command packet according to current settings
|
||||
int sendCommand(int mode); // writes a command to the device
|
||||
int calcCRC(int value); // calculates the checksum for the current command
|
||||
|
||||
// Protocol decoding
|
||||
int readMessage();
|
||||
void unpackTelemetry(int &b1, int &b2, int &b3, int &buttons, int &type, int &value8, int &value12);
|
||||
|
||||
// Mutex for controlling accessing private data
|
||||
QMutex pvars;
|
||||
|
||||
// INBOUND TELEMETRY - all volatile since it is updated by the run() thread
|
||||
volatile double devicePower; // current output power in Watts
|
||||
volatile double deviceHeartRate; // current heartrate in BPM
|
||||
volatile double deviceCadence; // current cadence in RPM
|
||||
volatile double deviceSpeed; // current speed in KPH
|
||||
volatile double deviceRRC; // calibrated Rolling Resistance
|
||||
volatile bool deviceCalibrated; // is it calibrated?
|
||||
volatile uint8_t spinScan[24]; // SS values only in SS_MODE
|
||||
volatile int deviceButtons; // Button status
|
||||
volatile bool deviceHRConnected; // HR jack is connected
|
||||
volatile bool deviceCADConnected; // Cadence jack is connected
|
||||
volatile int deviceStatus; // Device status running, paused, disconnected
|
||||
|
||||
// OUTBOUND COMMANDS - all volatile since it is updated by the GUI thread
|
||||
volatile int mode;
|
||||
volatile double load;
|
||||
volatile double gradient;
|
||||
|
||||
// i/o message holder
|
||||
uint8_t buf[7];
|
||||
|
||||
// device port
|
||||
QString deviceFilename;
|
||||
#ifdef WIN32
|
||||
HANDLE devicePort; // file descriptor for reading from com3
|
||||
DCB deviceSettings; // serial port settings baud rate et al
|
||||
#else
|
||||
int devicePort; // unix!!
|
||||
struct termios deviceSettings; // unix!!
|
||||
#endif
|
||||
// raw device utils
|
||||
int rawWrite(uint8_t *bytes, int size); // unix!!
|
||||
int rawRead(uint8_t *bytes, int size); // unix!!
|
||||
|
||||
#ifdef Q_OS_ANDROID
|
||||
QList<jbyte> bufRX;
|
||||
bool cleanFrame = false;
|
||||
#endif
|
||||
};
|
||||
|
||||
class CTsleeper : public QThread {
|
||||
public:
|
||||
static void msleep(unsigned long msecs); // inherited from QThread
|
||||
};
|
||||
|
||||
#endif // _GC_Computrainer_h
|
||||
41
src/ConnectIQ/iOS/ConnectIQ.xcframework/Info.plist
Normal file
41
src/ConnectIQ/iOS/ConnectIQ.xcframework/Info.plist
Normal file
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>AvailableLibraries</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>LibraryIdentifier</key>
|
||||
<string>ios-armv7_arm64</string>
|
||||
<key>LibraryPath</key>
|
||||
<string>ConnectIQ.framework</string>
|
||||
<key>SupportedArchitectures</key>
|
||||
<array>
|
||||
<string>armv7</string>
|
||||
<string>arm64</string>
|
||||
</array>
|
||||
<key>SupportedPlatform</key>
|
||||
<string>ios</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>LibraryIdentifier</key>
|
||||
<string>ios-i386_x86_64-simulator</string>
|
||||
<key>LibraryPath</key>
|
||||
<string>ConnectIQ.framework</string>
|
||||
<key>SupportedArchitectures</key>
|
||||
<array>
|
||||
<string>i386</string>
|
||||
<string>x86_64</string>
|
||||
</array>
|
||||
<key>SupportedPlatform</key>
|
||||
<string>ios</string>
|
||||
<key>SupportedPlatformVariant</key>
|
||||
<string>simulator</string>
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>XFWK</string>
|
||||
<key>XCFrameworkFormatVersion</key>
|
||||
<string>1.0</string>
|
||||
</dict>
|
||||
</plist>
|
||||
Binary file not shown.
@@ -0,0 +1,237 @@
|
||||
//
|
||||
// ConnectIQ.h
|
||||
// ConnectIQ
|
||||
//
|
||||
// Copyright (c) 2014 Garmin. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "IQConstants.h"
|
||||
#import "IQDevice.h"
|
||||
#import "IQApp.h"
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
#pragma mark - PUBLIC TYPES
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
/// @brief SendMessage progress callback block
|
||||
///
|
||||
/// @param sentBytes The number of bytes that have been successfully transferred
|
||||
/// to the device so far for this connection.
|
||||
/// @param totalBytes The total number of bytes to transfer for this connection.
|
||||
typedef void (^IQSendMessageProgress)(uint32_t sentBytes, uint32_t totalBytes);
|
||||
|
||||
/// @brief SendMessage completion callback block
|
||||
///
|
||||
/// @param result The result of the SendMessage operation.
|
||||
typedef void (^IQSendMessageCompletion)(IQSendMessageResult result);
|
||||
|
||||
/// @brief Conforming to the IQUIOverrideDelegate protocol indicates that an
|
||||
/// object handles one or more events triggered by the ConnectIQ SDK that
|
||||
/// require user input.
|
||||
@protocol IQUIOverrideDelegate <NSObject>
|
||||
@optional
|
||||
/// @brief Called by the ConnectIQ SDK when an action has been requested that
|
||||
/// requires Garmin Connect Mobile to be installed.
|
||||
///
|
||||
/// The receiver should choose whether or not to launch the Apple App
|
||||
/// Store page for GCM, ideally by presenting the user with a choice.
|
||||
///
|
||||
/// If the receiver of this message decides to install GCM, it must call
|
||||
/// showAppStoreForConnectMobile.
|
||||
- (void)needsToInstallConnectMobile;
|
||||
@end
|
||||
|
||||
/// @brief Conforming to the IQDeviceEventDelegate protocol indicates that an
|
||||
/// object handles ConnectIQ device status events.
|
||||
@protocol IQDeviceEventDelegate <NSObject>
|
||||
@optional
|
||||
/// @brief Called by the ConnectIQ SDK when an IQDevice's connection status has
|
||||
/// changed.
|
||||
///
|
||||
/// @param device The IQDevice whose status changed.
|
||||
/// @param status The new status of the device.
|
||||
- (void)deviceStatusChanged:(IQDevice *)device status:(IQDeviceStatus)status;
|
||||
@end
|
||||
|
||||
/// @brief Conforming to the IQAppMessageDelegate protocol indicates that an
|
||||
/// object handles messages from ConnectIQ apps on compatible devices.
|
||||
@protocol IQAppMessageDelegate <NSObject>
|
||||
@optional
|
||||
/// @brief Called by the ConnectIQ SDK when a message is received from a device.
|
||||
///
|
||||
/// @param message The message that was received.
|
||||
/// @param app The device app that sent the message.
|
||||
- (void)receivedMessage:(id)message fromApp:(IQApp *)app;
|
||||
@end
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
#pragma mark - CLASS DEFINITION
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
/// @brief The root of the ConnectIQ SDK API.
|
||||
@interface ConnectIQ : NSObject
|
||||
|
||||
+ (instancetype)new NS_UNAVAILABLE;
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
#pragma mark - SINGLETON ACCESS
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
/// @brief Exposes the single static instance of the ConnectIQ class.
|
||||
///
|
||||
/// @return The single status instance of the ConnectIQ class.
|
||||
+ (ConnectIQ *)sharedInstance;
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
#pragma mark - INITIALIZATION
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
/// @brief Initializes the ConnectIQ SDK with startup parameters necessary for
|
||||
/// its operation.
|
||||
///
|
||||
/// @param urlScheme The URL scheme for this companion app. When Garmin Connect
|
||||
/// Mobile is launched, it will return to the companion app by
|
||||
/// launching a URL with this scheme.
|
||||
/// @param delegate The delegate that the SDK will use for notifying the
|
||||
/// companion app about events that require user input. If this
|
||||
/// is nil, the SDK's default UI will be used.
|
||||
- (void)initializeWithUrlScheme:(NSString *)urlScheme uiOverrideDelegate:(id<IQUIOverrideDelegate>)delegate;
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
#pragma mark - EXTERNAL LAUNCHING
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
/// @brief Launches the Apple App Store page for the Garmin Connect Mobile app.
|
||||
/// The companion app should only call this in response to a
|
||||
/// needsToInstallConnectMobile event that gets triggered on the
|
||||
/// IQUIOverrideDelegate.
|
||||
- (void)showAppStoreForConnectMobile;
|
||||
|
||||
/// @brief Launches Garmin Connect Mobile for the purpose of retrieving a list of
|
||||
/// ConnectIQ-compatible devices.
|
||||
///
|
||||
/// Once the user has chosen which ConnectIQ devices to share with the
|
||||
/// companion app, GCM will return those devices to the companion app by
|
||||
/// opening a URL with the scheme registered in
|
||||
/// initializeWithUrlScheme:uiOverrideDelegate:.
|
||||
///
|
||||
/// The companion app should handle this URL by passing it in to the
|
||||
/// parseDeviceSelectionResponseFromURL: method to get the list of devices
|
||||
/// that the user permitted the companion app to communicate with.
|
||||
- (void)showConnectIQDeviceSelection;
|
||||
|
||||
/// @brief Parses a URL opened from Garmin Connect Mobile into a list of devices.
|
||||
///
|
||||
/// @param url The URL to parse.
|
||||
///
|
||||
/// @return An array of IQDevice objects representing the ConnectIQ-compatible
|
||||
/// devices that the user allowed GCM to share with the companion app.
|
||||
///
|
||||
/// @seealso showConnectIQDeviceSelection
|
||||
- (NSArray *)parseDeviceSelectionResponseFromURL:(NSURL *)url;
|
||||
|
||||
/// @brief Launches Garmin Connect Mobile and shows the ConnectIQ app store page
|
||||
/// for the given app.
|
||||
///
|
||||
/// The companion app should call this if the user would like to manage
|
||||
/// the app on the device, such as to install, upgrade, uninstall, or
|
||||
/// modify settings.
|
||||
///
|
||||
/// @param app The app to show the ConnectIQ app store page for.
|
||||
- (void)showConnectIQStoreForApp:(IQApp *)app;
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
#pragma mark - DEVICE MANAGEMENT
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
/// @brief Registers an object as a listener for ConnectIQ device status events.
|
||||
///
|
||||
/// A device may have multiple device event listeners if this method is
|
||||
/// called more than once.
|
||||
///
|
||||
/// @param device A device to listen for status events from.
|
||||
/// @param delegate The listener which will receive status events for this device.
|
||||
- (void)registerForDeviceEvents:(IQDevice *)device delegate:(id<IQDeviceEventDelegate>)delegate;
|
||||
|
||||
/// @brief Unregisters a listener for a specific device.
|
||||
///
|
||||
/// @param device The device to unregister the listener for.
|
||||
/// @param delegate The listener to remove from the device.
|
||||
- (void)unregisterForDeviceEvents:(IQDevice *)device delegate:(id<IQDeviceEventDelegate>)delegate;
|
||||
|
||||
/// @brief Unregisters the specified listener from all devices for which it had
|
||||
/// previously been registered.
|
||||
///
|
||||
/// @param delegate The listener to unregister.
|
||||
- (void)unregisterForAllDeviceEvents:(id<IQDeviceEventDelegate>)delegate;
|
||||
|
||||
/// @brief Gets the current connection status of a device.
|
||||
///
|
||||
/// The device must have been registered for event notifications by
|
||||
/// calling registerForDeviceEvents:delegate: or this method will return
|
||||
/// IQDeviceStatus_InvalidDevice.
|
||||
///
|
||||
/// @param device The device to get the status for.
|
||||
///
|
||||
/// @return The device's current connection status.
|
||||
- (IQDeviceStatus)getDeviceStatus:(IQDevice *)device;
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
#pragma mark - APP MANAGEMENT
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
/// @brief Begins getting the status of an app on a device. This method returns
|
||||
/// immediately.
|
||||
///
|
||||
/// @param app The IQApp to get the status for.
|
||||
/// @param completion The completion block that will be triggered when the device
|
||||
/// status operation is complete.
|
||||
- (void)getAppStatus:(IQApp *)app completion:(void(^)(IQAppStatus *appStatus))completion;
|
||||
|
||||
/// @brief Registers an object as a listener for ConnectIQ messages from an app
|
||||
/// on a device.
|
||||
///
|
||||
/// An app may have multiple message listeners if this method is called
|
||||
/// more than once.
|
||||
///
|
||||
/// @param app The app to listen for messages from.
|
||||
/// @param delegate The listener which will receive messages for this app.
|
||||
- (void)registerForAppMessages:(IQApp *)app delegate:(id<IQAppMessageDelegate>)delegate;
|
||||
|
||||
/// @brief Unregisters a listener for a specific app.
|
||||
///
|
||||
/// @param app The app to unregister a listener for.
|
||||
/// @param delegate The listener to remove from the app.
|
||||
- (void)unregisterForAppMessages:(IQApp *)app delegate:(id<IQAppMessageDelegate>)delegate;
|
||||
|
||||
/// @brief Unregisters all previously registered apps for a specific listener.
|
||||
///
|
||||
/// @param delegate The listener to unregister.
|
||||
- (void)unregisterForAllAppMessages:(id<IQAppMessageDelegate>)delegate;
|
||||
|
||||
/// @brief Begins sending a message to an app. This method returns immediately.
|
||||
///
|
||||
/// @param message The message to send to the app. This message must be one of
|
||||
/// the following types: NSString, NSNumber, NSNull, NSArray,
|
||||
/// or NSDictionary. Arrays and dictionaries may be nested.
|
||||
/// @param app The app to send the message to.
|
||||
/// @param progress A progress block that will be triggered periodically
|
||||
/// throughout the transfer. This is guaranteed to be triggered
|
||||
/// at least once.
|
||||
/// @param completion A completion block that will be triggered when the send
|
||||
/// message operation is complete.
|
||||
- (void)sendMessage:(id)message toApp:(IQApp *)app progress:(IQSendMessageProgress)progress completion:(IQSendMessageCompletion)completion;
|
||||
|
||||
/// @brief Sends an open app request message request to the device. This method returns immediately.
|
||||
///
|
||||
/// @param app The app to open.
|
||||
/// @param completion A completion block that will be triggered when the send
|
||||
/// message operation is complete.
|
||||
- (void)openAppRequest:(IQApp *)app completion:(IQSendMessageCompletion)completion;
|
||||
|
||||
// TODO *** Holding off on documenting this until this method actually works.
|
||||
- (void)sendImage:(NSData *)bitmap toApp:(IQApp *)app progress:(IQSendMessageProgress)progress completion:(IQSendMessageCompletion)completion;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,34 @@
|
||||
//
|
||||
// IQApp.h
|
||||
// ConnectIQ
|
||||
//
|
||||
// Copyright (c) 2014 Garmin. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "IQDevice.h"
|
||||
#import "IQAppStatus.h"
|
||||
|
||||
/// @brief Represents an instance of a ConnectIQ app that is installed on a
|
||||
/// Garmin device.
|
||||
@interface IQApp : NSObject <NSSecureCoding>
|
||||
|
||||
/// @brief The unique identifier for this app.
|
||||
@property (nonatomic, readonly) NSUUID *uuid;
|
||||
|
||||
/// @brief The unique identifier for this app in the store.
|
||||
@property (nonatomic, readonly) NSUUID *storeUuid;
|
||||
|
||||
/// @brief The device that this app is installed on.
|
||||
@property (nonatomic, readonly) IQDevice *device;
|
||||
|
||||
/// @brief Creates a new app instance.
|
||||
///
|
||||
/// @param uuid The UUID of the app to create.
|
||||
/// @param storeUuid The store UUID of the app to create.
|
||||
/// @param device The device the app to create is installed on.
|
||||
///
|
||||
/// @return A new IQApp instance with the appropriate values set.
|
||||
+ (IQApp *)appWithUUID:(NSUUID *)uuid storeUuid:(NSUUID *)storeUuid device:(IQDevice *)device;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,20 @@
|
||||
//
|
||||
// IQAppStatus.h
|
||||
// ConnectIQ
|
||||
//
|
||||
// Copyright (c) 2014 Garmin. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
/// @brief Represents the current status of an app on a Garmin device.
|
||||
@interface IQAppStatus : NSObject
|
||||
|
||||
/// @brief YES if the app is installed on the device, NO if it isn't.
|
||||
@property (nonatomic, readonly) BOOL isInstalled;
|
||||
|
||||
/// @brief The version of the app that is currently installed on the device. If
|
||||
/// the app is not installed, this value is unused.
|
||||
@property (nonatomic, readonly) uint16_t version;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,63 @@
|
||||
//
|
||||
// IQConstants.h
|
||||
// ConnectIQ
|
||||
//
|
||||
// Copyright (c) 2014 Garmin. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
/// @brief The current version of the ConnectIQ SDK.
|
||||
extern int const IQSDKVersion;
|
||||
|
||||
/// @brief The bundle identifier for the Garmin Connect Mobile app.
|
||||
extern NSString * const IQGCMBundle;
|
||||
|
||||
/// @brief The result of a SendMessage operation
|
||||
typedef NS_ENUM(NSInteger, IQSendMessageResult){
|
||||
///! @brief The message was sent successfully.
|
||||
IQSendMessageResult_Success,
|
||||
|
||||
/// @brief The message failed to send due to an unknown error.
|
||||
IQSendMessageResult_Failure_Unknown,
|
||||
|
||||
/// @brief The message failed to send. There was an error within the SDK or
|
||||
/// on the device.
|
||||
IQSendMessageResult_Failure_InternalError,
|
||||
|
||||
/// @brief The message failed to send. The device is not available right now.
|
||||
IQSendMessageResult_Failure_DeviceNotAvailable,
|
||||
|
||||
/// @brief The message failed to send. The app is not installed on the
|
||||
/// device.
|
||||
IQSendMessageResult_Failure_AppNotFound,
|
||||
|
||||
/// @brief The message failed to send. The device is busy and cannot receive
|
||||
/// the message right now.
|
||||
IQSendMessageResult_Failure_DeviceIsBusy,
|
||||
|
||||
/// @brief The message failed to send. The message contained an unsupported
|
||||
/// type.
|
||||
IQSendMessageResult_Failure_UnsupportedType,
|
||||
|
||||
/// @brief The message failed to send. The device does not have enough memory
|
||||
/// to receive the message.
|
||||
IQSendMessageResult_Failure_InsufficientMemory,
|
||||
|
||||
/// @brief The message failed to send. The connection timed out while sending
|
||||
/// the message.
|
||||
IQSendMessageResult_Failure_Timeout,
|
||||
|
||||
/// @brief The message failed to send and was retried, but could not complete
|
||||
/// after a number of tries.
|
||||
IQSendMessageResult_Failure_MaxRetries,
|
||||
|
||||
/// @brief The message was received by the device but it chose not to display
|
||||
/// a message prompt, ignoring the message.
|
||||
IQSendMessageResult_Failure_PromptNotDisplayed,
|
||||
|
||||
/// @brief The message was received by the device but the app to open
|
||||
/// was already running on the device.
|
||||
IQSendMessageResult_Failure_AppAlreadyRunning,
|
||||
};
|
||||
NSString *NSStringFromSendMessageResult(IQSendMessageResult value);
|
||||
@@ -0,0 +1,61 @@
|
||||
//
|
||||
// IQDevice.h
|
||||
// ConnectIQ
|
||||
//
|
||||
// Copyright (c) 2014 Garmin. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <CoreBluetooth/CoreBluetooth.h>
|
||||
|
||||
/// @brief The current status of an IQDevice.
|
||||
typedef NS_ENUM(NSInteger, IQDeviceStatus){
|
||||
/// @brief No device with this UUID has been registered for status events
|
||||
/// the SDK.
|
||||
IQDeviceStatus_InvalidDevice,
|
||||
|
||||
/// @brief Bluetooth is either powered off or resetting.
|
||||
IQDeviceStatus_BluetoothNotReady,
|
||||
|
||||
/// @brief This device could not be found by iOS. Perhaps the user removed
|
||||
/// the device?
|
||||
IQDeviceStatus_NotFound,
|
||||
|
||||
/// @brief The device is recognized by iOS, but it is not currently
|
||||
/// connected.
|
||||
IQDeviceStatus_NotConnected,
|
||||
|
||||
/// @brief The device is connected and ready to communicate.
|
||||
IQDeviceStatus_Connected,
|
||||
};
|
||||
|
||||
/// @brief Represents a ConnectIQ-compatible Garmin device.
|
||||
@interface IQDevice : NSObject <NSSecureCoding>
|
||||
|
||||
/// @brief The unique identifier for this device.
|
||||
@property (nonatomic, readonly) NSUUID *uuid;
|
||||
|
||||
/// @brief The model name of the device provided by Garmin Connect Mobile.
|
||||
@property (nonatomic, readonly) NSString *modelName;
|
||||
|
||||
/// @brief The friendly name of the device, set by the user and provided by
|
||||
/// Garmin Connect Mobile.
|
||||
@property (nonatomic, readonly) NSString *friendlyName;
|
||||
|
||||
/// @brief Creates a new device instance.
|
||||
///
|
||||
/// @param uuid The UUID of the device to create.
|
||||
/// @param modelName The model name of the device to create.
|
||||
/// @param friendlyName The friendly name of the device to create.
|
||||
///
|
||||
/// @return A new IQDevice instance with the appropriate values set.
|
||||
+ (IQDevice *)deviceWithId:(NSUUID *)uuid modelName:(NSString *)modelName friendlyName:(NSString *)friendlyName;
|
||||
|
||||
/// @brief Creates a new device instance by copying another device's values.
|
||||
///
|
||||
/// @param device The device to copy values from.
|
||||
///
|
||||
/// @return A new IQDevice instance with all values copied.
|
||||
- (instancetype)initWithDevice:(IQDevice *)device;
|
||||
|
||||
@end
|
||||
Binary file not shown.
@@ -0,0 +1,6 @@
|
||||
framework module ConnectIQ {
|
||||
umbrella header "ConnectIQ.h"
|
||||
|
||||
export *
|
||||
module * { export * }
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,237 @@
|
||||
//
|
||||
// ConnectIQ.h
|
||||
// ConnectIQ
|
||||
//
|
||||
// Copyright (c) 2014 Garmin. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "IQConstants.h"
|
||||
#import "IQDevice.h"
|
||||
#import "IQApp.h"
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
#pragma mark - PUBLIC TYPES
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
/// @brief SendMessage progress callback block
|
||||
///
|
||||
/// @param sentBytes The number of bytes that have been successfully transferred
|
||||
/// to the device so far for this connection.
|
||||
/// @param totalBytes The total number of bytes to transfer for this connection.
|
||||
typedef void (^IQSendMessageProgress)(uint32_t sentBytes, uint32_t totalBytes);
|
||||
|
||||
/// @brief SendMessage completion callback block
|
||||
///
|
||||
/// @param result The result of the SendMessage operation.
|
||||
typedef void (^IQSendMessageCompletion)(IQSendMessageResult result);
|
||||
|
||||
/// @brief Conforming to the IQUIOverrideDelegate protocol indicates that an
|
||||
/// object handles one or more events triggered by the ConnectIQ SDK that
|
||||
/// require user input.
|
||||
@protocol IQUIOverrideDelegate <NSObject>
|
||||
@optional
|
||||
/// @brief Called by the ConnectIQ SDK when an action has been requested that
|
||||
/// requires Garmin Connect Mobile to be installed.
|
||||
///
|
||||
/// The receiver should choose whether or not to launch the Apple App
|
||||
/// Store page for GCM, ideally by presenting the user with a choice.
|
||||
///
|
||||
/// If the receiver of this message decides to install GCM, it must call
|
||||
/// showAppStoreForConnectMobile.
|
||||
- (void)needsToInstallConnectMobile;
|
||||
@end
|
||||
|
||||
/// @brief Conforming to the IQDeviceEventDelegate protocol indicates that an
|
||||
/// object handles ConnectIQ device status events.
|
||||
@protocol IQDeviceEventDelegate <NSObject>
|
||||
@optional
|
||||
/// @brief Called by the ConnectIQ SDK when an IQDevice's connection status has
|
||||
/// changed.
|
||||
///
|
||||
/// @param device The IQDevice whose status changed.
|
||||
/// @param status The new status of the device.
|
||||
- (void)deviceStatusChanged:(IQDevice *)device status:(IQDeviceStatus)status;
|
||||
@end
|
||||
|
||||
/// @brief Conforming to the IQAppMessageDelegate protocol indicates that an
|
||||
/// object handles messages from ConnectIQ apps on compatible devices.
|
||||
@protocol IQAppMessageDelegate <NSObject>
|
||||
@optional
|
||||
/// @brief Called by the ConnectIQ SDK when a message is received from a device.
|
||||
///
|
||||
/// @param message The message that was received.
|
||||
/// @param app The device app that sent the message.
|
||||
- (void)receivedMessage:(id)message fromApp:(IQApp *)app;
|
||||
@end
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
#pragma mark - CLASS DEFINITION
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
/// @brief The root of the ConnectIQ SDK API.
|
||||
@interface ConnectIQ : NSObject
|
||||
|
||||
+ (instancetype)new NS_UNAVAILABLE;
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
#pragma mark - SINGLETON ACCESS
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
/// @brief Exposes the single static instance of the ConnectIQ class.
|
||||
///
|
||||
/// @return The single status instance of the ConnectIQ class.
|
||||
+ (ConnectIQ *)sharedInstance;
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
#pragma mark - INITIALIZATION
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
/// @brief Initializes the ConnectIQ SDK with startup parameters necessary for
|
||||
/// its operation.
|
||||
///
|
||||
/// @param urlScheme The URL scheme for this companion app. When Garmin Connect
|
||||
/// Mobile is launched, it will return to the companion app by
|
||||
/// launching a URL with this scheme.
|
||||
/// @param delegate The delegate that the SDK will use for notifying the
|
||||
/// companion app about events that require user input. If this
|
||||
/// is nil, the SDK's default UI will be used.
|
||||
- (void)initializeWithUrlScheme:(NSString *)urlScheme uiOverrideDelegate:(id<IQUIOverrideDelegate>)delegate;
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
#pragma mark - EXTERNAL LAUNCHING
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
/// @brief Launches the Apple App Store page for the Garmin Connect Mobile app.
|
||||
/// The companion app should only call this in response to a
|
||||
/// needsToInstallConnectMobile event that gets triggered on the
|
||||
/// IQUIOverrideDelegate.
|
||||
- (void)showAppStoreForConnectMobile;
|
||||
|
||||
/// @brief Launches Garmin Connect Mobile for the purpose of retrieving a list of
|
||||
/// ConnectIQ-compatible devices.
|
||||
///
|
||||
/// Once the user has chosen which ConnectIQ devices to share with the
|
||||
/// companion app, GCM will return those devices to the companion app by
|
||||
/// opening a URL with the scheme registered in
|
||||
/// initializeWithUrlScheme:uiOverrideDelegate:.
|
||||
///
|
||||
/// The companion app should handle this URL by passing it in to the
|
||||
/// parseDeviceSelectionResponseFromURL: method to get the list of devices
|
||||
/// that the user permitted the companion app to communicate with.
|
||||
- (void)showConnectIQDeviceSelection;
|
||||
|
||||
/// @brief Parses a URL opened from Garmin Connect Mobile into a list of devices.
|
||||
///
|
||||
/// @param url The URL to parse.
|
||||
///
|
||||
/// @return An array of IQDevice objects representing the ConnectIQ-compatible
|
||||
/// devices that the user allowed GCM to share with the companion app.
|
||||
///
|
||||
/// @seealso showConnectIQDeviceSelection
|
||||
- (NSArray *)parseDeviceSelectionResponseFromURL:(NSURL *)url;
|
||||
|
||||
/// @brief Launches Garmin Connect Mobile and shows the ConnectIQ app store page
|
||||
/// for the given app.
|
||||
///
|
||||
/// The companion app should call this if the user would like to manage
|
||||
/// the app on the device, such as to install, upgrade, uninstall, or
|
||||
/// modify settings.
|
||||
///
|
||||
/// @param app The app to show the ConnectIQ app store page for.
|
||||
- (void)showConnectIQStoreForApp:(IQApp *)app;
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
#pragma mark - DEVICE MANAGEMENT
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
/// @brief Registers an object as a listener for ConnectIQ device status events.
|
||||
///
|
||||
/// A device may have multiple device event listeners if this method is
|
||||
/// called more than once.
|
||||
///
|
||||
/// @param device A device to listen for status events from.
|
||||
/// @param delegate The listener which will receive status events for this device.
|
||||
- (void)registerForDeviceEvents:(IQDevice *)device delegate:(id<IQDeviceEventDelegate>)delegate;
|
||||
|
||||
/// @brief Unregisters a listener for a specific device.
|
||||
///
|
||||
/// @param device The device to unregister the listener for.
|
||||
/// @param delegate The listener to remove from the device.
|
||||
- (void)unregisterForDeviceEvents:(IQDevice *)device delegate:(id<IQDeviceEventDelegate>)delegate;
|
||||
|
||||
/// @brief Unregisters the specified listener from all devices for which it had
|
||||
/// previously been registered.
|
||||
///
|
||||
/// @param delegate The listener to unregister.
|
||||
- (void)unregisterForAllDeviceEvents:(id<IQDeviceEventDelegate>)delegate;
|
||||
|
||||
/// @brief Gets the current connection status of a device.
|
||||
///
|
||||
/// The device must have been registered for event notifications by
|
||||
/// calling registerForDeviceEvents:delegate: or this method will return
|
||||
/// IQDeviceStatus_InvalidDevice.
|
||||
///
|
||||
/// @param device The device to get the status for.
|
||||
///
|
||||
/// @return The device's current connection status.
|
||||
- (IQDeviceStatus)getDeviceStatus:(IQDevice *)device;
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
#pragma mark - APP MANAGEMENT
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
/// @brief Begins getting the status of an app on a device. This method returns
|
||||
/// immediately.
|
||||
///
|
||||
/// @param app The IQApp to get the status for.
|
||||
/// @param completion The completion block that will be triggered when the device
|
||||
/// status operation is complete.
|
||||
- (void)getAppStatus:(IQApp *)app completion:(void(^)(IQAppStatus *appStatus))completion;
|
||||
|
||||
/// @brief Registers an object as a listener for ConnectIQ messages from an app
|
||||
/// on a device.
|
||||
///
|
||||
/// An app may have multiple message listeners if this method is called
|
||||
/// more than once.
|
||||
///
|
||||
/// @param app The app to listen for messages from.
|
||||
/// @param delegate The listener which will receive messages for this app.
|
||||
- (void)registerForAppMessages:(IQApp *)app delegate:(id<IQAppMessageDelegate>)delegate;
|
||||
|
||||
/// @brief Unregisters a listener for a specific app.
|
||||
///
|
||||
/// @param app The app to unregister a listener for.
|
||||
/// @param delegate The listener to remove from the app.
|
||||
- (void)unregisterForAppMessages:(IQApp *)app delegate:(id<IQAppMessageDelegate>)delegate;
|
||||
|
||||
/// @brief Unregisters all previously registered apps for a specific listener.
|
||||
///
|
||||
/// @param delegate The listener to unregister.
|
||||
- (void)unregisterForAllAppMessages:(id<IQAppMessageDelegate>)delegate;
|
||||
|
||||
/// @brief Begins sending a message to an app. This method returns immediately.
|
||||
///
|
||||
/// @param message The message to send to the app. This message must be one of
|
||||
/// the following types: NSString, NSNumber, NSNull, NSArray,
|
||||
/// or NSDictionary. Arrays and dictionaries may be nested.
|
||||
/// @param app The app to send the message to.
|
||||
/// @param progress A progress block that will be triggered periodically
|
||||
/// throughout the transfer. This is guaranteed to be triggered
|
||||
/// at least once.
|
||||
/// @param completion A completion block that will be triggered when the send
|
||||
/// message operation is complete.
|
||||
- (void)sendMessage:(id)message toApp:(IQApp *)app progress:(IQSendMessageProgress)progress completion:(IQSendMessageCompletion)completion;
|
||||
|
||||
/// @brief Sends an open app request message request to the device. This method returns immediately.
|
||||
///
|
||||
/// @param app The app to open.
|
||||
/// @param completion A completion block that will be triggered when the send
|
||||
/// message operation is complete.
|
||||
- (void)openAppRequest:(IQApp *)app completion:(IQSendMessageCompletion)completion;
|
||||
|
||||
// TODO *** Holding off on documenting this until this method actually works.
|
||||
- (void)sendImage:(NSData *)bitmap toApp:(IQApp *)app progress:(IQSendMessageProgress)progress completion:(IQSendMessageCompletion)completion;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,34 @@
|
||||
//
|
||||
// IQApp.h
|
||||
// ConnectIQ
|
||||
//
|
||||
// Copyright (c) 2014 Garmin. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "IQDevice.h"
|
||||
#import "IQAppStatus.h"
|
||||
|
||||
/// @brief Represents an instance of a ConnectIQ app that is installed on a
|
||||
/// Garmin device.
|
||||
@interface IQApp : NSObject <NSSecureCoding>
|
||||
|
||||
/// @brief The unique identifier for this app.
|
||||
@property (nonatomic, readonly) NSUUID *uuid;
|
||||
|
||||
/// @brief The unique identifier for this app in the store.
|
||||
@property (nonatomic, readonly) NSUUID *storeUuid;
|
||||
|
||||
/// @brief The device that this app is installed on.
|
||||
@property (nonatomic, readonly) IQDevice *device;
|
||||
|
||||
/// @brief Creates a new app instance.
|
||||
///
|
||||
/// @param uuid The UUID of the app to create.
|
||||
/// @param storeUuid The store UUID of the app to create.
|
||||
/// @param device The device the app to create is installed on.
|
||||
///
|
||||
/// @return A new IQApp instance with the appropriate values set.
|
||||
+ (IQApp *)appWithUUID:(NSUUID *)uuid storeUuid:(NSUUID *)storeUuid device:(IQDevice *)device;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,20 @@
|
||||
//
|
||||
// IQAppStatus.h
|
||||
// ConnectIQ
|
||||
//
|
||||
// Copyright (c) 2014 Garmin. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
/// @brief Represents the current status of an app on a Garmin device.
|
||||
@interface IQAppStatus : NSObject
|
||||
|
||||
/// @brief YES if the app is installed on the device, NO if it isn't.
|
||||
@property (nonatomic, readonly) BOOL isInstalled;
|
||||
|
||||
/// @brief The version of the app that is currently installed on the device. If
|
||||
/// the app is not installed, this value is unused.
|
||||
@property (nonatomic, readonly) uint16_t version;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,63 @@
|
||||
//
|
||||
// IQConstants.h
|
||||
// ConnectIQ
|
||||
//
|
||||
// Copyright (c) 2014 Garmin. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
/// @brief The current version of the ConnectIQ SDK.
|
||||
extern int const IQSDKVersion;
|
||||
|
||||
/// @brief The bundle identifier for the Garmin Connect Mobile app.
|
||||
extern NSString * const IQGCMBundle;
|
||||
|
||||
/// @brief The result of a SendMessage operation
|
||||
typedef NS_ENUM(NSInteger, IQSendMessageResult){
|
||||
///! @brief The message was sent successfully.
|
||||
IQSendMessageResult_Success,
|
||||
|
||||
/// @brief The message failed to send due to an unknown error.
|
||||
IQSendMessageResult_Failure_Unknown,
|
||||
|
||||
/// @brief The message failed to send. There was an error within the SDK or
|
||||
/// on the device.
|
||||
IQSendMessageResult_Failure_InternalError,
|
||||
|
||||
/// @brief The message failed to send. The device is not available right now.
|
||||
IQSendMessageResult_Failure_DeviceNotAvailable,
|
||||
|
||||
/// @brief The message failed to send. The app is not installed on the
|
||||
/// device.
|
||||
IQSendMessageResult_Failure_AppNotFound,
|
||||
|
||||
/// @brief The message failed to send. The device is busy and cannot receive
|
||||
/// the message right now.
|
||||
IQSendMessageResult_Failure_DeviceIsBusy,
|
||||
|
||||
/// @brief The message failed to send. The message contained an unsupported
|
||||
/// type.
|
||||
IQSendMessageResult_Failure_UnsupportedType,
|
||||
|
||||
/// @brief The message failed to send. The device does not have enough memory
|
||||
/// to receive the message.
|
||||
IQSendMessageResult_Failure_InsufficientMemory,
|
||||
|
||||
/// @brief The message failed to send. The connection timed out while sending
|
||||
/// the message.
|
||||
IQSendMessageResult_Failure_Timeout,
|
||||
|
||||
/// @brief The message failed to send and was retried, but could not complete
|
||||
/// after a number of tries.
|
||||
IQSendMessageResult_Failure_MaxRetries,
|
||||
|
||||
/// @brief The message was received by the device but it chose not to display
|
||||
/// a message prompt, ignoring the message.
|
||||
IQSendMessageResult_Failure_PromptNotDisplayed,
|
||||
|
||||
/// @brief The message was received by the device but the app to open
|
||||
/// was already running on the device.
|
||||
IQSendMessageResult_Failure_AppAlreadyRunning,
|
||||
};
|
||||
NSString *NSStringFromSendMessageResult(IQSendMessageResult value);
|
||||
@@ -0,0 +1,61 @@
|
||||
//
|
||||
// IQDevice.h
|
||||
// ConnectIQ
|
||||
//
|
||||
// Copyright (c) 2014 Garmin. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <CoreBluetooth/CoreBluetooth.h>
|
||||
|
||||
/// @brief The current status of an IQDevice.
|
||||
typedef NS_ENUM(NSInteger, IQDeviceStatus){
|
||||
/// @brief No device with this UUID has been registered for status events
|
||||
/// the SDK.
|
||||
IQDeviceStatus_InvalidDevice,
|
||||
|
||||
/// @brief Bluetooth is either powered off or resetting.
|
||||
IQDeviceStatus_BluetoothNotReady,
|
||||
|
||||
/// @brief This device could not be found by iOS. Perhaps the user removed
|
||||
/// the device?
|
||||
IQDeviceStatus_NotFound,
|
||||
|
||||
/// @brief The device is recognized by iOS, but it is not currently
|
||||
/// connected.
|
||||
IQDeviceStatus_NotConnected,
|
||||
|
||||
/// @brief The device is connected and ready to communicate.
|
||||
IQDeviceStatus_Connected,
|
||||
};
|
||||
|
||||
/// @brief Represents a ConnectIQ-compatible Garmin device.
|
||||
@interface IQDevice : NSObject <NSSecureCoding>
|
||||
|
||||
/// @brief The unique identifier for this device.
|
||||
@property (nonatomic, readonly) NSUUID *uuid;
|
||||
|
||||
/// @brief The model name of the device provided by Garmin Connect Mobile.
|
||||
@property (nonatomic, readonly) NSString *modelName;
|
||||
|
||||
/// @brief The friendly name of the device, set by the user and provided by
|
||||
/// Garmin Connect Mobile.
|
||||
@property (nonatomic, readonly) NSString *friendlyName;
|
||||
|
||||
/// @brief Creates a new device instance.
|
||||
///
|
||||
/// @param uuid The UUID of the device to create.
|
||||
/// @param modelName The model name of the device to create.
|
||||
/// @param friendlyName The friendly name of the device to create.
|
||||
///
|
||||
/// @return A new IQDevice instance with the appropriate values set.
|
||||
+ (IQDevice *)deviceWithId:(NSUUID *)uuid modelName:(NSString *)modelName friendlyName:(NSString *)friendlyName;
|
||||
|
||||
/// @brief Creates a new device instance by copying another device's values.
|
||||
///
|
||||
/// @param device The device to copy values from.
|
||||
///
|
||||
/// @return A new IQDevice instance with all values copied.
|
||||
- (instancetype)initWithDevice:(IQDevice *)device;
|
||||
|
||||
@end
|
||||
Binary file not shown.
@@ -0,0 +1,6 @@
|
||||
framework module ConnectIQ {
|
||||
umbrella header "ConnectIQ.h"
|
||||
|
||||
export *
|
||||
module * { export * }
|
||||
}
|
||||
@@ -0,0 +1,830 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>files</key>
|
||||
<dict>
|
||||
<key>Headers/ConnectIQ.h</key>
|
||||
<data>
|
||||
F1hICh90Ex4ADEjYLcSi0YPhrPA=
|
||||
</data>
|
||||
<key>Headers/IQApp.h</key>
|
||||
<data>
|
||||
R7+SmeArgBACIBWHRnEAugyFHKE=
|
||||
</data>
|
||||
<key>Headers/IQAppStatus.h</key>
|
||||
<data>
|
||||
WnybOSMMVqCKGns0rEz9C3EfQOg=
|
||||
</data>
|
||||
<key>Headers/IQConstants.h</key>
|
||||
<data>
|
||||
eI7keKSkaajUZACnuMhgtV1RuBA=
|
||||
</data>
|
||||
<key>Headers/IQDevice.h</key>
|
||||
<data>
|
||||
bl545C/cu0mw2KlRmzojKmHPom0=
|
||||
</data>
|
||||
<key>Info.plist</key>
|
||||
<data>
|
||||
sMY09qXRBL/m1OGNWejLjfNg04w=
|
||||
</data>
|
||||
<key>Modules/module.modulemap</key>
|
||||
<data>
|
||||
SSRVAtIAdFmowQqE4HzOpWYLubg=
|
||||
</data>
|
||||
<key>ar.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
1CDTE/Qaf1Z/HuhSt9CUnwitv4M=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>cs.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
/jkyQ77G2Xd9wy6QptBphGNbtCY=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>da.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
FYi0wjOu/Hw//Qe96yqxSb9yClc=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>de.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
MitzVbGhXhTLjPvw9vuWcQQa50Q=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>el.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
n82gLcjjjHszaroTFeJUvSrrc0o=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>en.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
hcxxLyrTI+aElXlPc5dwr7jdqwc=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>es.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
ff8DVQtNhO8pF7HFnXjh8foHXbo=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>fi.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
R9cr8yqJmu91Xz31tGyprGR3t/s=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>fr.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
PwFmqFeRTcjdHmkXYrPzNVYoe5o=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>he.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
/jPUgFtYbbyELG5DZ3Sjoi/If9w=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>hr.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
H2GtdTeORRPCnogvpWY69Dg9uME=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>hu.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
QIimMhNyYmqp4ZW01hfj554WAMg=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>id.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
2/54a0gkcVuk1I3m4ulDAXOLL5o=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>it.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
hNIKYIcP/87e6g7AUP+zKRtJ52M=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>ja.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
0iU2PbJ/3xgXMZ20ffsqaWpxKWc=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>ko.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
ERH8oHR9H9jMHjP0EAgaTtVhnX4=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>ms.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
DkbQA2+v/qSgQWma/fg3647Bkqs=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>nb.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
T3zFOvuvrJt5Vnmfqt2Mf/du8as=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>nl.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
t9PD5JEbfoSLaQ7f8M2cLghOReI=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>pl.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
wfTnhBccAm6JfwH/JkZKNRKTUAU=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>pt-PT.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
7yXkcZEpJ4UiRHAzhK+vw/Q857Y=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>pt.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
tZPncsQs8weCDJa03AKLpijXSUw=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>ru.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
Ct+byJ3rWeigvg0q6rB/kQaR+yE=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>sk.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
1yTM1nAsAYpSH7NrYU6/nFlqk5E=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>sv.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
i84z6vuHLrFpO0qZ2V0zYjixIws=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>th.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
oW5npy+pDJM1wUOgTkw9FY1Ave4=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>tr.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
76rD7PLrQMiT5YTlI8IjEFgsiU4=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>zh-Hans.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
DNlMxUKypOvKArzi7ioJUiFfFXg=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>zh-Hant.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
U6I+uL07KIv2b77w0c0glaJlhMg=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>files2</key>
|
||||
<dict>
|
||||
<key>Headers/ConnectIQ.h</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
F1hICh90Ex4ADEjYLcSi0YPhrPA=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
ABtgvHbvmly4QpZO/KmmrwYkL0N+AqV3gXdPVrseysY=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Headers/IQApp.h</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
R7+SmeArgBACIBWHRnEAugyFHKE=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
X4vXt0sO9gxQNzQalIaLqMpSGNRC9ue2USDcfjBYkec=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Headers/IQAppStatus.h</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
WnybOSMMVqCKGns0rEz9C3EfQOg=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
tg9qNXtTmFUvNoJtq7O/aEXBNngcGENVRhvxLJ8C/xo=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Headers/IQConstants.h</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
eI7keKSkaajUZACnuMhgtV1RuBA=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
bqDpm8yikc2FIqaSUHcLqPY6TPXLlXSUo+Dl9NUYwmA=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Headers/IQDevice.h</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
bl545C/cu0mw2KlRmzojKmHPom0=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
4N4+64IHeb9iBwyziNxo0SMuCM75ez9Em4UfmtgtTHA=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Modules/module.modulemap</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
SSRVAtIAdFmowQqE4HzOpWYLubg=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
lQGjVO5Q0wfztjETCwDkwAkQ7nZInCgWdStnHL3o6Co=
|
||||
</data>
|
||||
</dict>
|
||||
<key>ar.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
1CDTE/Qaf1Z/HuhSt9CUnwitv4M=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
CWyQue2TCS0heGoGbN4ffetM2QZSk7lqgc2Wer2fgTg=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>cs.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
/jkyQ77G2Xd9wy6QptBphGNbtCY=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
1mSn+EYeYcTV1dArgHz7PkmZrV6mHWfnuG5aDa6Y87E=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>da.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
FYi0wjOu/Hw//Qe96yqxSb9yClc=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
yLkvGzd+smkOjicvW/+Oe6wGGyirHS+/YfjuSzyVoMM=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>de.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
MitzVbGhXhTLjPvw9vuWcQQa50Q=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
DFHv7MWBJmyAkOj993NmSFKbS2t8/vtSev603sBUtjI=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>el.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
n82gLcjjjHszaroTFeJUvSrrc0o=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
i4FAK4mi+SgS6oZv8zM74kRZToakn49E8GD7FcJBLoQ=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>en.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
hcxxLyrTI+aElXlPc5dwr7jdqwc=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
vmBi9DFJzFcG0OwaWKSDjgklNi407U8u2pz3EnEENN4=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>es.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
ff8DVQtNhO8pF7HFnXjh8foHXbo=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
z6RjynaWjrRKHmv4sLirc4eXwKOtQdylzj5+TiHpaTc=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>fi.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
R9cr8yqJmu91Xz31tGyprGR3t/s=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
6BI0iPRVWaP63/XFdjLBz6z7DsvvuOoaEAS+mYzrx8E=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>fr.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
PwFmqFeRTcjdHmkXYrPzNVYoe5o=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
geXjZzXre2CRiALecPFBGz4JSJA7MbkDnB4qrEMKNwk=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>he.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
/jPUgFtYbbyELG5DZ3Sjoi/If9w=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
47mcrSx16SFjWPIiN7guCAG0va8NiJ6I5s45tSVEHlY=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>hr.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
H2GtdTeORRPCnogvpWY69Dg9uME=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
4bQvygPax6VBpoFlyS5by1N6otnDMliHu+bWsDaWSQc=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>hu.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
QIimMhNyYmqp4ZW01hfj554WAMg=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
0m2fIyz26vh3RlUqqSXvoNTLovxIixrUyJoL/IDSoVk=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>id.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
2/54a0gkcVuk1I3m4ulDAXOLL5o=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
hQf9SrG7d8aVWsXIbCIxkKEJjbnW1FLvS+MbOI1VtHQ=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>it.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
hNIKYIcP/87e6g7AUP+zKRtJ52M=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
XAbEWX6cicDxGzxGgSx3DhF4rjUHX4LV+dO0X3rUEqc=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>ja.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
0iU2PbJ/3xgXMZ20ffsqaWpxKWc=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
YOqOvZq0WEN4DCoSwc0lcTSRc4C812DqzjIsaid1SHg=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>ko.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
ERH8oHR9H9jMHjP0EAgaTtVhnX4=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
WJyaRCWn1KqmcDeajRnC41MdNrlpbI+1JbPkXhbKrKY=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>ms.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
DkbQA2+v/qSgQWma/fg3647Bkqs=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
gztYxa4Hn58HkKmcUIZI1jCz44IETZeMsqrpZSKxJvc=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>nb.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
T3zFOvuvrJt5Vnmfqt2Mf/du8as=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
Oy6UOwSN+/xPIrthAEvzV8PEn27kfsHpMMLU5w1rww0=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>nl.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
t9PD5JEbfoSLaQ7f8M2cLghOReI=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
XbijhSaZgmsW59Vo9ZEbhDuUQH18fHizWKzsLosiM0o=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>pl.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
wfTnhBccAm6JfwH/JkZKNRKTUAU=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
MQYgqA+Hl03JJ261Q19K5Lt64kSTBP+pfpD+jOVE3AU=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>pt-PT.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
7yXkcZEpJ4UiRHAzhK+vw/Q857Y=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
seINq3QazVameLGOW+pIAtGWLa6NDl5XWRtqnObxywo=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>pt.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
tZPncsQs8weCDJa03AKLpijXSUw=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
GnzdqEuQwORzVCih99bwr79UHIyzXm+zuN5b9m1NrKY=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>ru.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
Ct+byJ3rWeigvg0q6rB/kQaR+yE=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
yCN9s/JXYqsMNZ1icaH4hUwyMQ1NtxOmV6sIAtRd9pc=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>sk.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
1yTM1nAsAYpSH7NrYU6/nFlqk5E=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
OFHDtkGLLSfTuSx8GOTycKDCKOKmX0Wh2QG1CHhRz3I=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>sv.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
i84z6vuHLrFpO0qZ2V0zYjixIws=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
a3Gk+3USOT5uundOXrNCgnbcD0rDo2lkCO7b7+zg2Is=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>th.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
oW5npy+pDJM1wUOgTkw9FY1Ave4=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
qxGqAqRMwm0/dMd0W7DUsvbWb9x65GT+3d1zOQEql1w=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>tr.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
76rD7PLrQMiT5YTlI8IjEFgsiU4=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
Y6TnKQmqO/TAx+0KYqRRG6UOz7I/gM1YmbUwgSfZSQU=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>zh-Hans.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
DNlMxUKypOvKArzi7ioJUiFfFXg=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
BI3m4MTMHuPI4sQKPGeQnxIlBJJrXwgVuR7Ho1Q5o6Y=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>zh-Hant.lproj/IQLocalizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
U6I+uL07KIv2b77w0c0glaJlhMg=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
14dQnjX3pEz2Um4J/fOdQDRe/LSuXxqkg1hEkO8E5ys=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>rules</key>
|
||||
<dict>
|
||||
<key>^.*</key>
|
||||
<true/>
|
||||
<key>^.*\.lproj/</key>
|
||||
<dict>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1000</real>
|
||||
</dict>
|
||||
<key>^.*\.lproj/locversion.plist$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1100</real>
|
||||
</dict>
|
||||
<key>^Base\.lproj/</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>1010</real>
|
||||
</dict>
|
||||
<key>^version.plist$</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>rules2</key>
|
||||
<dict>
|
||||
<key>.*\.dSYM($|/)</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>11</real>
|
||||
</dict>
|
||||
<key>^(.*/)?\.DS_Store$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>2000</real>
|
||||
</dict>
|
||||
<key>^.*</key>
|
||||
<true/>
|
||||
<key>^.*\.lproj/</key>
|
||||
<dict>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1000</real>
|
||||
</dict>
|
||||
<key>^.*\.lproj/locversion.plist$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1100</real>
|
||||
</dict>
|
||||
<key>^Base\.lproj/</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>1010</real>
|
||||
</dict>
|
||||
<key>^Info\.plist$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
<key>^PkgInfo$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
<key>^embedded\.provisionprofile$</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
<key>^version\.plist$</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
47
src/Home.qml
47
src/Home.qml
@@ -9,6 +9,12 @@ import QtMultimedia 5.15
|
||||
|
||||
HomeForm{
|
||||
objectName: "home"
|
||||
background: Rectangle {
|
||||
anchors.fill: parent
|
||||
width: parent.fill
|
||||
height: parent.fill
|
||||
color: settings.theme_background_color
|
||||
}
|
||||
signal start_clicked;
|
||||
signal stop_clicked;
|
||||
signal lap_clicked;
|
||||
@@ -21,6 +27,12 @@ HomeForm{
|
||||
Settings {
|
||||
id: settings
|
||||
property real ui_zoom: 100.0
|
||||
property bool theme_tile_icon_enabled: true
|
||||
property string theme_tile_background_color: "#303030"
|
||||
property string theme_background_color: "#303030"
|
||||
property bool theme_tile_shadow_enabled: true
|
||||
property string theme_tile_shadow_color: "#9C27B0"
|
||||
property int theme_tile_secondline_textsize: 12
|
||||
}
|
||||
|
||||
MessageDialog {
|
||||
@@ -68,8 +80,13 @@ HomeForm{
|
||||
onTriggered: popupLap.close();
|
||||
}
|
||||
|
||||
start.onClicked: { start_clicked(); }
|
||||
stop.onClicked: {
|
||||
Timer {
|
||||
id: checkStartStopFromWeb
|
||||
interval: 200; running: true; repeat: true
|
||||
onTriggered: {if(rootItem.stopRequested) {rootItem.stopRequested = false; inner_stop(); }}
|
||||
}
|
||||
|
||||
function inner_stop() {
|
||||
stop_clicked();
|
||||
rootItem.save_screenshot();
|
||||
if(CHARTJS)
|
||||
@@ -77,6 +94,11 @@ HomeForm{
|
||||
else
|
||||
stackView.push("ChartsEndWorkout.qml")
|
||||
}
|
||||
|
||||
start.onClicked: { start_clicked(); }
|
||||
stop.onClicked: {
|
||||
inner_stop();
|
||||
}
|
||||
lap.onClicked: { lap_clicked(); popupLap.open(); popupLapAutoClose.running = true; }
|
||||
|
||||
Component.onCompleted: { console.log("completed"); }
|
||||
@@ -144,26 +166,27 @@ HomeForm{
|
||||
height: 123 * settings.ui_zoom / 100
|
||||
radius: 3
|
||||
border.width: 1
|
||||
border.color: "purple"
|
||||
color: Material.backgroundColor
|
||||
border.color: (settings.theme_tile_shadow_enabled ? settings.theme_tile_shadow_color : settings.theme_tile_background_color)
|
||||
color: settings.theme_tile_background_color
|
||||
id: rect
|
||||
}
|
||||
|
||||
DropShadow {
|
||||
visible: settings.theme_tile_shadow_enabled
|
||||
anchors.fill: rect
|
||||
cached: true
|
||||
horizontalOffset: 3
|
||||
verticalOffset: 3
|
||||
radius: 8.0
|
||||
samples: 16
|
||||
color: Material.color(Material.Purple)
|
||||
color: settings.theme_tile_shadow_color
|
||||
source: rect
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: toggleIconTimer
|
||||
interval: 500; running: true; repeat: true
|
||||
onTriggered: { if(identificator === "inclination" && rootItem.autoInclinationEnabled()) myIcon.visible = !myIcon.visible; else myIcon.visible = true; }
|
||||
onTriggered: { if(identificator === "inclination" && rootItem.autoInclinationEnabled()) myIcon.visible = !myIcon.visible; else myIcon.visible = settings.theme_tile_icon_enabled && !largeButton; }
|
||||
}
|
||||
|
||||
Image {
|
||||
@@ -175,7 +198,7 @@ HomeForm{
|
||||
width: 48 * settings.ui_zoom / 100
|
||||
height: 48 * settings.ui_zoom / 100
|
||||
source: icon
|
||||
visible: !largeButton
|
||||
visible: settings.theme_tile_icon_enabled && !largeButton
|
||||
}
|
||||
Text {
|
||||
objectName: "value"
|
||||
@@ -202,7 +225,7 @@ HomeForm{
|
||||
}
|
||||
text: secondLine
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
font.pointSize: 12 * settings.ui_zoom / 100
|
||||
font.pointSize: settings.theme_tile_secondline_textsize * settings.ui_zoom / 100
|
||||
font.bold: false
|
||||
visible: !largeButton
|
||||
}
|
||||
@@ -255,7 +278,7 @@ HomeForm{
|
||||
color: largeButtonColor
|
||||
radius: 20
|
||||
}
|
||||
font.pointSize: 16 * settings.ui_zoom / 100
|
||||
font.pointSize: 20 * settings.ui_zoom / 100
|
||||
//width: 48 * settings.ui_zoom / 100
|
||||
//height: 48 * settings.ui_zoom / 100
|
||||
}
|
||||
@@ -274,7 +297,8 @@ HomeForm{
|
||||
anchors.top: gridView.bottom
|
||||
width: parent.width
|
||||
height: parent.height / 2
|
||||
|
||||
// Removed Timer, Play/Pause/Resume is now done via Homeform.cpp
|
||||
/*
|
||||
Timer {
|
||||
id: pauseTimer
|
||||
interval: 1000; running: true; repeat: true
|
||||
@@ -282,6 +306,7 @@ HomeForm{
|
||||
videoPlaybackHalf.play() :
|
||||
videoPlaybackHalf.pause()) } }
|
||||
}
|
||||
*/
|
||||
|
||||
onVisibleChanged: {
|
||||
if(visible === true) {
|
||||
@@ -292,7 +317,7 @@ HomeForm{
|
||||
|
||||
videoPlaybackHalf.seek(rootItem.videoPosition)
|
||||
videoPlaybackHalf.play()
|
||||
videoPlaybackHalf.muted = true
|
||||
videoPlaybackHalf.muted = rootItem.currentCoordinateValid
|
||||
} else {
|
||||
videoPlaybackHalf.stop()
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ import QtQuick 2.12
|
||||
import QtQuick.Controls 2.5
|
||||
import QtQuick.Controls.Material 2.12
|
||||
import QtGraphicalEffects 1.12
|
||||
import Qt.labs.settings 1.0
|
||||
|
||||
Page {
|
||||
|
||||
@@ -13,6 +14,13 @@ Page {
|
||||
property alias lap: lap
|
||||
property alias row: row
|
||||
|
||||
Settings {
|
||||
id: settings
|
||||
property real ui_zoom: 100.0
|
||||
property bool theme_tile_icon_enabled: true
|
||||
property string theme_background_color: "#303030"
|
||||
}
|
||||
|
||||
Item {
|
||||
width: parent.width
|
||||
height: rootItem.topBarHeight
|
||||
@@ -30,7 +38,7 @@ Page {
|
||||
Rectangle {
|
||||
width: 50
|
||||
height: row.height
|
||||
color: Material.backgroundColor
|
||||
color: settings.theme_background_color
|
||||
Column {
|
||||
id: column
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
@@ -42,7 +50,7 @@ Page {
|
||||
Rectangle {
|
||||
width: 50
|
||||
height: row.height
|
||||
color: Material.backgroundColor
|
||||
color: settings.theme_background_color
|
||||
|
||||
Image {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
@@ -73,7 +81,7 @@ Page {
|
||||
Rectangle {
|
||||
width: 120
|
||||
height: row.height
|
||||
color: Material.backgroundColor
|
||||
color: settings.theme_background_color
|
||||
RoundButton {
|
||||
icon.source: rootItem.startIcon
|
||||
icon.height: row.height - 54
|
||||
@@ -95,7 +103,7 @@ Page {
|
||||
Rectangle {
|
||||
width: 120
|
||||
height: row.height
|
||||
color: Material.backgroundColor
|
||||
color: settings.theme_background_color
|
||||
|
||||
RoundButton {
|
||||
icon.source: rootItem.stopIcon
|
||||
@@ -119,7 +127,7 @@ Page {
|
||||
id: item2
|
||||
width: 50
|
||||
height: row.height
|
||||
color: Material.backgroundColor
|
||||
color: settings.theme_background_color
|
||||
RoundButton {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
id: lap
|
||||
@@ -157,7 +165,7 @@ Page {
|
||||
width: parent.width
|
||||
anchors.top: row1.bottom
|
||||
anchors.topMargin: 30
|
||||
text: "This app should automatically connects to your bike/treadmill. <b>If it doesn't, please check</b>:<br>1) your Echelon/Domyos App MUST be closed while qdomyos-zwift is running;<br>2) bluetooth and bluetooth permission MUST be on<br>3) your bike/treadmill should be turned on BEFORE starting this app<br>4) try to restart your device<br><br>If your bike/treadmill disconnects every 30 seconds try to disable the 'virtual device' setting on the left bar.<br><br>In case of issue, please, feel free to contact me to roberto.viola83@gmail.com.<br><br><b>Have a nice ride!</b><br/ ><i>QZ specifically disclaims liability for<br>incidental or consequential damages and assumes<br>no responsibility or liability for any loss<br>or damage suffered by any person as a result of<br>the use or misuse of the app.</i><br><br>Roberto Viola"
|
||||
text: "This app should automatically connect to your bike/treadmill/rower. <b>If it doesn't, please check</b>:<br>1) your Echelon/Domyos App MUST be closed while qdomyos-zwift is running;<br>2) bluetooth and bluetooth permission MUST be on<br>3) your bike/treadmill/rower should be turned on BEFORE starting this app<br>4) try to restart your device<br><br>If your bike/treadmill disconnects every 30 seconds try to disable the 'virtual device' setting on the left bar.<br><br>In case of issues, please feel free to contact me at roberto.viola83@gmail.com.<br><br><b>Have a nice ride!</b><br/ ><i>QZ specifically disclaims liability for<br>incidental or consequential damages and assumes<br>no responsibility or liability for any loss<br>or damage suffered by any person as a result of<br>the use or misuse of the app.</i><br><br>Roberto Viola"
|
||||
wrapMode: Label.WordWrap
|
||||
visible: rootItem.labelHelp
|
||||
}
|
||||
|
||||
96
src/Toast.qml
Normal file
96
src/Toast.qml
Normal file
@@ -0,0 +1,96 @@
|
||||
import QtQuick 2.0
|
||||
|
||||
/**
|
||||
* adapted from StackOverflow:
|
||||
* http://stackoverflow.com/questions/26879266/make-toast-in-android-by-qml
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief An Android-like timed message text in a box that self-destroys when finished if desired
|
||||
*/
|
||||
Rectangle {
|
||||
|
||||
/**
|
||||
* Public
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Shows this Toast
|
||||
*
|
||||
* @param {string} text Text to show
|
||||
* @param {real} duration Duration to show in milliseconds, defaults to 3000
|
||||
*/
|
||||
function show(text, duration) {
|
||||
message.text = text;
|
||||
if (typeof duration !== "undefined") { // checks if parameter was passed
|
||||
time = Math.max(duration, 2 * fadeTime);
|
||||
}
|
||||
else {
|
||||
time = defaultTime;
|
||||
}
|
||||
animation.start();
|
||||
}
|
||||
|
||||
/**
|
||||
* Private
|
||||
*/
|
||||
|
||||
id: root
|
||||
|
||||
readonly property real defaultTime: 3000
|
||||
property real time: defaultTime
|
||||
readonly property real fadeTime: 300
|
||||
|
||||
property real margin: 10
|
||||
|
||||
anchors {
|
||||
left: (parent != null) ? parent.left : undefined
|
||||
right: (parent != null) ? parent.right : undefined
|
||||
margins: margin
|
||||
}
|
||||
|
||||
height: message.height + margin
|
||||
radius: margin
|
||||
|
||||
opacity: 0
|
||||
color: "#222222"
|
||||
|
||||
Text {
|
||||
id: message
|
||||
color: "white"
|
||||
wrapMode: Text.Wrap
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
anchors {
|
||||
top: parent.top
|
||||
left: parent.left
|
||||
right: parent.right
|
||||
margins: margin / 2
|
||||
}
|
||||
}
|
||||
|
||||
SequentialAnimation on opacity {
|
||||
id: animation
|
||||
running: false
|
||||
|
||||
|
||||
NumberAnimation {
|
||||
to: .9
|
||||
duration: fadeTime
|
||||
}
|
||||
|
||||
PauseAnimation {
|
||||
duration: time - 2 * fadeTime
|
||||
}
|
||||
|
||||
NumberAnimation {
|
||||
to: 0
|
||||
duration: fadeTime
|
||||
}
|
||||
|
||||
onRunningChanged: {
|
||||
if (!running) {
|
||||
+ toastManager.model.remove(index);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
56
src/ToastManager.qml
Normal file
56
src/ToastManager.qml
Normal file
@@ -0,0 +1,56 @@
|
||||
import QtQuick 2.0
|
||||
|
||||
/**
|
||||
* adapted from StackOverflow:
|
||||
* http://stackoverflow.com/questions/26879266/make-toast-in-android-by-qml
|
||||
* @brief Manager that creates Toasts dynamically
|
||||
*/
|
||||
ListView {
|
||||
/**
|
||||
* Public
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Shows a Toast
|
||||
*
|
||||
* @param {string} text Text to show
|
||||
* @param {real} duration Duration to show in milliseconds, defaults to 3000
|
||||
*/
|
||||
function show(text, duration) {
|
||||
model.insert(0, {text: text, duration: duration});
|
||||
}
|
||||
|
||||
/**
|
||||
* Private
|
||||
*/
|
||||
|
||||
id: root
|
||||
|
||||
z: Infinity
|
||||
spacing: 5
|
||||
anchors.fill: parent
|
||||
anchors.bottomMargin: 10
|
||||
verticalLayoutDirection: ListView.BottomToTop
|
||||
|
||||
interactive: false
|
||||
|
||||
displaced: Transition {
|
||||
NumberAnimation {
|
||||
properties: "y"
|
||||
easing.type: Easing.InOutQuad
|
||||
}
|
||||
}
|
||||
|
||||
delegate: Toast {
|
||||
Component.onCompleted: {
|
||||
if (typeof duration === "undefined") {
|
||||
show(text);
|
||||
}
|
||||
else {
|
||||
show(text, duration);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
model: ListModel {id: model}
|
||||
}
|
||||
@@ -102,9 +102,9 @@ ColumnLayout {
|
||||
clip: true
|
||||
Text {
|
||||
id: fileTextBox
|
||||
color: (!folderModel.isFolder(index)?Material.color(Material.Grey):Material.color(Material.Orange))
|
||||
color: (!folderModel.isFolder(index)?Material.color(Material.Grey):Material.color(Material.Orange))
|
||||
font.pixelSize: Qt.application.font.pixelSize * 1.6
|
||||
text: fileName.substring(0, fileName.length-4)
|
||||
text: (!folderModel.isFolder(index)?fileName.substring(0, fileName.length-4):fileName)
|
||||
NumberAnimation on x {
|
||||
Component.onCompleted: {
|
||||
if(fileName.length > 30) {
|
||||
|
||||
58
src/WebStravaAuth.qml
Normal file
58
src/WebStravaAuth.qml
Normal file
@@ -0,0 +1,58 @@
|
||||
import QtQuick 2.12
|
||||
import QtQuick.Controls 2.5
|
||||
import QtQuick.Controls.Material 2.12
|
||||
import QtQuick.Dialogs 1.0
|
||||
import QtGraphicalEffects 1.12
|
||||
import Qt.labs.settings 1.0
|
||||
import QtMultimedia 5.15
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtWebView 1.1
|
||||
|
||||
Item {
|
||||
anchors.fill: parent
|
||||
height: parent.height
|
||||
width: parent.width
|
||||
visible: true
|
||||
|
||||
WebView {
|
||||
anchors.fill: parent
|
||||
height: parent.height
|
||||
width: parent.width
|
||||
visible: !rootItem.generalPopupVisible
|
||||
url: rootItem.getStravaAuthUrl
|
||||
}
|
||||
|
||||
Popup {
|
||||
id: popupStravaConnectedWeb
|
||||
parent: Overlay.overlay
|
||||
enabled: rootItem.generalPopupVisible
|
||||
onEnabledChanged: { if(rootItem.generalPopupVisible) popupStravaConnectedWeb.open() }
|
||||
onClosed: { rootItem.generalPopupVisible = false; }
|
||||
|
||||
x: Math.round((parent.width - width) / 2)
|
||||
y: Math.round((parent.height - height) / 2)
|
||||
width: 380
|
||||
height: 120
|
||||
modal: true
|
||||
focus: true
|
||||
palette.text: "white"
|
||||
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
|
||||
enter: Transition
|
||||
{
|
||||
NumberAnimation { property: "opacity"; from: 0.0; to: 1.0 }
|
||||
}
|
||||
exit: Transition
|
||||
{
|
||||
NumberAnimation { property: "opacity"; from: 1.0; to: 0.0 }
|
||||
}
|
||||
Column {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
Label {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
width: 370
|
||||
height: 120
|
||||
text: qsTr("Your Strava account is now connected!<br><br>When you will press STOP on QZ a file<br>will be automatically uploaded to Strava!")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
#include "activiotreadmill.h"
|
||||
#include "virtualbike.h"
|
||||
|
||||
#include "ios/lockscreen.h"
|
||||
#ifdef Q_OS_ANDROID
|
||||
#include "keepawakehelper.h"
|
||||
#endif
|
||||
#include "virtualtreadmill.h"
|
||||
#include <QBluetoothLocalDevice>
|
||||
#include <QDateTime>
|
||||
@@ -54,10 +56,15 @@ void activiotreadmill::writeCharacteristic(const QLowEnergyCharacteristic charac
|
||||
return;
|
||||
}
|
||||
|
||||
gattCommunicationChannelService->writeCharacteristic(characteristic, QByteArray((const char *)data, data_len));
|
||||
if (writeBuffer) {
|
||||
delete writeBuffer;
|
||||
}
|
||||
writeBuffer = new QByteArray((const char *)data, data_len);
|
||||
|
||||
gattCommunicationChannelService->writeCharacteristic(characteristic, *writeBuffer);
|
||||
|
||||
if (!disable_log) {
|
||||
emit debug(QStringLiteral(" >> ") + QByteArray((const char *)data, data_len).toHex(' ') +
|
||||
emit debug(QStringLiteral(" >> ") + writeBuffer->toHex(' ') +
|
||||
QStringLiteral(" // ") + info);
|
||||
}
|
||||
|
||||
@@ -74,59 +81,59 @@ void activiotreadmill::forceSpeed(double requestSpeed) {
|
||||
|
||||
writeSpeed[1] = (requestSpeed * 10);
|
||||
writeSpeed[5] += writeSpeed[1];
|
||||
if(!settings.value(QZSettings::fitfiu_mc_v460, QZSettings::default_fitfiu_mc_v460).toBool())
|
||||
if (!settings.value(QZSettings::fitfiu_mc_v460, QZSettings::default_fitfiu_mc_v460).toBool() &&
|
||||
!settings.value(QZSettings::zero_zt2500_treadmill, QZSettings::default_zero_zt2500_treadmill).toBool())
|
||||
writeSpeed[6] = writeSpeed[1] + 1;
|
||||
else {
|
||||
switch(writeSpeed[1] & 0x0F) {
|
||||
case 0x00:
|
||||
writeSpeed[6] = writeSpeed[1] + 5;
|
||||
break;
|
||||
case 0x01:
|
||||
writeSpeed[6] = writeSpeed[1] + 3;
|
||||
break;
|
||||
case 0x02:
|
||||
writeSpeed[6] = writeSpeed[1] + 1;
|
||||
break;
|
||||
case 0x03:
|
||||
writeSpeed[6] = writeSpeed[1] - 1;
|
||||
break;
|
||||
case 0x04:
|
||||
writeSpeed[6] = writeSpeed[1] + 5;
|
||||
break;
|
||||
case 0x05:
|
||||
writeSpeed[6] = writeSpeed[1] + 3;
|
||||
break;
|
||||
case 0x06:
|
||||
writeSpeed[6] = writeSpeed[1] + 1;
|
||||
break;
|
||||
case 0x07:
|
||||
writeSpeed[6] = writeSpeed[1] - 1;
|
||||
break;
|
||||
case 0x08:
|
||||
writeSpeed[6] = writeSpeed[1] + 5;
|
||||
break;
|
||||
case 0x09:
|
||||
writeSpeed[6] = writeSpeed[1] + 3;
|
||||
break;
|
||||
case 0x0A:
|
||||
writeSpeed[6] = writeSpeed[1] + 1;
|
||||
break;
|
||||
case 0x0B:
|
||||
writeSpeed[6] = writeSpeed[1] - 1;
|
||||
break;
|
||||
case 0x0C:
|
||||
writeSpeed[6] = writeSpeed[1] + 5;
|
||||
break;
|
||||
case 0x0D:
|
||||
writeSpeed[6] = writeSpeed[1] + 3;
|
||||
break;
|
||||
case 0x0E:
|
||||
writeSpeed[6] = writeSpeed[1] + 1;
|
||||
break;
|
||||
case 0x0F:
|
||||
writeSpeed[6] = writeSpeed[1] - 1;
|
||||
break;
|
||||
|
||||
switch (writeSpeed[1] & 0x0F) {
|
||||
case 0x00:
|
||||
writeSpeed[6] = writeSpeed[1] + 5;
|
||||
break;
|
||||
case 0x01:
|
||||
writeSpeed[6] = writeSpeed[1] + 3;
|
||||
break;
|
||||
case 0x02:
|
||||
writeSpeed[6] = writeSpeed[1] + 1;
|
||||
break;
|
||||
case 0x03:
|
||||
writeSpeed[6] = writeSpeed[1] - 1;
|
||||
break;
|
||||
case 0x04:
|
||||
writeSpeed[6] = writeSpeed[1] + 5;
|
||||
break;
|
||||
case 0x05:
|
||||
writeSpeed[6] = writeSpeed[1] + 3;
|
||||
break;
|
||||
case 0x06:
|
||||
writeSpeed[6] = writeSpeed[1] + 1;
|
||||
break;
|
||||
case 0x07:
|
||||
writeSpeed[6] = writeSpeed[1] - 1;
|
||||
break;
|
||||
case 0x08:
|
||||
writeSpeed[6] = writeSpeed[1] + 5;
|
||||
break;
|
||||
case 0x09:
|
||||
writeSpeed[6] = writeSpeed[1] + 3;
|
||||
break;
|
||||
case 0x0A:
|
||||
writeSpeed[6] = writeSpeed[1] + 1;
|
||||
break;
|
||||
case 0x0B:
|
||||
writeSpeed[6] = writeSpeed[1] - 1;
|
||||
break;
|
||||
case 0x0C:
|
||||
writeSpeed[6] = writeSpeed[1] + 5;
|
||||
break;
|
||||
case 0x0D:
|
||||
writeSpeed[6] = writeSpeed[1] + 3;
|
||||
break;
|
||||
case 0x0E:
|
||||
writeSpeed[6] = writeSpeed[1] + 1;
|
||||
break;
|
||||
case 0x0F:
|
||||
writeSpeed[6] = writeSpeed[1] - 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -167,21 +174,26 @@ void activiotreadmill::update() {
|
||||
|
||||
QSettings settings;
|
||||
// ******************************************* virtual treadmill init *************************************
|
||||
if (!firstInit && !virtualTreadMill && !virtualBike) {
|
||||
bool virtual_device_enabled = settings.value(QZSettings::virtual_device_enabled, QZSettings::default_virtual_device_enabled).toBool();
|
||||
bool virtual_device_force_bike = settings.value(QZSettings::virtual_device_force_bike, QZSettings::default_virtual_device_force_bike).toBool();
|
||||
if (!firstInit && !this->hasVirtualDevice()) {
|
||||
bool virtual_device_enabled =
|
||||
settings.value(QZSettings::virtual_device_enabled, QZSettings::default_virtual_device_enabled).toBool();
|
||||
bool virtual_device_force_bike =
|
||||
settings.value(QZSettings::virtual_device_force_bike, QZSettings::default_virtual_device_force_bike)
|
||||
.toBool();
|
||||
if (virtual_device_enabled) {
|
||||
if (!virtual_device_force_bike) {
|
||||
debug("creating virtual treadmill interface...");
|
||||
virtualTreadMill = new virtualtreadmill(this, noHeartService);
|
||||
auto virtualTreadMill = new virtualtreadmill(this, noHeartService);
|
||||
connect(virtualTreadMill, &virtualtreadmill::debug, this, &activiotreadmill::debug);
|
||||
connect(virtualTreadMill, &virtualtreadmill::changeInclination, this,
|
||||
&activiotreadmill::changeInclinationRequested);
|
||||
this->setVirtualDevice(virtualTreadMill, VIRTUAL_DEVICE_MODE::PRIMARY);
|
||||
} else {
|
||||
debug("creating virtual bike interface...");
|
||||
virtualBike = new virtualbike(this);
|
||||
auto virtualBike = new virtualbike(this);
|
||||
connect(virtualBike, &virtualbike::changeInclination, this,
|
||||
&activiotreadmill::changeInclinationRequested);
|
||||
this->setVirtualDevice(virtualBike, VIRTUAL_DEVICE_MODE::ALTERNATIVE);
|
||||
}
|
||||
firstInit = 1;
|
||||
}
|
||||
@@ -201,7 +213,7 @@ void activiotreadmill::update() {
|
||||
requestSpeed = -1;
|
||||
}
|
||||
if (requestInclination != -100) {
|
||||
if(requestInclination < 0)
|
||||
if (requestInclination < 0)
|
||||
requestInclination = 0;
|
||||
if (requestInclination != currentInclination().value() && requestInclination >= 0 &&
|
||||
requestInclination <= 15) {
|
||||
@@ -297,10 +309,10 @@ void activiotreadmill::characteristicChanged(const QLowEnergyCharacteristic &cha
|
||||
|
||||
double speed = GetSpeedFromPacket(value);
|
||||
double incline = 1.0; // "fitfiu_mc_v460" has 1.0 fixed inclination
|
||||
if(!settings.value(QZSettings::fitfiu_mc_v460, QZSettings::default_fitfiu_mc_v460).toBool())
|
||||
if (!settings.value(QZSettings::fitfiu_mc_v460, QZSettings::default_fitfiu_mc_v460).toBool())
|
||||
incline = GetInclinationFromPacket(value);
|
||||
// double kcal = GetKcalFromPacket(value);
|
||||
// double distance = GetDistanceFromPacket(value);
|
||||
// double kcal = GetKcalFromPacket(value);
|
||||
// double distance = GetDistanceFromPacket(value);
|
||||
|
||||
#ifdef Q_OS_ANDROID
|
||||
if (settings.value(QZSettings::ant_heart, QZSettings::default_ant_heart).toBool())
|
||||
@@ -312,17 +324,7 @@ void activiotreadmill::characteristicChanged(const QLowEnergyCharacteristic &cha
|
||||
|
||||
uint8_t heart = 0;
|
||||
if (heart == 0) {
|
||||
|
||||
#ifdef Q_OS_IOS
|
||||
#ifndef IO_UNDER_QT
|
||||
lockscreen h;
|
||||
long appleWatchHeartRate = h.heartRate();
|
||||
h.setKcal(KCal.value());
|
||||
h.setDistance(Distance.value());
|
||||
Heart = appleWatchHeartRate;
|
||||
debug("Current Heart from Apple Watch: " + QString::number(appleWatchHeartRate));
|
||||
#endif
|
||||
#endif
|
||||
update_hr_from_external();
|
||||
} else
|
||||
|
||||
Heart = heart;
|
||||
@@ -332,7 +334,8 @@ void activiotreadmill::characteristicChanged(const QLowEnergyCharacteristic &cha
|
||||
if (!firstCharacteristicChanged) {
|
||||
if (watts(settings.value(QZSettings::weight, QZSettings::default_weight).toFloat()))
|
||||
KCal +=
|
||||
((((0.048 * ((double)watts(settings.value(QZSettings::weight, QZSettings::default_weight).toFloat())) + 1.19) *
|
||||
((((0.048 * ((double)watts(settings.value(QZSettings::weight, QZSettings::default_weight).toFloat())) +
|
||||
1.19) *
|
||||
settings.value(QZSettings::weight, QZSettings::default_weight).toFloat() * 3.5) /
|
||||
200.0) /
|
||||
(60000.0 / ((double)lastTimeCharacteristicChanged.msecsTo(
|
||||
@@ -518,7 +521,9 @@ void activiotreadmill::btinit(bool startTape) {
|
||||
uint8_t initData2[] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x26, 0x03};
|
||||
|
||||
writeCharacteristic(gattWrite2Characteristic, initData1, sizeof(initData1), QStringLiteral("init"), false, false);
|
||||
writeCharacteristic(gattWriteCharacteristic, initData2, sizeof(initData2), QStringLiteral("init"), false, true);
|
||||
|
||||
// starts the tape
|
||||
// writeCharacteristic(gattWriteCharacteristic, initData2, sizeof(initData2), QStringLiteral("init"), false, true);
|
||||
|
||||
if (startTape) {
|
||||
}
|
||||
@@ -675,8 +680,4 @@ bool activiotreadmill::connected() {
|
||||
return m_control->state() == QLowEnergyController::DiscoveredState;
|
||||
}
|
||||
|
||||
void *activiotreadmill::VirtualTreadMill() { return virtualTreadMill; }
|
||||
|
||||
void *activiotreadmill::VirtualDevice() { return VirtualTreadMill(); }
|
||||
|
||||
void activiotreadmill::searchingStop() { searchStopped = true; }
|
||||
|
||||
@@ -28,8 +28,6 @@
|
||||
#include <QObject>
|
||||
|
||||
#include "treadmill.h"
|
||||
#include "virtualbike.h"
|
||||
#include "virtualtreadmill.h"
|
||||
|
||||
#ifdef Q_OS_IOS
|
||||
#include "ios/lockscreen.h"
|
||||
@@ -41,11 +39,8 @@ class activiotreadmill : public treadmill {
|
||||
public:
|
||||
activiotreadmill(uint32_t poolDeviceTime = 200, bool noConsole = false, bool noHeartService = false,
|
||||
double forceInitSpeed = 0.0, double forceInitInclination = 0.0);
|
||||
bool connected();
|
||||
double minStepInclination();
|
||||
|
||||
void *VirtualTreadMill();
|
||||
void *VirtualDevice();
|
||||
bool connected() override;
|
||||
double minStepInclination() override;
|
||||
|
||||
private:
|
||||
double GetSpeedFromPacket(const QByteArray &packet);
|
||||
@@ -67,8 +62,6 @@ class activiotreadmill : public treadmill {
|
||||
bool firstCharacteristicChanged = true;
|
||||
|
||||
QTimer *refresh;
|
||||
virtualtreadmill *virtualTreadMill = nullptr;
|
||||
virtualbike *virtualBike = 0;
|
||||
|
||||
QLowEnergyService *gattCommunicationChannelService = nullptr;
|
||||
QLowEnergyCharacteristic gattWriteCharacteristic;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user