Compare commits

..

1138 Commits

Author SHA1 Message Date
Roberto Viola
a57408229b fixing linker error 2023-08-18 12:06:32 +02:00
Roberto Viola
82578e4923 Update build.gradle 2023-08-16 11:27:23 +02:00
Roberto Viola
4682c2b172 fixing path 2023-08-06 10:58:46 +02:00
Roberto Viola
64eace5ab9 keys added 2023-08-03 12:13:46 +02:00
Roberto Viola
b39b98b0d8 Update bluetooth.cpp 2023-08-03 10:23:33 +02:00
Roberto Viola
86e02be26e simplify the debug 2023-08-03 10:19:22 +02:00
Roberto Viola
b00e77a4ea Update qdomyos-zwift.pri 2023-08-03 09:28:17 +02:00
Roberto Viola
f80a8f4051 fixing models (en) 2023-08-03 08:47:46 +02:00
Roberto Viola
f45d3b9914 trying to fix models 2023-08-02 16:59:29 +02:00
Roberto Viola
bcb102e0dc not working yet 2023-07-28 22:25:56 +02:00
Roberto Viola
acee1b1301 adding assets to qt 2023-07-20 23:14:45 +02:00
Roberto Viola
0f9e7c0829 Revert "Revert "Revert "adding kotlin"""
This reverts commit 944d6d5ef2.
2023-07-20 17:53:01 +02:00
Roberto Viola
efd22aaee2 Update build.gradle 2023-07-20 17:52:56 +02:00
Roberto Viola
944d6d5ef2 Revert "Revert "adding kotlin""
This reverts commit 01e94e752c.
2023-07-20 15:54:59 +02:00
Roberto Viola
14fb0a5cde fixing build 2023-07-20 14:55:29 +02:00
Roberto Viola
da6faf18b5 Update ScreenCaptureService.java 2023-07-20 14:08:56 +02:00
Roberto Viola
6c662b20de Update ScreenCaptureService.java 2023-07-20 13:33:22 +02:00
Roberto Viola
75030bd25a Update ScreenCaptureService.java 2023-07-20 12:24:44 +02:00
Roberto Viola
a8b36057ce Update ScreenCaptureService.java 2023-07-20 11:56:22 +02:00
Roberto Viola
01e94e752c Revert "adding kotlin"
This reverts commit d83bcf984d.
2023-07-20 11:52:47 +02:00
Roberto Viola
d83bcf984d adding kotlin 2023-07-20 11:08:13 +02:00
Roberto Viola
ca93611acc Update build.gradle 2023-07-20 10:36:28 +02:00
Roberto Viola
9868a80be6 Update build.gradle 2023-07-20 09:23:21 +02:00
Roberto Viola
0d0db9fe3d added paddleocr4android 2023-07-20 08:20:36 +02:00
Roberto Viola
09affb4dd1 works but we need paddleocr too 2023-07-19 21:36:05 +02:00
Roberto Viola
ba1afdfa5a opencv works with zwift! 2023-07-19 21:25:26 +02:00
Roberto Viola
8ce3ae8ebd Update qdomyos-zwift.pri 2023-07-19 17:48:17 +02:00
Roberto Viola
6778364353 Update qdomyos-zwift.pri 2023-07-19 17:10:24 +02:00
Roberto Viola
1d4fa21899 Update qdomyos-zwift.pri 2023-07-19 16:40:11 +02:00
Roberto Viola
fa94706754 Update qdomyos-zwift.pri 2023-07-19 15:57:34 +02:00
Roberto Viola
3c5dc35675 updatung libopencv 2023-07-19 15:22:36 +02:00
Roberto Viola
bc5a1161df Update qdomyos-zwift.pri 2023-07-19 14:34:08 +02:00
Roberto Viola
7e5ff25d39 updating android_stl 2023-07-19 14:15:52 +02:00
Roberto Viola
0e46b52c64 updating opencv built against android-21 2023-07-19 13:14:06 +02:00
Roberto Viola
377381bb64 Revert "Update build.gradle"
This reverts commit 85558eda35.
2023-07-19 12:30:47 +02:00
Roberto Viola
85558eda35 Update build.gradle 2023-07-19 12:03:01 +02:00
Roberto Viola
8132e56483 Update qdomyos-zwift.pri 2023-07-19 11:29:19 +02:00
Roberto Viola
ab86534f31 linking libraries 2023-07-19 11:03:16 +02:00
Roberto Viola
ab92d03891 Update bluetooth.cpp 2023-07-19 10:23:07 +02:00
Roberto Viola
cb2980741e Update bluetooth.cpp 2023-07-18 16:57:13 +02:00
Roberto Viola
8304f43bc5 let's see if it builds 2023-07-18 10:08:40 +02:00
Roberto Viola
7636f768f1 pro form tour de france no reading #1560 (#1566)
* init and update wrote. need to check the force resistance and inclination and read metrics

* finalizing
2023-07-17 15:54:27 +02:00
Roberto Viola
cdf8a95e30 PaddleOCR for Zwift Workout OCR on Windows #1511 2023-07-14 07:39:12 +02:00
Roberto Viola
13389afe77 PaddleOCR for Zwift Workout OCR on Windows #1511 2023-07-14 07:36:16 +02:00
Roberto Viola
8acfb6b764 PaddleOCR for Zwift Workout OCR on Windows #1511 2023-07-14 07:35:13 +02:00
Roberto Viola
4244ce79a0 Ability to play a video in sync with ZWO training file #1562 2023-07-13 20:48:35 +02:00
Roberto Viola
907e96330f version 2.13.97 2023-07-13 19:25:51 +02:00
Roberto Viola
35136be5b9 Ability to play a video in sync with ZWO training file #1562 2023-07-13 19:00:40 +02:00
Roberto Viola
6cd33f2ff9 Ability to play a video in sync with ZWO training file #1562 2023-07-13 17:21:40 +02:00
Roberto Viola
7e52925242 zwift settings visible only on PC 2023-07-13 16:31:57 +02:00
Roberto Viola
98971bf036 Domyos Treadmill Randomly Send Speed = 0 #1567 2023-07-13 16:28:33 +02:00
Roberto Viola
51e97321ac PaddleOCR for Zwift Workout OCR on Windows #1511 2023-07-13 14:22:02 +02:00
Roberto Viola
d959c0bea2 version 2.13.96 2023-07-13 13:26:56 +02:00
Roberto Viola
875f283984 Ability to play a video in sync with ZWO training file #1562 (#1563)
* to be tested

* it's working!
2023-07-12 23:13:48 +02:00
Roberto Viola
b4f378a8e9 PaddleOCR for Zwift Workout OCR on Windows #1511 2023-07-11 17:03:56 +02:00
Roberto Viola
22e50a7600 PaddleOCR for Zwift Workout OCR on Windows #1511 2023-07-11 13:52:02 +02:00
Roberto Viola
30f3b47a8c fs5i nordick track more realistic ride when running with Rouvy or Zwift #1345 gewahr started this conversation in General fs5i nordick track more realistic ride when running with Rouvy or Zwift #1345 2023-07-11 13:45:33 +02:00
Roberto Viola
103f1675e6 fixing CI android due to USB library (#1547)
* Update build.gradle

* Update main.yml

* Update build.gradle

* Revert "Update main.yml"

This reverts commit 5b232904b1.

* Revert "Update build.gradle"

This reverts commit e961bac22d.
2023-07-11 13:20:37 +02:00
Roberto Viola
db7bc008e4 Training programs UI improvement #1537 2023-07-11 10:52:08 +02:00
Roberto Viola
e634348d75 Life Fitness Elliptical #1554 2023-07-10 08:21:41 +02:00
Roberto Viola
8956957e4d Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-07-10 08:06:30 +02:00
Roberto Viola
f79b0074a8 version 2.13.95 2023-07-06 11:19:27 +02:00
Roberto Viola
34abdab013 Sync workout data from android to apple (issue #1551) (#1552)
* first test, doesn't work on android yet

* first test on android

* hr from apple watch to android!
2023-07-06 11:17:11 +02:00
Roberto Viola
b741378a0e qzlogo added as watermark to watt badge 2023-07-06 11:15:51 +02:00
Roberto Viola
5404a68689 version 2.13.94 2023-07-05 20:49:31 +02:00
Roberto Viola
73bc5691e8 Fixed Speed over ANT+: tested on garmin edge 530 #1550 2023-07-05 20:48:10 +02:00
Roberto Viola
de42318370 Fixed Speed over ANT+: tested on garmin edge 530 #1550 2023-07-05 20:31:14 +02:00
Roberto Viola
61acaf033a peloton resistance instead of resistance in the watt badge 2023-07-05 19:34:19 +02:00
Roberto Viola
cd2592b14e fixing miles on badge 2023-07-05 19:29:55 +02:00
Roberto Viola
b0ef38885b ANT+ not working (Issue #1548) 2023-07-05 11:55:08 +02:00
Roberto Viola
34a3e1067d version 2.13.92 2023-07-04 20:28:02 +02:00
Roberto Viola
b084afea11 fixing crash on echelon rower 2023-07-04 19:31:50 +02:00
Roberto Viola
46eb6b3776 ANT+ not working (Issue #1548) 2023-07-04 19:12:54 +02:00
Roberto Viola
23d646848e Watt badge by Email (#1545)
* I have to verifiy if the image works

* Update qml.qrc
2023-07-04 19:04:59 +02:00
Roberto Viola
e78d4565bc Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-07-04 16:15:53 +02:00
Roberto Viola
9540bff975 PaddleOCR for Zwift Workout OCR on Windows (#1511)
* Update qzsettings.h

* Create zwift-workout.py

* ready to test!

* Update main.yml

* Update windows_zwift_workout_paddleocr_thread.cpp

* disabling Npu

* Update zwift-workout.py

* Update zwift-incline.py

* preventing conficts in the settings
2023-07-04 15:38:33 +02:00
Roberto Viola
4d5db2e3b3 workoutNameBasedOnBluetoothDevice function added 2023-07-04 09:48:46 +02:00
Roberto Viola
20027b914e 2.13.91 2023-07-04 08:08:50 +02:00
Andrea Gelmini
5764efd487 Fix typos (#1542)
* Fix typos

* Fix typo

* Fix typo

* Fix typo

* Update strydrunpowersensor.cpp

---------

Co-authored-by: Roberto Viola <Cagnulein@gmail.com>
2023-07-04 07:59:11 +02:00
Roberto Viola
c427c72726 Amazon App Store 64 bit compatibility #1328 (#1544)
* trying renaming libs

https://stackoverflow.com/questions/49402451/gradle-task-to-rename-file

* Update main.yml

* Update build.gradle

* Update build.gradle

* Update build.gradle

* Update build.gradle

* fixing for merge it

* fixing!

* Update build.gradle
2023-07-04 07:58:02 +02:00
Roberto Viola
41be14bb8a target cadence added to the overridable metrics for peloton 2023-07-03 19:07:23 +02:00
Roberto Viola
2fcd6eb310 FTMS treadmill: pause handled 2023-07-03 14:51:29 +02:00
Roberto Viola
656d404582 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-07-01 22:02:26 +02:00
Roberto Viola
548bdeb5e4 Adding Pace to Virtual Rower #1540 2023-07-01 22:02:08 +02:00
Roberto Viola
eaa5fca1fe Create "Peloton-Like" Summary Page in addition to Charts (Issue #517) 2023-06-30 23:01:46 +02:00
Roberto Viola
c9778f918d Adding Pace to Virtual Rower #1540 2023-06-30 22:29:52 +02:00
Roberto Viola
de17acdfcf fixing chartjs image on iOS 2023-06-30 21:58:13 +02:00
Roberto Viola
3f16b7d146 version 2.13.87 2023-06-29 13:52:39 +02:00
Roberto Viola
881e6db650 Android Billing v5 requirements from 11/1/2023 #1512 2023-06-29 13:51:39 +02:00
Roberto Viola
d27bccaea5 Training programs UI improvement #1537 2023-06-29 09:02:09 +02:00
Roberto Viola
afde8ad8d5 Adding Pace to Virtual Rower #1540 2023-06-28 23:18:31 +02:00
Roberto Viola
d8d0613f6d Create "Peloton-Like" Summary Page in addition to Charts #517 (#1533)
* drafting

* creating summary

* i need to work to the image

* ready to test

* Update qml.qrc

* fixing

* preparing for release
2023-06-28 21:59:29 +02:00
Roberto Viola
e255267116 fixed speed over 12.7 on the ziprotreadmill 2023-06-28 21:30:06 +02:00
Roberto Viola
e7e79b1816 zip windows release to improve CI performance (#1539)
* zip windows release to improve CI performance

* Update main.yml
2023-06-28 14:19:12 +02:00
Roberto Viola
df09bd2a9c Windows CI with and without python (#1513)
* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml
2023-06-28 13:50:51 +02:00
Roberto Viola
7ae17516f1 Create CODE_OF_CONDUCT.md 2023-06-28 13:24:18 +02:00
Roberto Viola
4f53e28cc4 using QT cache for CI (#1538)
* Update main.yml

* Update main.yml
2023-06-28 12:21:26 +02:00
Roberto Viola
08c9869c84 VirtuFit Etappe 2.0i Spinbike ERG Table #1526 2023-06-27 22:43:08 +02:00
Roberto Viola
86bd39b370 BH NLS12 ELLIPTICAL #1393 2023-06-27 11:18:55 +02:00
Roberto Viola
1e68328c0f Training programs UI improvement #1537 2023-06-27 10:13:57 +02:00
Roberto Viola
81d8950bb6 VirtuFit Etappe 2.0i Spinbike ERG Table #1526 2023-06-27 08:56:24 +02:00
Andrea Gelmini
df109a620e Fix typos (#1536) 2023-06-26 11:28:24 +02:00
Roberto Viola
fdc3e4166a Nordic Track S22i 10x expected Watt [BUG] (Issue #1534) 2023-06-22 23:26:10 +02:00
Roberto Viola
144472c57f VirtuFit Etappe 2.0i Spinbike ERG Table #1526 2023-06-22 23:14:49 +02:00
Roberto Viola
d23b36f267 BH NLS12 ELLIPTICAL #1393 2023-06-22 10:08:00 +02:00
Roberto Viola
47ed429773 Wahoo Kickr Headwind #1281 2023-06-22 09:52:10 +02:00
Roberto Viola
f8a09dc301 iOS Crash when bluetooth thread is busy #1530 2023-06-22 09:50:24 +02:00
Roberto Viola
c1b6b0e175 Rowing Concept2 Pm3, Pm4 (Bluetooth) #1486 2023-06-22 09:46:30 +02:00
Roberto Viola
d2e007fb43 Auto-Resistance Adjustment for NordicTrack VR25 #1532 2023-06-22 08:25:10 +02:00
Roberto Viola
589dd85678 Auto-Resistance Adjustment for NordicTrack VR25 #1532 2023-06-21 16:09:24 +02:00
Roberto Viola
4f4c6cebf1 added the first draft of a ESP32 app 2023-06-21 11:21:45 +02:00
Roberto Viola
1688a571af android version 2.13.83 2023-06-20 09:32:58 +02:00
Roberto Viola
018f96d243 Pro-form SB - Model # PFEVEX72917S #1507 (#1514)
* init and write done, i don't see any resistance writing in the hci snoof

* Update proformbike.cpp
2023-06-20 09:31:21 +02:00
Roberto Viola
428d7fee83 A setting to allow QZ to read data as KM rather than Miles on Echelon Stride Treadmill (Issue #1528) 2023-06-19 22:16:32 +02:00
Roberto Viola
ffb09bf78d Rowing Concept2 Pm3, Pm4 (Bluetooth) #1486 2023-06-19 22:06:42 +02:00
Roberto Viola
3a94929584 Rowing Concept2 Pm3, Pm4 (Bluetooth) #1486 2023-06-19 17:16:31 +02:00
Roberto Viola
fea04b29a4 v. 2.13.80 2023-06-16 10:15:44 +02:00
Roberto Viola
f7145710af VirtuFit Etappe 2.0i Spinbike ERG Table #1526 2023-06-16 09:31:13 +02:00
Roberto Viola
e3ef341e60 Rowing Concept2 Pm3, Pm4 (Bluetooth) #1486 2023-06-16 09:02:31 +02:00
Roberto Viola
b097e0898e Volume keys not working on android even if the volume gears setting is disabled #1524 (#1525)
* Update main.qml

* fixed!
2023-06-16 07:13:28 +02:00
Roberto Viola
8237c3c862 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-06-15 21:58:39 +02:00
Roberto Viola
6d6bad02db Peloton workout doesnt start on fake device #1522 2023-06-15 21:58:09 +02:00
Roberto Viola
9dd25f0d69 Rowing Concept2 Pm3, Pm4 (Bluetooth) #1486 2023-06-15 08:07:00 +02:00
Roberto Viola
c84e16aed9 build 590 2023-06-14 21:00:46 +02:00
Roberto Viola
f10e68f47b Peloton workout doesnt start on fake device #1522 2023-06-14 15:40:18 +02:00
Roberto Viola
07111d5a9e Support for Ultrasport F-Bike 400B #690 2023-06-14 14:06:31 +02:00
Roberto Viola
77a4d4224a NordicTrack X11i - watt value takes on huge value when incline level set to "-6%" #52
https://github.com/cagnulein/QZCompanionNordictrackTreadmill/issues/52
2023-06-14 11:54:55 +02:00
Roberto Viola
bda145a29e Kickr Snap #585 2023-06-14 11:17:41 +02:00
Roberto Viola
54799c3519 Revert "Peloton Rowing with Concept 2 #1481"
This reverts commit 90469409b7.
2023-06-13 21:48:05 +02:00
Roberto Viola
1580471db8 Update csaferower.cpp 2023-06-12 13:19:52 +02:00
Roberto Viola
0b918f1b44 Rowing Concept2 Pm3, Pm4 (Bluetooth) (Issue #1486) 2023-06-12 13:08:30 +02:00
Roberto Viola
a13719b0a0 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-06-12 11:43:15 +02:00
Roberto Viola
90469409b7 Peloton Rowing with Concept 2 #1481 2023-06-12 11:43:02 +02:00
Roberto Viola
e3474fa844 Update CSafeRowerUSBHID.java 2023-06-11 16:30:26 +02:00
Roberto Viola
2da438778a Rowing Concept2 Pm3, Pm4 (Bluetooth) #1486 2023-06-11 15:54:10 +02:00
Roberto Viola
2cf61c2ccf fitplusbike with and without response 2023-06-11 12:10:57 +02:00
Roberto Viola
6b8b1c2f68 fixing android build error 2023-06-10 20:41:31 +02:00
Roberto Viola
85b0bd5f74 Domyos EL500 elliptical Cadence settings (Issue #1519) 2023-06-10 20:31:42 +02:00
Roberto Viola
bf53671dc7 Rowing Concept2 Pm3, Pm4 (Bluetooth) (Issue #1486) 2023-06-10 20:27:08 +02:00
Roberto Viola
86f4bdddd7 Rowing Concept2 Pm3, Pm4 (Bluetooth) #1486 2023-06-09 10:27:38 +02:00
Roberto Viola
1096b08fdd Use Peloton workout name in fit file #1502 2023-06-09 09:37:11 +02:00
Roberto Viola
5d1b115645 Usbhid #1486 (#1510)
* Revert "fixing android build"

This reverts commit c44f576876.

* Revert "Rowing concept2 pm3, pm4 (bluetooth) #1486 (#1505)"

This reverts commit 71647a8406.

* usb hid first commit

* fixing android build

* Update CSafeRowerUSBHID.java
2023-06-08 11:11:01 +02:00
Roberto Viola
094c5a838d Use Peloton workout name in fit file #1502 2023-06-08 10:15:01 +02:00
Roberto Viola
2488cc8758 PaddleOCR for Zwift OCR on Windows (#1438)
* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml

* very raw implementation of the python script

https://github.com/victorypoint/iFit-Wolf3/blob/main/process-image.py

* Update windows_zwift_incline_paddleocr_thread.h

* fixing path

* use signal

* fixing lag on debug prints

* fixing chinese file url

* Update zwift-incline.py

* Update zwift-incline.py

* Update main.yml

* Update zwift-incline.py
2023-06-08 10:03:47 +02:00
Roberto Viola
8084b9f06b Rowing Concept2 Pm3, Pm4 (Bluetooth) #1486 2023-06-07 21:42:14 +02:00
Roberto Viola
8b48707dfb Powerzone line and zones not showing #1509 2023-06-07 21:31:00 +02:00
Roberto Viola
0ad679e2f8 Rowing Concept2 Pm3, Pm4 (Bluetooth) #1486 2023-06-07 21:20:05 +02:00
Roberto Viola
33a1202f5f BH NLS12 ELLIPTICAL #1393 2023-06-06 16:20:29 +02:00
Roberto Viola
776aee4902 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-06-06 14:19:51 +02:00
Roberto Viola
c44f576876 fixing android build 2023-06-06 14:19:47 +02:00
Roberto Viola
a723dce8fc fixed simulator don't show up on xcode 2023-06-06 10:53:56 +02:00
Roberto Viola
7329389ffc 2.13.72 2023-06-06 09:17:02 +02:00
Roberto Viola
71647a8406 Rowing concept2 pm3, pm4 (bluetooth) #1486 (#1505)
* builds!

* Update Usbserial.java
2023-06-06 09:15:57 +02:00
Roberto Viola
669a99e6cd Peloton Rowing with Concept 2 #1481 2023-06-05 22:29:23 +02:00
Roberto Viola
49b0883e26 STOP , PAUSE , START buttons do not function on FTMS treadmill (Issue #1503) 2023-06-05 22:13:53 +02:00
Roberto Viola
ec13911855 Auto Sync Not Working On Google TV with IPAD ios #1441
https://github.com/cagnulein/qdomyos-zwift/issues/1441#issuecomment-1575613785
2023-06-05 09:01:47 +02:00
Roberto Viola
5b7422cff0 Use Peloton workout name in fit file #1502 2023-06-05 08:26:30 +02:00
Roberto Viola
ee7b1ca1d5 STOP , PAUSE , START buttons do not function on FTMS treadmill #1503 2023-06-05 08:17:32 +02:00
Roberto Viola
b588037651 Rowing Concept2 Pm3, Pm4 (Bluetooth) #1486
reverting and start a separate branch
2023-06-04 17:03:54 +02:00
Roberto Viola
5a19c314ba Rowing Concept2 Pm3, Pm4 (Bluetooth) #1486 2023-06-04 16:56:41 +02:00
Roberto Viola
4e06af6200 Use Peloton workout name in fit file #1502 2023-06-04 16:47:12 +02:00
Roberto Viola
b6ffdb7145 Rowing Concept2 Pm3, Pm4 (Bluetooth) #1486 2023-06-04 16:35:32 +02:00
Roberto Viola
02c7c2ff2a Peloton Rowing with Concept 2 (Issue #1481) 2023-06-04 10:14:51 +02:00
Roberto Viola
6369194167 Peloton Rowing with Concept 2 #1481 2023-06-04 08:36:15 +02:00
Roberto Viola
fd8984f2ca 2.13.67 2023-06-03 16:16:46 +02:00
Roberto Viola
328b2cadc1 Peloton Rowing with Concept 2 #1481 2023-06-03 16:16:03 +02:00
Roberto Viola
8a9b5a3cc9 Peloton Rowing with Concept 2 (Issue #1481)
https://github.com/cagnulein/qdomyos-zwift/issues/1481#issuecomment-1574706758
2023-06-03 08:40:15 +02:00
Roberto Viola
46792b3c4f build 574 2023-06-03 07:20:37 +02:00
Roberto Viola
5662f90e31 2.13.66 2023-06-03 07:18:22 +02:00
Roberto Viola
81c94738b0 Use Peloton workout name in fit file #1502 2023-06-03 07:15:52 +02:00
Roberto Viola
b3874957ca Pro-form Sport RL rower Bluetooth Name I_RW Pace and Speed are incorrect #1498 2023-06-03 06:56:44 +02:00
Roberto Viola
7f16b04824 Peloton Rowing with Concept 2 (Issue #1481)
https://github.com/cagnulein/qdomyos-zwift/issues/1481#issuecomment-1574648781
2023-06-03 06:44:43 +02:00
Roberto Viola
a3af5be2ce Peloton Rowing with Concept 2 (Issue #1481)
https://github.com/cagnulein/qdomyos-zwift/issues/1481#issuecomment-1574354738
2023-06-03 06:00:05 +02:00
Roberto Viola
033ab6bd16 Echelon Row Sport Pace & Odometer Data Wrong #1500 2023-06-03 05:50:10 +02:00
Roberto Viola
38df1caf10 build 573 2023-06-02 17:58:51 +02:00
Roberto Viola
ef909a35df negative HR (Issue #1501) 2023-06-02 17:48:48 +02:00
Roberto Viola
65777dea2d Echelon Row Sport Pace & Odometer Data Wrong #1500 2023-06-02 17:46:11 +02:00
Roberto Viola
f2554ad454 Echelon Row Sport Pace & Odometer Data Wrong (Issue #1500) 2023-06-02 16:00:10 +02:00
Roberto Viola
56c04335ae Add FTMS device rower setting #1497 2023-06-02 12:13:42 +02:00
Roberto Viola
c5cf31b228 Peloton Rowing with Concept 2 (Issue #1481) 2023-06-02 07:26:14 +02:00
Roberto Viola
1b04588b4e Peloton Rowing with Concept 2 (Issue #1481) 2023-06-02 07:19:17 +02:00
Roberto Viola
c99c008b64 Peloton Rowing with Concept 2 (Issue #1481) 2023-06-02 07:16:33 +02:00
Roberto Viola
af2db915b4 Vision 600E Treadmill FTMS #1499 2023-06-02 07:06:10 +02:00
Roberto Viola
1c2a220ae4 SmartRow rower on iOS #1485 2023-06-02 07:01:37 +02:00
David Mason
77cb8439c0 Override keyword 1472 (#1475)
* #1472 make a lack of override keyword a compile error

* #1472 added override keyword as recommended by QtCreator

* #1472 deleting void Virtual* in prep for merge from master

* fix typo in the merge

---------

Co-authored-by: Roberto Viola <cagnulein@gmail.com>
2023-06-01 16:46:14 +02:00
Roberto Viola
5f14e7aa22 SmartRow rower on iOS #1485 2023-06-01 16:32:16 +02:00
Roberto Viola
e0ab1edbb6 Peloton Rowing with Concept 2 (Issue #1481) 2023-06-01 15:23:46 +02:00
Roberto Viola
ff09896cf4 Octane Fitness Q37xi Support #1023 2023-06-01 15:02:47 +02:00
Roberto Viola
a9a118d03a 2.13.64 2023-06-01 09:07:02 +02:00
Roberto Viola
f3d6f13be9 Rower AVG pace #1158 2023-06-01 09:04:44 +02:00
Roberto Viola
f23ec88dfb Peloton Rowing with Concept 2 (Issue #1481)
colors!
2023-06-01 08:52:28 +02:00
Roberto Viola
9027eb961f Peloton Rowing with Concept 2 (Issue #1481) 2023-06-01 08:34:10 +02:00
Roberto Viola
6b637e1d92 Peloton Rowing with Concept 2 #1481 2023-05-31 17:55:20 +02:00
Roberto Viola
e96eceb271 Peloton Rowing with Concept 2 #1481 2023-05-31 09:56:00 +02:00
Roberto Viola
a77074a874 Rowing Concept2 Pm3, Pm4 (Bluetooth) #1486 2023-05-31 09:46:44 +02:00
Roberto Viola
1927ad9577 CSafe Rower (#1491)
* very basic csafe implementation

* trying to fix build

* fixing build

* Update csaferower.cpp

* Update csafe.h

* Update csafe.h

* Update csafe.cpp

* Revert "Update csafe.h"

This reverts commit 3af958da71.

* builds

* ready to merge!
2023-05-30 19:14:07 +02:00
Roberto Viola
f79fd80838 Peloton Rowing with Concept 2 #1481
target pace tile added
2023-05-30 11:46:07 +02:00
Roberto Viola
cfe05c76f4 BH NLS12 ELLIPTICAL #1393 2023-05-30 09:10:05 +02:00
Roberto Viola
4c8da03f19 Peloton Rowing with Concept 2 #1481 2023-05-30 08:45:13 +02:00
Roberto Viola
7abf133a61 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-05-29 08:29:09 +02:00
Roberto Viola
383ecc6381 version 2.13.59 2023-05-29 08:27:09 +02:00
Roberto Viola
dfd68c4445 Peloton Rower Pace (#1490)
* Update peloton.cpp

* added setting for the level and parsed

* handle target speed on trainprogram.cpp

* changespeed signal handled on the training program
2023-05-29 08:24:20 +02:00
Roberto Viola
cd689cb6fc Linux WebSockects in CI (#1489)
* Update main.yml

* Update main.yml
2023-05-28 19:21:49 +02:00
Roberto Viola
43094f41e2 Update ftmsrowertestdata.h 2023-05-28 06:40:51 +02:00
Roberto Viola
ad6d683b09 Concept 2 Rower #335 2023-05-28 06:08:58 +02:00
Roberto Viola
db5d177925 Concept 2 Rower #335 2023-05-27 21:12:16 +02:00
Roberto Viola
bfe6838acc replacing / with - in the xml training program file name 2023-05-27 18:45:25 +02:00
Roberto Viola
4a061acbfb peloton training program xml in the training folder with also the air date 2023-05-27 18:21:46 +02:00
Roberto Viola
5326089804 pm5 rower fix 2023-05-27 18:06:10 +02:00
Roberto Viola
42c6e35219 SmartRow rower on iOS #1485 2023-05-27 11:12:43 +02:00
Roberto Viola
a9f86f78b4 BH NLS12 ELLIPTICAL #1393 2023-05-27 08:27:19 +02:00
Roberto Viola
3ce7828c8f version 2.13.58 2023-05-27 08:00:05 +02:00
Roberto Viola
cb821f65b8 smartrow fix 2023-05-26 21:27:13 +02:00
Roberto Viola
cbc09609a0 adding request cadence to the rower charts 2023-05-26 08:00:58 +02:00
Roberto Viola
0f8ad887dd adding a separator for the auto saved training program 2023-05-25 16:44:57 +02:00
Roberto Viola
5d7f688321 version 2.13.57 2023-05-25 08:44:54 +02:00
Roberto Viola
b904af9335 Peloton Rowing with Concept 2 (Issue #1481) 2023-05-25 08:36:36 +02:00
Roberto Viola
030689217c save and send peloton xml training program by email 2023-05-25 08:36:11 +02:00
Roberto Viola
8f02feb172 bkoolbike added to ios 2023-05-25 08:13:16 +02:00
Roberto Viola
27ee8d99d8 Kickr Snap #585 2023-05-24 22:13:55 +02:00
Roberto Viola
4fcb13b11b fixing build error 2023-05-24 22:08:56 +02:00
Roberto Viola
13d488025f Bkool trainer #1483 2023-05-24 21:57:11 +02:00
Roberto Viola
c379985c68 Bkool trainer #1483 2023-05-24 10:08:34 +02:00
Roberto Viola
50e4ff371f Back to Back workouts without Restarting app cause NEGATIVE Calories #1480 2023-05-24 08:53:01 +02:00
Roberto Viola
01749bad6e Nautilus U618 [BUG] #1477 2023-05-24 08:24:47 +02:00
Roberto Viola
7ba1986929 BH Spada 2 bike (i.concept module) #486 2023-05-23 11:04:21 +02:00
David Mason
0a52f15406 Virtual device encapsulation #994 (#995)
* #887 converted a group of many fields of different subclasses of bluetoothdevice to use a single bluetoothdevice instance.
- This changes the behaviour. Previously multiple devices could be found and references stored, and the first in the order of ifs in device() used. Now the last one found is used and the others found are overwritten. This needs to be addressed.
- Still not making use of virtual destructors.

* #887 added virtualdevice abstract class and used it throughout

* #887 added the ability to hide the virtual device and still manage its deletion from the bluetoothdevice destructor, and used for the various cases where only 1 of multiple possible virtual devices are exposed via VirtualDevice().

* #887 fixes from merge

* #887 removed superfluous command

* #887 restored code deleted in merge

* typo fixed!

* Video again, just to show and see #838

* Video again, just to show and see #838

* Video again, just to show and see #838

* Video again, just to show and see (Issue #838)

* qz immediately crashes (Issue #929)

* faketreadmill HR fixed

* #927 route starting and stopping of bluetooth discovery through new functions startDiscovery() and stopDiscovery()

* #927 log a qDebug when stopDiscovery is called when the discovery agent is null

* #887 fixed merge conflict

* #997 fix merge conflict

* #997 fix merge conflict

* #887 fix merge problem

* #994 restored bluetooth class from master, and removed the deletion of the virtual devices

* #994 restored keepawakehelper.h includes for Android builds, but inside #ifdefs to avoid the little yellow "correction" flag (i.e. to remove it) from QtCreator.

* #994 restored unnecessarily adjusted white space

* #994 adjustments based on self review in the PR

* #994 adjusted header includes - put keepawakehelper in Android-only builds, and lockscreen.h in iOS only builds

* #994 removed some #includes repeated from the header

* #994 updated new device class to use inherited virtual device functionality

* #994 log deletion to qDebug

* #994 log deletion to qDebug

* #994 align qmdnsengine with master

* #994 fixed typo

* #994 fixed build errors

* #994 fix merge error

* #994 introduce VIRTUAL_DEVICE_MODE enum to say something about why the virtual device is exposed or not

* #994 updated some devices to use inherited virtual device management

* #994 reduction of diff with master

* #994 fixed typo in doc

* #994 reduction of diff with master

* #994 fix check for virtual device

* #994 reduction of diff with master

* #994 reduction of diff with master

* #994 reduction of diff with master

* #994 reduction of diff with master

* #994 reduction of diff with master

* #994 reduction of diff with master

* #994 reduction of diff with master

* #994 reduction of diff with master

* #994 reduction of diff with master

* #994 reduction of diff with master

* #994 reduction of diff with master

* #994 align submodule with master

* fixing build error

Signed-off-by: Roberto Viola <Cagnulein@gmail.com>

* #994 removed override keyword not required for this PR

* #994 removed deprecated comment

* fixing build on iOS

* from bluetoothdevice::VirtualDevice() always returning a virtualDevice pointer

Signed-off-by: Roberto Viola <Cagnulein@gmail.com>

* #994 updated some @brief comments to account for bluetoothdevice::VirtualDevice() now returning the virtual device regardless of virtual device mode.

* reverting merge error in proformrower.cpp

Signed-off-by: Roberto Viola <Cagnulein@gmail.com>

---------

Signed-off-by: Roberto Viola <Cagnulein@gmail.com>
Co-authored-by: Roberto Viola <Cagnulein@gmail.com>
2023-05-22 17:40:21 +02:00
Roberto Viola
abd2e76f4f WalkingPad X21 new version #1473 2023-05-22 14:06:23 +02:00
Roberto Viola
035d150c6d Update horizontreadmill.cpp 2023-05-21 13:26:21 +02:00
Roberto Viola
a29619feca fixing CI auth (#1474)
* Update main.yml

* Create http_parser.h

* Add files via upload

* Update main.yml
2023-05-21 11:27:22 +02:00
Roberto Viola
964be4b5d1 KETTLER TM support #1465 2023-05-21 07:18:37 +02:00
Roberto Viola
d01be6384d KETTLER TM support #1465 2023-05-20 19:00:35 +02:00
Roberto Viola
0845406940 Open WalkingPad X21 new version #1473 2023-05-20 15:54:06 +02:00
Roberto Viola
fd30c61124 KETTLER TM support #1465 2023-05-20 15:20:30 +02:00
Roberto Viola
a49b9b07ef new KinfSmith R2 treadmill ( KS-NACH-X21C ) 2023-05-20 15:10:36 +02:00
Roberto Viola
af91761a23 KETTLER TM support (#1470) 2023-05-20 12:07:16 +02:00
Roberto Viola
32af96b05b Zero ZT-2500 treadmill #1471 2023-05-20 07:29:29 +02:00
Roberto Viola
658006a12a Assault Air Runner Treadmill #1446 2023-05-19 19:36:26 +02:00
Roberto Viola
4451680cea fixing test cases for Sole treadmills 2023-05-19 12:07:50 +02:00
Roberto Viola
beaab12894 fixing floating issue with the null values 2023-05-18 17:25:26 +02:00
Roberto Viola
cc74ef6fe4 fixing overflow on kettler treadmill #1465 2023-05-18 16:06:37 +02:00
Roberto Viola
958487b0e5 Sole F85 help #1468 2023-05-18 15:33:10 +02:00
Roberto Viola
68d191d581 Open Floating on a Browser button added 2023-05-18 14:37:32 +02:00
Roberto Viola
aca68b2a10 KETTLER TM support (#1470)
* preparing the modification

* Update horizontreadmill.cpp
2023-05-18 14:06:16 +02:00
Roberto Viola
c3f013a69a add/allow minimum resistance for classic peloton workouts #1469 2023-05-17 10:00:52 +02:00
Roberto Viola
c2dc509c97 KETTLER TM support #1465 2023-05-17 09:47:08 +02:00
Roberto Viola
520726f989 Support for Ultrasport F-Bike 400B #690 2023-05-16 22:03:04 +02:00
Roberto Viola
04c7837e35 Kickr Snap #585 2023-05-16 16:07:58 +02:00
Roberto Viola
e1b097837b Proform 8 speed and inclination force #1454 2023-05-15 09:03:20 +02:00
Roberto Viola
b443b03d49 Tacx Flow requests #1460 2023-05-14 09:15:00 +02:00
Roberto Viola
c8cf9367db Auto Sync Not Working On Google TV with IPAD ios #1441 2023-05-13 14:52:21 +02:00
Roberto Viola
1a7c0be896 Reduce Incline not working on Horizon 7.0AT (01) #1458 2023-05-12 15:10:12 +02:00
Roberto Viola
bb219fdf9a fix build 2023-05-12 06:27:32 +02:00
Roberto Viola
d446186082 Reduce Incline not working on Horizon 7.0AT (01) #1458 2023-05-12 06:26:03 +02:00
Roberto Viola
1bc00b4f9d background and shadow color customization
Top bar custom color modification
#1420
2023-05-10 13:47:02 +02:00
Roberto Viola
28db6a7f70 Option for voice announcement of treadmill speed changes #1453 2023-05-09 10:06:50 +02:00
Roberto Viola
a1ad083422 Horizon Paragon X #637 2023-05-09 09:25:25 +02:00
Roberto Viola
0132a3f38d BH NLS12 ELLIPTICAL #1393 2023-05-08 14:36:09 +02:00
Roberto Viola
1a6a06ead4 version 2.13.41 2023-05-07 20:11:15 +02:00
Roberto Viola
f34f373687 BH Spada 2 bike (i.concept module) #486 2023-05-05 11:05:37 +02:00
Roberto Viola
95327f6c1a Update domyoselliptical.cpp (#1444) 2023-05-03 21:38:54 +02:00
Roberto Viola
93e60262d6 Assault Air Runner Treadmill #1446 2023-05-02 17:17:32 +02:00
Roberto Viola
992ae1c88c arranging metrics in floating window - Android qz #1131 2023-05-02 16:59:13 +02:00
Roberto Viola
5754e800d2 Xiaomi Walkingpad R2 Pro #1447 2023-04-30 20:07:30 +02:00
Roberto Viola
ee9491d5f6 Assault Air Runner Treadmill #1446 2023-04-30 19:56:52 +02:00
Roberto Viola
789c911966 Yesoul S3 FTMS #1445 2023-04-30 19:16:30 +02:00
Roberto Viola
d95c6f86c7 arranging metrics in floating window - Android qz (Issue #1131) 2023-04-28 13:44:23 +02:00
Roberto Viola
4d7da98c7a Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-04-28 13:10:20 +02:00
Roberto Viola
193518c1c1 2.13.38 543 2023-04-28 13:10:17 +02:00
Roberto Viola
32aafc3d00 Connect with strava button (#1439)
* peloton bike communicate with QZ AI Companion

* image added

* Update main.qml
2023-04-28 09:52:43 +02:00
Roberto Viola
1ffd44ae91 peloton bike communicate with QZ AI Companion 2023-04-28 09:00:34 +02:00
Roberto Viola
d3c8441717 BH Spada 2 bike (i.concept module) #486 2023-04-27 16:53:37 +02:00
Roberto Viola
ca8638abe0 UI theme (#1435)
* UI theme first commit

* status bar default color is not working yet

* all the new 3 settings are working!

---------

Co-authored-by: Roberto Viola <roberto.viola@systemceramics.com>
2023-04-27 12:20:51 +02:00
Roberto Viola
514ac12484 Horizon Paragon X #637 2023-04-27 09:27:10 +02:00
Roberto Viola
db5c4cc73e Disabling auto resistance does not work #1430 2023-04-26 14:29:29 +02:00
Roberto Viola
58f2934bb8 BH NLS12 Elliptical (#1408) 2023-04-26 14:25:48 +02:00
Roberto Viola
6c677a3a2b 2.13.37 build 542 2023-04-26 11:54:58 +02:00
Roberto Viola
2b4d04acc0 BH NLS12 Elliptical (#1408) #486 2023-04-26 11:54:08 +02:00
Roberto Viola
3841918383 Revert "BH Spada 2 bike (i.concept module) #486"
This reverts commit 95cb85fd88.
2023-04-26 11:51:13 +02:00
Roberto Viola
d843d09829 Nexgim QB-C01 smart bike #1433 2023-04-24 17:57:56 +02:00
Roberto Viola
c1bceca06f Disabling auto resistance does not work #1430 2023-04-24 15:23:39 +02:00
Roberto Viola
ec7782b86f Ypoo elliptical trainer U3 cross trainer #1412 (PR #1417) 2023-04-24 15:19:44 +02:00
Roberto Viola
ae6505bdb4 android version 2.13.35 2023-04-21 20:51:38 +02:00
Roberto Viola
3690120207 Sportplus SP-HT-1200 B IE #1429 2023-04-21 20:18:33 +02:00
Roberto Viola
dfe8c59a91 Update ftmsbiketestdata.h 2023-04-21 14:15:38 +02:00
Roberto Viola
e25abb0317 Update ftmsbiketestdata.h 2023-04-21 12:34:16 +02:00
Roberto Viola
4dd02ad1b6 Update ftmsbiketestdata.h 2023-04-21 12:04:46 +02:00
Roberto Viola
ef715f002b ios build 539 2023-04-21 11:32:17 +02:00
Roberto Viola
f02c2d4293 Diamondback 1260Sc Bike #1428 2023-04-21 11:29:07 +02:00
Roberto Viola
9a4baffe81 Stroke Rate with WaterRower COM Module doesn't decrease when I stop rowing. #1424 2023-04-21 10:18:16 +02:00
Roberto Viola
dd7e1b3861 android version 2.13.34 2023-04-20 15:21:50 +02:00
Roberto Viola
7cffb2c51e Ypoo elliptical trainer U3 cross trainer #1412 (#1417)
* init and write resistance done

* cross trainer data used, need to check with these frames

Value: 9e0000000040021800000000100014006e00

Value: 002f00000000000b000000000000000f00

* i guess I finished

* Update devices.h

* Update ypooellipticaltestdata.h
2023-04-20 14:47:01 +02:00
Roberto Viola
d6e5accc84 fixed popup on floating window 2023-04-19 16:46:20 +02:00
Roberto Viola
900a7f2d94 Conversion gain setting and conversion offset setting do not work with Tacx Neo 2 and Peloton. #1418 2023-04-19 10:47:56 +02:00
Roberto Viola
dd6e0068ee Qthttpserver for windows #1308 (#1309) 2023-04-18 21:13:07 +02:00
Roberto Viola
fd9c3f414b closing the popup on the floating if the user press the popup on the main screen 2023-04-18 17:35:10 +02:00
Roberto Viola
dd692b5b04 Peloton workout doesn't follow #1419 2023-04-18 08:54:34 +02:00
Roberto Viola
1f83bc94f2 closing the popup on the floating if the user press the popup on the main screen 2023-04-18 07:15:53 +02:00
Roberto Viola
c7386511ea bodytone zro-t4 treadmill #1416 2023-04-17 17:37:36 +02:00
Bepo7012
446c6ee027 Inclination improvement for Videos (#1415)
* Test Videos with higher fps Rates

* Set the speed limit higher, no longer a Problem

* iOS project updated

* Inclination Filter and Pause Video implemented

* Update qmdnsengine

* Revert "Update qmdnsengine"

This reverts commit 779bc6e4d0.

* Changes requested

* Fixed power selection for fakebike

* fakebike reverted, fixed bug in trainprogram speed limit

* Revert "Update qmdnsengine"

This reverts commit 779bc6e4d0.

* Video rec. factor included in max. Replay Rate

---------

Co-authored-by: Roberto Viola <cagnulein@gmail.com>
2023-04-17 17:15:17 +02:00
Roberto Viola
e85a6bc090 bodytone zro-t4 treadmill #1416 2023-04-17 17:10:25 +02:00
Roberto Viola
2a84b6075e bodytone zro-t4 treadmill #1416 2023-04-17 16:01:45 +02:00
Roberto Viola
1ff6295aae Inclination improvement for Videos (PR #1415) 2023-04-16 16:01:58 +02:00
Roberto Viola
70913cd7af label for the garmin companion in the settings 2023-04-14 08:33:20 +02:00
Roberto Viola
3576eff46e build 536 2023-04-13 19:49:17 +02:00
Roberto Viola
49984654ea peloton floating url available always even if the train program is not ready 2023-04-13 19:41:55 +02:00
Roberto Viola
c7f17cd749 BH NLS12 Elliptical (#1408)
* init done

* first phase

* test cases added

* fixing linker error

* Update iconceptellipticaltestdata.h

* test updated
2023-04-13 11:51:27 +02:00
Roberto Viola
20af8dcfed Wahoo Kickr Headwind #1281 2023-04-13 08:55:19 +02:00
Roberto Viola
1f113b0164 ios build CI (#1394) 2023-04-12 22:36:42 +02:00
Roberto Viola
11d0a33374 Kickr Snap #585 2023-04-12 11:31:07 +02:00
Roberto Viola
e371d13f0f trying to fix cadence (#1406) 2023-04-11 11:39:27 +02:00
Roberto Viola
f5d201aed1 floating window on ios works to qz ai companion app 2023-04-10 18:16:51 +02:00
Roberto Viola
d561dfa318 adding new case for the peloton ocr and toast messages 2023-04-10 11:35:27 +02:00
Roberto Viola
ef095dc9f1 ZWO Running distance file #1403 2023-04-09 08:46:17 +02:00
Roberto Viola
0db053b60a garmin running cadence fixed 2023-04-07 15:19:11 +02:00
Roberto Viola
2eeba4f9a6 adding cadenceFromAppleWatch to echelonstride 2023-04-07 13:42:58 +02:00
Roberto Viola
f4ccbfb33f QZ Peloton Auto Sync through an external device (#1400)
* it works, most of

* floating url added

* settings added!

* Update qmdnsengine

* preparing for release

* keeping the same logic between android ocr and companion ocr
2023-04-07 13:32:10 +02:00
Roberto Viola
32b9c2810f Update treadmill.cpp 2023-04-06 21:55:26 +02:00
Roberto Viola
7abc3834aa fixing android build 2023-04-06 21:53:56 +02:00
Roberto Viola
51cf710b08 foot cadence from Garmin Companion 2023-04-06 21:42:52 +02:00
Roberto Viola
34ae065c2c compatibilty with Garmin Companion 1.1.0 2023-04-06 11:24:51 +02:00
Roberto Viola
cbf0b178d6 Zwift OCR for Auto incline on freerun (PR #1369) 2023-04-06 10:01:57 +02:00
Roberto Viola
229b6a8e30 ios build fixed 2023-04-05 13:23:51 +02:00
Roberto Viola
02cc189d72 version 2.13.26 2023-04-05 08:44:42 +02:00
Roberto Viola
af9d1d97a8 Nautilus B616 connects but shows 0 for all stats #1383 2023-04-05 08:43:29 +02:00
Roberto Viola
20b3263a5b Garmin ConnectIQ Companion App (#1330)
* library added to the iOS project

* iOS build on CI

* adding app_delegate

* fixing typo

* Update main.yml

* Update main.yml

* fixing build error

* app on ios builds!

* handleURL works!

* connect to device but doesn't receive msgs

* android sdk works!

* HR receveid!

* getHR added to android

* should be everything for android

* fixing ios build

* fixing new xcode errors

* hr read from ios too!

* ios startup cleaned

* full chain on ios works!

* removing ant heart and apple watch hr from device files

* update_hr_from_external added

* fixing hr for 2 devices

* garmin hr fixed on android

* removing the ios CI

* Update fakebike.cpp

* Update lockscreen.h

* Update proformwifibike.cpp
2023-04-05 08:20:06 +02:00
Roberto Viola
f712b7bb92 Provide Increment/Decrement preferences for Speed/Incline #618 2023-04-03 19:04:28 +02:00
Roberto Viola
38b69c20e1 proformwifibike: turned on inclinationAvailableByHardware 2023-04-03 14:36:25 +02:00
Roberto Viola
5f99c1dd22 Heart Rate Monitor (Wahoo tick) going On and Off intermittently, only when in Domyos Elliptical bike setup. #1392 2023-04-03 09:49:08 +02:00
David Mason
a715849756 #1221 added test that bluetooth class performs action to activate template managers after detecting a device (#1223)
* #1221 decoupled template managers from class bluetooth and added tests

* #1221 renamed function

* #1221 updated comments

* #1221 adjusted for enhanced messages of #1287

* #1221 fixed merge error

* #1221 fix build error post-merge

* fix ios build

---------

Co-authored-by: Roberto Viola <cagnulein@gmail.com>
2023-04-03 09:33:35 +02:00
Roberto Viola
16b62d8752 Allow the resitance knob on echelon bikes to be used to switch gears (Issue #1299) 2023-04-03 09:28:58 +02:00
Roberto Viola
b68c166b01 disabled auto start of the tap for activiotreadmill.cpp 2023-04-02 18:39:50 +02:00
Roberto Viola
c6aaaa6944 android version 2.13.25 2023-04-02 05:19:30 +02:00
Roberto Viola
625e8c91eb Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-04-01 17:53:02 +02:00
Roberto Viola
4d81a51442 adding external power sensor on proformwifibikes 2023-04-01 17:52:55 +02:00
Roberto Viola
bbe3b4e369 ios android fixed 2023-04-01 12:20:55 +02:00
Roberto Viola
e94e030a00 adding toast from C++ 2023-04-01 09:30:23 +02:00
Roberto Viola
c9f8076a5e Nautilus B616 connects but shows 0 for all stats #1383 2023-04-01 08:53:37 +02:00
Roberto Viola
dbc1e43c2b iOS build fixed 2023-04-01 08:43:04 +02:00
Roberto Viola
b4ea2cd1c5 Zwift OCR for Auto incline on freerun #1369 2023-03-31 16:20:31 +02:00
Roberto Viola
e2d0c9284a Back character missing from title bar #1163 2023-03-31 14:16:01 +02:00
Roberto Viola
66bedca4a4 double back to close android app, ask before closing #1386 2023-03-31 12:20:35 +02:00
Roberto Viola
5a10627594 Confirmation on OK on the settings page #417 2023-03-31 11:52:55 +02:00
Roberto Viola
7465f71c74 Toast manager added
thanks to https://gist.github.com/jonmcclung/bae669101d17b103e94790341301c129
2023-03-31 10:50:54 +02:00
Roberto Viola
8c58f03d82 version 2.13.23 2023-03-31 10:09:02 +02:00
Roberto Viola
e199ea3fc6 Settings / auto restart #1114 2023-03-31 10:06:57 +02:00
Roberto Viola
bbd37dc36c Zwift OCR for Auto incline on freerun #1369 2023-03-30 17:30:15 +02:00
Roberto Viola
48646ec3bb Bowflex T128 #1385 2023-03-30 10:45:24 +02:00
Roberto Viola
dca0b1b917 iOS version 2.13.22 2023-03-30 07:08:57 +02:00
Roberto Viola
db78365ffd Nautilus B616 connects but shows 0 for all stats #1383 2023-03-30 06:54:01 +02:00
Roberto Viola
1325b1cd29 Add support for hometrainer Skandika X-2000 #1364 2023-03-29 16:32:37 +02:00
Roberto Viola
43780a076f Zwift OCR for Auto incline on freerun #1369 2023-03-29 08:55:54 +02:00
Roberto Viola
a374ebcf6e Schwinn 170 not connecting in QZ #1365 2023-03-29 08:45:53 +02:00
Roberto Viola
7ab1eac7fe Schwinn 170 not connecting in QZ #1365 2023-03-28 15:33:00 +02:00
Roberto Viola
d378ab23ea Schwinn 170 not connecting in QZ #1365 2023-03-28 14:29:09 +02:00
Roberto Viola
4c3566a156 added an option to simulate incline with an increment of speed
for all the treadmills
2023-03-27 16:45:18 +02:00
Roberto Viola
51fb564640 added an option to simulate incline with an increment of speed 2023-03-27 15:11:34 +02:00
Roberto Viola
ef40f29597 Floating Window: start button and disabling auto resistance #1134 2023-03-27 14:57:08 +02:00
Roberto Viola
34db47f611 qz crashes with Rouvy #1282 2023-03-27 12:16:45 +02:00
Roberto Viola
100d0b3f58 Add support for hometrainer Skandika X-2000 #1364 2023-03-27 11:32:35 +02:00
Takiora
2a4b58634b Fixing Resistance nordictrackelliptical.cpp (#1375) 2023-03-24 14:46:14 +01:00
Roberto Viola
95cb85fd88 BH Spada 2 bike (i.concept module) #486 2023-03-24 14:36:16 +01:00
Roberto Viola
ff1abb2b9f Zwift OCR for Auto incline on freerun (#1369) 2023-03-23 19:44:02 +01:00
Roberto Viola
aa22225e5e Zwift OCR for Auto incline on freerun (#1369) 2023-03-23 17:04:45 +01:00
Roberto Viola
b6b5d8ecba GEM module inclination added 2023-03-23 15:48:14 +01:00
Roberto Viola
e9be1d8fb2 BH Spada 2 bike (i.concept module) #486 2023-03-22 14:17:07 +01:00
Roberto Viola
5bfa0b3312 Auto-resistance not working properly with tacx neo 2 and peleton app (Issue #1370) 2023-03-22 12:56:14 +01:00
Roberto Viola
7fd491e005 android version 2.13.17 2023-03-22 12:11:26 +01:00
Roberto Viola
0717799d15 Floating Window: start button and disabling auto resistance #1134 2023-03-22 11:08:25 +01:00
Roberto Viola
2c34d9001b added some note on the zwift ocr setting 2023-03-22 11:03:11 +01:00
Roberto Viola
61498cb6ef Zwift OCR for Auto incline on freerun (#1369)
* testing and output

* getting ready to get the inclination

* Update trainprogram.cpp

* Update trainprogram.cpp

* Update ScreenCaptureService.java

* it's working!

* fixing resolution!
2023-03-22 10:25:56 +01:00
Roberto Viola
95ec82b641 Save FIT file when the app is closing (#1346)
* Update homeform.cpp

* -fit-file-saved-on-quit added

* debug log added

* Update qzsettings.cpp

* Update main.cpp
2023-03-21 16:56:12 +01:00
Roberto Viola
c6a34c59d3 BH Spada 2 bike (i.concept module) #486 2023-03-21 08:21:31 +01:00
Roberto Viola
c9d243ab18 QZ won't connect to Norditrack C1750 #1373 2023-03-20 17:28:06 +01:00
Roberto Viola
172440872a n Support for Sole Fitness F85 >2019 treadmill #1243 2023-03-20 16:15:28 +01:00
Roberto Viola
7ccbc07808 fixing android build 2023-03-20 11:18:58 +01:00
Roberto Viola
e02fb8e1c5 Stride in metric when other measures are imperial #1372 2023-03-20 11:17:10 +01:00
Roberto Viola
17b54a1963 Auto-resistance not working properly with tacx neo 2 and peleton app #1370 2023-03-20 10:50:52 +01:00
Roberto Viola
5e7b208c92 BH Spada 2 bike (i.concept module) #486 2023-03-20 10:26:05 +01:00
Roberto Viola
78a652a512 NPE RUNN Inclination Override Not Working #1352 2023-03-19 16:34:49 +01:00
Roberto Viola
9a49ef1e7f BH Spada 2 bike (i.concept module) #486 2023-03-19 16:22:24 +01:00
Roberto Viola
39f92a429a QZCompanion and Wahoo Direct Connect no-gui #1332 2023-03-19 07:46:32 +01:00
Roberto Viola
a70c79f144 WaterRower S4 ComModule #1366 2023-03-17 08:38:20 +01:00
Roberto Viola
278e209670 version 2.13.13 2023-03-16 16:43:48 +01:00
Roberto Viola
9fefde58ac Add support for hometrainer Skandika X-2000 #1364 2023-03-16 16:24:11 +01:00
Roberto Viola
7f26e63cd6 Add support for hometrainer Skandika X-2000 #1364 2023-03-16 15:39:01 +01:00
Roberto Viola
54beb7cc4e fix build error 2023-03-16 08:53:06 +01:00
Roberto Viola
35d7e54871 Open Resistance dropping or going higher when using QZ + Zwift/Rouvy[BUG] #1356 #1299 2023-03-16 08:23:14 +01:00
Roberto Viola
5eb9de8c9b NPE RUNN Inclination Override Not Working #1352 2023-03-16 08:07:35 +01:00
Roberto Viola
0f703cd836 Costaway folding treadmill #1350 (#1355)
* Costaway folding treadmill #1350

first implementation, not finished yet

* Update eslinkertreadmill.cpp
2023-03-15 08:55:00 +01:00
Roberto Viola
9157e39ebd fixing treadmillInclinationOverride 2023-03-14 21:16:16 +01:00
Roberto Viola
e9c76bde99 version 2.13.12 2023-03-14 20:37:42 +01:00
Roberto Viola
1398cb26fb fixing treadmillInclinationOverride 2023-03-14 20:34:55 +01:00
Roberto Viola
35a986fdd0 fixing virtual bike device for strydrunpowersensor 2023-03-14 20:22:03 +01:00
Roberto Viola
3f8aa376a6 version 2.13.11 2023-03-14 10:42:55 +01:00
Roberto Viola
21a3ae6816 Paragon X #1359 2023-03-14 10:42:10 +01:00
Roberto Viola
3da7ac198a Proform Pro22 add #1341 2023-03-14 05:47:27 +01:00
Roberto Viola
36aed6c326 setting tips fonts increased 2023-03-13 08:30:14 +01:00
Roberto Viola
2a02eec288 NPE RUNN Inclination Override Not Working #1352 2023-03-13 08:09:28 +01:00
Roberto Viola
0ca1a8caad Support for ZIPRO Notus (Issue #1344) 2023-03-11 08:00:39 +01:00
Roberto Viola
13ea251697 adding virtual bike to stryd (rouvy abandoned treadmill thing so users want to play with rouvy bike format) 2023-03-11 07:55:13 +01:00
Roberto Viola
9c0757986f WalkingPad #1348 2023-03-10 13:41:33 +01:00
Roberto Viola
81028fc111 iOS version 2.13.7 514 2023-03-10 09:47:51 +01:00
Roberto Viola
1999bbaee0 Support for ZIPRO Notus (Issue #1344) 2023-03-10 09:19:56 +01:00
Roberto Viola
12ad01ddde power calculation for footpods 2023-03-10 09:09:58 +01:00
Roberto Viola
8b79b85f8c Support for ZIPRO Notus (Issue #1344) 2023-03-09 16:09:52 +01:00
Roberto Viola
3e900c1a55 Broadcast cadence & speed to Garmin watch #1316
send power and cadence to garmin device also on android (not tested)
2023-03-09 10:17:43 +01:00
Roberto Viola
5f22107085 Open Support for ZIPRO Notus #1344 2023-03-09 10:04:57 +01:00
Roberto Viola
6354d20bc4 Open Support for ZIPRO Notus #1344
HR added!
2023-03-09 09:54:10 +01:00
Roberto Viola
d1aeb30abb PID not showing right number according to training program (Issue #1234) 2023-03-09 09:48:54 +01:00
Roberto Viola
e2592896c6 Broadcast cadence & speed to Garmin watch #1316 2023-03-09 08:54:19 +01:00
Roberto Viola
d4305fa93a align swift virtual bike from Garmin power sensor over bluetooth #1347 2023-03-09 06:41:32 +01:00
Roberto Viola
cc0051f7c3 it works! 2023-03-09 06:31:54 +01:00
Roberto Viola
56962545d8 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-03-08 14:31:08 +01:00
Roberto Viola
7b128d2a8a iOS 2.13.6 2023-03-08 14:30:51 +01:00
Roberto Viola
a228f55a9a Please add total output & time to next as a metric available in the floater window #1321 2023-03-08 14:15:25 +01:00
Roberto Viola
9ec12d5733 Support for ZIPRO Notus #1344 2023-03-08 10:22:23 +01:00
Roberto Viola
f460a9770a Support for ZIPRO Notus #1344 2023-03-08 09:44:35 +01:00
Roberto Viola
49bbbddbe2 PID not showing right number according to training program #1234 2023-03-08 08:29:45 +01:00
Roberto Viola
f1b7daf34b Some tiles data missing from floating window #1247 2023-03-07 10:15:31 +01:00
Roberto Viola
e78434fbb3 Add Google Maps Display when "travelling" imported GPX Files #455
https://github.com/cagnulein/qdomyos-zwift/issues/455#issuecomment-1456871560
2023-03-07 10:04:18 +01:00
Roberto Viola
397dcc7db8 fix typo 2023-03-07 09:24:08 +01:00
Roberto Viola
c2b0ebb882 Solution to get Octane Zero Runner ZR8 Elliptical working with Zwift #1338 2023-03-07 09:01:16 +01:00
Roberto Viola
68a8169e0b 2.13.4 on iOS 2023-03-06 16:45:48 +01:00
Roberto Viola
5611be511f 2.13.5 2023-03-06 12:26:40 +01:00
Roberto Viola
427b63b113 Some tiles data missing from floating window #1247 2023-03-06 12:12:58 +01:00
Roberto Viola
716a256cf4 Some tiles data missing from floating window #12 2023-03-06 12:02:39 +01:00
Roberto Viola
8d123cec1a Horizon Paragon X #637 2023-03-06 11:51:04 +01:00
Roberto Viola
582c260dd9 typo 2023-03-06 10:20:20 +01:00
Roberto Viola
7994c884ea Gear adjustment option within floating window #1336 2023-03-06 10:06:27 +01:00
Roberto Viola
58dbee1e15 Solution to get Octane Zero Runner ZR8 Elliptical working with Zwift #1338 2023-03-06 10:05:03 +01:00
Roberto Viola
5c2483b264 Solution to get Octane Zero Runner ZR8 Elliptical working with Zwift #1338 2023-03-06 09:50:21 +01:00
Roberto Viola
15d94329c2 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-03-06 09:21:01 +01:00
Roberto Viola
77de4703d3 Wahoo Kickr Headwind #1281 2023-03-06 09:20:30 +01:00
Takiora
2318531980 Nordictrack_C7.5 (#1337)
* inclination+cadence+resistance+heart+speed ok

* Update nordictrackelliptical.cpp
2023-03-04 16:01:56 +01:00
Roberto Viola
993727d251 Solution to get Octane Zero Runner ZR8 Elliptical working with Zwift #1338 2023-03-04 15:54:11 +01:00
Roberto Viola
128ad2a84b Ability to turn magnet on/off from floater window (Issue #1322) 2023-03-03 08:24:08 +01:00
Roberto Viola
9e8a8a18f2 QZ FIT file start timestamp inconsistent with Zwift (Issue #1311) (#1312) 2023-03-03 07:00:36 +00:00
Roberto Viola
19e05219f5 MatrixTF50 Treadmill #1331 2023-03-02 17:43:48 +01:00
Roberto Viola
58376bff43 Ability to turn magnet on/off from floater window #1322
https://github.com/cagnulein/qdomyos-zwift/issues/1322#issuecomment-1449125738
2023-03-02 13:53:07 +01:00
Roberto Viola
d4518fe018 version 507 for iOS 2023-03-01 16:05:56 +01:00
Roberto Viola
d6258a5774 Low Speed based on calculation on wattage #1325 2023-03-01 12:14:47 +01:00
Roberto Viola
063ab524e6 Allow the resitance knob on echelon bikes to be used to switch gears #1299 2023-03-01 10:36:08 +01:00
Roberto Viola
fbf8fed94d Ability to turn magnet on/off from floater window #1322 2023-03-01 10:14:40 +01:00
Roberto Viola
bbf0ef11d4 iOS Crash when stop pressed #1323 2023-03-01 09:11:20 +01:00
Roberto Viola
1439f5d15a added a protection for the homeform singleton in the templateinfosenderbuilder 2023-02-28 16:47:47 +01:00
Roberto Viola
79aad21d26 fixed homeform singleton 2023-02-28 16:29:31 +01:00
Roberto Viola
062cac38f6 Ability to turn magnet on/off from floater window #1322 2023-02-28 15:57:35 +01:00
Roberto Viola
36046c00ad Please add total output & time to next as a metric available in the floater window #1321 2023-02-28 15:22:33 +01:00
Roberto Viola
8e84d2bf95 Please add total output & time to next as a metric available in the floater window #1321 2023-02-28 14:27:46 +01:00
Roberto Viola
66aaeb5c8b floating: removed target number if 0 2023-02-28 11:56:41 +01:00
Roberto Viola
52c25f5fc7 Update apexbiketestdata.h 2023-02-28 10:12:33 +01:00
Roberto Viola
ec457a18c2 Apex Rides bikes #1230 2023-02-28 09:45:34 +01:00
Roberto Viola
eb00d52512 Apex Rides bikes #1230 2023-02-28 09:27:09 +01:00
Roberto Viola
55ad2dbe3e QZ FIT file start timestamp inconsistent with Zwift #1311 2023-02-28 08:28:21 +01:00
Roberto Viola
2ea9ad2992 Occasional wildly inaccurate distance measurement #1290 2023-02-28 08:07:08 +01:00
Roberto Viola
211024f67f Samsung S22/S23 crash on startup #1320 2023-02-27 17:38:58 +01:00
Roberto Viola
3b7fa4f8a8 Target/Actual Zones on floater #1310 2023-02-27 10:41:36 +01:00
Roberto Viola
e3c0fc933a PID not showing right number according to training program #1234 2023-02-27 09:55:53 +01:00
Roberto Viola
e4d2d7899b PID not showing right number according to training program #1234 2023-02-27 09:41:43 +01:00
Roberto Viola
70e87ac6a3 Elliptical NordicTrack C 7.5 #1277 2023-02-27 09:34:04 +01:00
Roberto Viola
9d6b53586a target inclination added in the floating 2023-02-27 08:14:03 +01:00
Roberto Viola
b35c41a319 target speed added to the floating 2023-02-27 08:02:25 +01:00
Roberto Viola
010d0b0dcc floating.htm clang formatted 2023-02-27 07:55:32 +01:00
Roberto Viola
a31c926a1a fixed cadence in the floating window for device different from bike 2023-02-27 07:49:34 +01:00
Roberto Viola
94c03ba9b4 Allow the resitance knob on echelon bikes to be used to switch gears #1299 2023-02-26 22:43:55 +01:00
Roberto Viola
bce965c6d6 Domyos EL 520 auto resistance #1252 2023-02-26 08:50:24 +01:00
Roberto Viola
74e5e04f0c Issue with Peloton ride 1/21/23 (Issue #1315) 2023-02-25 19:45:14 +01:00
Roberto Viola
159611da89 YPOO treadmill #1306 2023-02-25 03:14:15 +01:00
Roberto Viola
8cb9d24261 Indicate n/a for speeds too low for Pace calculation (Issue #1293) 2023-02-25 02:54:14 +01:00
Roberto Viola
74cc93b91e Elliptical NordicTrack C 7.5 (Issue #1277) 2023-02-24 14:54:41 +01:00
Roberto Viola
85d622a1e3 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-02-24 14:44:25 +01:00
Roberto Viola
9967550a41 Beta 2.12(498) - Incline Step : Per Facebook #1303 2023-02-24 13:37:03 +01:00
Roberto Viola
bf41d8f1d7 Update treadmill.cpp 2023-02-24 07:39:26 +01:00
Roberto Viola
f4999e3233 YPOO treadmill #1306 2023-02-23 16:28:05 +01:00
Roberto Viola
2b01877a7c Beta 2.12(498) - Incline Step : Per Facebook #1303 2023-02-23 16:12:01 +01:00
Roberto Viola
d985b9a477 Elliptical NordicTrack C 7.5 #1277 2023-02-23 15:55:19 +01:00
Roberto Viola
960aa7a17b Display step cadence on main app #1242 2023-02-23 12:04:23 +01:00
Roberto Viola
42e7c3481e Allow the resitance knob on echelon bikes to be used to switch gears #1299 2023-02-23 09:27:31 +01:00
Roberto Viola
7404128eba Elliptical NordicTrack C 7.5 #1277 2023-02-23 08:25:38 +01:00
Roberto Viola
f81f5354f6 2.12.72 2023-02-22 16:41:29 +01:00
Roberto Viola
b3e588cff5 Beta 2.12(498) - Incline Step : Per Facebook (Issue #1303) 2023-02-22 16:27:18 +01:00
Roberto Viola
a39597765c 2.12.71 2023-02-22 14:59:52 +01:00
Roberto Viola
28f4bb04da Beta 2.12(498) - Incline Step : Per Facebook #1303 2023-02-22 14:20:22 +01:00
Roberto Viola
80ab7a3877 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-02-22 14:12:58 +01:00
Roberto Viola
5fcd1233c1 Cadence not showing #1302 2023-02-22 14:12:55 +01:00
Roberto Viola
b894906f48 Strava Auth Webview (#1296)
* test needed

* linker error

* removing static for linker error

* signals fixed

* Update Home.qml

* Update main.qml

* fixing anchors

* using a separate qml

* Update WebStravaAuth.qml

* Update WebStravaAuth.qml

* added setting to fallback to previous

* removed unused import
2023-02-22 14:04:19 +01:00
Roberto Viola
f998d7123f Preset tiles colour setting doesn't work, crashes [BUG] #1301 2023-02-22 13:46:35 +01:00
Roberto Viola
35c4ecc781 Elliptical NordicTrack C 7.5 #1277 2023-02-22 11:28:50 +01:00
Roberto Viola
c98e0db8b0 Technogym myrun cadence but no stride length #1260 2023-02-22 11:01:01 +01:00
Roberto Viola
0eead667a3 Indicate n/a for speeds too low for Pace calculation #1293 2023-02-22 10:57:14 +01:00
Roberto Viola
759dcf37c7 dynamic text recognition for amazon app store 2023-02-22 06:39:40 +01:00
Roberto Viola
4f79679601 Noble Pro Elite e8i treadmill #1298 2023-02-21 21:34:28 +01:00
Roberto Viola
a834e6ea14 adding the mlkit text recogniton library for amazon app store 2023-02-21 20:22:19 +01:00
Roberto Viola
325963327e version 2.12.70 2023-02-21 15:22:39 +01:00
Roberto Viola
ef96f05127 Domyos EL 520 auto resistance #1252 2023-02-21 15:07:36 +01:00
Roberto Viola
d836883fc3 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-02-21 11:05:52 +01:00
Roberto Viola
4abb1be184 Elliptical NordicTrack C 7.5 #1277 2023-02-21 11:05:42 +01:00
Roberto Viola
8af0ca3350 Google Test on CI (#1148)
* Update main.yml

* Update main.yml

* Update main.yml

* fixing bluetooth scan thanks to tests!

* Update main.yml

* Update main.yml

* Update main.yml

* Update main.yml
2023-02-21 11:03:18 +01:00
David Mason
c16e113290 #1294 additional compiler option in Windows to avoid "File too big" error (#1295) 2023-02-21 06:40:34 +01:00
Roberto Viola
6e92bcece2 Kickr connection not showing watts (Issue #1229) 2023-02-21 06:37:43 +01:00
Roberto Viola
f71a393c2b noblepro connect to fitshow treadmill 2023-02-20 22:32:11 +01:00
Roberto Viola
015bf842b0 Domyos 500b self powered rower (Issue #1238) 2023-02-20 22:08:17 +01:00
Roberto Viola
cde122089e Nordictrack Incline Trainer x7i #1284 2023-02-20 14:23:21 +01:00
Roberto Viola
709ead19a3 Sole S77 Support #1283 2023-02-20 13:28:07 +01:00
David Mason
8b4fe10f87 #1287 unit test fixes (#1288)
* #1287 unit test fixes

* #1287 made test name values more user friendly, after all, they aren't actually the test name identifier anymore.
2023-02-20 08:45:39 +01:00
Roberto Viola
74d69f5d8f Kickr connection not showing watts #1229 2023-02-20 08:35:38 +01:00
Roberto Viola
d7a8caa24c Sunny Health Fitness Smart Multifunction Magnetic Rowing Machine SF-RW5941SMART #1289 2023-02-20 08:22:22 +01:00
Roberto Viola
803291ba43 TREADMILL NORDIC TRACK 2950 #1278 2023-02-20 08:16:23 +01:00
Roberto Viola
38f53fd1bf Sole S77 Support (Issue #1283) 2023-02-20 07:56:52 +01:00
Roberto Viola
3d310bfd14 fixing double issue for the color of the resistance 2023-02-19 14:24:26 +01:00
Roberto Viola
5cdad64d9c cadence missing in the floating window for treadmill and elliptical 2023-02-19 08:34:07 +01:00
Roberto Viola
d3c2d15fc3 Sole S77 Support (Issue #1283) 2023-02-19 08:32:10 +01:00
Roberto Viola
794cda41cc license on apk 2023-02-18 18:00:51 +01:00
Roberto Viola
330359c446 Kickr connection not showing watts (Issue #1229) 2023-02-18 06:55:10 +01:00
Roberto Viola
c75906f766 disable_hr_frommachinery setting for fitshow treadmill 2023-02-18 06:42:06 +01:00
Roberto Viola
a2d9994608 version 2.12.67 2023-02-17 15:13:58 +01:00
Roberto Viola
0a01f62f79 Missing event_type start in Fit Export #1279 2023-02-17 15:09:13 +01:00
Roberto Viola
8888639bef DYNAMAX treadmill added 2023-02-17 15:04:20 +01:00
Roberto Viola
5a114a7f8f Renpho. Auto resistance with only whole numbers #1245 2023-02-17 11:23:14 +01:00
Roberto Viola
53717078b9 Missing event_type start in Fit Export #1279 2023-02-17 10:57:05 +01:00
Roberto Viola
d2c94da6bf Kickr connection not showing watts #1229 2023-02-17 08:14:10 +01:00
Roberto Viola
320a40c65c NPE Runn Incline Data #1276 2023-02-17 07:31:31 +01:00
Roberto Viola
9efb573f83 version 2.12.65 2023-02-16 19:00:21 +01:00
Roberto Viola
072024cee1 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-02-16 18:56:07 +01:00
Roberto Viola
bf692fbcc0 Nordictrack Incline Trainer added (not tested yet) 2023-02-16 11:29:20 +01:00
Roberto Viola
2909a61a94 added disabling auto resistance handling to ftmsbike 2023-02-16 07:56:22 +01:00
Roberto Viola
c06dc9c332 NPE Runn Incline Data #1276 2023-02-16 07:52:29 +01:00
Roberto Viola
85ee8fae3c 2.12.64 2023-02-15 13:35:03 +01:00
Roberto Viola
0f3f5d7db3 Update wahookickrsnapbike.cpp 2023-02-15 10:00:29 +01:00
Roberto Viola
5d34e2e6eb Missing event_type start in Fit Export #1279 2023-02-15 09:58:15 +01:00
Roberto Viola
679fec7e69 Lap Issue #1102 2023-02-14 15:40:04 +01:00
Roberto Viola
1cd68457a9 Elliptical NordicTrack C 7.5 #1277 2023-02-14 09:48:27 +01:00
Roberto Viola
065494ae43 Fixed treadmill incline #1273 2023-02-14 08:58:05 +01:00
Roberto Viola
c59ee00d3e NPE Runn Incline Data #1276 2023-02-14 08:46:51 +01:00
Roberto Viola
d504812655 Domyos EL 520 auto resistance #1252 2023-02-14 08:30:08 +01:00
Roberto Viola
06110e808d Strava Activity Walking when average speed is under 6.5 km/h #1275 2023-02-13 15:13:11 +01:00
Roberto Viola
c27e7353b7 Train Program: HR Min and Max #1271 2023-02-13 11:43:30 +01:00
Roberto Viola
38ca4cbf33 Rhythm 24 HRM cadence and heart rate sensor 2023-02-13 10:34:34 +01:00
Roberto Viola
f86604d7b2 Auto Resistance from Zwift-QZ is not working on Proform Hybrid #1172 2023-02-13 10:11:07 +01:00
Roberto Viola
7309df034e Kickr connection not showing watts #1229 2023-02-13 09:56:06 +01:00
Roberto Viola
16180689ac Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-02-13 08:55:39 +01:00
Roberto Viola
880a8708f0 Domyos Elliptical EL 520 Power Calibration #1267 2023-02-13 08:55:31 +01:00
Roberto Viola
fbc68c5487 version 2.12.62 2023-02-11 09:11:07 +01:00
Roberto Viola
1540fd4fe3 Domyos EL500 Gears [BUG] (Issue #1263) 2023-02-11 09:02:29 +01:00
Roberto Viola
9855b9e76f Kickr connection not showing watts #1229 2023-02-10 15:15:16 +01:00
Roberto Viola
3ba1eaf92a Technogym myrun cadence but no stride length (Issue #1260) 2023-02-10 15:08:38 +01:00
Roberto Viola
474d519d85 Matching QZ Speed to Zwift Speed using Zwift Workout files (.zwo) (Issue #1209) 2023-02-10 14:08:20 +01:00
Roberto Viola
3e8bbf57d2 Auto Resistance from Zwift-QZ is not working on Proform Hybrid #1172 2023-02-10 08:59:44 +01:00
Roberto Viola
80f6a5a9ee Revert "Auto Resistance from Zwift-QZ is not working on Proform Hybrid #1172"
This reverts commit 7191141177.
2023-02-10 08:42:21 +01:00
Roberto Viola
c1c1a07cd9 cardiostrang TX90 smart treadmill #1251 2023-02-10 08:23:37 +01:00
Roberto Viola
369eb4d101 Kickr connection not showing watts #1229 2023-02-10 08:21:04 +01:00
Roberto Viola
115bdc1cb2 Kickr connection not showing watts #1229 2023-02-09 15:49:46 +01:00
Roberto Viola
3b6b5a6721 Renpho. Auto resistance with only whole numbers #1245 2023-02-09 11:21:53 +01:00
Roberto Viola
24b680ca12 removed email from debug log 2023-02-08 17:27:44 +01:00
Roberto Viola
7c53a16e38 Horizon Paragon X not able to control through qz (Issue #1256) 2023-02-08 15:38:14 +01:00
Roberto Viola
0eabe10ea1 Matching QZ Speed to Zwift Speed using Zwift Workout files (.zwo) (Issue #1209) 2023-02-08 15:26:42 +01:00
Roberto Viola
c92b702b2e Debug log using qdomyos on a proform Tour de France 10.0 bike #877
https://github.com/cagnulein/qdomyos-zwift/issues/877#issuecomment-1422555720
2023-02-08 14:08:56 +01:00
Roberto Viola
9068e82ae3 Tiles not displaying data for Sole e55 elliptical (#1240) 2023-02-08 13:56:51 +01:00
Roberto Viola
77ebbe7c6d Domyos EL 520 auto resistance #1252 2023-02-08 10:46:18 +01:00
Roberto Viola
8ec760855e Jumping Resistance on Schwinn IC8 (Issue #1236) 2023-02-08 09:59:25 +01:00
Roberto Viola
5d1b399fa6 Incline Override (Issue #1244) 2023-02-07 23:21:59 +01:00
Roberto Viola
b6ebeadae2 fix build error on iOS 2023-02-07 18:53:07 +01:00
Roberto Viola
c43dfaeb1f Lap Issue #1102 2023-02-07 17:16:23 +01:00
Roberto Viola
0f6caeff8a Winfita (T532) Treadmill Incline Levels Table for Calculations, etc. #1244 (#1253)
* settings added

* done
2023-02-07 15:17:53 +01:00
Roberto Viola
7191141177 Auto Resistance from Zwift-QZ is not working on Proform Hybrid #1172 2023-02-07 14:56:04 +01:00
Roberto Viola
256981dff7 adding adb for windows for nordictrack treadmill (#1167)
* start adding adb for windows for nordictrack treadmill #1153

* adding adb to package

* Update main.yml

* Update main.yml

* fixing file path

* fixing file name

* avoiding searching for bluetooth for wifi devices

* using adb pull to get the logs

* Update nordictrackifitadbtreadmill.cpp

* fixing open file issue

* Update nordictrackifitadbtreadmill.cpp

* Update nordictrackifitadbtreadmill.cpp

* adb on a thread

* thread error

* trying to get log emulating the tail command

* trying logcat directly

* using logcat only!
2023-02-07 09:00:08 +01:00
Roberto Viola
ac8e295322 Joroto x2pro #1239 2023-02-07 08:34:50 +01:00
Roberto Viola
d772ae85bf filering watch device #110 2023-02-07 08:17:13 +01:00
Roberto Viola
83180f37ce target power on echelon #1198 2023-02-07 08:09:47 +01:00
Roberto Viola
af695b0aab Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-02-07 07:52:42 +01:00
Roberto Viola
68bf628cf3 cardiostrang TX90 smart treadmill #1251 2023-02-07 07:52:33 +01:00
Roberto Viola
c631511fc9 Display step cadence on main app #1242 2023-02-06 16:30:24 +01:00
Roberto Viola
7a0ac82f0d Display step cadence on main app #1242 2023-02-06 16:18:08 +01:00
Roberto Viola
f90e980a62 Horizon Paragon X #637 2023-02-06 15:34:55 +01:00
Roberto Viola
03b871143a Jumping Resistance on Schwinn IC8 #1236 2023-02-06 09:26:32 +01:00
Roberto Viola
c374cbeace Matching QZ Speed to Zwift Speed using Zwift Workout files (.zwo) (Issue #1209) 2023-02-05 18:32:24 +01:00
Roberto Viola
df55d648c9 Wahoo Kickr compatibity #442 #1229 2023-02-04 06:33:54 +01:00
Roberto Viola
d18a2ebe38 version 2.12.59 2023-02-03 15:42:43 +01:00
Roberto Viola
bca55a68a1 Getting peloton timestamp #1224 (#1225)
* Getting peloton timestamp #1224

crash on start service

* screenshot works!

* OCR implementation done!

* OCR implemented, not tested

* linker fix

* fixing linking error

* fix compile error

* Update ScreenCaptureService.java

* fixing android build

* it's working at least for a minute!

* some optimizations, working

* memory leak fixed

* working like a charm! super stable!

* peloton logic added, not tested

* added AppChecker

* Update AndroidManifest.xml

* adding also landscape recognizer

* Update MediaProjection.java

* Update MediaProjection.java

* Update MediaProjection.java

* Update MediaProjection.java

* peloton bike added!

* peloton bike ocr works

* peloton bike doesn't require location services (don't know if it's available)

* added androidadblog class

* getting package name

* removing previewtrainingprogram when a program is correctly loaded

* it's working!
2023-02-03 15:40:38 +01:00
Roberto Viola
a34d880ef3 FTMS Treadmill inclination timeout issue #1237 2023-02-03 12:24:32 +01:00
Roberto Viola
1b07564429 Jumping Resistance on Schwinn IC8 #1236 2023-02-02 15:48:23 +01:00
Roberto Viola
53fd346348 Jumping Resistance on Schwinn IC8 #1236 2023-02-02 15:32:13 +01:00
Roberto Viola
11e037dd84 Max Resistance #1219 2023-02-02 12:09:19 +01:00
Roberto Viola
0869ad36c5 Max Resistance #1219 2023-02-02 11:54:57 +01:00
Roberto Viola
334e0cfd25 Auto Resistance from Zwift-QZ is not working on Proform Hybrid #1172 2023-02-02 11:49:11 +01:00
Roberto Viola
d2af89f693 BUG] Kickr connection not showing watts #1229 2023-02-02 11:24:58 +01:00
Roberto Viola
2f832c65ed Matching QZ Speed to Zwift Speed using Zwift Workout files (.zwo) #1209
math issue
2023-02-02 11:01:49 +01:00
Roberto Viola
cb087ea4be Matrix T50 Treadmill #1235 2023-02-02 08:18:16 +01:00
Roberto Viola
72df934997 Wrong speed after update QZ on 31 Jan 2023 #1233 2023-02-02 08:13:30 +01:00
Roberto Viola
349b525295 add canStartStop method to the treadmills 2023-02-01 10:56:09 +01:00
Roberto Viola
3e58c2d681 Open Matching QZ Speed to Zwift Speed using Zwift Workout files (.zwo) #1209 2023-02-01 10:31:25 +01:00
Roberto Viola
e7748f943c Sprint XBR555 #1231 2023-02-01 08:25:39 +01:00
Roberto Viola
03a755ee36 fixing minor on #1134 2023-01-31 12:08:46 +01:00
Roberto Viola
9ad1821194 Differences in the GPX starting point (Issue #988)
scaling down the pin
2023-01-31 10:33:05 +01:00
Roberto Viola
04b16b5849 Floating Window: start button and disabling auto resistance (Issue #1134) 2023-01-31 10:30:54 +01:00
Roberto Viola
12c16b9634 Floating Window: start button and disabling auto resistance #1134 2023-01-30 10:56:45 +01:00
Roberto Viola
4034109195 Proform Hybrid Trainer XT connects but data seems inaccurate. #1138 2023-01-30 10:03:31 +01:00
Roberto Viola
5355b43cdf Virtual Echelon: distance is wrong in miles #1226 2023-01-30 09:26:15 +01:00
Roberto Viola
ecbb40a375 Winfita treadmill #1214 2023-01-30 08:30:19 +01:00
Roberto Viola
6235d00c55 android version 2.12.55 2023-01-28 20:59:46 +01:00
Roberto Viola
bff9f1a0a2 Floating Window: start button and disabling auto resistance #1134 2023-01-28 20:49:39 +01:00
Roberto Viola
ecc6306b7d Winfita treadmill #1214 2023-01-28 17:24:22 +01:00
Roberto Viola
e9856d8b42 Fixing Android CI (#1216)
* trying to use java 9

* Update main.yml

* Update gradle-wrapper.properties

* Update gradle-wrapper.properties

* Update main.yml

* Update gradle-wrapper.properties

* Update main.yml

* Update main.yml
2023-01-28 17:01:56 +01:00
Roberto Viola
099bbf7d9c Proform Hybrid Trainer XT connects but data seems inaccurate. (Issue #1138) 2023-01-28 08:03:18 +01:00
Roberto Viola
ba462a4d10 Proform Hybrid Trainer XT connects but data seems inaccurate. #1138 2023-01-28 07:25:30 +01:00
Roberto Viola
f953335bd2 Proform Hybrid Trainer XT connects but data seems inaccurate. (Issue #1138) 2023-01-27 14:18:07 +01:00
Roberto Viola
3e60e0bd91 Add elevation gain to iOS for treadmill #1218 2023-01-27 14:10:40 +01:00
Roberto Viola
3e98e548be Merge pull request #1210 from cagnulein/Floating-Window-start-button-and-disabling-auto-resistance#1134
Floating Window: start button and disabling auto resistance #1134
2023-01-27 09:15:21 +01:00
Roberto Viola
8021055345 start stop pause on floating 2023-01-27 09:12:33 +01:00
Roberto Viola
3fdf890474 Merge branch 'master' into Floating-Window-start-button-and-disabling-auto-resistance#1134 2023-01-27 08:07:12 +01:00
Roberto Viola
53e4e58c3f Winfita treadmill #1214 2023-01-27 07:56:57 +01:00
punk-kaos
ad37d26815 Fix resistance auto tracking values for Proform Hybrid Trainer XT. (#1211) 2023-01-25 18:58:52 +01:00
Roberto Viola
a59321e7b8 Floating Window: start button and disabling auto resistance #1134 2023-01-25 15:08:43 +01:00
Roberto Viola
e203fdaa67 Training Program Random Option INT? #1152 2023-01-25 10:09:32 +01:00
Roberto Viola
81b95ac080 Open Proform Hybrid Trainer XT connects but data seems inaccurate. #1138 2023-01-25 08:35:47 +01:00
David Mason
3ce3719630 Test updates 1197 (#1208) 2023-01-24 22:03:16 +01:00
Roberto Viola
5eaac9e509 Proform Hybrid Trainer XT connects but data seems inaccurate. (Issue #1138) 2023-01-24 19:40:50 +01:00
Roberto Viola
65adba7285 Specify profile to use via cmd-line #1189 (#1190)
* Specify profile to use via cmd-line #1189

* added  + ".qzs" to the filename

* fixed and tested
2023-01-24 16:00:18 +01:00
Roberto Viola
03aadfa864 Proform Cycle Trainer 400 Ri #1203 2023-01-24 11:53:01 +01:00
Roberto Viola
b3a83c13b3 Proform Hybrid Trainer XT connects but data seems inaccurate. #1138 2023-01-24 09:20:18 +01:00
Roberto Viola
a92e43ba4d peloton offset on floating is changing 3 seconds at once #1206 2023-01-24 08:50:28 +01:00
Roberto Viola
bbf2fd54f3 Treadmill Sportsmaster T300 originally manufactured by DK City (T800 is the name used by DK City) #1204 2023-01-23 16:42:26 +01:00
Roberto Viola
2b110e7d9c Proform Hybrid Trainer XT connects but data seems inaccurate. #1138 2023-01-23 14:27:02 +01:00
Roberto Viola
ac3f2dd7f9 Floating Window - km to mph (Issue #1201) 2023-01-23 09:31:38 +01:00
Roberto Viola
afda87f2b3 Sole ST90 Treadmill #1202 2023-01-23 08:11:21 +01:00
Roberto Viola
2689b01159 Sole SB700 #1196 2023-01-21 20:14:46 +01:00
Roberto Viola
28c69284cf Update settings.qml 2023-01-21 19:03:36 +01:00
Roberto Viola
606aa28231 ERG Mode Stops Auto-Adjusting Resistance after beginning of workout [BUG] #1194 2023-01-21 18:53:14 +01:00
Roberto Viola
26e25914db BH iBoxster Plus doesn’t work #1185 2023-01-21 12:15:16 +01:00
Roberto Viola
6d83d67ec3 BH iBoxster Plus doesn’t work #1185 2023-01-21 08:43:56 +01:00
Roberto Viola
aad68cb1b9 description added to the settings 2023-01-20 11:40:23 +01:00
Roberto Viola
959b2e1663 Increase speed on treadmill for the Peloton app for the whole run as upper is too fast and average is too slow #1091 2023-01-20 10:25:22 +01:00
Roberto Viola
48b247fed6 Proform Hybrid Trainer XT connects but data seems inaccurate. #1138 2023-01-20 09:43:38 +01:00
Roberto Viola
a575776ea7 Strange behavior with HR training programs #1182 2023-01-20 08:50:41 +01:00
Roberto Viola
a394c7d075 second wave of descrptions in the settings 2023-01-19 15:52:49 +01:00
Roberto Viola
1efad04a7c first wave of comments in the settings 2023-01-19 14:41:59 +01:00
Roberto Viola
d6418d199f Treadmill Workouts All Labeled as Run in Strava #1130 2023-01-19 08:05:16 +01:00
Roberto Viola
6915494594 version 2.12.49 2023-01-18 20:55:37 +01:00
Roberto Viola
44b278173d sportstech sx600 connection but no data #1116 2023-01-18 20:52:47 +01:00
Roberto Viola
621de55f67 Home Fitness Buddy classes with the same date. needs to check the pel… (#1179)
* Home Fitness Buddy classes with the same date. needs to check the peloton class id #1176

work in progress to test and fix

* fixed

* removing debug

* Update main.cpp
2023-01-18 20:48:13 +01:00
mo1425z
11f347276c #1177 Fixing Grammar and details on home form (#1178) 2023-01-18 20:40:09 +01:00
Roberto Viola
d165382960 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-01-18 16:50:00 +01:00
Roberto Viola
819ecaf133 Power Zone Desync investigation #1175 2023-01-18 16:49:52 +01:00
Roberto Viola
b744ceb731 Target resistance tiles are toggled off in settings. (Issue #1162) 2023-01-18 11:47:40 +01:00
Roberto Viola
d706314802 Back character missing from title bar #1163 2023-01-18 11:33:17 +01:00
Roberto Viola
c9e5c2f065 Floating Window - Resistance (Echelon) stat appears even if Resistance & Target resistance tiles are toggled off in settings. (Issue #1162) 2023-01-18 11:10:02 +01:00
Roberto Viola
eadaf62064 sportstech sx600 connection but no data #1116
merging ftms with fitplus
2023-01-18 10:20:46 +01:00
Roberto Viola
ca9ada6d83 windows workaround for cscbike 2023-01-18 07:49:18 +01:00
Roberto Viola
aa9948b4ba Saris trainer #1173 2023-01-18 07:22:22 +01:00
Roberto Viola
07a301f53c steam rejected qz from their store 2023-01-18 07:07:45 +01:00
Roberto Viola
984a6395d0 Horizon treadmill miss some frames in the init #1108 2023-01-18 07:06:02 +01:00
Roberto Viola
50361e2b4f jtx_fitness_sprint_treadmill beeps everytime qz sends a inclination request. let's limit to 0.5 2023-01-17 20:50:26 +01:00
punk-kaos
fb6478324b Update Proform Hybrid XT resistance settings to (mostly) proper bluetooth values. (#1170) 2023-01-17 20:15:25 +01:00
Roberto Viola
048edf2022 fixing target tiles boolean on the floating 2023-01-16 22:20:47 +01:00
Roberto Viola
0985816c20 Floating window - Peloton Offset always appears even if that tile is disabled. (Issue #1161) 2023-01-16 22:15:06 +01:00
Roberto Viola
95e7ca1f6b Floating Window - Resistance (Echelon) stat appears even if Resistance & Target resistance tiles are toggled off in settings. #1162 2023-01-16 20:37:13 +01:00
Roberto Viola
f30e141d3f Support of Kingsmith WR1 rowing device (Issue #1118) 2023-01-16 16:37:02 +01:00
Roberto Viola
0bd4232d24 Support of Kingsmith WR1 rowing device (Issue #1118) not tested yet 2023-01-16 16:07:31 +01:00
Roberto Viola
f56b12ae85 Proform Hybrid Trainer XT connects but data seems inaccurate. (Issue #1138) 2023-01-16 15:02:27 +01:00
Roberto Viola
d98fccdf5a version 2.12.44 2023-01-16 14:07:03 +01:00
Roberto Viola
13b62ab0d0 Debug log using qdomyos on a proform Tour de France 10.0 bike #877 2023-01-16 14:03:58 +01:00
Roberto Viola
a20f73dc1b fixed empty charts if the previous session was stopped #857 2023-01-16 12:22:31 +01:00
Roberto Viola
dd84d2ce04 sportstech sx600 connection but no data #1116 2023-01-16 12:05:24 +01:00
Roberto Viola
b304505a1b Bowflex T6 treadmill #1064 2023-01-16 11:59:27 +01:00
Roberto Viola
c6c2717bb5 tile disabled fixed 2023-01-16 10:00:06 +01:00
Roberto Viola
61e539c822 sportstech sx600 connection but no data #1116 2023-01-16 09:26:35 +01:00
Roberto Viola
5cfb8141af Training Program Random Option INT? #1152 2023-01-15 10:21:06 +01:00
Roberto Viola
bb03d1c36a What are the available values to use in the training program xml? #1149 2023-01-15 09:00:37 +01:00
Roberto Viola
59c4249741 Support of Kingsmith WR1 rowing device (Issue #1118) 2023-01-15 08:56:31 +01:00
Roberto Viola
a44f52995d Echelon Stride treadmill stays in 'app' mode after the app has been closed (iOS keeps the connection alive) #1155 2023-01-15 08:37:12 +01:00
David Mason
ac2848cb55 Build corrections 1150 (#1156) 2023-01-15 07:02:52 +01:00
Roberto Viola
e8169806f9 fixing android build 2023-01-13 10:36:05 +01:00
Roberto Viola
8295ad654b Update settings.qml 2023-01-13 09:36:20 +01:00
Roberto Viola
6abcf8e536 Make Gears setting permanent (Issue #1146) 2023-01-13 09:21:24 +01:00
Roberto Viola
8161aae3da Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-01-13 09:02:04 +01:00
Roberto Viola
36c1933192 Proform Hybrid Trainer XT connects but data seems inaccurate. #1138 2023-01-13 09:02:01 +01:00
Roberto Viola
0508d26796 Update 20_supported_devices_and_applications.md 2023-01-13 08:13:28 +01:00
Roberto Viola
67d2292680 Sole Elliptical: Apple Watch not connecting #1120 2023-01-13 08:04:49 +01:00
Roberto Viola
873c4e8b72 Saris H3 #1147 2023-01-13 07:55:44 +01:00
David Mason
1a3a10f636 #1144 added tests for Thinkrider X5, Noblepro treadmill. (#1145) 2023-01-13 06:51:19 +01:00
Roberto Viola
a876959e79 fixing CI Steam 2023-01-12 07:38:57 +01:00
Roberto Viola
138af1514a fixing CI steam 2023-01-12 07:00:51 +01:00
David Mason
c9ec71ae02 Automated testing with Google Test #911 (#1111)
* #911 new branch with a very basic google test. Needs google test downloaded into /google_test. Will probably set up another submodule at some point.

* #911 added google test as a submodule

* Attempt to get lib and test project to build in action

* #911 trying to get submodule checkout to work

* #911 trying to get Linux build to happen

* #911 added header include

* #996 put the values from settings read for device discovery into a class

* #996 moved the enormous if statement for device detection to a method.

* #996 split device detection into detection and bluetoothdevice object creation

* #996 return the created object (but don't use it)

* #996 factored out starting of template managers into a single location

* #911 beginning of 2 device detection tests using google test

* #911 removed unnecessary #pragma once

* #996 put new classes into separate files. Added exclusions to devicediscoveryinfo to replicate current production behaviour

* #996 comments on functions

* #911 latest work. Tests crash in Windows.

* #911 2 device detection tests working

* #911 added test data classes for remaining devices

* #911 missed file

* #911 tests build and run. Most fail due to incomplete config.

* #911 filled in details for some of the device tests

* #911 filled in vast majority of test data. Doesn't build, and some obscure situations yet to be done.

* #911 use template method instead

* #911 builds, some tests failing

* #911 fixed some tests.

* #911 device identification tests passing to the currently possible extent, pending feedback.

* #911 start of work testing device object creation

* #911 got bluetoothdevice object creation tests working

* #911 added manufacturer data for m3i bike test, and fixed case sensitivity of m3i bike test.

* #911 added ability to specify and test multiple settings configurations

* #911 fixed typos

* #911 parameterized version

* #911 fixed file name to match class

* #911 added version using typed tests. Refactored to share basic test code from original test suite.

* #911 added googletest submodule to the documentation

* #911 rework to match current functioning of the bluetooth class, instead of the result of current work on #996.

* #911 updated for changes in master. Still doesn't actually work.

* #911 added configuration of test QSettings.

QSettings are probablly not set up properly, but the tests actually run now, but many fail.

* #911 added test settings facility

This enables the developer to override the default QSettings for the life of a test suite.

* #911 start tests with default settings.

* #911 got exclusions working

At least, where the bluetoothdevice object can actually work.

* #911 skip abstract devices

* #911 removed some unused code

* #911 removed unused file

* #911 include app project in main project

* #911 updated for latest device detection code

* #911 added submodule checkout of googletest to Android build

* #911 run qmake from the root in android build

* #911 adjusted test names and made the test for the invalid bluetooth device info test with enabling and disabling settings.

* #911 enabled the test for non-detection with invalid names

* #911 fixed test

* #911 updated comments

* #911 moved devicediscoveryinfo to the testing project

* #911 move devicediscoveryinfo to the test project

* #911 removed a unused class

* #911 removed unused file

* #911 modify correct object

* #911 modify correct object

* #911 removed irrelevant comment

* adding ls to locate llvm-arm

* debugging github actions

* Update main.yml

* #911 try being more specific about tst project dependency

* trying linking llvm-ar

* debugging llvm

* adding alias to llvm-ar

* enabling aliases

* Update main.yml

* maybe the last one for fixing CI?

* #911 see how the CI builds go without the app project

* #911 restored app project to root project

* trying to move the alias just before the make process

* trying to use NDK_LLVM_PATH

* trying set AR variable

* seems to be the right way

* fixing test m3i

* updating version aligned with the master

* #911 moved some definitions to defaults.pri

* #911 adjusted test case for adjusted detection rule

* #911 adjusted relative path

* #911 try adding toolchain/bin to path

* #911 revert previous change and show the PATH

* #911 fixed yml file

* #911 restored previous working yml file

* #911 show the PATH

* #911 moved some android related content to the shared defaults.pri

* #911 ignore the test and lib projects in an Android build

* #911 restore yml without AR specified

* #911 updated for the "TOORX" option for Horizon Treadmill

* #911 added test for the new detection criteria for Horizon Treadmill (TOORX)

* #911 added test for Kingsmith WR1 rowing device

* #911 added test cases for Toorx experience etc

* #911 added test case for FTMS Bike named KICKR CORE

* #911 simplified setup of multiple detection configs

* #911 further simplification of test config setup

* version aligned with master

Co-authored-by: Roberto Viola <cagnulein@gmail.com>
2023-01-12 06:30:40 +01:00
Roberto Viola
e10e7e5cc7 peloton offset fixed in the floating window 2023-01-12 06:15:24 +01:00
Roberto Viola
e7ea68e766 Steam Store (#1140) 2023-01-11 17:45:56 +01:00
Roberto Viola
2ccdbb1336 thinkrider X5 trainer bike #1142 2023-01-11 16:15:11 +01:00
Roberto Viola
c3c43991f2 Zwift not seeing Renpho #1141 2023-01-11 14:36:31 +01:00
Roberto Viola
ef135f1ffe Sole Elliptical: Apple Watch not connecting #1120 2023-01-11 10:25:27 +01:00
Roberto Viola
3294c9284b NoblePro treadmill #1139 2023-01-11 09:59:42 +01:00
Roberto Viola
9f287ca8c7 Support of Kingsmith WR1 rowing device #1118 2023-01-10 09:49:27 +01:00
Roberto Viola
cbacce66ca sportstech sx600 connection but no data #1116 2023-01-10 08:14:42 +01:00
Roberto Viola
dac3a5323e Bowflex T6 treadmill #1064 2023-01-09 16:55:39 +01:00
Roberto Viola
d486d7e2a0 Floating window: target tiles and peloton offset #1136 2023-01-09 16:30:22 +01:00
Roberto Viola
1c0e212125 KICKR CORE #1135 2023-01-09 16:12:53 +01:00
Roberto Viola
146e1c5da4 Bowflex T6 treadmill #1064 2023-01-09 15:04:06 +01:00
Roberto Viola
d21e0da604 Windows version doesn't show the profiles #1133 2023-01-09 11:41:20 +01:00
Roberto Viola
11864ed49d sportstech sx600 connection but no data #1116 2023-01-09 11:22:45 +01:00
Roberto Viola
86c0db5612 Nautilus T618 treadmill being discovered but not working #1074 2023-01-09 09:28:09 +01:00
Roberto Viola
b61b2132f9 Lap Issue #1102 2023-01-08 08:56:20 +01:00
Roberto Viola
66c963ec7c Suspend stats while paused for horizon treadmill #923
https://github.com/cagnulein/qdomyos-zwift/issues/923#issuecomment-1374666627
2023-01-08 08:40:20 +01:00
Roberto Viola
2505e49675 Horizon Treadmill Auto speed off 0.1 #1128 2023-01-07 18:40:58 +01:00
Roberto Viola
8e4d0dd49e No speed or incline control on T6.5S #1119 2023-01-06 09:49:34 +01:00
Roberto Viola
919902f8bb Sole Elliptical: Apple Watch not connecting #1120 2023-01-04 15:56:38 +01:00
Roberto Viola
020c1440d6 Support of Kingsmith WR1 rowing device #1118 2023-01-04 15:51:01 +01:00
Roberto Viola
349f03b330 Toorx Experience plus all parameter (speed, inclination) = 0 (Issue #1107) 2023-01-04 10:03:53 +01:00
Roberto Viola
fd1224e7c9 Support of Kingsmith WR1 rowing device #1118 2023-01-04 09:56:41 +01:00
Roberto Viola
672455c0d3 Resistance icon not showing in Floating Window #1113 2023-01-04 09:51:29 +01:00
Roberto Viola
676f2f1f9a Nordic Track S25i Treadmill [BUG] #1115 2023-01-04 09:45:55 +01:00
Roberto Viola
b94fa37aaf Mobvoi Treadmill #1095 reverted 2023-01-03 16:59:31 +01:00
Roberto Viola
0af537701c Mobvoi Treadmill #1095 2023-01-02 14:42:00 +01:00
Roberto Viola
d819781150 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2023-01-02 12:25:57 +01:00
Roberto Viola
d9443cff54 Lap Issue #1102 2023-01-02 12:25:52 +01:00
jwatral
92283b65ba issues with ant+ speed sensor fixed by migration to speed and cadence (#1110) 2023-01-02 08:54:03 +01:00
Roberto Viola
497cbc67f1 Rebook treadmill with wrong odometer after 1 km #1100 2023-01-02 06:11:31 +01:00
Roberto Viola
3085d284f6 Horizon treadmill miss some frames in the init (Issue #1108) 2023-01-02 05:47:19 +01:00
Roberto Viola
d39b51c389 Mobvoi Treadmill #1095 2022-12-31 17:44:07 +01:00
Roberto Viola
590e42dc73 NordicTrack S25i Treadmill #1109 2022-12-31 14:56:11 +01:00
Roberto Viola
242ca22bc5 TDF2 incline not working #1101 2022-12-31 11:20:57 +01:00
Roberto Viola
34f37bc70a Floating Window - default to active (Issue #1105) 2022-12-31 11:14:36 +01:00
Roberto Viola
43ae256c18 Floating Window - retain location between sessions (Issue #1104) 2022-12-31 10:57:33 +01:00
Roberto Viola
466be88bb9 SmartSpin2K as smart trainer (Issue #1080) 2022-12-31 10:21:19 +01:00
Roberto Viola
ff7b7bbfe7 Increase speed on treadmill for the Peloton app for the whole run as upper is too fast and average is too slow (Issue #1091) 2022-12-31 10:11:27 +01:00
Roberto Viola
1d1c22b234 Horizon treadmill miss some frames in the init #1108 2022-12-31 09:55:20 +01:00
Roberto Viola
1b1850f82c K80 Toorx Treadmill #1106 2022-12-30 17:50:22 +01:00
Roberto Viola
e9942ca63d TDF2 incline not working (Issue #1101) 2022-12-30 17:17:40 +01:00
Roberto Viola
b87cf9162c Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2022-12-30 16:16:00 +01:00
Roberto Viola
8c11fe9ae1 Increase speed on treadmill for the Peloton app for the whole run as upper is too fast and average is too slow #1091 2022-12-30 16:15:56 +01:00
Roberto Viola
4a1726df27 fixing android build 2022-12-30 15:33:52 +01:00
Roberto Viola
9f51255994 android version 2.12.32 2022-12-30 14:35:31 +01:00
Roberto Viola
d2b3262edd fixing android build 2022-12-30 14:34:58 +01:00
Roberto Viola
3f7b085173 Tread Bootcamp only sends Partial Time remaining #1103 2022-12-30 12:13:58 +01:00
Roberto Viola
ed4cb797d4 fixing android build 2022-12-30 12:09:34 +01:00
Roberto Viola
d3bc3cdfaf TDF2 incline not working #1101 2022-12-30 11:42:40 +01:00
Roberto Viola
db3f8c217b Picture in Picture on android #1072 2022-12-30 11:36:54 +01:00
Roberto Viola
5cf4719de2 Picture in Picture on android #1072 2022-12-30 10:56:06 +01:00
Roberto Viola
0ddfb3d910 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2022-12-30 10:33:22 +01:00
Roberto Viola
47621150d3 NordicTrack S22i support using issue 877 as example (Issue #954) 2022-12-30 10:31:42 +01:00
Roberto Viola
d5ff290a8b fixing build 2022-12-29 19:02:07 +01:00
Roberto Viola
4629a9ed04 fixing distance parsing 2022-12-29 18:53:11 +01:00
Roberto Viola
92a2fb5854 NordicTrack S22i support using issue 877 as example (Issue #954) 2022-12-29 18:25:02 +01:00
Roberto Viola
3dedb4cb5e Picture in Picture on android #1072 2022-12-29 15:05:08 +01:00
Roberto Viola
23ef0eab21 build fix 2022-12-29 11:54:20 +01:00
Roberto Viola
c72535e423 fix build 2022-12-29 11:22:53 +01:00
Roberto Viola
07a050d6c5 NordicTrack S22i support using issue 877 as example (Issue #954) 2022-12-29 10:56:13 +01:00
Roberto Viola
58c1ac9d5b playing with floating window #1072 2022-12-28 18:33:56 +01:00
Roberto Viola
0d2e53e6af Picture in Picture on android #1072 2022-12-28 16:50:47 +01:00
Roberto Viola
581f2a4af1 setting to enable adb remote 2022-12-28 15:14:02 +01:00
Roberto Viola
009b569f25 Zwift RunPod OE run cadence does not match strava (Issue #1099) 2022-12-28 14:55:10 +01:00
Roberto Viola
d47364d344 android version 2.12.29 2022-12-28 14:35:00 +01:00
Roberto Viola
61b011b3ce crash fixed when usb is not inserted #1085 2022-12-28 11:24:11 +01:00
Roberto Viola
09d48c0bbf Rebook treadmill with wrong odometer after 1 km #1100 2022-12-28 07:11:05 +01:00
Roberto Viola
e184347f0e ADBRemote #1094 2022-12-27 20:06:17 +01:00
Roberto Viola
dc3f83093e Background operation permanent notification option #1058 2022-12-27 18:29:27 +01:00
Roberto Viola
0bf0466a11 Picture in Picture on android #1072 2022-12-27 18:12:15 +01:00
Roberto Viola
2347b5633d floating window button hides it also 2022-12-27 17:57:59 +01:00
Roberto Viola
7de641ce5c Increase speed on treadmill for the Peloton app for the whole run as upper is too fast and average is too slow (Issue #1091) 2022-12-27 16:04:50 +01:00
Roberto Viola
2e8189037c Zwift Runpod #1097 2022-12-27 15:42:43 +01:00
Roberto Viola
a54071f05d android version 2.12.27 2022-12-27 15:33:02 +01:00
Roberto Viola
77e92f4e96 ADBRemote for android 2022-12-27 15:31:59 +01:00
Roberto Viola
39e63a435f Support for Computrainer with USB connection #1085 2022-12-26 17:13:17 +01:00
Roberto Viola
2218bb4489 Mobvoi Treadmill #1095 2022-12-26 16:12:39 +01:00
Roberto Viola
dc85b4a35e fix ios build 2022-12-26 08:22:13 +01:00
Roberto Viola
75604aed8c Support for Computrainer with USB connection #1085 2022-12-25 18:07:19 +01:00
Roberto Viola
029995d420 SmartSpin2K as smart trainer #1080 2022-12-23 08:54:01 +01:00
Roberto Viola
aec612614c Support for Computrainer with USB connection #1085 2022-12-23 08:31:04 +01:00
Roberto Viola
2a4ca076cf Increase speed on treadmill for the Peloton app for the whole run as upper is too fast and average is too slow #1091 2022-12-23 08:10:32 +01:00
Roberto Viola
e215918987 Support for Computrainer with USB connection #1085 2022-12-21 21:28:51 +01:00
Roberto Viola
23e2a11b6b Increase speed on treadmill for the Peloton app for the whole run as upper is too fast and average is too slow #1091 2022-12-21 20:57:41 +01:00
Roberto Viola
5f8a09d82e Support for Computrainer with USB connection #1085 2022-12-21 20:12:28 +01:00
Roberto Viola
6e2107e82e Support for Computrainer with USB connection #1085 2022-12-21 19:01:44 +01:00
Roberto Viola
af3ab73359 Support for Computrainer with USB connection #1085 2022-12-21 17:51:33 +01:00
Roberto Viola
7d3828d3b9 Increase speed on treadmill for the Peloton app for the whole run as upper is too fast and average is too slow (Issue #1091) 2022-12-21 17:00:43 +01:00
Roberto Viola
a43b73fb9e Support for Computrainer with USB connection #1085 2022-12-21 16:39:06 +01:00
Roberto Viola
bd102dee72 adding speed based on power setting on proformwifibikes 2022-12-21 16:04:02 +01:00
Roberto Viola
2634993a3a ios build errors 2022-12-21 11:07:52 +01:00
Roberto Viola
30f93ac439 android version 2.12.18 2022-12-21 10:53:08 +01:00
Roberto Viola
337b06cce4 Usb serial for android (#1092)
* adding manifest and gradle

* it's working!
2022-12-21 10:51:40 +01:00
Roberto Viola
cc41d02607 Strava Virtual Tag Setting #1083 2022-12-20 09:03:19 +01:00
Roberto Viola
4b7829e1f3 added some debug log #1085 2022-12-20 08:25:32 +01:00
Roberto Viola
ac8fd15d0a android version 2.12.17 2022-12-20 08:21:40 +01:00
Roberto Viola
b1a4b58ba2 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2022-12-20 08:20:37 +01:00
Roberto Viola
3bd17743d2 SmartSpin2K as smart trainer #1080 2022-12-20 08:20:30 +01:00
Roberto Viola
e88e89c96b Computrainer (#1086)
* first commit

* build fix

* fixing build errors on windows
2022-12-20 08:05:59 +01:00
Roberto Viola
ae3a393038 Zwift HUB #1087 2022-12-19 15:09:42 +01:00
Roberto Viola
12f2f2601c Proform TDF4 and Wahoo SYSTM training software, Erg mode does not affect resistance #1081 2022-12-19 10:37:38 +01:00
Roberto Viola
e42825b0ec Proform TDF4 and Wahoo SYSTM training software, Erg mode does not affect resistance #1081 2022-12-19 10:09:14 +01:00
Roberto Viola
eb7895bb48 added echelon rower sport 2022-12-16 19:41:29 +01:00
Roberto Viola
1366c21891 missing changeresistance event for the rowers 2022-12-16 19:35:32 +01:00
Roberto Viola
341b0607fc version 2.12.14 2022-12-16 15:13:17 +01:00
Roberto Viola
e8a59937f6 SmartSpin2K as smart trainer #1080 2022-12-16 08:44:31 +01:00
Roberto Viola
20c69a374c Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2022-12-14 14:45:47 +01:00
Roberto Viola
3eb3dbecc8 power calibration for Domyos Bike[REQ] #1078 2022-12-14 14:45:39 +01:00
Roberto Viola
f8a6e428ee version 2.12.13 on android 2022-12-14 14:38:03 +01:00
Roberto Viola
196bfe351d Android floating window (#1077)
* first implementation of the webview. didn't compile yet

* it's building

* window appears but is not showing the webview and also doesn't move. permission window needs to be fixed

* floating window works!

* adding html page for floating

* adding floating.htm to the floating window

* creating tiles...

* table

* dinamicize metrics on the floating window

* adding transparency

* finalizing

* alpha channel fixed

* fixing 1 minute timeout
2022-12-14 14:25:26 +01:00
Roberto Viola
5169cf78a4 ifit kcal fixed 2022-12-14 08:23:49 +01:00
Roberto Viola
11425ea861 Bowflex T6 treadmill #1064 2022-12-13 18:46:16 +01:00
Roberto Viola
d4a5604af6 Add option to disable pausing/stopping of machinery when pause/stop is pressed in QZ #1075 2022-12-13 18:44:43 +01:00
Roberto Viola
b53ff4a516 notification icon on android restored to false as default 2022-12-12 09:37:18 +01:00
Roberto Viola
1adf0b2e08 Gears tile for elliptical #1071 2022-12-12 08:46:49 +01:00
Roberto Viola
883c4c56d6 Bowflex T6 treadmill #1064 2022-12-12 07:59:43 +01:00
Roberto Viola
13a2c95671 Add option to disable pausing/stopping of machinery when pause/stop is pressed in QZ #1075 2022-12-11 20:04:27 +01:00
Roberto Viola
48df8b3057 Add option to disable pausing/stopping of machinery when pause/stop is pressed in QZ (Issue #1075) 2022-12-11 19:53:57 +01:00
Roberto Viola
e771b4a62d Add option to disable pausing/stopping of machinery when pause/stop is pressed in QZ (Issue #1075) 2022-12-11 19:44:19 +01:00
Roberto Viola
c7bed0a259 Add option to disable pausing/stopping of machinery when pause/stop is pressed in QZ #1075 2022-12-11 18:50:11 +01:00
Roberto Viola
bb7dc3f4e9 Domyos EL 520 Minimum Resistance #1069 2022-12-10 14:30:00 +01:00
Roberto Viola
e9c383ce8b ios project updated 2022-12-10 10:49:59 +01:00
Roberto Viola
395973b0ae Bowflex T6 treadmill #1064 2022-12-10 09:44:16 +01:00
Roberto Viola
8cdbc8463a Open proform wifi bike doesn't reconnect automatically #1062 2022-12-10 09:15:41 +01:00
Roberto Viola
9f1d6a163f The control of RGT app not working with Wahoo Direct Connect for RGT setting (#1059)
* fundaments building :)

* Update project.pbxproj

* dircon wahoo protocol managed for RFT

* The control of RGT app not working with Wahoo Direct Connect for RGT setting #1055

* The control of RGT app not working with Wahoo Direct Connect for RGT setting #1055

* cleaning the code

* The control of RGT app not working with Wahoo Direct Connect for RGT setting #1055
2022-12-10 09:08:21 +01:00
Roberto Viola
44b304bcf7 adding close button on android since the notification icon will keep qz alive 2022-12-09 11:21:57 +01:00
Roberto Viola
b0bea930e0 trying to fix swag bag on android 2022-12-09 11:21:32 +01:00
Roberto Viola
6ce71c69f6 incline doesn't work #1063 2022-12-09 07:05:11 +01:00
Roberto Viola
1bf665ae98 incline doesn't work (Issue #1063) 2022-12-08 17:31:03 +01:00
Roberto Viola
a3e6cbd416 removing qt5-default 2022-12-07 14:40:22 +01:00
Roberto Viola
c2ef787a74 qt5-default missing
https://askubuntu.com/questions/1335184/qt5-default-not-in-ubuntu-21-04
2022-12-07 14:37:48 +01:00
Roberto Viola
c00f2a81ca Bowflex T6 treadmill #1064 2022-12-07 14:28:09 +01:00
Roberto Viola
b4164cd10f Kingsmith walkingpad X21, app not responding #1031 2022-12-07 08:06:27 +01:00
Roberto Viola
f95a0510c7 echelon stride doesn't provide metrics #1056 2022-12-05 09:11:34 +01:00
Roberto Viola
b6c5099e07 Kingsmith walkingpad X21, app not responding #1031 2022-12-05 08:50:52 +01:00
Roberto Viola
bc26307c63 proform wifi bike doesn't reconnect automatically #1062
https://github.com/cagnulein/qdomyos-zwift/issues/1062#issuecomment-1336437407
2022-12-04 16:42:23 +01:00
Roberto Viola
ee0b7993de new iOS requirement 2022-12-02 20:24:50 +01:00
Roberto Viola
93a6a352a1 Tacx Flow #1060 2022-12-02 08:18:48 +01:00
Roberto Viola
1e98454070 version 2.12.9 2022-12-01 17:44:48 +01:00
Roberto Viola
a90d3f227f Wahoo Dircon on Treadmill doesn't flash the inclination icon #1061 2022-12-01 17:44:14 +01:00
Roberto Viola
0ad5ca8651 Background operation // Permanent notification option #711 2022-12-01 16:31:23 +01:00
Roberto Viola
8daf02afb6 Background operation // Permanent notification option #711 2022-12-01 16:06:07 +01:00
Roberto Viola
422bf4144f Tacx Flow #1060 2022-12-01 14:23:49 +01:00
Roberto Viola
57455ee7d6 Back from the same gpx path (START - END - START - END all the time) #987 2022-12-01 09:19:57 +01:00
Roberto Viola
032636b3b6 Background operation // Permanent notification option #711 2022-12-01 08:54:57 +01:00
Roberto Viola
536067d731 Background operation permanent notification option (#1058) under settings 2022-11-30 14:40:54 +01:00
Roberto Viola
9aaa1a0d18 Background operation permanent notification option (#1058)
* first try

* Update NotificationClient.java

* Update NotificationClient.java

* adding Foreground Service

* fixing build errors

* build error fixed

* fixing

* Update ForegroundService.java

* fixing click on the notification
2022-11-30 10:00:05 +01:00
Roberto Viola
17db301d5d fixing forcing resistance,speed and incline for nordictrack adb devices 2022-11-29 17:03:15 +01:00
Roberto Viola
0e4945f15b Back from the same gpx path (START - END - START - END all the time) #987 2022-11-29 11:36:10 +01:00
Roberto Viola
94ba539de4 erg mode for proform wifi bike improved 2022-11-28 10:58:57 +01:00
Roberto Viola
9c9d540585 Domyos Elliptical EL 520 #1046 2022-11-28 04:26:32 +01:00
Roberto Viola
9f6e54dfc4 nordictreadmill can go with negative inclination 2022-11-28 03:10:05 +01:00
Roberto Viola
3b1d24381e Revert "Proform Treadmill on Windows error #1054"
This reverts commit 563e7708f0.
2022-11-27 19:00:20 +01:00
Roberto Viola
563e7708f0 Proform Treadmill on Windows error #1054 2022-11-27 13:45:34 +01:00
Roberto Viola
5127420097 Ability to change target power by tiles for bikes #1053 2022-11-26 08:46:05 +01:00
Roberto Viola
9202958a39 fixing ERG mode for proformwifibike 2022-11-25 08:21:53 +01:00
Roberto Viola
c2ca7a06fe Auto stop when a GPX ride has completed #905 2022-11-22 15:32:28 +01:00
Roberto Viola
0a852644bc Auto stop when a GPX ride has completed #905 2022-11-22 13:47:44 +01:00
Roberto Viola
fd32d29c87 Care Fitness CV-351 : #1042 2022-11-21 16:50:49 +01:00
Roberto Viola
c4c1091147 XT800 treadmill #1051 2022-11-21 15:57:19 +01:00
Roberto Viola
fd15b1ac4f Add ProForm Cadence LT Treadmill to QZ to connect to Peloton [REQ] #1047 2022-11-21 14:32:08 +01:00
Roberto Viola
7b53ee0dc9 build issue fixed 2022-11-21 14:03:35 +01:00
Roberto Viola
59fc9864ec fixing decimal error on inclination on horizontreadmill #1050 2022-11-21 13:50:12 +01:00
Roberto Viola
c59e8a0079 Care Fitness CV-351 : (Issue #1042) 2022-11-21 13:35:03 +01:00
Roberto Viola
96ff845abe inclination offset and gain for treadmill used also on train program 2022-11-21 08:42:05 +01:00
Roberto Viola
62f504bdc7 Power Sensor Profile with 16bit UUID on iOS #1044 2022-11-20 07:52:14 +01:00
Roberto Viola
8113bccb77 Power Sensor Profile with 16bit UUID on iOS #1044 2022-11-19 16:11:28 +01:00
Roberto Viola
ab14cbfa49 Care Fitness CV-351 : #1042 2022-11-19 15:19:09 +01:00
Roberto Viola
ee252a313d Care Fitness CV-351 : #1042 2022-11-18 14:24:04 +01:00
Roberto Viola
293ff2eda1 Virtual Dircon Bike device for treadmill #1043 2022-11-18 14:16:47 +01:00
Roberto Viola
f084b88312 Life Fitness Treadmill FTMS #1018 2022-11-18 12:04:32 +01:00
Roberto Viola
bc9c36624a Stages bike peloton resistance null sometimes #1040 2022-11-18 08:49:55 +01:00
Roberto Viola
b49af71c2e Life Fitness Treadmill FTMS #1018
removing forcing commands since this treadmill is not able to do so
2022-11-18 08:40:19 +01:00
Roberto Viola
118684ebff Carefitness CV-351 #1041 2022-11-18 08:23:51 +01:00
Roberto Viola
9e8c8322e3 Life Fitness Treadmill FTMS #1018 2022-11-17 15:21:24 +01:00
Roberto Viola
cce52fcdfa Update SwagBagView.qml 2022-11-16 15:12:52 +01:00
Roberto Viola
e29b7f1356 swag bag edited in order to be accepted from the app store 2022-11-16 14:16:00 +01:00
Roberto Viola
036f0c4fc9 Blank Screen/No Metrics after Class #857 2022-11-15 14:00:25 +01:00
Roberto Viola
2ff9cdeba6 Apple Watch/Health integration - indoor walk for treadmill instead of indoor cycle #924 2022-11-15 09:27:07 +01:00
Roberto Viola
1b7e61e77a Life Fitness Treadmill FTMS #1018 2022-11-15 08:17:14 +01:00
Roberto Viola
5affe4b687 Add Virtual Pod mode #45 2022-11-14 16:16:46 +01:00
Roberto Viola
5f6d3cc7f3 Footpod (Stryd) support with manual incline #1038 2022-11-14 15:33:14 +01:00
Roberto Viola
c651c682c3 inCondi ET660i support #1007 2022-11-14 08:42:43 +01:00
Roberto Viola
6163b967f7 NordiTrack T 7.0 treadmill #1030
fixing start
2022-11-14 08:33:24 +01:00
Roberto Viola
0c1c25823c Life Fitness Treadmill FTMS #1018 2022-11-14 08:16:12 +01:00
Roberto Viola
30046c8177 Merge pull request #1035 from cagnulein/ftmsCRR
FTMS CRR implemented
2022-11-12 18:30:17 +01:00
Roberto Viola
c893180e4d added QZ_EnableDiscoveryCharsAndDescripttors to domyostreadmill and fitmetria 2022-11-12 09:37:51 +01:00
Roberto Viola
5d49fa8174 ios project updated 2022-11-11 19:59:46 +01:00
Roberto Viola
e0f8c30a94 build issue fixed 2022-11-11 19:58:50 +01:00
Roberto Viola
a4b7eb7ebb fixed build issue 2022-11-11 19:57:12 +01:00
Roberto Viola
ee3067baa0 qmdnsengine doesn't work anymore with iOS 16 or Ventura #1011 2022-11-11 19:54:39 +01:00
Roberto Viola
73a1d8dbb6 fixing qml error 2022-11-11 16:04:37 +01:00
Roberto Viola
63f778c32d added also the wind resistance 2022-11-11 15:37:54 +01:00
Roberto Viola
9d50363a9c removing the gain from the CRR formula 2022-11-11 15:19:17 +01:00
Roberto Viola
7dc112b6f5 implemented 2022-11-11 15:08:16 +01:00
Roberto Viola
3b1a478822 Life Fitness Treadmill FTMS #1018 2022-11-11 09:09:59 +01:00
Roberto Viola
e114745d5f Pace (Treadmill Only) on 3d maps #1020
pin updated
2022-11-10 12:00:01 +01:00
Roberto Viola
a18818d5fe Pace (Treadmill Only) on 3d maps #1020 2022-11-10 10:08:46 +01:00
Roberto Viola
c5fdf4a9bf Life Fitness Treadmill FTMS #1018 2022-11-10 04:39:49 +01:00
Roberto Viola
f45610343b reverting all the iOS mdns madness. Let's wait an answer from Apple 2022-11-10 04:19:45 +01:00
Roberto Viola
f45dd3bfed adding some protection to the domyostreadmill 2022-11-09 20:58:05 +01:00
Roberto Viola
5d0f0138a5 peloton power zone metrics fail #1033 2022-11-09 16:47:36 +01:00
Roberto Viola
827285ede0 JK fitness 577 bike #1032 2022-11-09 09:57:03 +01:00
Roberto Viola
df759a14a1 Android version 2.11.89 2022-11-09 08:10:41 +01:00
Roberto Viola
2b38d4fbe3 JK fitness 577 bike #1032 2022-11-09 08:09:54 +01:00
Roberto Viola
2dccd4016a qmdnsengine doesn't work anymore with iOS 16 or Ventura #1011 2022-11-08 14:59:00 +01:00
Roberto Viola
06ccf9136b Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2022-11-08 13:37:12 +01:00
Roberto Viola
66e3420abc JK fitness 577 bike #1032 2022-11-08 13:37:09 +01:00
Bepo7012
650fc81c6d Test Videos with higher fps Rates (#1024)
* Test Videos with higher fps Rates

* Set the speed limit higher, no longer a Problem

* iOS project updated

Co-authored-by: Roberto Viola <cagnulein@gmail.com>
2022-11-08 12:14:47 +01:00
Roberto Viola
dff786dd2a NordiTrack T 7.0 treadmill #1030 2022-11-08 11:57:08 +01:00
Roberto Viola
78bc2b2d97 Life Fitness Treadmill FTMS #1018 2022-11-08 08:03:50 +01:00
Roberto Viola
bd79b30eda fixing integer cast for inclination for the proform wifi bike 2022-11-07 14:55:31 +01:00
Roberto Viola
2a6a4e3db8 Disable TTS prefixes for frequent repetitions #986 2022-11-07 14:23:14 +01:00
Roberto Viola
8af33b0845 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2022-11-06 07:28:57 +01:00
Roberto Viola
cdb09471b1 iOS project updated 2022-11-06 07:28:47 +01:00
Andrea Gelmini
f5c7b1d891 Fix typos (#1025) 2022-11-05 07:05:53 +01:00
David Mason
7908420622 #962 Bluetooth details to settings for all devices (#963)
* #962 factored out the setting of the last bluetooth device settings to a method

* #962 call setLastBluetoothDevice for every device

* #962 fixed typos

* #962 whitespace adjustments

* #962 whitespace adjustments

* #962 updated qmdnsengine submodule to HEAD

Co-authored-by: Roberto Viola <Cagnulein@gmail.com>
2022-11-04 14:01:58 +01:00
Roberto Viola
e0ba6e6f08 Octane Fitness Q37xi Support #1023 2022-11-04 12:12:26 +01:00
Roberto Viola
c9cb0e5728 QZ / ZWIFT / Treadmill / Smartwatch: Different distance value #1022 2022-11-04 08:36:55 +01:00
Roberto Viola
43c263bd22 GPX Issues on Treadmill #973 2022-11-03 14:54:31 +01:00
Roberto Viola
1f38aee4d0 GPX Issues on Treadmill #973
cesium metrics on the bottom right and with a rounded green box around
2022-11-03 12:25:52 +01:00
Roberto Viola
424d98cb80 using watt gain and watt offset even for target_watt for proform bikes 2022-11-03 12:24:42 +01:00
Roberto Viola
8869913c4e Differences in the GPX starting point #988
new pin point in the 3d map
2022-11-03 10:04:52 +01:00
Roberto Viola
69d9b23b6e Fitshow FTMS bike doesn't send metrics #1019 2022-11-03 08:20:23 +01:00
Roberto Viola
c9b215ff44 Life Fitness Treadmill FTMS #1018 2022-11-03 08:06:03 +01:00
Roberto Viola
ee8c66d3e8 bluetooth discovery fitfan improvement 2022-11-02 16:01:11 +01:00
Roberto Viola
c2589f7f26 AVG Watts per Lap #1009 2022-11-02 15:03:48 +01:00
Roberto Viola
8dd3ff6340 Preset resistance tiles #493 2022-11-02 14:36:43 +01:00
Roberto Viola
82e075798c inCondi ET660i support #1007 2022-11-02 08:42:55 +01:00
Roberto Viola
732e84d2e3 new raspberry install #1014 2022-10-31 11:05:59 +01:00
Roberto Viola
c2d0176b67 ios dircon permission fixed #1011 2022-10-28 23:46:43 +02:00
Roberto Viola
01ef11496d proformwifibike: send only 0.5 inclination 2022-10-28 14:53:48 +02:00
Roberto Viola
0c768a4943 optimizing bluetooth traffic over fitmetria 2022-10-28 14:43:43 +02:00
Roberto Viola
9e63e31954 erg mode added to proformwifiibike 2022-10-28 11:49:27 +02:00
Roberto Viola
c7efa0e5ad fixing a problem with the speed based on power setting enabled
if the wattage was evaluated after the speed in the bike module, the speed was always 0
2022-10-28 09:57:13 +02:00
Roberto Viola
0b9de9509c Differences in the GPX starting point (Issue #988) 2022-10-28 09:17:47 +02:00
Roberto Viola
92dbbcaf5a preparing version 2.11.84 2022-10-28 08:36:35 +02:00
Roberto Viola
d8951ab83e Differences in the GPX starting point #988
chartjs color typo
2022-10-28 08:35:45 +02:00
Roberto Viola
a4bd3cfd6e iOS version 2.11.83 2022-10-26 18:26:09 +02:00
Roberto Viola
83637aa626 adding ECH-UK as another name of echelon stride 2022-10-26 17:40:19 +02:00
Roberto Viola
f65ecd3df7 fixing speed gain and offset to the calculateSpeedFromPower function 2022-10-26 15:13:22 +02:00
Roberto Viola
7e11c740ac Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2022-10-26 14:26:12 +02:00
Roberto Viola
7b4102964e Apple Watch Miles and Km conversion #1006 2022-10-26 14:26:05 +02:00
Roberto Viola
c706b2db71 Merge pull request #1008 from Bepo7012/master
Added Debug for Video Jump Issues
2022-10-26 12:04:00 +02:00
Bepo7012
70f5b627d1 Added Debug for Video Jump Issues 2022-10-26 11:19:15 +02:00
Roberto Viola
547bd51673 build issues 2022-10-26 10:23:51 +02:00
Roberto Viola
b42f684bbf inCondi ET660i support #1007 2022-10-26 09:46:29 +02:00
Roberto Viola
8434cebdc7 version 2.11.83 2022-10-26 08:28:11 +02:00
Roberto Viola
9f7886af58 Differences in the GPX starting point #988 2022-10-26 08:27:38 +02:00
Roberto Viola
82f3cf227d Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2022-10-25 16:15:44 +02:00
Roberto Viola
8708bb76cc android version 2.11.82 2022-10-25 16:12:11 +02:00
Roberto Viola
3a23d6798a Merge pull request #1005 from Bepo7012/master
Fix for INF Calculation in cagnulein#973
2022-10-25 15:46:21 +02:00
Bepo7012
9d3457b53c Update trainprogram.cpp
Fix for INF Calculation in cagnulein#973
2022-10-25 15:42:42 +02:00
Roberto Viola
e0f5c90d93 Spirit XT385 not able to get working, Gets discovered but can't see Qdomyos in Zwift Discovery. #833 2022-10-25 14:24:45 +02:00
Roberto Viola
46d2d0c346 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2022-10-25 11:52:36 +02:00
Roberto Viola
dc2876f80a Differences in the GPX starting point #988 2022-10-25 11:52:29 +02:00
Roberto Viola
73767d68fe Merge pull request #999 from drmason789/iconcept_virtualdevice_setup_998
#998 only attempt to set up virtual device on first update
2022-10-25 11:44:19 +02:00
Roberto Viola
ee840abd5e Merge pull request #1003 from drmason789/kingsmith_searchingStop_removal_1000 2022-10-25 06:55:14 +02:00
David Mason
31d401a1df #1000 removed searchStopped check from virtual device setup 2022-10-24 21:25:40 +01:00
David Mason
05a0184f03 #998 only attempt to set up virtual device on first update 2022-10-24 20:54:50 +01:00
Roberto Viola
1707f7c8ff yesoul target resistance fixed on zwift 2022-10-24 21:22:19 +02:00
Roberto Viola
c0b4ea071e fixing typo 2022-10-24 16:46:27 +02:00
Roberto Viola
7a2528d007 Merge pull request #997 from cagnulein/preset_tiles
Preset resistance tiles (#493)
2022-10-24 15:31:02 +02:00
Roberto Viola
1a37a4c3b2 Preset resistance tiles (#493) 2022-10-24 15:27:18 +02:00
Roberto Viola
ed1568c583 Spirit XT385 not able to get working, Gets discovered but can't see Qdomyos in Zwift Discovery. #833 2022-10-24 08:45:43 +02:00
Roberto Viola
69d95ee27d Spirit XT385 not able to get working, Gets discovered but can't see Qdomyos in Zwift Discovery. #833 2022-10-22 13:07:53 +02:00
Roberto Viola
1cfb556e6c Merge pull request #992 from jwatral/ant_plus_speed_channel_controller_fix_167
fixed speed value conversion in SpeedChannelController #167
2022-10-20 08:30:02 +02:00
Roberto Viola
20a0b9e968 helper label added 2022-10-20 08:29:15 +02:00
Jaroslaw Watral
57dd826033 removed cadence reference usage in ChannelService 2022-10-20 00:09:54 +02:00
Jaroslaw Watral
fe7e259db3 fixed speed value conversion in SpeedChannelController 2022-10-20 00:01:30 +02:00
Roberto Viola
88ba5a5239 Differences in the GPX starting point #988 2022-10-19 10:24:42 +02:00
Roberto Viola
bbd586895a keeping useful modification 2022-10-18 21:40:08 +02:00
Roberto Viola
ae1d25208e Revert "Differences in the GPX starting point #988"
This reverts commit 2b19896498.
2022-10-18 21:39:11 +02:00
Roberto Viola
2b19896498 Differences in the GPX starting point #988 2022-10-18 14:33:48 +02:00
Roberto Viola
ea6c5c1190 version 2.11.75 2022-10-18 08:03:27 +02:00
Roberto Viola
50bb52c15c gpx without timestamp fixed 2022-10-17 23:19:31 +02:00
Roberto Viola
be4454563b version 2.11.74 for android 2022-10-17 16:54:42 +02:00
Roberto Viola
0ac29a4470 Disable TTS prefixes for frequent repetitions #986 2022-10-17 14:41:29 +02:00
Roberto Viola
136c807f16 Android 2 Android Wahoo Kickr direct no data #983 2022-10-17 11:58:10 +02:00
Roberto Viola
c74e3545d4 Android 2 Android Wahoo Kickr direct no data #983 2022-10-17 10:59:15 +02:00
Roberto Viola
a05345264c adding wifi permissions on android in order to collect the ip address of the wifi for dircon 2022-10-16 20:22:04 +02:00
Roberto Viola
92c10f3042 GPX Issues on Treadmill #973 2022-10-16 14:24:31 +02:00
Roberto Viola
76935090a4 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2022-10-16 10:43:09 +02:00
Roberto Viola
2b0accb933 Merach MRK-S02-0B8D Resistance Change #984 2022-10-16 10:43:05 +02:00
Brad Stoney
26e2146051 Update 30_usage.md (#985)
Updated -qml default and added -noqml
2022-10-16 10:39:01 +02:00
Roberto Viola
f552f27224 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2022-10-16 09:36:28 +02:00
Roberto Viola
05deaa76fc GPX Issues on Treadmill (Issue #973 2022-10-16 09:36:24 +02:00
Roberto Viola
8d79fb3f35 android version 2.11.70 2022-10-14 08:03:38 +02:00
Roberto Viola
ec748b695e calling watts() instead of m_watt on speed based on power formula 2022-10-14 08:02:42 +02:00
Roberto Viola
8618384bb6 Pro FlexCycle #979 2022-10-13 14:46:43 +02:00
Roberto Viola
11e1117611 adding debug on ftmsbike 2022-10-13 13:38:40 +02:00
Roberto Viola
ba08f656fe adding a setting for zwift compatibility #476 2022-10-13 13:33:58 +02:00
Roberto Viola
af875a7295 Wahoo Direct Connect #476 RGT compatibility fixed
Tested with RGT and Zwift on iOS
2022-10-13 11:49:12 +02:00
Bepo7012
56e38e650a Keep Video and Gpx Position synchronized (Addition to #838) (#945)
* Speed up debugging on Windows

* Added new way for Video Rate

* Tried another Variant

* Fixed double double Conversion

* Splitted Videopos Rate and Frame rate

* Fixed new calculation

* Very easy possible solution

* Simple try

* Not really better, another try

* Adjust both Endpoints for calculation

* Framerate set

* Collecting Data

* Use average Rate

* Adjusted Videoframe Distance

* Fixed correction

* use weighted mean rate

* Played with factor weighting

* Found logic Error in Video Rate

* Factor weighting and try reduce flickering

* Fixed weighting of Rates

* New Idea

* Bad  Idea, changed Factor weighting again

* Code cleanup before Pull Request

* added Time difference for testing spec. Video

* Test should not be in Pull Request

* reverted debug on main.cpp

* ios version 2.11.54

* Fixed rewinding Video

* Variable Weighting Videorate/Framerate

* Added changes again for windows debug

* Different Aproach again

* Fixed wrong speed calc

* Add adjustment to rate based on time difference

* try higher or lower rate by 10% first

* Adjusted the Rate Base

* Removed the Rate % adoption

* video length added

* Implemented Referencepoint at End of Video

* Corrected Video start Time

* Init Videotimestamp with Traintimestamp at Start

* Fixed comparence

* Added trainProgram::TotalGPXSecs

* Corrected return

* Time to finish

* Removed Test and Debug changes in main.cpp

* Debug Message removed for next Windows Build

* Setting Video to correct Pos if length differs

* Don't do anything if Video isn't displayed

* fixed visible

* fixed visible comparison

* added videoSeekPosition in order to change the position of the video in realtime

* Implemented Video Adjustment on start

* Correct Videotimestamp every time if needed

* As usual, fixed Typo

* Reversed Video Timestamp correction

* Implemented case that Video is shorter then gpx

* Approach should be smoother

* Corrected shorter Video

* Fixed Video starting point if hidden/redisplayed

* Reverted Debug changes in main.cpp

* adding acceleration in the calculation of the speed based on wattage

* fixing negative speed values

* Windows debugging again

* added Debug Info to calculateSpeedFromPower

* Moved Watt calc up to have it for Speed calc

* Corrected Start for shorter Videos

* Try to use smaller Frame for average Video Speed

* Use Fullrate if Diff is to high

* Changed high difference rate

* adjusted factor

* Add 1 % of Timediff to Totalrate

* Not successfull, removed again

* rolling resistance setting added

* Hopefully the last approach

* Corrected Target

* Remarked some Things to get Debug Data

* use only 90 % of rate

* Only adjust factor one time per gpx Cycle

* Try Percent adoption

* fixing changeTimestamp callback with milliseconds precision

* Removed % in-/decrease

* Removed call to changeTimestamp

* removed avgInclination for bikes #838

* Test for Debug

* fixing distance error on trxappgateusbbike when speed was calculated over wattage

* tried fake bike

* Use a 2 sec Window

* Added changed Header definition

* try to fix gaps in gps

* Added some Debug Info

* Changed Params for Fake

* Removed 2 seconds frame

* Try Speed without average

* Debug Output Trainprogram

* Add more Debug for Trainprogram

* Removed Trainprogram Debug

* Tried avg. Speed -3/+3 secs

* Fix Bug in avgSpeedCalculation

* try to limit the rate change

* Fixed limiting

* Fixed again

* Fixed init of Limitation

* Removed Limitation, not working as hoped

* Check speed Deviation between 90 and 110 %

* Search for speed in 6 Secs/clearify Property-Names

* Fixed Typo

* Fixed Bug in gpx average Speed calculation

* Changed Filerrange from +/- 15 %

* Fixed possible segmentation Fault

* improving precision in the debuglog

* fixing elapsed time #838

* changeTimestamp again when next point reached

* fixing wrong ratiodistance

* qzsettings updated

* Save currentStepDistance before set to 0

* currentStop is already incremented, use -2

* use Distance from prev.Row too

* currentStep -1 distance and -2 time

* Don't use Point 1

* just a try

* Should be correct now

* changed distance

* fixing merge issues

* fixing another merge issue

* updating ios project

* fixing circuit gpx for video

* caching the odometer for all the scheduler event and removing the changetimestamp not time based

* Calc RatioDistance with Timediff between Points

* do this only if the point get hits first

* Calc distanceRow to gpx Diff

* only use currentStepDistance added since last

* Ratio Time has to be summed

* Redesign the process

* fixed typo

* Forgot one change

* fixed crash

* hopefully fixed now

* only add ratioDistance one time

* Added debug Info

* Filter changingTimestamp if Variance to high

* added Debug Info

* fixed Variance calculation

* fixed typo

* Store last Tick/TimeStamp Ratio for next cycle

* moved ratioDistance in correct scope

* Add ratioDistance, not calculated Ratio

* Back to Ratio again, better Results

* add ms not s

* changed Variance Range to -25/+25%

* Apply filtering Speed to trainingrows

* header definition added

* Fixed typo

* fixed array access

* accessing row data

* fixed bug when timetotickratio was 0

* logic Error

* fix bug in wma calculation

* added more detail to debug

* Calculate new distance into temporary array before

* fixed typo

* removed filter in changing timestamp

* Removed some routines no longer needed

* Remove peak Filter ompletely, no longer needed

* fixed crash at end of program

* fixing ios build and applySpeedFilter only on gpx workout

* adding running cadence from apple watch to ipad

* Fix for iOS Crash?

* fixing treadmill force speed setting with applyspeedfilter on

* adding speedlimit to bike

* Update trainprogram.cpp

Max.Speed for Bikes (=2 * avg current Trainprogram Speed) implemented

* Update trainprogram.cpp

changed to max speed to get a max replay factor of 1.9

* fixing speed limit

* removing bad check on the speedlimit

* adding a new method to know if the video is visible and reset the speed limit

* Fixed Issues on video hiding/redisplaying

 Also makes the first display a little nicer

* Removed no longer needed filterSeconds

The Option in the setting can also be removed, it's no longer needed

* Try to calculate the Speedlimit +1sec

* video_playback_window setting removed

* preparing for the merge

* removed unuseful coment

Co-authored-by: Roberto Viola <cagnulein@gmail.com>
Co-authored-by: Bernhard Ponemayr <bernhard.ponemayr@voglauer.com>
2022-10-13 10:56:12 +02:00
Roberto Viola
3b75f4fa94 Zwift Workouts Over Cadence #980 2022-10-13 10:48:23 +02:00
Roberto Viola
7e18946909 Update settings.qml 2022-10-12 18:16:34 +02:00
Roberto Viola
6edde653b6 Average Speed in the Email doesn't match #977 2022-10-12 09:54:24 +02:00
Roberto Viola
caedc73901 Bike Support Merach MRK-S02-0B8D #978 2022-10-12 09:46:40 +02:00
Roberto Viola
19e552f4cd Pro FlexCycle #979 2022-10-12 08:18:08 +02:00
Roberto Viola
6dc46aa689 license request every 30s 2022-10-11 17:18:27 +02:00
Roberto Viola
2cce91beea fixed typo 2022-10-11 17:03:32 +02:00
Roberto Viola
4824b65590 GPX Issues on Treadmill #973
speed on treadmill fixed
2022-10-11 16:59:15 +02:00
Roberto Viola
f327d13252 fix typo 2022-10-10 20:45:56 +02:00
Roberto Viola
e1a4bbb19a fixin avg inclination for treadmill 2022-10-10 20:31:02 +02:00
Roberto Viola
e11d4610a9 fixing build error on iOS 2022-10-10 20:17:11 +02:00
Roberto Viola
68d1eb678f GPX Issues on Treadmill #973 2022-10-10 16:26:50 +02:00
Roberto Viola
95d1f1fd8e Merge pull request #976 from nzbrian/master
Adding ESLinker YPOO Mini Change treadmill
2022-10-10 10:05:36 +02:00
Brian Bannister
ceaa5f0fa2 Adding ESLinker YPOO Mini Change treadmill 2022-10-10 18:22:53 +13:00
Roberto Viola
efede4bee0 GPX Issues on Treadmill #973 2022-10-09 08:26:46 +02:00
Roberto Viola
18787431a6 fixed crash for nautilus treadmill 2022-10-08 19:55:17 +02:00
Roberto Viola
e30e3c85e3 GPX Issues on Treadmill #973
map icon showed only when speed forcing for treadmill is disabled
2022-10-08 15:19:05 +02:00
Roberto Viola
e5724b43db fixed qzsettings usage 2022-10-08 03:02:45 +02:00
Roberto Viola
2428b4c230 GPX Issues on Treadmill #973 2022-10-07 14:30:34 +02:00
Roberto Viola
cf111ab23c Merge pull request #974 from cagnulein/cherrypickingfromvideobranch
Cherry-picking from video branch
2022-10-07 13:59:38 +02:00
Roberto Viola
3c37f1d77b fixing another merge issue 2022-10-07 12:23:59 +02:00
Roberto Viola
e0a79b51d3 updating ios project 2022-10-07 12:23:33 +02:00
Roberto Viola
5de8e7f1d8 rolling resistance setting added 2022-10-07 12:22:13 +02:00
Roberto Viola
45ddd78624 fixing negative speed values 2022-10-07 12:19:16 +02:00
Roberto Viola
b47d605999 adding acceleration in the calculation of the speed based on wattage 2022-10-07 12:18:40 +02:00
Roberto Viola
b2ea235729 using qzsettings in kcal on fitshowtreadmill 2022-10-06 12:23:45 +02:00
Roberto Viola
875764ac5c fixing kcal and distance for fitshowtreadmills 2022-10-06 08:46:29 +02:00
David Mason
832fd25edb #948 Set string values in cpp file to lower output size (#972)
* #948 copied settings.qml to qzsettings.h

* #948 removed non-settings content

* #948 adjusted tabs

* #948 converted to C++

* #948 move defaults to next line

* #948 fixed invalid bool value from settings.qml

* #948 converted settings.value

* #948 added settings keys and defaults that are not in settings.qml. Fixed some build errors.

* #948 comment fixes

* #948 fixed comments

* #948 include qzsettings.h

* #948 added missing settings keys that are not in settings.qml

* #948 include qzsettings.h

* #948 fixed comment

* #948 changed settings key name to match the one from settings.qml

* #948 converted a QLatin1String to QStringLiteral in qzsettings.h

* #948 added placeholders for comment/documentation

* #948 added function to qDebug log the settings from the QZSettings constants

* #948 some missing usage of new constants

* #948 removed superfluous )

* #948 restored some defaults reading the settings that were not constants. Added some docs on the settings keys.

* #948 some removal of the commented out old defaults for QSettings.value. having checked they match the default obtained from settings.qml

* #948 updates based on feedback about defaults that differ from settings.qml

* #948 removed most of the remaining commented-out defaults having checked them individually against the constants the were replaced with.

* #948 removed more of the remaining commented-out defaults having checked them individually against the constants the were replaced with.

* #948 another use of settings constant

* #948 added missing keys, write settings to debug log from qzsettings in main.cpp. Sort the qdebug dump from qzsettings by key.

* #948 removed unused variable and settings read.

* #948 removed another commented, previously hardcoded default.

* #948 filled in some @briefs, deleted others where deemed to be self explanatory, or  very device specific. A few remain, for more consideration.

* #948 processed most remaining commented out hardcoded default settings values

* #948
- updates for PR review feedback
- factored out setting of last bluetooth device settings

* #948 restored original user_email defaults, and made the constant for it a QLatin1String (though not actually used)

* #948 restored defaults in homeform::sortTiles

* #948 filled in some more @briefs

* #948 added new nordictrack device setting

* Update proformbike.cpp

* removing the qdebugallsettings from main

* #948 set string values in cpp file to lower output size

Co-authored-by: Roberto Viola <Cagnulein@gmail.com>
2022-10-06 08:45:51 +02:00
Roberto Viola
c526d4e675 trying const char instead of qstring for qzsettings (#971) 2022-10-05 18:20:31 +02:00
Roberto Viola
bb8e0f0417 NordicTrack GX 2.7 U #964 2022-10-05 17:27:20 +02:00
Roberto Viola
9cbf72d594 Schwinn 510T #970 2022-10-05 16:28:13 +02:00
Roberto Viola
df65f0d951 android build fixed 2022-10-05 16:26:08 +02:00
Roberto Viola
2325635b28 NordicTrack GX 2.7 U #964 2022-10-05 14:48:40 +02:00
David Mason
1d9c24ba91 Use of named constants for settings keys and default values (#950)
* #948 copied settings.qml to qzsettings.h

* #948 removed non-settings content

* #948 adjusted tabs

* #948 converted to C++

* #948 move defaults to next line

* #948 fixed invalid bool value from settings.qml

* #948 converted settings.value

* #948 added settings keys and defaults that are not in settings.qml. Fixed some build errors.

* #948 comment fixes

* #948 fixed comments

* #948 include qzsettings.h

* #948 added missing settings keys that are not in settings.qml

* #948 include qzsettings.h

* #948 fixed comment

* #948 changed settings key name to match the one from settings.qml

* #948 converted a QLatin1String to QStringLiteral in qzsettings.h

* #948 added placeholders for comment/documentation

* #948 added function to qDebug log the settings from the QZSettings constants

* #948 some missing usage of new constants

* #948 removed superfluous )

* #948 restored some defaults reading the settings that were not constants. Added some docs on the settings keys.

* #948 some removal of the commented out old defaults for QSettings.value. having checked they match the default obtained from settings.qml

* #948 updates based on feedback about defaults that differ from settings.qml

* #948 removed most of the remaining commented-out defaults having checked them individually against the constants the were replaced with.

* #948 removed more of the remaining commented-out defaults having checked them individually against the constants the were replaced with.

* #948 another use of settings constant

* #948 added missing keys, write settings to debug log from qzsettings in main.cpp. Sort the qdebug dump from qzsettings by key.

* #948 removed unused variable and settings read.

* #948 removed another commented, previously hardcoded default.

* #948 filled in some @briefs, deleted others where deemed to be self explanatory, or  very device specific. A few remain, for more consideration.

* #948 processed most remaining commented out hardcoded default settings values

* #948
- updates for PR review feedback
- factored out setting of last bluetooth device settings

* #948 restored original user_email defaults, and made the constant for it a QLatin1String (though not actually used)

* #948 restored defaults in homeform::sortTiles

* #948 filled in some more @briefs

* #948 added new nordictrack device setting

* Update proformbike.cpp

* removing the qdebugallsettings from main

Co-authored-by: Roberto Viola <Cagnulein@gmail.com>
2022-10-05 14:13:10 +02:00
Roberto Viola
39ba7402d7 ftmsCharacteristicChanged missing on the virtualtreadmill 2022-10-05 08:56:04 +02:00
Roberto Viola
4e29df685a Open Train Program Update Suggestions[REQ] #968 2022-10-05 08:48:12 +02:00
Roberto Viola
d1f5afce4c Include elevation gain in summary email #966 2022-10-05 07:59:13 +02:00
Roberto Viola
641783d90a improving precision in the qdebug in the gpx.cpp 2022-10-04 16:04:24 +02:00
Roberto Viola
7f6cdf82cf Video again, just to show and see #838
float to double conversion for the lat and lon in the gpx file
2022-10-04 15:55:38 +02:00
Roberto Viola
6e414f8e02 Include elevation gain in summary email #966 2022-10-04 14:05:31 +02:00
Roberto Viola
5f41e9a08d NordicTrack GX 2.7 U #964 2022-10-04 12:03:23 +02:00
Roberto Viola
115cbc0fa1 fix desync from ipad to iphone #957 2022-10-03 15:26:14 +02:00
Roberto Viola
a702d7e4c3 android version 2.11.63 2022-10-03 09:01:37 +02:00
Roberto Viola
cbe3f7de78 starting NordicTrack GX 2.7 U #964 2022-10-03 08:10:26 +02:00
Roberto Viola
0803236439 Should NordicTrack Commercial X11i treadmill work with Android app? #961 2022-10-03 07:31:31 +02:00
Roberto Viola
5c8c8881e0 build issue fixed #957 2022-10-02 08:56:18 +02:00
Roberto Viola
1bbca34ca5 writing distance and kcal to iphone #957 2022-10-02 07:22:49 +02:00
Roberto Viola
37e98fa0a6 android version 2.11.62 2022-10-02 06:45:48 +02:00
Roberto Viola
9498aa5501 bidirectional Apple Watch communication to IPad #957 2022-10-01 17:24:59 +02:00
Roberto Viola
e659322a0b removing assert for wrong HR devices 2022-10-01 15:21:06 +02:00
Roberto Viola
b74a5b3f8b also the iphone should connect to the ipad to collecting distance and kcal #958 2022-10-01 07:13:20 +02:00
Roberto Viola
6e2541d1b7 Merge pull request #960 from drmason789/ios_peloton_workaround_default_959 2022-10-01 06:37:02 +02:00
David Mason
647717cd73 #959 changed default for reading ios_peloton_workaround setting to true 2022-10-01 00:22:47 +01:00
Roberto Viola
56a09fad21 Merge pull request #958 from cagnulein/AppleWatchFromIpad
Apple Watch to iPad
2022-09-30 22:31:46 +02:00
Roberto Viola
b156396d1c it's working! (at least the hr) 2022-09-30 22:27:56 +02:00
Roberto Viola
ae1f099703 not tested code, but the idea should works 2022-09-30 16:21:48 +02:00
Roberto Viola
07d62ed9ad trying the bonjour approach 2022-09-30 15:53:41 +02:00
Roberto Viola
a8cf95380c adding the multicast entitlement 2022-09-29 13:55:10 +02:00
Roberto Viola
48f2d479a3 first test for Apple Watch on iPad 2022-09-29 12:15:20 +02:00
Roberto Viola
67515b94c9 adding issuehunt account 2022-09-29 10:09:03 +02:00
Roberto Viola
f1b05c5975 #923 horizon profiles can't accept letters 2022-09-28 17:27:43 +02:00
Roberto Viola
2e1d3b03c7 iOS version 2.11.62 2022-09-28 16:54:31 +02:00
Roberto Viola
79e3be71ca Merge pull request #951 from cagnulein/horizontreadmill7_4
Horizon treadmill 7.4
2022-09-28 16:52:16 +02:00
Roberto Viola
82717a6775 Revert "trying to fix some strange init situation #923"
This reverts commit f4b9be340f.
2022-09-28 15:09:41 +02:00
Roberto Viola
1f0582e0d0 license retry 2022-09-28 14:58:29 +02:00
Roberto Viola
f4b9be340f trying to fix some strange init situation #923 2022-09-28 09:52:57 +02:00
Roberto Viola
43d6e6c233 removed the - 500 meter offset from fit file (strava seems to doesn't consider it)
https://www.strava.com/activities/7873313493
2022-09-27 09:39:02 +02:00
Roberto Viola
2e608cae22 Resistance control BH Fitness i.CARBON BIKE DUAL H8705LW with the DualKit FTMS Extension #912 2022-09-26 14:28:56 +02:00
Roberto Viola
0d8dd957ad fixing build error on iOS 2022-09-26 11:32:36 +02:00
Roberto Viola
810391f03b Apple Watch/Health integration - indoor walk for treadmill instead of indoor cycle #924 2022-09-26 11:14:01 +02:00
Roberto Viola
386484d03b Resistance control BH Fitness i.CARBON BIKE DUAL H8705LW with the DualKit FTMS Extension #912 2022-09-26 10:54:14 +02:00
Roberto Viola
2c2436a430 Resistance control BH Fitness i.CARBON BIKE DUAL H8705LW with the DualKit FTMS Extension #912 2022-09-26 09:58:58 +02:00
Roberto Viola
06c178cbff fixing profiles 2022-09-26 08:30:57 +02:00
Roberto Viola
ce22fef00d fixed wrong index and segmentation fault 2022-09-25 09:15:04 +02:00
Roberto Viola
4c49918a97 fixing wrong index #923 2022-09-24 20:24:09 +02:00
Roberto Viola
88344438a7 fixing decimal point on distance on apple watch 2022-09-22 17:25:28 +02:00
Roberto Viola
09d8881b43 profiles for horizon in the settings added 2022-09-22 14:22:29 +02:00
Roberto Viola
83fe4e19ec fixing pid heart (double issue) #427 2022-09-22 12:06:29 +02:00
Roberto Viola
5733889e8a CRC function for updating the profile messages 2022-09-22 08:59:10 +02:00
Roberto Viola
5895f5cc7c Merge branch 'master' into horizontreadmill7_4 2022-09-22 08:08:41 +02:00
Roberto Viola
94830044f6 disabling qml too if the no-gui selector is enabled 2022-09-21 08:10:09 +02:00
Roberto Viola
3200cf2b28 PID function a little pushy #427 2022-09-20 14:34:51 +02:00
Roberto Viola
38cb8f4ccd Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2022-09-20 11:00:35 +02:00
Roberto Viola
73a20b9980 Avoidance of compiler warning #936 2022-09-20 11:00:33 +02:00
Roberto Viola
57b06c2143 Merge pull request #937 from cagnulein/Speed-Sensor
Speed Sensor #935
2022-09-20 10:22:30 +02:00
Roberto Viola
583ab09dc4 fixing battery cscbike issue 2022-09-20 10:18:33 +02:00
Roberto Viola
67a5f8612f fixing memory overflow 2022-09-20 09:43:40 +02:00
Roberto Viola
14c91a308b Profiles seem to overwrite each other #947 2022-09-20 08:57:49 +02:00
Roberto Viola
8995cf866c disabling HR from FTMS rower is now possible 2022-09-20 08:44:35 +02:00
Roberto Viola
3808619f3e reverting tunturi fix 2022-09-18 19:40:18 +02:00
Roberto Viola
3206a28199 trying to fix communication error on TUNTURI_2 #920 2022-09-18 18:56:43 +02:00
Roberto Viola
216e6874b2 Tunturi E60 Performance combatibly (Discussion #920)Tunturi E60 Performance combatibly (Discussion #920) 2022-09-18 16:06:56 +02:00
Roberto Viola
28aaf7fbff Bodytone DS25 2022-09-18 15:41:06 +02:00
Roberto Viola
55d4467886 Horizon 7.4 Treadmill starts on its own after app launch #923 2022-09-16 16:17:41 +02:00
Roberto Viola
f1887b7ea1 Horizon 7.4 Treadmill starts on its own after app launch #923 2022-09-16 14:54:58 +02:00
Roberto Viola
a8bc82c2d0 2.11.53 2022-09-16 14:21:21 +02:00
Roberto Viola
3b2dcaef43 Yesoul C1H #944 2022-09-16 13:58:22 +02:00
Roberto Viola
cd217d4f38 Connecting TUNTURI Fitcycle 50i #932 2022-09-16 11:31:31 +02:00
Roberto Viola
c5e113bd20 bluetooth device setting to max width 2022-09-16 10:10:18 +02:00
Roberto Viola
d63eafe0b3 fixed build issue #838 2022-09-16 09:59:29 +02:00
Roberto Viola
ea69aa2251 adding the videotimestamp #838 2022-09-16 09:52:46 +02:00
Roberto Viola
e697842df7 Merge pull request #941 from cagnulein/quit_button
Quit option #939
2022-09-15 08:41:28 +02:00
Roberto Viola
909bc2dbc5 use "nickname" setting to profiles name #923 2022-09-14 15:14:13 +02:00
Roberto Viola
d152c5d9c6 Quit option #939 2022-09-14 10:47:16 +02:00
Roberto Viola
dad642e82d trying to remove profiles #923 2022-09-14 10:32:27 +02:00
Roberto Viola
c3d757a872 Connecting TUNTURI Fitcycle 50i #932 2022-09-12 15:16:57 +02:00
Roberto Viola
a1cd69d68f Horizon 7.4 Treadmill starts on its own after app launch #923 2022-09-12 14:48:23 +02:00
Roberto Viola
cd6edddea0 Horizon 7.4 Treadmill starts on its own after app launch #923 2022-09-12 14:04:24 +02:00
Roberto Viola
22a8352963 Speed Sensor #935 2022-09-12 11:11:04 +02:00
Roberto Viola
997b04ee54 Horizon GR7 Spin Bike #477
bike without the 2AD2 characteristic
2022-09-12 10:30:15 +02:00
Roberto Viola
835b1c3956 Horizon 7.4 Treadmill starts on its own after app launch #923 2022-09-12 10:16:57 +02:00
Roberto Viola
097e23d20b Support for Whipr kayak please #653 2022-09-12 08:15:42 +02:00
Roberto Viola
51e55a81e7 Video again, just to show and see #838 2022-09-10 21:01:44 +02:00
Roberto Viola
95eeae56cc Connecting TUNTURI Fitcycle 50i #932 2022-09-10 19:06:04 +02:00
Roberto Viola
90278bd6b2 ios 2.11.49 2022-09-10 17:21:37 +02:00
Roberto Viola
32c0019f89 fixing ftms rower bug in the kcal metric 2022-09-10 17:14:48 +02:00
Roberto Viola
f8df2c580b Open Video again, just to show and see #838 2022-09-10 13:10:40 +02:00
Roberto Viola
38dce24e26 Kickr Rollr #934 2022-09-10 13:09:21 +02:00
Roberto Viola
5bfa16ace1 Horizon 7.4 Treadmill starts on its own after app launch #923 2022-09-09 14:43:21 +02:00
Roberto Viola
7b0819dce2 Horizon GR7 Spin Bike #477 2022-09-09 13:56:21 +02:00
Roberto Viola
c349e3d6e4 HR fixed for wifi based devices 2022-09-09 09:38:14 +02:00
Roberto Viola
e6a3ce0d3c Video again, just to show and see (Issue #838) 2022-09-09 09:26:36 +02:00
Roberto Viola
85f8d4454f Merge pull request #928 from cagnulein/VideoWorkoutFooter
Video Workout footer
2022-09-08 20:21:36 +02:00
Roberto Viola
3ea6780fe7 version 2.11.46 2022-09-08 20:17:07 +02:00
Roberto Viola
8c2598f2c6 Video again, just to show and see #838 2022-09-08 20:16:06 +02:00
Roberto Viola
6c987ef4bf Merge pull request #930 from drmason789/discovery_927 2022-09-07 21:46:39 +02:00
David Mason
970915996a #927 log a qDebug when stopDiscovery is called when the discovery agent is null 2022-09-07 20:42:32 +01:00
David Mason
7159812dbc #927 route starting and stopping of bluetooth discovery through new functions startDiscovery() and stopDiscovery() 2022-09-07 20:17:51 +01:00
Roberto Viola
515ec1605b faketreadmill HR fixed 2022-09-07 21:14:52 +02:00
Roberto Viola
00802d1374 qz immediately crashes (Issue #929) 2022-09-07 21:03:00 +02:00
Roberto Viola
428f07dc6f Video again, just to show and see (Issue #838) 2022-09-07 20:55:45 +02:00
Roberto Viola
dcfb1f9588 Video again, just to show and see #838 2022-09-07 16:52:24 +02:00
Roberto Viola
5736cc6a97 Horizon 7.4 Treadmill starts on its own after app launch #923 2022-09-07 16:48:59 +02:00
Roberto Viola
146ebd156c Video again, just to show and see #838 2022-09-07 15:18:37 +02:00
Roberto Viola
0ad2c37dcb Video again, just to show and see #838 2022-09-07 12:09:08 +02:00
Roberto Viola
253244abda typo fixed! 2022-09-07 08:34:32 +02:00
Roberto Viola
0ac3d3e944 version 2.11.43 2022-09-06 15:52:35 +02:00
Roberto Viola
c6b1398aa9 Horizon 7.4 Treadmill starts on its own after app launch #923 2022-09-06 15:45:55 +02:00
Roberto Viola
4ba6862c61 Cant enter colon for times in iOS app under pace options #926 #838 2022-09-06 15:36:18 +02:00
Roberto Viola
9066c4e02a typo fixed 2022-09-06 12:26:42 +02:00
Roberto Viola
9349996989 adding some debug to changeTimestamp 2022-09-06 09:25:31 +02:00
Roberto Viola
da5157970a Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift 2022-09-06 09:18:40 +02:00
Roberto Viola
28efbcdd9b Apple Watch/Health integration - indoor walk for treadmill instead of indoor cycle #924 2022-09-06 09:18:29 +02:00
Roberto Viola
10200c1e29 Horizon 7.4 Treadmill starts on its own after app launch #923 2022-09-06 08:45:41 +02:00
Roberto Viola
e37e0853d1 Video again, just to show and see #838 2022-09-06 08:36:15 +02:00
Roberto Viola
4b464ba041 sole f80 treadmill HR builtin handled 2022-09-05 15:56:31 +02:00
Roberto Viola
ff7863a25c Horizon 7.4 Treadmill starts on its own after app launch #923
pause handled
2022-09-05 15:46:44 +02:00
Roberto Viola
72af1701a2 Apple Watch/Health integration - indoor walk for treadmill instead of indoor cycle (Issue #924) 2022-09-05 11:36:23 +02:00
Roberto Viola
487ff2e8e9 Apple Watch/Health integration - indoor walk for treadmill instead of indoor cycle (Issue #924) 2022-09-05 11:23:15 +02:00
Roberto Viola
6cda7cd02c Apple Watch/Health integration - indoor walk for treadmill instead of indoor cycle (Issue #924) 2022-09-05 11:05:01 +02:00
Roberto Viola
77b34e2f41 start event added for horizon treadmill 7.4 2022-09-03 16:26:42 +02:00
Roberto Viola
0e27c87480 Horizon 7.4 Treadmill starts on its own after app launch (Issue #923) 2022-09-03 11:04:50 +02:00
Roberto Viola
fb1bac5e5e "Virtual Treadmill" #917 2022-09-02 09:16:41 +02:00
Roberto Viola
27ea164da1 Spirit Xt485 Treadmill Connection (Log file attached) #918 2022-09-02 08:43:57 +02:00
Roberto Viola
2ec9abc4ad Video again, just to show and see #838
trying a different videorate approach
2022-09-02 08:03:55 +02:00
Roberto Viola
bb1d903e07 Debug log using qdomyos on a proform Tour de France 10.0 bike #877 2022-08-31 14:04:46 +02:00
Roberto Viola
9ccb1ef5d5 Debug log using qdomyos on a proform Tour de France 10.0 bike #877 2022-08-31 12:08:32 +02:00
Roberto Viola
065ee078a2 Merge pull request #913 from cagnulein/android_api_31 2022-08-30 15:27:16 +02:00
Roberto Viola
8b876ac17f footer added and it's working! 2022-08-03 17:56:18 +02:00
786 changed files with 158581 additions and 9630 deletions

2
.github/FUNDING.yml vendored
View File

@@ -7,6 +7,6 @@ ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
issuehunt: cagnulein
otechie: # Replace with a single Otechie username
custom: ['https://www.buymeacoffee.com/cagnulein'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

View File

@@ -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 qt5-default qtquickcontrols2-5-dev libqt5bluetooth5 libqt5widgets5 libqt5positioning5 libqt5xml5 qtconnectivity5-dev qtpositioning5-dev libqt5charts5-dev libqt5charts5 qt5-default libqt5networkauth5-dev libqt5websockets5* libxcb-randr0-dev libxcb-xtest0-dev libxcb-xinerama0-dev libxcb-shape0-dev libxcb-xkb-dev
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

6
.gitignore vendored
View File

@@ -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,8 +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
View File

@@ -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
View 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
View 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;
}*/
}

View File

@@ -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 */; };
@@ -167,8 +170,12 @@
872261F0289EA887006A6F75 /* moc_nordictrackelliptical.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 872261EF289EA887006A6F75 /* moc_nordictrackelliptical.cpp */; };
8727A47727849EA600019B5D /* paferstreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8727A47627849EA600019B5D /* paferstreadmill.cpp */; };
8727A47927849EB200019B5D /* moc_paferstreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8727A47827849EB200019B5D /* moc_paferstreadmill.cpp */; };
872A20DA28C5EC380037774D /* faketreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 872A20D928C5EC380037774D /* faketreadmill.cpp */; };
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 */; };
@@ -236,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 */; };
@@ -247,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 */; };
@@ -259,6 +270,7 @@
8762D5132601F89500F6F049 /* scanrecordresult.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8762D5112601F89500F6F049 /* scanrecordresult.cpp */; };
87646C2027B5064600F82131 /* bhfitnesselliptical.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87646C1E27B5064500F82131 /* bhfitnesselliptical.cpp */; };
87646C2227B5065100F82131 /* moc_bhfitnesselliptical.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87646C2127B5065100F82131 /* moc_bhfitnesselliptical.cpp */; };
8767EF1E29448D6700810C0F /* characteristicwriteprocessor.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8767EF1D29448D6700810C0F /* characteristicwriteprocessor.cpp */; };
8768D1FB285081FE00F58E3A /* nordictrackifitadbtreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8768D1F9285081FE00F58E3A /* nordictrackifitadbtreadmill.cpp */; };
8768D1FD2850820B00F58E3A /* moc_nordictrackifitadbtreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8768D1FC2850820B00F58E3A /* moc_nordictrackifitadbtreadmill.cpp */; };
876BFC9C27BE35C5001D7645 /* proformelliptical.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 876BFC9827BE35C4001D7645 /* proformelliptical.cpp */; };
@@ -290,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 */; };
@@ -310,12 +324,19 @@
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 */; };
8790FDE1277B0AC600247550 /* moc_nautilustreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 8790FDE0277B0AC600247550 /* moc_nautilustreadmill.cpp */; };
87917A7328E768D200F8D9AC /* Browser.swift in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87917A6E28E768D200F8D9AC /* Browser.swift */; };
87917A7528E768D200F8D9AC /* Connection.swift in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87917A7028E768D200F8D9AC /* Connection.swift */; };
87917A7628E768D200F8D9AC /* Server.swift in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87917A7128E768D200F8D9AC /* Server.swift */; };
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 */; };
@@ -331,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 */; };
@@ -345,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 */; };
@@ -353,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 */; };
@@ -389,11 +420,16 @@
87CC3B9E25A08812001EC5A8 /* moc_elliptical.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87CC3B9C25A08812001EC5A8 /* moc_elliptical.cpp */; };
87CC3BA325A0885F001EC5A8 /* domyoselliptical.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87CC3B9F25A0885D001EC5A8 /* domyoselliptical.cpp */; };
87CC3BA425A0885F001EC5A8 /* elliptical.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87CC3BA025A0885D001EC5A8 /* elliptical.cpp */; };
87CF5169293C879800A7CABC /* characteristicwriteprocessore005.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87CF5167293C879700A7CABC /* characteristicwriteprocessore005.cpp */; };
87CF516B293C87B000A7CABC /* moc_characteristicwriteprocessore005.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87CF516A293C87AF00A7CABC /* moc_characteristicwriteprocessore005.cpp */; };
87D10552290996EA00B3935B /* mepanelbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87D10550290996EA00B3935B /* mepanelbike.cpp */; };
87D105542909971100B3935B /* moc_mepanelbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87D105532909971100B3935B /* moc_mepanelbike.cpp */; };
87D2699F25F535200076AA48 /* m3ibike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87D2699A25F535160076AA48 /* m3ibike.cpp */; };
87D269A025F535200076AA48 /* skandikawiribike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87D2699D25F535180076AA48 /* skandikawiribike.cpp */; };
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 */; };
@@ -414,6 +450,8 @@
87DF68BF25E2675100FCDA46 /* moc_schwinnic4bike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87DF68BC25E2675100FCDA46 /* moc_schwinnic4bike.cpp */; };
87E0761D277A081A00FDA0F9 /* technogymmyruntreadmillrfcomm.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87E0761B277A081900FDA0F9 /* technogymmyruntreadmillrfcomm.cpp */; };
87E0761F277A082300FDA0F9 /* moc_technogymmyruntreadmillrfcomm.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87E0761E277A082300FDA0F9 /* moc_technogymmyruntreadmillrfcomm.cpp */; };
87E2F85D291ED308002BDC65 /* lifefitnesstreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87E2F85C291ED308002BDC65 /* lifefitnesstreadmill.cpp */; };
87E2F85F291ED315002BDC65 /* moc_lifefitnesstreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87E2F85E291ED315002BDC65 /* moc_lifefitnesstreadmill.cpp */; };
87E34C2B2886F95400CEDE4B /* octanetreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87E34C2A2886F95400CEDE4B /* octanetreadmill.cpp */; };
87E34C2D2886F99A00CEDE4B /* moc_octanetreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87E34C2C2886F99900CEDE4B /* moc_octanetreadmill.cpp */; };
87E5D2C625E69F3100BDBE6C /* horizontreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87E5D2C525E69F3100BDBE6C /* horizontreadmill.cpp */; };
@@ -433,7 +471,12 @@
87EFB57025BD704A0039DD5A /* moc_proformtreadmill.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87EFB56F25BD704A0039DD5A /* moc_proformtreadmill.cpp */; };
87EFE45927A518F5006EA1C3 /* nautiluselliptical.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87EFE45827A518F5006EA1C3 /* nautiluselliptical.cpp */; };
87EFE45B27A51901006EA1C3 /* moc_nautiluselliptical.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87EFE45A27A51900006EA1C3 /* moc_nautiluselliptical.cpp */; };
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 */; };
87FA11AB27C5ECD1008AC5D1 /* ultrasportbike.cpp in Compile Sources */ = {isa = PBXBuildFile; fileRef = 87FA11AA27C5ECD1008AC5D1 /* ultrasportbike.cpp */; };
@@ -562,6 +605,7 @@
dstPath = "";
dstSubfolderSpec = 10;
files = (
873D388C29B0D745006A2611 /* ConnectIQ.xcframework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
@@ -798,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>"; };
@@ -833,8 +881,14 @@
8727A47527849EA600019B5D /* paferstreadmill.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = paferstreadmill.h; path = ../src/paferstreadmill.h; sourceTree = "<group>"; };
8727A47627849EA600019B5D /* paferstreadmill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = paferstreadmill.cpp; path = ../src/paferstreadmill.cpp; sourceTree = "<group>"; };
8727A47827849EB200019B5D /* moc_paferstreadmill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_paferstreadmill.cpp; sourceTree = "<group>"; };
872A20D828C5EC380037774D /* faketreadmill.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = faketreadmill.h; path = ../src/faketreadmill.h; sourceTree = "<group>"; };
872A20D928C5EC380037774D /* faketreadmill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = faketreadmill.cpp; path = ../src/faketreadmill.cpp; sourceTree = "<group>"; };
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>"; };
@@ -937,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>"; };
@@ -954,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>"; };
@@ -972,6 +1030,7 @@
87646C1E27B5064500F82131 /* bhfitnesselliptical.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bhfitnesselliptical.cpp; path = ../src/bhfitnesselliptical.cpp; sourceTree = "<group>"; };
87646C1F27B5064500F82131 /* bhfitnesselliptical.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bhfitnesselliptical.h; path = ../src/bhfitnesselliptical.h; sourceTree = "<group>"; };
87646C2127B5065100F82131 /* moc_bhfitnesselliptical.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_bhfitnesselliptical.cpp; sourceTree = "<group>"; };
8767EF1D29448D6700810C0F /* characteristicwriteprocessor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = characteristicwriteprocessor.cpp; path = ../src/characteristicwriteprocessor.cpp; sourceTree = "<group>"; };
8768D1F9285081FE00F58E3A /* nordictrackifitadbtreadmill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = nordictrackifitadbtreadmill.cpp; path = ../src/nordictrackifitadbtreadmill.cpp; sourceTree = "<group>"; };
8768D1FA285081FE00F58E3A /* nordictrackifitadbtreadmill.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = nordictrackifitadbtreadmill.h; path = ../src/nordictrackifitadbtreadmill.h; sourceTree = "<group>"; };
8768D1FC2850820B00F58E3A /* moc_nordictrackifitadbtreadmill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_nordictrackifitadbtreadmill.cpp; sourceTree = "<group>"; };
@@ -1023,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>"; };
@@ -1053,15 +1115,24 @@
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>"; };
8790FDDD277B0ABA00247550 /* nautilustreadmill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = nautilustreadmill.cpp; path = ../src/nautilustreadmill.cpp; sourceTree = "<group>"; };
8790FDDE277B0ABA00247550 /* nautilustreadmill.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = nautilustreadmill.h; path = ../src/nautilustreadmill.h; sourceTree = "<group>"; };
8790FDE0277B0AC600247550 /* moc_nautilustreadmill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_nautilustreadmill.cpp; sourceTree = "<group>"; };
87917A6E28E768D200F8D9AC /* Browser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Browser.swift; path = ../src/ios/AppleWatchToIpad/Browser.swift; sourceTree = "<group>"; };
87917A7028E768D200F8D9AC /* Connection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Connection.swift; path = ../src/ios/AppleWatchToIpad/Connection.swift; sourceTree = "<group>"; };
87917A7128E768D200F8D9AC /* Server.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Server.swift; path = ../src/ios/AppleWatchToIpad/Server.swift; sourceTree = "<group>"; };
87917A7228E768D200F8D9AC /* Client.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Client.swift; path = ../src/ios/AppleWatchToIpad/Client.swift; sourceTree = "<group>"; };
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>"; };
@@ -1082,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>"; };
@@ -1106,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>"; };
@@ -1117,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>"; };
@@ -1173,6 +1259,12 @@
87CC3BA025A0885D001EC5A8 /* elliptical.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = elliptical.cpp; path = ../src/elliptical.cpp; sourceTree = "<group>"; };
87CC3BA125A0885E001EC5A8 /* elliptical.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = elliptical.h; path = ../src/elliptical.h; sourceTree = "<group>"; };
87CC3BA225A0885E001EC5A8 /* domyoselliptical.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = domyoselliptical.h; path = ../src/domyoselliptical.h; sourceTree = "<group>"; };
87CF5167293C879700A7CABC /* characteristicwriteprocessore005.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = characteristicwriteprocessore005.cpp; path = ../src/characteristicwriteprocessore005.cpp; sourceTree = "<group>"; };
87CF5168293C879700A7CABC /* characteristicwriteprocessore005.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = characteristicwriteprocessore005.h; path = ../src/characteristicwriteprocessore005.h; sourceTree = "<group>"; };
87CF516A293C87AF00A7CABC /* moc_characteristicwriteprocessore005.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_characteristicwriteprocessore005.cpp; sourceTree = "<group>"; };
87D10550290996EA00B3935B /* mepanelbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mepanelbike.cpp; path = ../src/mepanelbike.cpp; sourceTree = "<group>"; };
87D10551290996EA00B3935B /* mepanelbike.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mepanelbike.h; path = ../src/mepanelbike.h; sourceTree = "<group>"; };
87D105532909971100B3935B /* moc_mepanelbike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_mepanelbike.cpp; sourceTree = "<group>"; };
87D2699925F535160076AA48 /* m3ibike.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = m3ibike.h; path = ../src/m3ibike.h; sourceTree = "<group>"; };
87D2699A25F535160076AA48 /* m3ibike.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = m3ibike.cpp; path = ../src/m3ibike.cpp; sourceTree = "<group>"; };
87D2699C25F535170076AA48 /* skandikawiribike.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = skandikawiribike.h; path = ../src/skandikawiribike.h; sourceTree = "<group>"; };
@@ -1180,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>"; };
@@ -1209,6 +1302,9 @@
87E0761B277A081900FDA0F9 /* technogymmyruntreadmillrfcomm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = technogymmyruntreadmillrfcomm.cpp; path = ../src/technogymmyruntreadmillrfcomm.cpp; sourceTree = "<group>"; };
87E0761C277A081900FDA0F9 /* technogymmyruntreadmillrfcomm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = technogymmyruntreadmillrfcomm.h; path = ../src/technogymmyruntreadmillrfcomm.h; sourceTree = "<group>"; };
87E0761E277A082300FDA0F9 /* moc_technogymmyruntreadmillrfcomm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_technogymmyruntreadmillrfcomm.cpp; sourceTree = "<group>"; };
87E2F85B291ED308002BDC65 /* lifefitnesstreadmill.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lifefitnesstreadmill.h; path = ../src/lifefitnesstreadmill.h; sourceTree = "<group>"; };
87E2F85C291ED308002BDC65 /* lifefitnesstreadmill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = lifefitnesstreadmill.cpp; path = ../src/lifefitnesstreadmill.cpp; sourceTree = "<group>"; };
87E2F85E291ED315002BDC65 /* moc_lifefitnesstreadmill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_lifefitnesstreadmill.cpp; sourceTree = "<group>"; };
87E34C292886F95300CEDE4B /* octanetreadmill.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = octanetreadmill.h; path = ../src/octanetreadmill.h; sourceTree = "<group>"; };
87E34C2A2886F95400CEDE4B /* octanetreadmill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = octanetreadmill.cpp; path = ../src/octanetreadmill.cpp; sourceTree = "<group>"; };
87E34C2C2886F99900CEDE4B /* moc_octanetreadmill.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_octanetreadmill.cpp; sourceTree = "<group>"; };
@@ -1237,6 +1333,14 @@
87EFE45727A518F5006EA1C3 /* nautiluselliptical.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = nautiluselliptical.h; path = ../src/nautiluselliptical.h; sourceTree = "<group>"; };
87EFE45827A518F5006EA1C3 /* nautiluselliptical.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = nautiluselliptical.cpp; path = ../src/nautiluselliptical.cpp; sourceTree = "<group>"; };
87EFE45A27A51900006EA1C3 /* moc_nautiluselliptical.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_nautiluselliptical.cpp; sourceTree = "<group>"; };
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>"; };
87F93426278E0EC00088B596 /* domyosrower.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = domyosrower.cpp; path = ../src/domyosrower.cpp; sourceTree = "<group>"; };
87F93428278E0ECF0088B596 /* moc_domyosrower.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = moc_domyosrower.cpp; sourceTree = "<group>"; };
@@ -1544,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 */,
@@ -1593,6 +1698,7 @@
0FF051564C679F373AD93E32 /* ios */ = {
isa = PBXGroup;
children = (
87917A6D28E768B000F8D9AC /* AppleWatchToIpad */,
8754D24B27F786F0003D7054 /* virtualrower.swift */,
2F0E70F726316F3600E11F3A /* virtualbike_zwift.swift */,
871E4CD025A6FB5A00E18D6D /* BLEPeripheralManager.swift */,
@@ -1615,6 +1721,22 @@
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 */,
87D105532909971100B3935B /* moc_mepanelbike.cpp */,
872A20DB28C5F5CE0037774D /* moc_faketreadmill.cpp */,
878C9E6A28B77E9800669129 /* moc_nordictrackifitadbbike.cpp */,
872261EF289EA887006A6F75 /* moc_nordictrackelliptical.cpp */,
879E5AA9289C05A500FEA38A /* moc_proformwifitreadmill.cpp */,
@@ -1767,6 +1889,44 @@
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 */,
87E2F85C291ED308002BDC65 /* lifefitnesstreadmill.cpp */,
87E2F85B291ED308002BDC65 /* lifefitnesstreadmill.h */,
87F02E3E29178523000DB52C /* octaneelliptical.cpp */,
87F02E3F29178524000DB52C /* octaneelliptical.h */,
87D10550290996EA00B3935B /* mepanelbike.cpp */,
87D10551290996EA00B3935B /* mepanelbike.h */,
87F527BC28EEB5AA00A9F8D5 /* qzsettings.cpp */,
87F527BD28EEB5AA00A9F8D5 /* qzsettings.h */,
872A20D928C5EC380037774D /* faketreadmill.cpp */,
872A20D828C5EC380037774D /* faketreadmill.h */,
878C9E6828B77E7B00669129 /* nordictrackifitadbbike.cpp */,
878C9E6728B77E7B00669129 /* nordictrackifitadbbike.h */,
872261EC289EA873006A6F75 /* nordictrackelliptical.cpp */,
@@ -2085,6 +2245,7 @@
68418A2D51B69FC30BF5A41C /* virtualbike.h */,
35E903698E72424585D33829 /* virtualtreadmill.h */,
C8CE72E7B224D8B886614E3F /* domyosbike.h */,
8710707229C4A5E70094D0F3 /* GarminConnect.swift */,
);
name = Sources;
sourceTree = "<group>";
@@ -2154,6 +2315,17 @@
path = "Preview Content";
sourceTree = "<group>";
};
87917A6D28E768B000F8D9AC /* AppleWatchToIpad */ = {
isa = PBXGroup;
children = (
87917A6E28E768D200F8D9AC /* Browser.swift */,
87917A7228E768D200F8D9AC /* Client.swift */,
87917A7028E768D200F8D9AC /* Connection.swift */,
87917A7128E768D200F8D9AC /* Server.swift */,
);
name = AppleWatchToIpad;
sourceTree = "<group>";
};
87DF60DE337FB58864343E39 /* Resources */ = {
isa = PBXGroup;
children = (
@@ -2166,6 +2338,7 @@
AF39DD055C3EF8226FBE929D /* Frameworks */ = {
isa = PBXGroup;
children = (
873D388A29B0D744006A2611 /* ConnectIQ.xcframework */,
879F74142893D732009A64C8 /* CoreMedia.framework */,
879F74122893D705009A64C8 /* CoreVideo.framework */,
879F74102893D5B7009A64C8 /* libqavfcamera.a */,
@@ -2768,6 +2941,7 @@
8738249127E646E3004F1B46 /* dirconpacket.cpp in Compile Sources */,
87C5F0BB26285E5F0067A1B5 /* mimetext.cpp in Compile Sources */,
8732C17F27353464006DF424 /* iconceptbike.cpp in Compile Sources */,
87CF5169293C879800A7CABC /* characteristicwriteprocessore005.cpp in Compile Sources */,
873824C027E64707004F1B46 /* moc_dirconmanager.cpp in Compile Sources */,
2F0E70F826316F3600E11F3A /* virtualbike_zwift.swift in Compile Sources */,
8772A0E825E43AE70080718C /* moc_trxappgateusbbike.cpp in Compile Sources */,
@@ -2775,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 */,
@@ -2796,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 */,
@@ -2814,6 +2990,9 @@
C6B3CD471768392E18F85819 /* fit_accumulated_field.cpp in Compile Sources */,
3D7395B0A17915A06361C7F3 /* fit_accumulator.cpp in Compile Sources */,
2A61806454201575EDB3F94F /* fit_buffer_encode.cpp in Compile Sources */,
87F02E4229178545000DB52C /* moc_octaneelliptical.cpp in Compile Sources */,
87E2F85D291ED308002BDC65 /* lifefitnesstreadmill.cpp in Compile Sources */,
87917A7328E768D200F8D9AC /* Browser.swift in Compile Sources */,
873CD20B27EF8D8A000131BC /* inapptransaction.cpp in Compile Sources */,
873824EF27E647A9004F1B46 /* query.cpp in Compile Sources */,
876F45FF279350D9003CDA5A /* moc_concept2skierg.cpp in Compile Sources */,
@@ -2825,11 +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 */,
@@ -2839,6 +3021,7 @@
87CC3B9D25A08812001EC5A8 /* moc_domyoselliptical.cpp in Compile Sources */,
87900DC6268B672E000CB351 /* renphobike.cpp in Compile Sources */,
879F16462847E55C00CE4945 /* proformellipticaltrainer.cpp in Compile Sources */,
87917A7728E768D200F8D9AC /* Client.swift in Compile Sources */,
873824B927E64707004F1B46 /* moc_provider.cpp in Compile Sources */,
8727A47727849EA600019B5D /* paferstreadmill.cpp in Compile Sources */,
DF1FD9718B75FA591A7E3D80 /* fit_decode.cpp in Compile Sources */,
@@ -2856,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 */,
@@ -2885,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 */,
@@ -2911,19 +3099,23 @@
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 */,
87F527BE28EEB5AA00A9F8D5 /* qzsettings.cpp in Compile Sources */,
8703BAEB273C67A90058E206 /* pafersbike.cpp in Compile Sources */,
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 */,
@@ -2939,6 +3131,7 @@
87A3BC222656429600D302E3 /* rower.cpp in Compile Sources */,
C719682D8D421AF6B2DAAEA9 /* main.cpp in Compile Sources */,
87BB1774269E983200F46A1C /* moc_webserverinfosender.cpp in Compile Sources */,
87E2F85F291ED315002BDC65 /* moc_lifefitnesstreadmill.cpp in Compile Sources */,
876BFCA127BE35D8001D7645 /* moc_bowflext216treadmill.cpp in Compile Sources */,
25FCD41CCCAF49293B9369E8 /* qfit.cpp in Compile Sources */,
87ADD2BD27634C2100B7A0AB /* moc_technogymmyruntreadmill.cpp in Compile Sources */,
@@ -2950,17 +3143,20 @@
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 */,
873824BB27E64707004F1B46 /* moc_prober_p.cpp in Compile Sources */,
8742C2B227C92C30007D3FA0 /* wahookickrsnapbike.cpp in Compile Sources */,
87EB918327EE5FE7002535E1 /* moc_inappstore.cpp in Compile Sources */,
87CF516B293C87B000A7CABC /* moc_characteristicwriteprocessore005.cpp in Compile Sources */,
8780D949264FB8B800192D41 /* moc_smartspin2k.cpp in Compile Sources */,
8768D1FD2850820B00F58E3A /* moc_nordictrackifitadbtreadmill.cpp in Compile Sources */,
87D5DC402823047D008CCDE7 /* truetreadmill.cpp in Compile Sources */,
@@ -2971,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 */,
@@ -2979,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 */,
@@ -2996,9 +3195,11 @@
87AE0CB227760DCB00E547E9 /* virtualtreadmill_zwift.swift in Compile Sources */,
87062643259480A200D06586 /* AppDelegate.swift in Compile Sources */,
873824F027E647A9004F1B46 /* server.cpp in Compile Sources */,
872A20DC28C5F5CE0037774D /* moc_faketreadmill.cpp in Compile Sources */,
873CD20927EF8D8A000131BC /* inapppurchasebackend.cpp in Compile Sources */,
87E0761F277A082300FDA0F9 /* moc_technogymmyruntreadmillrfcomm.cpp in Compile Sources */,
87433F2127D8B722003D1672 /* simplecrypt.cpp in Compile Sources */,
87917A7628E768D200F8D9AC /* Server.swift in Compile Sources */,
2B42755BF45173E11E2110CB /* FitFieldDefinition.mm in Compile Sources */,
873824AE27E64706004F1B46 /* moc_browser.cpp in Compile Sources */,
8738249727E646E3004F1B46 /* characteristicnotifier2a53.cpp in Compile Sources */,
@@ -3015,11 +3216,14 @@
873824E527E647A8004F1B46 /* message.cpp in Compile Sources */,
210F6A0A7E2FA7CDD3CA0084 /* qdomyoszwift_qml_plugin_import.cpp in Compile Sources */,
87062644259480A600D06586 /* APIFetcher.swift in Compile Sources */,
87F02E4029178524000DB52C /* octaneelliptical.cpp in Compile Sources */,
878531682711A3EC004B153D /* moc_activiotreadmill.cpp in Compile Sources */,
87C5F0D626285E7E0067A1B5 /* moc_emailaddress.cpp in Compile Sources */,
39FAA19B9285AB16AE3A39BA /* qrc_icons.cpp in Compile Sources */,
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 */,
@@ -3032,6 +3236,7 @@
873824BD27E64707004F1B46 /* moc_resolver_p.cpp in Compile Sources */,
876ED21A25C3E9010065F3DC /* moc_material.cpp in Compile Sources */,
87A4B76125AF27CB0027EF3C /* metric.cpp in Compile Sources */,
87D10552290996EA00B3935B /* mepanelbike.cpp in Compile Sources */,
9D9484EED654597C394345DE /* moc_echelonconnectsport.cpp in Compile Sources */,
87DED80627D1273900BE4FBB /* filedownloader.cpp in Compile Sources */,
7DEEAF0C3D671FBFD84ACFCE /* moc_homeform.cpp in Compile Sources */,
@@ -3043,6 +3248,7 @@
E62DA5FF2436135448C94671 /* moc_toorxtreadmill.cpp in Compile Sources */,
87586A4325B8341B00A243C4 /* moc_proformbike.cpp in Compile Sources */,
87CC3BA325A0885F001EC5A8 /* domyoselliptical.cpp in Compile Sources */,
87D105542909971100B3935B /* moc_mepanelbike.cpp in Compile Sources */,
87B617F325F260150094A1CB /* moc_snodebike.cpp in Compile Sources */,
87DA8467284933DE00B550E9 /* moc_fakeelliptical.cpp in Compile Sources */,
87C5F0D726285E7E0067A1B5 /* moc_mimefile.cpp in Compile Sources */,
@@ -3053,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 */,
@@ -3061,6 +3268,7 @@
879E5AA8289C057E00FEA38A /* proformwifitreadmill.cpp in Compile Sources */,
873824B227E64706004F1B46 /* moc_hostname.cpp in Compile Sources */,
873824EB27E647A8004F1B46 /* prober.cpp in Compile Sources */,
8767EF1E29448D6700810C0F /* characteristicwriteprocessor.cpp in Compile Sources */,
87B617F425F260150094A1CB /* moc_screencapture.cpp in Compile Sources */,
87B617ED25F25FED0094A1CB /* fitshowtreadmill.cpp in Compile Sources */,
87A0C4BC262329A600121A76 /* cscbike.cpp in Compile Sources */,
@@ -3068,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 */,
@@ -3084,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 */,
@@ -3096,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 */,
@@ -3448,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.11.24;
CURRENT_PROJECT_VERSION = 612;
DEVELOPMENT_TEAM = 6335M7T29D;
ENABLE_BITCODE = NO;
HEADER_SEARCH_PATHS = (
@@ -3481,6 +3695,7 @@
../src/purchasing/qmltypes,
../src/purchasing/ios,
../../Qt/5.15.2/ios/include/QtTextToSpeech,
../../Qt/5.15.2/ios/include/QtMultimedia,
);
LIBRARY_SEARCH_PATHS = (
/Users/cagnulein/Qt/5.15.2/ios/plugins/platforms,
@@ -3526,7 +3741,7 @@
/Users/cagnulein/Qt/5.15.2/ios/plugins/playlistformats,
/Users/cagnulein/Qt/5.15.2/ios/plugins/audio,
);
MARKETING_VERSION = 2.11;
MARKETING_VERSION = 2.13;
OTHER_CFLAGS = (
"-pipe",
"-g",
@@ -3615,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.11.24;
CURRENT_PROJECT_VERSION = 612;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 6335M7T29D;
ENABLE_BITCODE = NO;
@@ -3650,6 +3865,7 @@
../src/purchasing/qmltypes,
../src/purchasing/ios,
../../Qt/5.15.2/ios/include/QtTextToSpeech,
../../Qt/5.15.2/ios/include/QtMultimedia,
);
LIBRARY_SEARCH_PATHS = (
/Users/cagnulein/Qt/5.15.2/ios/plugins/platforms,
@@ -3695,7 +3911,7 @@
/Users/cagnulein/Qt/5.15.2/ios/plugins/playlistformats,
/Users/cagnulein/Qt/5.15.2/ios/plugins/audio,
);
MARKETING_VERSION = 2.11;
MARKETING_VERSION = 2.13;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = (
"-pipe",
@@ -3822,7 +4038,7 @@
CODE_SIGN_ENTITLEMENTS = "watchkit Extension/WatchKit Extension.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2.11.24;
CURRENT_PROJECT_VERSION = 612;
DEVELOPMENT_TEAM = 6335M7T29D;
ENABLE_BITCODE = YES;
ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -3842,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.11;
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";
@@ -3914,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.11.24;
CURRENT_PROJECT_VERSION = 612;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 6335M7T29D;
ENABLE_BITCODE = YES;
@@ -3930,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.11;
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";
@@ -3951,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;
@@ -4001,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.11.24;
CURRENT_PROJECT_VERSION = 612;
DEVELOPMENT_ASSET_PATHS = "\"watchkit Extension/Preview Content\"";
ENABLE_BITCODE = YES;
ENABLE_PREVIEWS = YES;
@@ -4020,9 +4245,33 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = (
../src,
.,
../../Qt/5.15.2/ios/mkspecs/common/uikit,
"../src/fit-sdk",
../../Qt/5.15.2/ios/include,
../../Qt/5.15.2/ios/include/QtWidgets,
../../Qt/5.15.2/ios/include/QtQuick,
../../Qt/5.15.2/ios/include/QtGui,
../../Qt/5.15.2/ios/include/QtBluetooth,
../../Qt/5.15.2/ios/include/QtXml,
../../Qt/5.15.2/ios/include/QtPositioning,
../../Qt/5.15.2/ios/include/QtQmlModels,
../../Qt/5.15.2/ios/include/QtQml,
../../Qt/5.15.2/ios/include/QtNetwork,
../../Qt/5.15.2/ios/include/QtCore,
.,
"../../Qt/5.15.2/ios/mkspecs/macx-ios-clang",
../../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.11;
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";
@@ -4091,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.11.24;
CURRENT_PROJECT_VERSION = 612;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_ASSET_PATHS = "\"watchkit Extension/Preview Content\"";
ENABLE_BITCODE = YES;
@@ -4106,9 +4355,33 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = (
../src,
.,
../../Qt/5.15.2/ios/mkspecs/common/uikit,
"../src/fit-sdk",
../../Qt/5.15.2/ios/include,
../../Qt/5.15.2/ios/include/QtWidgets,
../../Qt/5.15.2/ios/include/QtQuick,
../../Qt/5.15.2/ios/include/QtGui,
../../Qt/5.15.2/ios/include/QtBluetooth,
../../Qt/5.15.2/ios/include/QtXml,
../../Qt/5.15.2/ios/include/QtPositioning,
../../Qt/5.15.2/ios/include/QtQmlModels,
../../Qt/5.15.2/ios/include/QtQml,
../../Qt/5.15.2/ios/include/QtNetwork,
../../Qt/5.15.2/ios/include/QtCore,
.,
"../../Qt/5.15.2/ios/mkspecs/macx-ios-clang",
../../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.11;
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";
@@ -4128,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;

View File

@@ -87,8 +87,6 @@
</RemoteRunnable>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "876E4E102594747F00BD5714"
BuildableName = "watchkit.app"
BlueprintName = "watchkit"
ReferencedContainer = "container:qdomyoszwift.xcodeproj">

View File

@@ -17,16 +17,33 @@ class MainController: WKInterfaceController {
@IBOutlet weak var distanceLabel: WKInterfaceLabel!
@IBOutlet weak var heartRateLabel: WKInterfaceLabel!
@IBOutlet weak var startButton: WKInterfaceButton!
@IBOutlet weak var cmbSports: WKInterfacePicker!
static var start: Bool! = false
let pedometer = CMPedometer()
var sport: Int = 0
override func awake(withContext context: Any?) {
super.awake(withContext: context)
let sports: [WKPickerItem] = [WKPickerItem(),WKPickerItem(),WKPickerItem(),WKPickerItem(),WKPickerItem()]
sports[0].title = "Bike"
sports[1].title = "Run"
sports[2].title = "Walk"
sports[3].title = "Elliptical"
sports[4].title = "Rowing"
cmbSports.setItems(sports)
sport = UserDefaults.standard.value(forKey: "sport") as? Int ?? 0
cmbSports.setSelectedItemIndex(sport)
// Configure interface objects here.
print("AWAKE")
}
@IBAction func changeSport(_ value: Int) {
self.sport = value
UserDefaults.standard.set(value, forKey: "sport")
UserDefaults.standard.synchronize()
}
override func willActivate() {
// This method is called when watch view controller is about to be visible to user
super.willActivate()
@@ -57,6 +74,7 @@ extension MainController {
MainController.start = true
startButton.setTitle("Stop")
WorkoutTracking.authorizeHealthKit()
WorkoutTracking.shared.setSport(sport)
WorkoutTracking.shared.startWorkOut()
WorkoutTracking.shared.delegate = self
@@ -86,8 +104,12 @@ extension MainController: WorkoutTrackingDelegate {
"\(heartRate)" as AnyObject])
WorkoutTracking.distance = WatchKitConnection.distance
WorkoutTracking.kcal = WatchKitConnection.kcal
self.distanceLabel.setText("Distance \(Double(WorkoutTracking.distance))")
if Locale.current.measurementSystem != "Metric" {
self.distanceLabel.setText("Distance \(String(format:"%.2f", WorkoutTracking.distance))")
} else {
self.distanceLabel.setText("Distance \(String(format:"%.2f", WorkoutTracking.distance * 1.60934))")
}
self.caloriesLabel.setText("KCal \(Int(WorkoutTracking.kcal))")
//WorkoutTracking.cadenceSteps = pedometer.
}
@@ -105,3 +127,11 @@ extension MainController: WatchKitConnectionDelegate {
userNameLabel.setText(userName)
}
}
extension Locale
{
var measurementSystem : String?
{
return (self as NSLocale).object(forKey: NSLocale.Key.measurementSystem) as? String
}
}

View File

@@ -31,6 +31,7 @@ class WorkoutTracking: NSObject {
public static var cadenceTimeStamp = NSDate().timeIntervalSince1970
public static var cadenceLastSteps = Double()
public static var cadenceSteps = 0
var sport: Int = 0
let healthStore = HKHealthStore()
let configuration = HKWorkoutConfiguration()
var workoutSession: HKWorkoutSession!
@@ -101,8 +102,23 @@ extension WorkoutTracking {
}
}
func setSport(_ sport: Int) {
self.sport = sport
}
private func configWorkout() {
configuration.activityType = .cycling
var activityType = HKWorkoutActivityType.cycling
if self.sport == 1 {
activityType = HKWorkoutActivityType.running
} else if self.sport == 2 {
activityType = HKWorkoutActivityType.walking
} else if self.sport == 3 {
activityType = HKWorkoutActivityType.elliptical
} else if self.sport == 4 {
activityType = HKWorkoutActivityType.rowing
}
configuration.activityType = activityType
configuration.locationType = .indoor
do {
@@ -134,6 +150,7 @@ extension WorkoutTracking: WorkoutTrackingProtocol {
HKSampleType.quantityType(forIdentifier: .stepCount)!,
HKSampleType.quantityType(forIdentifier: .heartRate)!,
HKSampleType.quantityType(forIdentifier: .distanceCycling)!,
HKSampleType.quantityType(forIdentifier: .distanceWalkingRunning)!,
HKSampleType.quantityType(forIdentifier: .activeEnergyBurned)!,
HKSampleType.workoutType()
])
@@ -159,6 +176,10 @@ extension WorkoutTracking: WorkoutTrackingProtocol {
if let error = error {
print(error)
}
if self.sport > 0 {
self.workoutBuilder.dataSource?.enableCollection(for: HKQuantityType.quantityType(forIdentifier: .distanceWalkingRunning)!, predicate: nil)
}
}
}
@@ -183,29 +204,72 @@ extension WorkoutTracking: WorkoutTrackingProtocol {
end: Date())
workoutBuilder.add([sample]) {(success, error) in}
guard let quantityTypeDistance = HKQuantityType.quantityType(
forIdentifier: .distanceCycling) else {
return
}
let unitDistance = HKUnit.mile()
let miles = WorkoutTracking.distance
let quantityMiles = HKQuantity(unit: unitDistance,
doubleValue: miles)
let sampleDistance = HKCumulativeQuantitySeriesSample(type: quantityTypeDistance,
quantity: quantityMiles,
start: workoutSession.startDate!,
end: Date())
workoutBuilder.add([sample]) {(success, error) in}
workoutBuilder.add([sampleDistance]) {(success, error) in}
workoutBuilder.endCollection(withEnd: Date()) { (success, error) in
if(sport == 0) {
guard let quantityTypeDistance = HKQuantityType.quantityType(
forIdentifier: .distanceCycling) else {
return
}
let sampleDistance = HKCumulativeQuantitySeriesSample(type: quantityTypeDistance,
quantity: quantityMiles,
start: workoutSession.startDate!,
end: Date())
workoutBuilder.add([sampleDistance]) {(success, error) in
if let error = error {
print(error)
}
self.workoutBuilder.endCollection(withEnd: Date()) { (success, error) in
if let error = error {
print(error)
}
self.workoutBuilder.finishWorkout{ (workout, error) in
if let error = error {
print(error)
}
workout?.setValue(quantityMiles, forKey: "totalDistance")
}
}
}
} else {
guard let quantityTypeDistance = HKQuantityType.quantityType(
forIdentifier: .distanceWalkingRunning) else {
return
}
let sampleDistance = HKCumulativeQuantitySeriesSample(type: quantityTypeDistance,
quantity: quantityMiles,
start: workoutSession.startDate!,
end: Date())
workoutBuilder.add([sampleDistance]) {(success, error) in
if let error = error {
print(error)
}
self.workoutBuilder.endCollection(withEnd: Date()) { (success, error) in
if let error = error {
print(error)
}
self.workoutBuilder.finishWorkout{ (workout, error) in
if let error = error {
print(error)
}
workout?.setValue(quantityMiles, forKey: "totalDistance")
}
}
}
}
workoutBuilder.finishWorkout{ (success, error) in }
}
func fetchStepCounts() {

View File

@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder.WatchKit.Storyboard" version="3.0" toolsVersion="19529" targetRuntime="watchKit" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="Tpn-rd-UUX">
<document type="com.apple.InterfaceBuilder.WatchKit.Storyboard" version="3.0" toolsVersion="20037" targetRuntime="watchKit" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="Tpn-rd-UUX">
<device id="watch38"/>
<dependencies>
<deployment identifier="watchOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19519"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBWatchKitPlugin" version="19514"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBWatchKitPlugin" version="20006"/>
</dependencies>
<scenes>
<!--Main-->
@@ -22,9 +22,15 @@
<label width="136" alignment="left" text="Step Counts" id="HpA-e9-6YV"/>
<label width="136" alignment="left" text="Calories" id="Szi-Jp-J3S"/>
<label width="136" alignment="left" text="Distance" id="eRf-NJ-6If"/>
<picker height="100" alignment="left" id="OTR-HF-vYb">
<connections>
<action selector="changeSport:" destination="Tpn-rd-UUX" id="3vY-lq-IhZ"/>
</connections>
</picker>
</items>
<connections>
<outlet property="caloriesLabel" destination="Szi-Jp-J3S" id="trd-YS-bJy"/>
<outlet property="cmbSports" destination="OTR-HF-vYb" id="Ws5-w9-ZT8"/>
<outlet property="distanceLabel" destination="eRf-NJ-6If" id="ZE2-OB-jqN"/>
<outlet property="heartRateLabel" destination="Nda-m1-XRw" id="1la-8R-3jG"/>
<outlet property="startButton" destination="vZg-X8-uY5" id="pJc-09-kfV"/>

15
defaults.pri Normal file
View 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

View File

@@ -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
```
@@ -25,13 +28,13 @@ $ sudo ./qdomyos-zwift
You will need to (at a minimum) to install the xcode Command Line Tools (CLI) thanks to @richardwait
https://developer.apple.com/download/more/?=xcode
Download and install http://download.qt.io/official_releases/qt/5.12/5.12.9/qt-opensource-mac-x64-5.12.9.dmg and simply run the qdomyos-zwift relase for MacOs
Download and install http://download.qt.io/official_releases/qt/5.12/5.12.9/qt-opensource-mac-x64-5.12.9.dmg and simply run the qdomyos-zwift release for MacOs
## On Raspberry Pi Zero W
![raspi](../docs/img/raspi-bike.jpg)
This guide will walk you through steps to setup an autonomous, headless raspberry brigde.
This guide will walk you through steps to setup an autonomous, headless raspberry bridge.
### Initial System Preparation
@@ -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)

View File

@@ -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

View File

@@ -26,5 +26,5 @@ You can have ae true 4k video stream while you ride ("extreme quality" setting)
The application do not read the FTMS value. It is required to start the application with `-heart-service` or `bike_heartrate_service: true` in settings.
### Resistance management
You can adjust resistence using arrows [up and down](img/21_zwift-resistance-buttons.jpg) rom the riding screen.
You can adjust resistance using arrows [up and down](img/21_zwift-resistance-buttons.jpg) rom the riding screen.

View File

@@ -24,8 +24,9 @@ This is the list of settings available in the application. These settings needs
| **Option** | **Type** | **Default** | **Function** |
|:------------------------------|:---------|:------------|:-----------------------------------------------------------------------------|
| -no-gui | Boolean | False | Disable GUI |
| -qml | Boolean | False | Enables the QML interface |
| -miles | Boolean | False | Swithes to Imperial Units System |
| -qml | Boolean | True | Enables the QML interface |
| -noqml | Boolean | False | Enables the NativeQT interface |
| -miles | Boolean | False | Switches to Imperial Units System |
| -no-console | Boolean | False | Not in use |
| -test-resistance | Boolean | False | |
| -no-log | Boolean | False | Disable Logging |
@@ -42,10 +43,10 @@ This is the list of settings available in the application. These settings needs
| -service-changed | Boolean | False | |
| -bike-wheel-revs | Boolean | False | |
| -run-cadence-sensor | Boolean | False | |
| -nordictrack-10-treadmill | Boolean | False | Enable NordicTrack compatibility mode |
| -nordictrack-10-treadmill | Boolean | False | Enable NordicTrack compatibility mode |
| -train | String | | Force training program |
| -name | String | | Force bluetooth device name (if QZ struggles finding your fitness equipment) |
| -poll-device-time | Int | 200 (ms) | Frequency to refresh informations from QZ to Fitness equipment |
| -poll-device-time | Int | 200 (ms) | Frequency to refresh information from QZ to Fitness equipment |
| -bike-resistance-gain | Int | | Adjust resistance from the fitness application |
| -bike-resistance-offset | Int | | Set another resistance point than default |

View File

@@ -0,0 +1,272 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Copyright 2017 Bluetooth SIG, Inc. All rights reserved.-->
<Characteristic xsi:noNamespaceSchemaLocation="http://schemas.bluetooth.org/Documents/characteristic.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
name="Cross Trainer Data"
type="org.bluetooth.characteristic.cross_trainer_data" uuid="2ACE"
last-modified="2017-02-14" approved="Yes">
<InformativeText>
<Summary>The Cross Trainer Data characteristic is used to send
training-related data to the Client from a cross trainer
(Server).</Summary>
</InformativeText>
<Value>
<Field name="Flags">
<Requirement>Mandatory</Requirement>
<Format>24bit</Format>
<BitField>
<Bit index="0" size="1" name="More Data">
<Enumerations>
<Enumeration key="0" value="False" requires="C1" />
<Enumeration key="1" value="True" />
</Enumerations>
</Bit>
<Bit index="1" size="1" name="Average Speed present">
<Enumerations>
<Enumeration key="0" value="False" />
<Enumeration key="1" value="True" requires="C2" />
</Enumerations>
</Bit>
<Bit index="2" size="1" name="Total Distance Present">
<Enumerations>
<Enumeration key="0" value="False" />
<Enumeration key="1" value="True" requires="C3" />
</Enumerations>
</Bit>
<Bit index="3" size="1" name="Step Count present">
<Enumerations>
<Enumeration key="0" value="False" />
<Enumeration key="1" value="True" requires="C4" />
</Enumerations>
</Bit>
<Bit index="4" size="1" name="Stride Count present">
<Enumerations>
<Enumeration key="0" value="False" />
<Enumeration key="1" value="True" requires="C5" />
</Enumerations>
</Bit>
<Bit index="5" size="1" name="Elevation Gain present">
<Enumerations>
<Enumeration key="0" value="False" />
<Enumeration key="1" value="True" requires="C6" />
</Enumerations>
</Bit>
<Bit index="6" size="1"
name="Inclination and Ramp Angle Setting present">
<Enumerations>
<Enumeration key="0" value="False" />
<Enumeration key="1" value="True" requires="C7" />
</Enumerations>
</Bit>
<Bit index="7" size="1" name="Resistance Level Present">
<Enumerations>
<Enumeration key="0" value="False" />
<Enumeration key="1" value="True" requires="C8" />
</Enumerations>
</Bit>
<Bit index="8" size="1" name="Instantaneous Power present">
<Enumerations>
<Enumeration key="0" value="False" />
<Enumeration key="1" value="True" requires="C9" />
</Enumerations>
</Bit>
<Bit index="9" size="1" name="Average Power present">
<Enumerations>
<Enumeration key="0" value="False" />
<Enumeration key="1" value="True" requires="C10" />
</Enumerations>
</Bit>
<Bit index="10" size="1" name="Expended Energy present">
<Enumerations>
<Enumeration key="0" value="False" />
<Enumeration key="1" value="True" requires="C11" />
</Enumerations>
</Bit>
<Bit index="11" size="1" name="Heart Rate present">
<Enumerations>
<Enumeration key="0" value="False" />
<Enumeration key="1" value="True" requires="C12" />
</Enumerations>
</Bit>
<Bit index="12" size="1"
name="Metabolic Equivalent present">
<Enumerations>
<Enumeration key="0" value="False" />
<Enumeration key="1" value="True" requires="C13" />
</Enumerations>
</Bit>
<Bit index="13" size="1" name="Elapsed Time present">
<Enumerations>
<Enumeration key="0" value="False" />
<Enumeration key="1" value="True" requires="C14" />
</Enumerations>
</Bit>
<Bit index="14" size="1" name="Remaining Time present">
<Enumerations>
<Enumeration key="0" value="False" />
<Enumeration key="1" value="True" requires="C15" />
</Enumerations>
</Bit>
<Bit index="15" size="1" name="Movement Direction">
<Enumerations>
<Enumeration key="0" value="Forward" />
<Enumeration key="1" value="Backward" />
</Enumerations>
</Bit>
<ReservedForFutureUse index="16" size="8" />
</BitField>
</Field>
<Field name="Instantaneous Speed">
<InformativeText>Kilometer per hour with a resolution of
0.01</InformativeText>
<Requirement>C1</Requirement>
<Format>uint16</Format>
<Unit>org.bluetooth.unit.velocity.kilometre_per_hour</Unit>
<DecimalExponent>-2</DecimalExponent>
</Field>
<Field name="Average Speed">
<InformativeText>Kilometer per hour with a resolution of
0.01</InformativeText>
<Requirement>C2</Requirement>
<Format>uint16</Format>
<Unit>org.bluetooth.unit.velocity.kilometre_per_hour</Unit>
<DecimalExponent>-2</DecimalExponent>
</Field>
<Field name="Total Distance">
<InformativeText>Meters with a resolution of
1</InformativeText>
<Requirement>C3</Requirement>
<Format>uint24</Format>
<Unit>org.bluetooth.unit.length.metre</Unit>
</Field>
<Field name="Step Per Minute">
<InformativeText>Step/minute with a resolution of
1</InformativeText>
<Requirement>C4</Requirement>
<Format>uint16</Format>
<Unit>org.bluetooth.unit.step_per_minute</Unit>
</Field>
<Field name="Average Step Rate">
<InformativeText>Step/minute with a resolution of
1</InformativeText>
<Requirement>C4</Requirement>
<Format>uint16</Format>
<Unit>org.bluetooth.unit.step_per_minute</Unit>
</Field>
<Field name="Stride Count">
<InformativeText>Unitless with a resolution of
0.1</InformativeText>
<Requirement>C5</Requirement>
<Format>uint16</Format>
<DecimalExponent>-1</DecimalExponent>
<Unit>org.bluetooth.unit.unitless</Unit>
</Field>
<Field name="Positive Elevation Gain">
<InformativeText>Meters with a resolution of
1</InformativeText>
<Requirement>C6</Requirement>
<Format>uint16</Format>
<Unit>org.bluetooth.unit.length.metre</Unit>
</Field>
<Field name="Negative Elevation Gain">
<InformativeText>Meters with a resolution of
1</InformativeText>
<Requirement>C6</Requirement>
<Format>uint16</Format>
<Unit>org.bluetooth.unit.length.metre</Unit>
</Field>
<Field name="Inclination">
<InformativeText>Percent with a resolution of
0.1</InformativeText>
<Requirement>C7</Requirement>
<Format>sint16</Format>
<Unit>org.bluetooth.unit.percentage</Unit>
<DecimalExponent>-1</DecimalExponent>
</Field>
<Field name="Ramp Angle Setting">
<InformativeText>Degree with a resolution of
0.1</InformativeText>
<Requirement>C7</Requirement>
<Format>sint16</Format>
<Unit>org.bluetooth.unit.plane_angle.degree</Unit>
<DecimalExponent>-1</DecimalExponent>
</Field>
<Field name="Resistance Level">
<InformativeText>Unitless with a resolution of
0.1</InformativeText>
<Requirement>C8</Requirement>
<Format>sint16</Format>
<DecimalExponent>-1</DecimalExponent>
<Unit>org.bluetooth.unit.unitless</Unit>
</Field>
<Field name="Instantaneous Power">
<InformativeText>Watts with a resolution of
1</InformativeText>
<Requirement>C9</Requirement>
<Format>sint16</Format>
<Unit>org.bluetooth.unit.power.watt</Unit>
</Field>
<Field name="Average Power">
<InformativeText>Watts with a resolution of
1</InformativeText>
<Requirement>C10</Requirement>
<Format>sint16</Format>
<Unit>org.bluetooth.unit.power.watt</Unit>
</Field>
<Field name="Total Energy">
<InformativeText>Kilo Calorie with a resolution of
1</InformativeText>
<Requirement>C11</Requirement>
<Format>uint16</Format>
<Unit>org.bluetooth.unit.energy.kilogram_calorie</Unit>
</Field>
<Field name="Energy Per Hour">
<InformativeText>Kilo Calorie with a resolution of
1</InformativeText>
<Requirement>C11</Requirement>
<Format>uint16</Format>
<Unit>org.bluetooth.unit.energy.kilogram_calorie</Unit>
</Field>
<Field name="Energy Per Minute">
<InformativeText>Kilo Calorie with a resolution of
1</InformativeText>
<Requirement>C11</Requirement>
<Format>uint8</Format>
<Unit>org.bluetooth.unit.energy.kilogram_calorie</Unit>
</Field>
<Field name="Heart Rate">
<InformativeText>Beats per minute with a resolution of
1</InformativeText>
<Requirement>C12</Requirement>
<Format>uint8</Format>
<Unit>org.bluetooth.unit.period.beats_per_minute</Unit>
</Field>
<Field name="Metabolic Equivalent">
<InformativeText>Metabolic Equivalent with a resolution of
0.1</InformativeText>
<Requirement>C13</Requirement>
<Format>uint8</Format>
<DecimalExponent>-1</DecimalExponent>
<Unit>org.bluetooth.unit.metabolic_equivalent</Unit>
</Field>
<Field name="Elapsed Time">
<InformativeText>Second with a resolution of
1</InformativeText>
<Requirement>C14</Requirement>
<Format>uint16</Format>
<Unit>org.bluetooth.unit.time.second</Unit>
</Field>
<Field name="Remaining Time">
<InformativeText>Second with a resolution of
1</InformativeText>
<Requirement>C15</Requirement>
<Format>uint16</Format>
<Unit>org.bluetooth.unit.time.second</Unit>
</Field>
</Value>
<Note>The fields in the above table, reading from top to bottom,
are shown in the order of LSO to MSO, where LSO = Least
Significant Octet and MSO = Most Significant Octet. The Least
Significant Octet represents the eight bits numbered 0 to
7.</Note>
</Characteristic>

File diff suppressed because it is too large Load Diff

View 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
View 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
}

View File

@@ -1018,7 +1018,7 @@ public class QtBluetoothLE {
/*
* Already executed in GattCallback so executed by the HandlerThread. No need to
* post it to the Hander.
* post it to the Handler.
*/
private void scheduleMtuExchange() {
ReadWriteJob newJob = new ReadWriteJob();

View File

@@ -385,11 +385,11 @@ QT_USE_NAMESPACE
}
[uuids addObject:nsUuid];
// With the latest CoreBluetooth, we can synchronously retrive peripherals:
// With the latest CoreBluetooth, we can synchronously retrieve peripherals:
QT_BT_MAC_AUTORELEASEPOOL;
NSArray *const peripherals = [manager retrievePeripheralsWithIdentifiers:uuids];
if (!peripherals || peripherals.count != 1) {
qCWarning(QT_BT_OSX) << "failed to retrive a peripheral";
qCWarning(QT_BT_OSX) << "failed to retrieve a peripheral";
if (notifier)
emit notifier->CBManagerError(QLowEnergyController::UnknownRemoteDeviceError);
return;
@@ -648,7 +648,7 @@ QT_USE_NAMESPACE
servicesToDiscoverDetails.removeAll(serviceUuid);
const NSUInteger nHandles = qt_countGATTEntries(service);
Q_ASSERT_X(nHandles, Q_FUNC_INFO, "unexpected number of GATT entires");
Q_ASSERT_X(nHandles, Q_FUNC_INFO, "unexpected number of GATT entries");
const QLowEnergyHandle maxHandle = std::numeric_limits<QLowEnergyHandle>::max();
if (nHandles >= maxHandle || lastValidHandle > maxHandle - nHandles) {
@@ -1058,7 +1058,7 @@ QT_USE_NAMESPACE
// TODO: test that we NEVER have the same characteristic twice in array!
// At the moment I just protect against this by iterating in a reverse
// order (at least avoiding a potential inifite loop with '-indexOfObject:').
// order (at least avoiding a potential infinite loop with '-indexOfObject:').
NSArray *const cs = service.characteristics;
if (cs.count == 1)
return nil;
@@ -1091,7 +1091,7 @@ QT_USE_NAMESPACE
// TODO: test that we NEVER have the same characteristic twice in array!
// At the moment I just protect against this by iterating in a reverse
// order (at least avoiding a potential inifite loop with '-indexOfObject:').
// order (at least avoiding a potential infinite loop with '-indexOfObject:').
NSArray *const cs = service.characteristics;
if (cs.count == 1)
return nil;
@@ -1597,8 +1597,8 @@ QT_USE_NAMESPACE
} else {
// This is (probably) the result of update notification.
// It's very possible we can have an invalid handle here (0) -
// if something esle is wrong (we subscribed for a notification),
// disconnected (but other application is connected) and still receiveing
// if something else is wrong (we subscribed for a notification),
// disconnected (but other application is connected) and still receiving
// updated values ...
// TODO: this must be properly tested.
if (!chHandle) {

View File

@@ -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

File diff suppressed because it is too large Load Diff

215
src/Computrainer.h Normal file
View 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

View 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>

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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

View File

@@ -0,0 +1,6 @@
framework module ConnectIQ {
umbrella header "ConnectIQ.h"
export *
module * { export * }
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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

View File

@@ -0,0 +1,6 @@
framework module ConnectIQ {
umbrella header "ConnectIQ.h"
export *
module * { export * }
}

View File

@@ -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>

Some files were not shown because too many files have changed in this diff Show More