Giter VIP home page Giter VIP logo

Comments (113)

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
Please lets have this thread separated from Elite Direto thread!

Are you 100% sure that the Zwift Hub is not connected to another client application (i.c. Zwift)?
It looks like your Zwift Hub is advertising FTMS but is NOT exposing the FTMS Service when it is connected. That means it is controlled by another Client, since you do not have (a) BLE(dongle) that must be over ANT+. Or do you have an other setup?

--> Shut down your PC, remove the ANT+ dongle and restart the PC.
--> Please set the Debug level in the Arduoino IDE to RELEASE (level 0)!!
Like the instructions say:

  • Requirements: Running FTMS trainer and Feather nRF52 board
    1. Start the trainer and do NOT connect it with other devices
    1. Upload and Run this code on the Feather-nRF52

Good luck!
Jörgen.

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
Please have a look at this tool for your smartphone to help you inspecting and testing BLE devices:
nRF Connect by Nordic
You can perfectly inspect the Zwift Hub trainer and check for the presence of BLE services like CPS, CSC, FTMS and others. You can easily connect to the trainer and test all those different Characteristics.... and their behaviour. It should be part of your toolbox I.C.E.

I have uploaded a new version for the Client (v023) that is more robust when error states occur. It will not result in an other outcome of your previous test!
Regards,
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorghen,

I redid the test with Ant+ disconnected and Bluethoot gsm switched off.

Here is the result with FTMS_Client_ v022:

Now I think it's good !

Joel

PS : I'm waiting for the dongle, maybe tomorrow

Feather nRF52 Client/Central: CPS, CSC and FTMS
----------------- Version 02.2 ------------------
Initialise the Bluefruit nRF52 module: Client (Central)
[CFG ] SoftDevice's RAM requires: 0x20002C78
FTMS and Chars 'initialized'
CPS and Chars 'initialized'
CSCS and Chars 'initialized'
GA and Chars 'initialized'
DIS and Chars 'initialized'
Start Scanning for CPS, CSC and FTMS!
Found advertising Peripheral with FTMS service!, see the Raw Data packet:
Timestamp MAC Address Rssi Data
000016641 F8:9C:FC:53:5E:49 -68 09-02-16-18-26-18-18-18-0A-18
[BLE ] BLE_GAP_EVT_CONNECTED : Conn Handle = 0
[GAP ] MAC = F8:9C:FC:53:5E:49, Type = 1, Resolved = 0
[GAP ] Conn Interval = 20.00 ms, Latency = 0, Supervisor Timeout = 2000 ms
[BLE ] BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST : Conn Handle = 0
[GAP ] ATT MTU is changed to 23
[BLE ] BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST : Conn Handle = 0
[GAP ] Data Length Request is (tx, rx) octets = (251, 251), (tx, rx) time = (2120, 2120) us
[BLE ] BLE_GAP_EVT_DATA_LENGTH_UPDATE : Conn Handle = 0
[GAP ] Data Length is (tx, rx) octets = (27, 27), (tx, rx) time = (1370, 1370) us
[BLE ] BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP : Conn Handle = 0
Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
Now checking mandatory Client Services and Characteristics!
Discovering Client Cycling Power (CP) Service ... [DISC ] [SVC] Handle start = 1
[BLE ] BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP : Conn Handle = 0
[DISC ] [SVC] Service Count: 1
[DISC ] [SVC] Found 0x1818, Handle start = 41, end = 48

Found it! CPS Max Payload: 20 Data Length: 27
Discovering Client CP Measurement characteristic ... [DISC ] [CHR] Handle start = 41, end = 48
[BLE ] BLE_GATTC_EVT_CHAR_DISC_RSP : Conn Handle = 0
[DISC ] [CHR] Characteristic Count: 3
[DISC ] [CHR] Found 0x2A63, handle = 43

[DISC ] [DESC] Handle start = 44, end = 48
[BLE ] BLE_GATTC_EVT_DESC_DISC_RSP : Conn Handle = 0
[DISC ] [DESC] Descriptor Count: 5
[DISC ] [DESC] Descriptor 0: uuid = 0x2902, handle = 44
[DISC ] [DESC] Descriptor 1: uuid = 0x2803, handle = 45
[DISC ] [DESC] Descriptor 2: uuid = 0x2A65, handle = 46
[DISC ] [DESC] Descriptor 3: uuid = 0x2803, handle = 47
[DISC ] [DESC] Descriptor 4: uuid = 0x2A5D, handle = 48
[DISC ] Found CCCD: handle = 44
Found it!
Discovering Client CP Control Point characteristic ... [DISC ] [CHR] Handle start = 41, end = 48
[BLE ] BLE_GATTC_EVT_CHAR_DISC_RSP : Conn Handle = 0
[DISC ] [CHR] Characteristic Count: 3
[DISC ] [CHR] Handle start = 49, end = 48
[BLE ] BLE_GATTC_EVT_CHAR_DISC_RSP : Conn Handle = 0
[DISC ] [CHR] Characteristic Count: 0
[DISC ] [CHR] Gatt Status = 0x0101
Not Found! NOT Mandatory!
Discovering Client CP Feature characteristic ... [DISC ] [CHR] Handle start = 41, end = 48
[BLE ] BLE_GATTC_EVT_CHAR_DISC_RSP : Conn Handle = 0
[DISC ] [CHR] Characteristic Count: 3
[DISC ] [CHR] Found 0x2A65, handle = 46

Found it!
[BLE ] BLE_GATTC_EVT_READ_RSP : Conn Handle = 0
-> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
Wheel revolution data supported
Crank revolution data supported
Discovering Client CP Sensor Location characteristic ... [DISC ] [CHR] Handle start = 41, end = 48
[BLE ] BLE_GATTC_EVT_CHAR_DISC_RSP : Conn Handle = 0
[DISC ] [CHR] Characteristic Count: 3
[DISC ] [CHR] Found 0x2A5D, handle = 48

Found it!
-> Client Reads CP Location Sensor: Loc#: 0 Other
Discovering Cycling Speed and Cadence (CSC) Service ... [DISC ] [SVC] Handle start = 1
bool BLEDiscovery::_discoverService(uint16_t, BLEClientService&, uint16_t): 79: verify failed, error = NRF_ERROR_BUSY
Not Found and disconnecting!
CSC Service is mandatory!
[BLE ] BLE_GATTC_EVT_READ_RSP : Conn Handle = 0
[BLE ] BLE_GAP_EVT_DISCONNECTED : Conn Handle = 0
[GAP ] Disconnect Reason: LOCAL_HOST_TERMINATED_CONNECTION
Client Disconnected, reason = 0x16

Restart the Feather nRF52 Client for a new run! <<<
Couldn't enable notify for Client CP Measurement Characteristic.
Couldn't enable indicate for Client CP Control Point Characteristic.
Couldn't enable notify for Client CSC Measurement Characteristic.
Couldn't enable notify for Client FTM Training Status Characteristic.
FTMS (trainer) is controlled by another Client (Training App)!
Client (Central) is Up and Running!

BSP Library : 1.3.0
Bootloader : s140 6.1.1
Serial No : C2BA380FAD3CBBC2

--------- SoftDevice Config ---------
Max UUID128 : 10
ATTR Table Size : 4096
Service Changed : 1
Central Connect Setting

  • Max MTU : 23
  • Event Length : 3
  • HVN Queue Size : 1
  • WrCmd Queue Size: 1

--------- BLE Settings ---------
Name : ItsyBitsy nRF52840 Express
Max Connections : Peripheral = 0, Central = 1
Address : E2:AA:F7:E9:06:E0 (Static)
TX Power : 0 dBm
Conn Intervals : min = 20.00 ms, max = 30.00 ms
Conn Timeout : 2000 ms
Central Paired Devices:

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Test with FTMS_Client_v023 :

Feather nRF52 Client/Central: CPS, CSC and FTMS
----------------- Version 02.3 ------------------
Initialise the Bluefruit nRF52 module: Client (Central)
[CFG ] SoftDevice's RAM requires: 0x20002C78
FTMS and Chars 'initialized'
CPS and Chars 'initialized'
CSCS and Chars 'initialized'
GA and Chars 'initialized'
DIS and Chars 'initialized'
Start Scanning for CPS, CSC and FTMS!
[BLE ] BLE_GAP_EVT_ADV_REPORT : Conn Handle = 65535
Found advertising Peripheral with FTMS service!, see the Raw Data packet:
Timestamp MAC Address Rssi Data
000013719 F8:9C:FC:53:5E:49 -66 09-02-16-18-26-18-18-18-0A-18
[BLE ] BLE_GAP_EVT_CONNECTED : Conn Handle = 0
[GAP ] MAC = F8:9C:FC:53:5E:49, Type = 1, Resolved = 0
[GAP ] Conn Interval = 20.00 ms, Latency = 0, Supervisor Timeout = 2000 ms
[BLE ] BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST : Conn Handle = 0
[GAP ] ATT MTU is changed to 23
[BLE ] BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST : Conn Handle = 0
[GAP ] Data Length Request is (tx, rx) octets = (251, 251), (tx, rx) time = (2120, 2120) us
[BLE ] BLE_GAP_EVT_DATA_LENGTH_UPDATE : Conn Handle = 0
[GAP ] Data Length is (tx, rx) octets = (27, 27), (tx, rx) time = (1370, 1370) us
[BLE ] BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP : Conn Handle = 0
Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
Now checking mandatory Client Services and Characteristics!
Discovering Client Cycling Power (CP) Service ... [DISC ] [SVC] Handle start = 1
[BLE ] BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP : Conn Handle = 0
[DISC ] [SVC] Service Count: 1
[DISC ] [SVC] Found 0x1818, Handle start = 41, end = 48

Found it! CPS Max Payload: 20 Data Length: 27
Discovering Client CP Measurement characteristic ... [DISC ] [CHR] Handle start = 41, end = 48
[BLE ] BLE_GATTC_EVT_CHAR_DISC_RSP : Conn Handle = 0
[DISC ] [CHR] Characteristic Count: 3
[DISC ] [CHR] Found 0x2A63, handle = 43

[DISC ] [DESC] Handle start = 44, end = 48
[BLE ] BLE_GATTC_EVT_DESC_DISC_RSP : Conn Handle = 0
[DISC ] [DESC] Descriptor Count: 5
[DISC ] [DESC] Descriptor 0: uuid = 0x2902, handle = 44
[DISC ] [DESC] Descriptor 1: uuid = 0x2803, handle = 45
[DISC ] [DESC] Descriptor 2: uuid = 0x2A65, handle = 46
[DISC ] [DESC] Descriptor 3: uuid = 0x2803, handle = 47
[DISC ] [DESC] Descriptor 4: uuid = 0x2A5D, handle = 48
[DISC ] Found CCCD: handle = 44
Found it!
Discovering Client CP Control Point characteristic ... [DISC ] [CHR] Handle start = 41, end = 48
[BLE ] BLE_GATTC_EVT_CHAR_DISC_RSP : Conn Handle = 0
[DISC ] [CHR] Characteristic Count: 3
[DISC ] [CHR] Handle start = 49, end = 48
[BLE ] BLE_GATTC_EVT_CHAR_DISC_RSP : Conn Handle = 0
[DISC ] [CHR] Characteristic Count: 0
[DISC ] [CHR] Gatt Status = 0x0101
Not Found! NOT Mandatory!
Discovering Client CP Feature characteristic ... [DISC ] [CHR] Handle start = 41, end = 48
[BLE ] BLE_GATTC_EVT_CHAR_DISC_RSP : Conn Handle = 0
[DISC ] [CHR] Characteristic Count: 3
[DISC ] [CHR] Found 0x2A65, handle = 46

Found it!
[BLE ] BLE_GATTC_EVT_READ_RSP : Conn Handle = 0
-> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
Wheel revolution data supported
Crank revolution data supported
Discovering Client CP Sensor Location characteristic ... [DISC ] [CHR] Handle start = 41, end = 48
[BLE ] BLE_GATTC_EVT_CHAR_DISC_RSP : Conn Handle = 0
[DISC ] [CHR] Characteristic Count: 3
[DISC ] [CHR] Found 0x2A5D, handle = 48

Found it!
-> Client Reads CP Location Sensor: Loc#: 0 Other
Discovering Cycling Speed and Cadence (CSC) Service ... [DISC ] [SVC] Handle start = 1
bool BLEDiscovery::_discoverService(uint16_t, BLEClientService&, uint16_t): 79: verify failed, error = NRF_ERROR_BUSY
Not Found and disconnecting!
CSC Service is mandatory!
[BLE ] BLE_GATTC_EVT_READ_RSP : Conn Handle = 0
[BLE ] BLE_GAP_EVT_DISCONNECTED : Conn Handle = 0
[GAP ] Disconnect Reason: LOCAL_HOST_TERMINATED_CONNECTION
Client Disconnected, reason = 0x16

Restart the Feather nRF52 Client for a new run! <<<
Stopped!
BSP Library : 1.3.0
Bootloader : s140 6.1.1
Serial No : C2BA380FAD3CBBC2

--------- SoftDevice Config ---------
Max UUID128 : 10
ATTR Table Size : 4096
Service Changed : 1
Central Connect Setting

  • Max MTU : 23
  • Event Length : 3
  • HVN Queue Size : 1
  • WrCmd Queue Size: 1

--------- BLE Settings ---------
Name : ItsyBitsy nRF52840 Express
Max Connections : Peripheral = 0, Central = 1
Address : E2:AA:F7:E9:06:E0 (Static)
TX Power : 0 dBm
Conn Intervals : min = 20.00 ms, max = 30.00 ms
Conn Timeout : 2000 ms
Central Paired Devices:

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,

  1. I have asked you before --> Please set the Debug level in the Arduino IDE to RELEASE (level 0) !! You did NOT do this...for a particular reason? Please realize that more elaborate debug levels cost processor capacity and might lead to BLE timing errors.... See above: Discovering the CSC service an error occurs: error = NRF_ERROR_BUSY ---> Busy? Doing what? Does this error also occur when you set Release level to zero at compile time ?
  2. --------- BLE Settings --------- Name : ItsyBitsy nRF52840 Express
    Did you have a particular reason why you bought this board and not the Feather nRF52840 Express that the Simcline projects use? I have no experience with the ItsyBitsy at all and nobody I know ever used it in this project....so I simply do not know if there are critical differences, that lead to unexpected results during operation and/or debugging in this stage or later.
  3. The results are not very different from previous runs, the client detects a trainer [Zwift Hub] that advertises with CPS, CSC and FTMS... However when connected the discover actions (in the latest runs) for a mandatory service or characteristic fail at CSC. That is different from the first runs! The first runs failed when FTM was NOT detected! Does your Zwift hub not expose CSC? Is that typical for this type? Are there different types of Zwift Hubs with different specs.?
  4. Please use nRF Connect to scan your Zwift hub when it is powered --> advertising -> connect -> detail the different services and characteristics that the hub is exposing... In previous issues (see Elite Direto) you can see how people made screen shots of screens of the nRF Connect tool and how instructive these images are!
  5. What other devices (Treadmill(s), trainers, smartphone(s) et cetera) with BLE and/or ANT+ are present in the room that can disturb a smooth connection process.
    Best wishes,
    Jörgen.

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
After a night sleep.... I have made some changes in the Client software and uploaded version v024.

  1. No longer is CSC a MANDATORY service, it is very well possible that Zwift Hub does not has it implemented... sofar we do not know! May be "nRF Connect" is giving soon better insight in what services are exposed exactly!
  2. I have changed the order of the connect sequence (discover a service or characteristic). The sequence now starts with more general services that all BLE devices (must) have, only thereafter we check for FTMS... That is mandatory so if it fails -> end of exercise! If all goes well CPS (Mandatory) and CSC (Not Mandatory) are checked...
    I hope this will give more decisive information!
    Good luck,
    Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Dear Jörghen,

I ordered today Adafruit Feather nRF52840 Express
image
but there are many sites out of stock!
that's why I ordered the ItsyBitsy nRF52840 Express

Here is the first result with version V024.
At first I turn on the trainer and watch the results.
Here they are :

FTMS and Chars 'initialized'
CPS and Chars 'initialized'
CSCS and Chars 'initialized'
GA and Chars 'initialized'
DIS and Chars 'initialized'
Start Scanning for CPS, CSC and FTMS!
Found advertising Peripheral with FTMS service!, see the Raw Data packet:
Timestamp MAC Address Rssi Data
000016166 F8:9C:FC:53:5E:49 -64 09-02-16-18-26-18-18-18-0A-18
Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
Now checking all Client Services and Characteristics!
If Mandatory Services Fail --> the Client will disconnect!
First checking Generic Access and Device Information Services and Characteristics!
Found Client Generic Access
-> Client Reads Device Name: [Zwift Hub]
-> Client Reads Appearance: [0]
Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
Disconnecting since Client FTM Service is mandatory!
Client Disconnected, reason = 0x16

Restart the Feather nRF52 Client for a new run! <<<
Stopped!

And here is the second if just after turning on I pedal to wake up the services.

This is the second result if i'm turn

Feather nRF52 Client/Central: CPS, CSC and FTMS
----------------- Version 02.4 ------------------
Initialise the Bluefruit nRF52 module: Client (Central)
FTMS and Chars 'initialized'
CPS and Chars 'initialized'
CSCS and Chars 'initialized'
GA and Chars 'initialized'
DIS and Chars 'initialized'
Start Scanning for CPS, CSC and FTMS!
Found advertising Peripheral with FTMS service!, see the Raw Data packet:
Timestamp MAC Address Rssi Data
000001764 F8:9C:FC:53:5E:49 -70 09-02-16-18-26-18-18-18-0A-18
Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
Now checking all Client Services and Characteristics!
If Mandatory Services Fail --> the Client will disconnect!
First checking Generic Access and Device Information Services and Characteristics!
Found Client Generic Access
-> Client Reads Device Name: [Zwift Hub]
-> Client Reads Appearance: [1152]
Found Client Device Information
-> Client Reads Manufacturer: [Zwift]
-> Client Reads Model Number: [06]
-> Client Reads Serial Number: [06-F89CFC535E49]
Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
Discovering Client FTM Feature Characteristic ... Found it!
-> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
Discovering Client FTM Training Status Characteristic ... Not Found!
Disconnecting since Client FTM Characteristic is mandatory!
Client Disconnected, reason = 0x16

Restart the Feather nRF52 Client for a new run! <<<
Stopped!

Here with the V23:

Feather nRF52 Client/Central: CPS, CSC and FTMS
----------------- Version 02.3 ------------------
Initialise the Bluefruit nRF52 module: Client (Central)
FTMS and Chars 'initialized'
CPS and Chars 'initialized'
CSCS and Chars 'initialized'
GA and Chars 'initialized'
DIS and Chars 'initialized'
Start Scanning for CPS, CSC and FTMS!
Found advertising Peripheral with FTMS service!, see the Raw Data packet:
Timestamp MAC Address Rssi Data
000001160 F8:9C:FC:53:5E:49 -69 09-02-16-18-26-18-18-18-0A-18
Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
Now checking mandatory Client Services and Characteristics!
Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
Discovering Client CP Measurement characteristic ... Found it!
Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
Discovering Client CP Feature characteristic ... Found it!
-> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
Wheel revolution data supported
Crank revolution data supported
Discovering Client CP Sensor Location characteristic ... Found it!
-> Client Reads CP Location Sensor: Loc#: 0 Other
Discovering Cycling Speed and Cadence (CSC) Service ... Not Found and disconnecting!
CSC Service is mandatory!
Client Disconnected, reason = 0x16

Restart the Feather nRF52 Client for a new run! <<<
Stopped!

Here are the screenshots with nrf connect:

Screenshot_20221210-132431_nRF Connect
Screenshot_20221210-132214_nRF Connect
Screenshot_20221210-132222_nRF Connect
Screenshot_20221210-132412_nRF Connect

Sincerely,

Joel

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

I don't know if this can't help you? :
Conect nrf debug mode log

nRF Connect, 2022-12-10
Zwift Hub (F8:9C:FC:53:5E:49)
V 16:01:11.439 Connecting to F8:9C:FC:53:5E:49...
D 16:01:11.439 gatt = device.connectGatt(autoConnect = false, TRANSPORT_LE, preferred PHY = LE 1M)
D 16:01:11.697 [Callback] Connection state changed with status: 0 and new state: CONNECTED (2)
I 16:01:11.697 Connected to F8:9C:FC:53:5E:49
V 16:01:11.702 Discovering services...
D 16:01:11.702 gatt.discoverServices()
D 16:01:11.728 [Broadcast] Action received: android.bluetooth.device.action.ACL_CONNECTED
I 16:01:12.541 Connection parameters updated (interval: 7.5ms, latency: 0, timeout: 5000ms)
D 16:01:15.576 [Callback] Services discovered with status: 0
I 16:01:15.577 Services discovered
V 16:01:15.615 Generic Access (0x1800)

  • Device Name [R W] (0x2A00)
  • Appearance [R] (0x2A01)
  • Peripheral Preferred Connection Parameters [R] (0x2A04)
  • Central Address Resolution [R] (0x2AA6)
    Generic Attribute (0x1801)
  • Service Changed [I] (0x2A05)
    Client Characteristic Configuration (0x2902)
    Fitness Machine (0x1826)
  • Indoor Bike Data [N] (0x2AD2)
    Client Characteristic Configuration (0x2902)
  • Fitness Machine Feature [R] (0x2ACC)
  • Supported Resistance Level Range [R] (0x2AD6)
  • Supported Power Range [R] (0x2AD8)
  • Fitness Machine Status [N] (0x2ADA)
    Client Characteristic Configuration (0x2902)
  • Fitness Machine Control Point [I W] (0x2AD9)
    Client Characteristic Configuration (0x2902)
    Cycling Speed and Cadence (0x1816)
  • CSC Measurement [N] (0x2A5B)
    Client Characteristic Configuration (0x2902)
  • CSC Feature [R] (0x2A5C)
  • Sensor Location [R] (0x2A5D)
  • SC Control Point [I W] (0x2A55)
    Client Characteristic Configuration (0x2902)
    Cycling Power (0x1818)
  • Cycling Power Measurement [N] (0x2A63)
    Client Characteristic Configuration (0x2902)
  • Cycling Power Feature [R] (0x2A65)
  • Sensor Location [R] (0x2A5D)
    Secure DFU Service (0xFE59)
  • Buttonless DFU [I W] (8ec90003-f315-4f60-9fb8-838830daea50)
    Client Characteristic Configuration (0x2902)
    Heart Rate (0x180D)
  • Heart Rate Measurement [N] (0x2A37)
    Client Characteristic Configuration (0x2902)
  • Body Sensor Location [R] (0x2A38)
    Unknown Service (c4630001-003f-4cec-8994-e489b04d857f)
  • Unknown Characteristic [R] (c4632b03-003f-4cec-8994-e489b04d857f)
  • Unknown Characteristic [N R] (c4632b05-003f-4cec-8994-e489b04d857f)
    Client Characteristic Configuration (0x2902)
    Characteristic User Description (0x2901)
  • Unknown Characteristic [I W] (c4632b04-003f-4cec-8994-e489b04d857f)
    Client Characteristic Configuration (0x2902)
    Device Information (0x180A)
  • Manufacturer Name String [R] (0x2A29)
  • Model Number String [R] (0x2A24)
  • Serial Number String [R] (0x2A25)
  • Hardware Revision String [R] (0x2A27)
  • Firmware Revision String [R] (0x2A26)
    D 16:01:15.616 gatt.setCharacteristicNotification(00002a05-0000-1000-8000-00805f9b34fb, true)
    D 16:01:15.621 gatt.setCharacteristicNotification(00002ad2-0000-1000-8000-00805f9b34fb, true)
    D 16:01:15.624 gatt.setCharacteristicNotification(00002ada-0000-1000-8000-00805f9b34fb, true)
    D 16:01:15.627 gatt.setCharacteristicNotification(00002ad9-0000-1000-8000-00805f9b34fb, true)
    D 16:01:15.630 gatt.setCharacteristicNotification(00002a5b-0000-1000-8000-00805f9b34fb, true)
    D 16:01:15.632 gatt.setCharacteristicNotification(00002a55-0000-1000-8000-00805f9b34fb, true)
    D 16:01:15.635 gatt.setCharacteristicNotification(00002a63-0000-1000-8000-00805f9b34fb, true)
    D 16:01:15.637 gatt.setCharacteristicNotification(00002a37-0000-1000-8000-00805f9b34fb, true)
    D 16:01:15.640 gatt.setCharacteristicNotification(c4632b05-003f-4cec-8994-e489b04d857f, true)
    D 16:01:15.643 gatt.setCharacteristicNotification(c4632b04-003f-4cec-8994-e489b04d857f, true)
    I 16:01:15.766 Connection parameters updated (interval: 47.5ms, latency: 0, timeout: 5000ms)
    I 16:01:18.099 Connection parameters updated (interval: 142.5ms, latency: 0, timeout: 4000ms)
    I 16:01:51.051 Notification received from 00002a5b-0000-1000-8000-00805f9b34fb, value: (0x) 01-94-00-00-00-B7-28
    A 16:01:51.051 "Wheel rev: 148,
    Last wheel event time: 10423 ms" received
    I 16:01:52.035 Notification received from 00002a5b-0000-1000-8000-00805f9b34fb, value: (0x) 01-96-00-00-00-E6-2D
    A 16:01:52.035 "Wheel rev: 150,
    Last wheel event time: 11750 ms" received
    I 16:01:53.032 Notification received from 00002a5b-0000-1000-8000-00805f9b34fb, value: (0x) 01-98-00-00-00-79-32
    A 16:01:53.032 "Wheel rev: 152,
    Last wheel event time: 12921 ms" received
    I 16:01:54.032 Notification received from 00002a5b-0000-1000-8000-00805f9b34fb, value: (0x) 01-99-00-00-00-C8-34
    A 16:01:54.032 "Wheel rev: 153,
    Last wheel event time: 13512 ms" received
    I 16:01:54.887 Notification received from 00002a5b-0000-1000-8000-00805f9b34fb, value: (0x) 01-9B-00-00-00-71-39
    A 16:01:54.887 "Wheel rev: 155,
    Last wheel event time: 14705 ms" received
    I 16:01:56.023 Notification received from 00002a5b-0000-1000-8000-00805f9b34fb, value: (0x) 03-9D-00-00-00-2F-3E-3C-00-FA-3A
    A 16:01:56.023 "Wheel rev: 157,
    Last wheel event time: 15919 ms,
    Crank rev: 60,
    Last crank event time: 15098 ms" received
    I 16:01:56.883 Notification received from 00002a5b-0000-1000-8000-00805f9b34fb, value: (0x) 03-9E-00-00-00-88-40-3D-00-C5-3F
    A 16:01:56.883 "Wheel rev: 158,
    Last wheel event time: 16520 ms,
    Crank rev: 61,
    Last crank event time: 16325 ms" received
    I 16:01:57.878 Notification received from 00002a5b-0000-1000-8000-00805f9b34fb, value: (0x) 03-A0-00-00-00-30-45-3E-00-2F-44
    A 16:01:57.878 "Wheel rev: 160,
    Last wheel event time: 17712 ms,
    Crank rev: 62,
    Last crank event time: 17455 ms" received
    I 16:01:59.017 Notification received from 00002a5b-0000-1000-8000-00805f9b34fb, value: (0x) 03-A2-00-00-00-B1-49-3F-00-7A-48
    A 16:01:59.017 "Wheel rev: 162,
    Last wheel event time: 18865 ms,
    Crank rev: 63,
    Last crank event time: 18554 ms" received
    I 16:02:00.017 Notification received from 00002a5b-0000-1000-8000-00805f9b34fb, value: (0x) 03-A4-00-00-00-18-4E-40-00-b-0000-1000-8000-00805f9b34fb, value: (0x) 03-B8-00-00-00-9E-A4-49-00-

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

I found this program:
https://github.com/arduino-libraries/ArduinoBLE/blob/master/examples/Central/PeripheralExplorer/PeripheralExplorer.ino

for ESP32 BLE of which I did the test and here is the result of the services :

ets Jun 8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1344
load:0x40078000,len:13864
load:0x40080400,len:3608
entry 0x400805f0
Bluetooth�� Low Energy Central - Peripheral Explorer
Found 64:6c:58:a5:76:71 '' fe9f
Found 60:1e:b5:71:b8:93 '' fe9f
Found f8:9c:fc:53:5e:49 'Zwift Hub' 1816
Connecting ...
Connected
Discovering attributes ...
Attributes discovered

Device name: Zwift Hub
Appearance: 0x0

Service 1800
Characteristic 2a00, properties 0xA, value 0x5A7769667420487562
Descriptor 2803, value 0x020500012A
Descriptor 2a01, value 0x8004
Characteristic 2a01, properties 0x2, value 0x8004
Descriptor 2803, value 0x020700042A
Descriptor 2a04, value 0x4800780000009001
Characteristic 2a04, properties 0x2, value 0x4800780000009001
Descriptor 2803, value 0x020900A62A
Descriptor 2aa6, value 0x01
Characteristic 2aa6, properties 0x2, value 0x01
Service 1801
Characteristic 2a05, properties 0x20
Descriptor 2902, value 0x0000
Service 1826
Characteristic 2ad2, properties 0x10
Descriptor 2902, value 0x0000
Descriptor 2803, value 0x021300CC2A
Descriptor 2acc, value 0x874400000CE00000
Characteristic 2acc, properties 0x2, value 0x874400000CE00000
Descriptor 2803, value 0x021500D62A
Descriptor 2ad6, value 0x000064000100
Characteristic 2ad6, properties 0x2, value 0x000064000100
Descriptor 2803, value 0x021700D82A
Descriptor 2ad8, value 0x0000E8030100
Characteristic 2ad8, properties 0x2, value 0x0000E8030100
Descriptor 2803, value 0x101900DA2A
Descriptor 2ada, value 0x
Characteristic 2ada, properties 0x10
Descriptor 2902, value 0x0000
Descriptor 2803, value 0x281C00D92A
Descriptor 2ad9, value 0x
Characteristic 2ad9, properties 0x28
Descriptor 2902, value 0x0000
Service 1816
Characteristic 2a5b, properties 0x10
Descriptor 2902, value 0x0000
Descriptor 2803, value 0x0223005C2A
Descriptor 2a5c, value 0x0300
Characteristic 2a5c, properties 0x2, value 0x0300
Descriptor 2803, value 0x0225005D2A
Descriptor 2a5d, value 0x0C
Characteristic 2a5d, properties 0x2, value 0x0C
Descriptor 2803, value 0x282700552A
Descriptor 2a55, value 0x
Characteristic 2a55, properties 0x28
Descriptor 2902, value 0x0000
Service 1818
Characteristic 2a63, properties 0x10
Descriptor 2902, value 0x0000
Descriptor 2803, value 0x022E00652A
Descriptor 2a65, value 0x0C000000
Characteristic 2a65, properties 0x2, value 0x0C000000
Descriptor 2803, value 0x0230005D2A
Descriptor 2a5d, value 0x0C
Characteristic 2a5d, properties 0x2, value 0x0C
Service fe59
Characteristic 8ec90003-f315-4f60-9fb8-838830daea50, properties 0x28
Descriptor 2902, value 0x0000
Service 180d
Characteristic 2a37, properties 0x10
Descriptor 2902, value 0x0000
Descriptor 2803, value 0x023A00382A
Descriptor 2a38, value 0x01
Characteristic 2a38, properties 0x2, value 0x01
Service c4630001-003f-4cec-8994-e489b04d857f
Characteristic c4632b03-003f-4cec-8994-e489b04d857f, properties 0x2, value 0xFF0F0000
Descriptor 2803, value 0x123F007F854DB089E49489EC4C3F00052B63C4
Descriptor 857f, value 0x0000000000000000000000000000000000000000
Descriptor 4cec, value 0x
Descriptor 470a, value 0x
Characteristic c4632b05-003f-4cec-8994-e489b04d857f, properties 0x12, value 0x0000000000000000000000000000000000000000
Descriptor 2902, value 0x0000
Descriptor 2901, value 0x537461747573
Descriptor 2803, value 0x2843007F854DB089E49489EC4C3F00042B63C4
Descriptor 857f, value 0x
Descriptor 4cec, value 0x
Descriptor 470a, value 0x
Characteristic c4632b04-003f-4cec-8994-e489b04d857f, properties 0x28
Descriptor 2902, value 0x0000
Service 180a
Characteristic 2a29, properties 0x2, value 0x5A77696674
Descriptor 2803, value 0x024900242A
Descriptor 2a24, value 0x3036
Characteristic 2a24, properties 0x2, value 0x3036
Descriptor 2803, value 0x024B00252A
Descriptor 2a25, value 0x30362D463839434643353335453439
Characteristic 2a25, properties 0x2, value 0x30362D463839434643353335453439
Descriptor 2803, value 0x024D00272A
Descriptor 2a27, value 0x31
Characteristic 2a27, properties 0x2, value 0x31
Descriptor 2803, value 0x024F00262A
Descriptor 2a26, value 0x332E39
Characteristic 2a26, properties 0x2, value 0x332E39

Disconnecting ...
Disconnected

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
Only this Sunday morning I had time to look into your post.....
Wow! Super! That is a wealth of information!
This is more than one could have asked for, what a pity we did not start this way....
I have to study it all carefully and that will take some time!

One thing is immediately striking at my first scan:

And here is the second if just after turning on I pedal to wake up the services.

I have only met trainers that are awake all the time, may be after 20 minutes go to sleep, but never within seconds/minutes...
CPS (1818), CSC (1816) and FTMS (1826) are all present, NO DOUBT! I have to check if all the Chars are exposed and if there is a discrepancy in what the Client is instructed to be Mandatory and what the Zwift Hub is programmed with !!!
This explains definitely the behavior in all of the runs.
I will be back soon!
Thanks again, this will bring the solution!
Regards,
Jörgen.

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Let's give Client_FTMS version v025 a try!
I have changed several Service Characteristics to NOT Mandatory, hopefully this is now fully in accordance with the Zwift Hub settings....! (This is quite different from FTMS trainers I have met so far, but no reason for worries!)
Procedure is changed: run Feather code first and then start and wake up your trainer (we know now this is critical!)

    1. Upload and Run this code on the Feather-nRF52
    1. Start the Serial Monitor to catch verbose debugging and data info
    1. Power ON and Wake UP trainer -> do NOT connect with other devices

Fingers crossed!

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Dear jörghen,

Here are the results, You should know that the first attempt was a failure. The Zwift Hub is very temperamental to wake up.
On the second I had to hurry to wake him up or else I don't know what happened. But he woke up at just the right time!

Unfortunately I didn't copy everything because the serial monitor had already been closed!!!!

I'm trying to reproduce but I can't!!!

Feather nRF52 Client/Central: CPS, CSC and FTMS
----------------- Version 02.5 ------------------
Initialise the Bluefruit nRF52 module: Client (Central)
FTMS and Chars 'initialized'
CPS and Chars 'initialized'
CSCS and Chars 'initialized'
GA and Chars 'initialized'
DIS and Chars 'initialized'
Start Scanning for CPS, CSC and FTMS!
Found advertising Peripheral with FTMS service!, see the Raw Data packet:
Timestamp MAC Address Rssi Data
000021991 F8:9C:FC:53:5E:49 -69 09-02-16-18-26-18-18-18-0A-18
Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
Now checking all Client Services and Characteristics!
If Mandatory Services Fail --> the Client will disconnect!
First checking Generic Access and Device Information Services and Characteristics!
Found Client Generic Access
-> Client Reads Device Name: [Zwift Hub]
-> Client Reads Appearance: [0]
Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
Disconnecting since Client FTM Service is mandatory!
Client Disconnected, reason = 0x16

Restart the Feather nRF52 Client for a new run! <<<
Stopped!

15:54:24.551 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
15:54:26.523 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 F5 FF 28 33 00 ]
15:54:26.643 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
15:54:26.643 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 F5 FF 28 33 ]
15:54:28.645 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 E4 FF 28 33 00 ]
15:54:28.694 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
15:54:28.694 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 E4 FF 28 33 ]
15:54:30.682 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 CF FF 28 33 00 ]
15:54:30.915 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
15:54:30.915 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 CF FF 28 33 ]
15:54:32.764 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A8 FF 28 33 00 ]
15:54:32.888 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
15:54:32.888 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A8 FF 28 33 ]
15:54:34.867 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 84 FF 28 33 00 ]
15:54:35.131 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
15:54:35.131 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 84 FF 28 33 ]
15:54:36.980 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 FF 28 33 00 ]
15:54:37.072 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
15:54:37.072 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 FF 28 33 ]
15:54:39.043 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5D FF 28 33 00 ]
15:54:39.168 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
15:54:39.168 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5D FF 28 33 ]
15:54:41.168 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5E FF 28 33 00 ]
15:54:41.261 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
15:54:41.261 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5E FF 28 33 ]
15:54:43.265 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 6F FF 28 33 00 ]
15:54:43.310 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
15:54:43.310 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 6F FF 28 33 ]
15:54:45.302 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 8A FF 28 33 00 ]
15:54:45.361 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
15:54:45.382 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8A FF 28 33 ]
15:54:47.333 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 B8 FF 28 33 00 ]
15:54:47.519 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
15:54:47.519 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 B8 FF 28 33 ]
15:54:49.443 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
15:54:49.506 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
15:54:49.552 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
15:54:51.551 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A2 00 28 33 00 ]
15:54:51.627 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
15:54:51.627 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A2 00 28 33 ]
15:54:53.625 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 01 28 33 00 ]
15:54:53.658 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
15:54:53.658 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 01 28 33 ]
15:54:55.690 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 4F 01 28 33 00 ]
15:54:55.768 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
15:54:55.768 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 4F 01 28 33 ]
15:54:57.765 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 01 28 33 00 ]
15:54:58.198 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
15:54:58.198 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 01 28 33 ]
15:54:59.858 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 57 FF 28 33 00 ]
15:54:59.915 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
15:54:59.915 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 57 FF 28 33 ]
15:55:01.902 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 08 00 00 00 00 00 00 00 ]
15:55:02.041 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 08 03 ]
15:55:04.002 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 01 00 00 00 00 00 00 00 ]
15:55:04.081 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 01 01 ]
15:55:04.129 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 01 ]
15:55:06.110 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
15:55:06.186 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
15:55:08.190 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
15:55:08.236 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
15:55:10.225 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
15:55:10.537 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 07 01 ]
15:55:10.537 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 04 ]
15:55:12.340 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]
15:55:12.466 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
15:55:12.511 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 01 28 33 ]

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Now I managed to get the full serial but I don't know how I woke up the Zwift hub.

I can't reproduce every time!!!!

16:35:25.068 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
16:35:25.068 -> ----------------- Version 02.5 ------------------
16:35:25.068 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:35:25.071 -> FTMS and Chars 'initialized'
16:35:25.071 -> CPS and Chars 'initialized'
16:35:25.071 -> CSCS and Chars 'initialized'
16:35:25.071 -> GA and Chars 'initialized'
16:35:25.071 -> DIS and Chars 'initialized'
16:35:25.071 -> Start Scanning for CPS, CSC and FTMS!
16:35:25.071 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:35:25.071 -> Timestamp MAC Address Rssi Data
16:35:25.071 -> 000000717 F8:9C:FC:53:5E:49 -64 09-02-16-18-26-18-18-18-0A-18
16:35:25.071 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:35:25.071 -> Now checking all Client Services and Characteristics!
16:35:25.071 -> If Mandatory Services Fail --> the Client will disconnect!
16:35:25.071 -> First checking Generic Access and Device Information Services and Characteristics!
16:35:25.229 -> Found Client Generic Access
16:35:25.229 -> -> Client Reads Device Name: [Zwift Hub]
16:35:25.231 -> -> Client Reads Appearance: [1152]
16:35:25.231 -> Found Client Device Information
16:35:25.242 -> -> Client Reads Manufacturer: [Zwift]
16:35:25.242 -> -> Client Reads Model Number: [06]
16:35:25.378 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:35:25.378 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
16:35:25.425 -> Discovering Client FTM Feature Characteristic ... Found it!
16:35:25.832 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
16:35:25.832 -> Discovering Client FTM Control Point Characteristic ... Found it!
16:35:26.374 -> Discovering Client FTM Status Characteristic ... Found it!
16:35:26.374 -> Discovering Client FTM Training Status Characteristic ... Ready to receive Client FTM Control Point Response Messages
16:35:26.409 -> Ready to receive Client FTM Status values
16:35:26.409 -> >>> Couldn't enable notify for Client FTM Training Status Characteristic.
16:35:26.409 -> >>> Couldn't enable notify for Client FTM Indoor Bike Data Characteristic.
16:35:26.409 -> >>> Couldn't enable notify for Client CP Measurement Characteristic.
16:35:26.409 -> >>> Couldn't enable indicate for Client CP Control Point Characteristic.
16:35:26.409 -> >>> Couldn't enable notify for Client CSC Measurement Characteristic.
16:35:26.409 -> Client (Central) is Up and Running!
16:35:26.595 -> Not Found! Not Mandatory
16:35:26.595 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
16:35:26.750 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
16:35:26.750 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
16:35:27.058 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
16:35:27.058 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
16:35:27.291 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
16:35:27.383 -> Discovering Client CP Measurement characteristic ... Found it!
16:35:27.554 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
16:35:27.816 -> Discovering Client CP Feature characteristic ... Found it!
16:35:27.987 -> -> Client Reads Raw CP Feature bytes: [4] [ 00 00 00 00 ]
16:35:27.987 -> Discovering Client CP Sensor Location characteristic ... NOT Found! NOT Mandatory!
16:35:27.987 -> Discovering Cycling Speed and Cadence (CSC) Service ... Not Found! CSC Service is Not Mandatory!
16:35:28.391 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
16:35:28.513 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
16:35:30.519 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
16:35:30.597 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
16:35:32.596 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
16:35:32.673 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 07 01 ]
16:35:32.673 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 04 ]
16:35:34.658 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]
16:35:34.734 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
16:35:34.769 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 01 28 33 ]
16:35:36.711 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 00 28 33 00 ]
16:35:36.789 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
16:35:36.789 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 00 28 33 ]
16:35:38.772 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
16:35:39.099 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
16:35:39.099 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
16:35:40.880 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 14 00 28 33 00 ]
16:35:40.958 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
16:35:40.958 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 14 00 28 33 ]
16:35:42.973 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 00 28 33 00 ]
16:35:43.066 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
16:35:43.066 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 00 28 33 ]
16:35:45.077 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 25 00 28 33 00 ]
16:35:45.154 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
16:35:45.154 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 25 00 28 33 ]
16:35:47.144 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 23 00 28 33 00 ]
16:35:47.470 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
16:35:47.470 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 23 00 28 33 ]
16:35:49.244 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 1C 00 28 33 00 ]
16:35:49.415 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
16:35:49.415 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1C 00 28 33 ]
16:35:51.357 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 0F 00 28 33 00 ]
16:35:51.481 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
16:35:51.481 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 0F 00 28 33 ]
16:35:53.451 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
16:35:53.523 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
16:35:53.523 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
16:35:55.537 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 F5 FF 28 33 00 ]
16:35:55.583 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
16:35:55.583 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 F5 FF 28 33 ]
16:35:57.562 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 E4 FF 28 33 00 ]
16:35:57.700 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
16:35:57.700 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 E4 FF 28 33 ]
16:35:59.685 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 CF FF 28 33 00 ]
16:35:59.809 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
16:35:59.809 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 CF FF 28 33 ]
16:36:01.790 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A8 FF 28 33 00 ]
16:36:01.931 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
16:36:01.931 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A8 FF 28 33 ]
16:36:03.871 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 84 FF 28 33 00 ]
16:36:03.948 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
16:36:03.949 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 84 FF 28 33 ]

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

At the first test I turned the pedals with my hand and I would say yes, I think it was decreasing! On the second test I did not pay attention!

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
It looks like a successful run now! Feather and Trainer are connected, services/characteristics were detected or not. Focus was until now on establishing the connection, but what I am still missing is the response of the trainer to the resistance simulation parameters that the client is regularly sending...and how these data are decoded by the Feather..... This is critical information!

  1. Move the trainer pedals and notice/feel changes in resistance...
    The Client sends Resistance Parameters to the Trainer that coincide
    with the first 5 minutes of the Zwift Volcano Circuit!
  2. Inspect the info presented by Serial Monitor.....

This is what I miss in the output: -> Client Rec'd Raw FTM Indoor Bike Data: [##] [#####################]
Have a careful look at the complete debug output file that I have uploaded and notice the comment (physical experience) at the start of the tester's output file! If you want to be sure communication is working flawless you have to do the pedaling on the bike, Zwift Hub is clearly not doing it by itself! Or it is simply NOT working.... How do we know?
See Output
Good luck!
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorghen,

Here are the results after several connection attempts I tried several ways to connect and wake up the services.

I have never managed to do it again 2 times in a row!!!

So I don't know how to make a successful connection!!!

But we have successful results!! And I really felt the different resistances.

20:01:34.256 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
20:01:34.256 -> ----------------- Version 02.5 ------------------
20:01:34.256 -> Initialise the Bluefruit nRF52 module: Client (Central)
20:01:34.348 -> FTMS and Chars 'initialized'
20:01:34.348 -> CPS and Chars 'initialized'
20:01:34.348 -> CSCS and Chars 'initialized'
20:01:34.348 -> GA and Chars 'initialized'
20:01:34.348 -> DIS and Chars 'initialized'
20:01:34.348 -> Start Scanning for CPS, CSC and FTMS!
20:01:35.186 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
20:01:35.186 -> Timestamp MAC Address Rssi Data
20:01:35.186 -> 000002583 F8:9C:FC:53:5E:49 -69 09-02-16-18-26-18-18-18-0A-18
20:01:35.277 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
20:01:35.277 -> Now checking all Client Services and Characteristics!
20:01:35.277 -> If Mandatory Services Fail --> the Client will disconnect!
20:01:35.277 -> First checking Generic Access and Device Information Services and Characteristics!
20:01:35.494 -> Found Client Generic Access
20:01:35.494 -> -> Client Reads Device Name: [Zwift Hub]
20:01:35.815 -> -> Client Reads Appearance: [1152]
20:01:35.815 -> Found Client Device Information
20:01:36.219 -> -> Client Reads Manufacturer: [Zwift]
20:01:36.219 -> -> Client Reads Model Number: [06]
20:01:36.389 -> -> Client Reads Serial Number: [06-F89CFC535E49]
20:01:36.389 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
20:01:36.467 -> Discovering Client FTM Feature Characteristic ... Found it!
20:01:36.653 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
20:01:36.653 -> Discovering Client FTM Control Point Characteristic ... Not Found!
20:01:36.653 -> Disconnecting since Client FTM Control Point Characteristic is mandatory!
20:01:36.699 -> Client Disconnected, reason = 0x16
20:01:36.699 -> >>> Restart the Feather nRF52 Client for a new run! <<<
20:01:37.689 -> Stopped!

20:02:38.186 -> FTMS and Chars 'initialized'
20:02:38.186 -> CPS and Chars 'initialized'
20:02:38.186 -> CSCS and Chars 'initialized'
20:02:38.186 -> GA and Chars 'initialized'
20:02:38.186 -> DIS and Chars 'initialized'
20:02:38.186 -> Start Scanning for CPS, CSC and FTMS!
20:02:38.186 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
20:02:38.186 -> Timestamp MAC Address Rssi Data
20:02:38.186 -> 000001612 F8:9C:FC:53:5E:49 -67 09-02-16-18-26-18-18-18-0A-18
20:02:38.418 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [] MAC Address: F8:9C:FC:53:5E:49
20:02:38.418 -> Now checking all Client Services and Characteristics!
20:02:38.418 -> If Mandatory Services Fail --> the Client will disconnect!
20:02:38.418 -> First checking Generic Access and Device Information Services and Characteristics!
20:02:38.418 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
20:02:38.418 -> Disconnecting since Client FTM Service is mandatory!
20:02:38.418 -> Client Disconnected, reason = 0x3E
20:02:38.418 -> >>> Restart the Feather nRF52 Client for a new run! <<<
20:02:39.988 -> Stopped!

20:03:28.928 -> FTMS and Chars 'initialized'
20:03:28.928 -> CPS and Chars 'initialized'
20:03:28.928 -> CSCS and Chars 'initialized'
20:03:28.928 -> GA and Chars 'initialized'
20:03:28.928 -> DIS and Chars 'initialized'
20:03:28.928 -> Start Scanning for CPS, CSC and FTMS!
20:03:28.928 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
20:03:28.928 -> Timestamp MAC Address Rssi Data
20:03:28.928 -> 000001315 F8:9C:FC:53:5E:49 -67 09-02-16-18-26-18-18-18-0A-18
20:03:28.943 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [] MAC Address: F8:9C:FC:53:5E:49
20:03:28.943 -> Now checking all Client Services and Characteristics!
20:03:28.943 -> If Mandatory Services Fail --> the Client will disconnect!
20:03:28.943 -> First checking Generic Access and Device Information Services and Characteristics!
20:03:28.943 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
20:03:28.943 -> Disconnecting since Client FTM Service is mandatory!
20:03:28.943 -> Client Disconnected, reason = 0x3E
20:03:28.943 -> >>> Restart the Feather nRF52 Client for a new run! <<<
20:03:30.705 -> Stopped!

20:15:52.131 -> ----------------- Version 02.5 ------------------
20:15:52.131 -> Initialise the Bluefruit nRF52 module: Client (Central)
20:15:52.135 -> FTMS and Chars 'initialized'
20:15:52.135 -> CPS and Chars 'initialized'
20:15:52.135 -> CSCS and Chars 'initialized'
20:15:52.135 -> GA and Chars 'initialized'
20:15:52.135 -> DIS and Chars 'initialized'
20:15:52.135 -> Start Scanning for CPS, CSC and FTMS!
20:16:41.655 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
20:16:41.655 -> Timestamp MAC Address Rssi Data
20:16:41.655 -> 000052631 F8:9C:FC:53:5E:49 -63 09-02-16-18-26-18-18-18-0A-18
20:16:41.870 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
20:16:41.870 -> Now checking all Client Services and Characteristics!
20:16:41.870 -> If Mandatory Services Fail --> the Client will disconnect!
20:16:41.870 -> First checking Generic Access and Device Information Services and Characteristics!
20:16:42.087 -> Found Client Generic Access
20:16:42.087 -> -> Client Reads Device Name: [Zwift Hub]
20:16:42.351 -> -> Client Reads Appearance: [1152]
20:16:42.351 -> Found Client Device Information
20:16:42.816 -> -> Client Reads Manufacturer: [Zwift]
20:16:42.816 -> -> Client Reads Model Number: [06]
20:16:42.986 -> -> Client Reads Serial Number: [06-F89CFC535E49]
20:16:42.987 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
20:16:43.112 -> Discovering Client FTM Feature Characteristic ... Found it!
20:16:43.249 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
20:16:43.249 -> Discovering Client FTM Control Point Characteristic ... Found it!
20:16:43.974 -> Discovering Client FTM Status Characteristic ... Found it!
20:16:43.974 -> Discovering Client FTM Training Status Characteristic ... Ready to receive Client FTM Control Point Response Messages
20:16:44.310 -> Ready to receive Client FTM Status values
20:16:44.310 -> >>> Couldn't enable notify for Client FTM Training Status Characteristic.
20:16:44.310 -> >>> Couldn't enable notify for Client FTM Indoor Bike Data Characteristic.
20:16:44.310 -> >>> Couldn't enable notify for Client CP Measurement Characteristic.
20:16:44.310 -> >>> Couldn't enable indicate for Client CP Control Point Characteristic.
20:16:44.310 -> >>> Couldn't enable notify for Client CSC Measurement Characteristic.
20:16:44.310 -> Client (Central) is Up and Running!
20:16:44.346 -> Not Found! Not Mandatory
20:16:44.346 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
20:16:44.516 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
20:16:44.516 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
20:16:44.870 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
20:16:44.870 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
20:16:45.056 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
20:16:45.149 -> Discovering Client CP Measurement characteristic ... Found it!
20:16:45.334 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
20:16:45.569 -> Discovering Client CP Feature characteristic ... Found it!
20:16:45.752 -> -> Client Reads Raw CP Feature bytes: [4] [ 00 00 00 00 ]
20:16:45.752 -> Discovering Client CP Sensor Location characteristic ... NOT Found! NOT Mandatory!
20:16:45.752 -> Discovering Cycling Speed and Cadence (CSC) Service ... Not Found! CSC Service is Not Mandatory!
20:16:46.309 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
20:16:46.401 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
20:16:48.356 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
20:16:48.450 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
20:16:50.443 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
20:16:50.475 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 07 01 ]
20:16:50.475 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 04 ]
20:16:52.514 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]
20:16:52.546 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:16:52.546 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 01 28 33 ]
20:16:54.573 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 00 28 33 00 ]
20:16:54.757 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:16:54.803 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 00 28 33 ]
20:16:56.652 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
20:16:56.839 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:16:56.839 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
20:16:58.772 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 14 00 28 33 00 ]
20:16:58.943 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:16:58.943 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 14 00 28 33 ]
20:17:00.869 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 00 28 33 00 ]
20:17:00.961 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:00.961 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 00 28 33 ]
20:17:02.957 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 25 00 28 33 00 ]
20:17:03.052 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:03.052 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 25 00 28 33 ]
20:17:05.040 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 23 00 28 33 00 ]
20:17:05.072 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:05.072 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 23 00 28 33 ]
20:17:07.112 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 1C 00 28 33 00 ]
20:17:07.342 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:07.342 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1C 00 28 33 ]
20:17:09.211 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 0F 00 28 33 00 ]
20:17:09.289 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:09.289 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 0F 00 28 33 ]
20:17:11.266 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
20:17:11.360 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:11.360 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
20:17:13.362 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 F5 FF 28 33 00 ]
20:17:13.473 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:13.473 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 F5 FF 28 33 ]
20:17:15.452 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 E4 FF 28 33 00 ]
20:17:15.545 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:15.545 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 E4 FF 28 33 ]
20:17:17.539 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 CF FF 28 33 00 ]
20:17:17.571 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:17.571 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 CF FF 28 33 ]
20:17:19.604 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A8 FF 28 33 00 ]
20:17:19.715 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:19.715 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A8 FF 28 33 ]
20:17:21.694 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 84 FF 28 33 00 ]
20:17:21.834 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:21.834 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 84 FF 28 33 ]
20:17:23.799 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 FF 28 33 00 ]
20:17:24.109 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:24.109 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 FF 28 33 ]
20:17:25.913 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5D FF 28 33 00 ]
20:17:26.007 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:26.007 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5D FF 28 33 ]
20:17:28.006 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5E FF 28 33 00 ]
20:17:28.053 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:28.053 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5E FF 28 33 ]
20:17:30.047 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 6F FF 28 33 00 ]
20:17:30.111 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:30.111 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 6F FF 28 33 ]
20:17:32.153 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 8A FF 28 33 00 ]
20:17:32.230 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:32.230 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8A FF 28 33 ]
20:17:34.207 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 B8 FF 28 33 00 ]
20:17:34.377 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:34.377 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 B8 FF 28 33 ]
20:17:36.308 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
20:17:36.433 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:36.433 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
20:17:38.431 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A2 00 28 33 00 ]
20:17:38.510 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:38.510 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A2 00 28 33 ]
20:17:40.534 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 01 28 33 00 ]
20:17:40.643 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:40.643 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 01 28 33 ]
20:17:42.606 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 4F 01 28 33 00 ]
20:17:42.682 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:42.682 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 4F 01 28 33 ]
20:17:44.682 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 01 28 33 00 ]
20:17:44.852 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:44.852 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 01 28 33 ]
20:17:46.768 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 57 FF 28 33 00 ]
20:17:46.845 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:46.845 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 57 FF 28 33 ]
20:17:48.847 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 08 00 00 00 00 00 00 00 ]
20:17:49.112 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 08 03 ]
20:17:50.939 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 01 00 00 00 00 00 00 00 ]
20:17:51.063 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 01 01 ]
20:17:51.063 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 01 ]
20:17:53.041 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
20:17:53.088 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
20:17:55.102 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
20:17:55.195 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
20:17:57.185 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
20:17:57.510 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 07 01 ]
20:17:57.510 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 04 ]
20:17:59.284 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]
20:17:59.331 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:17:59.331 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 01 28 33 ]
20:18:01.351 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 00 28 33 00 ]
20:18:01.567 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:01.567 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 00 28 33 ]
20:18:03.450 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
20:18:03.528 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:03.528 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
20:18:05.512 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 14 00 28 33 00 ]
20:18:05.590 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:05.590 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 14 00 28 33 ]
20:18:07.627 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 00 28 33 00 ]
20:18:07.673 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:07.673 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 00 28 33 ]
20:18:09.683 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 25 00 28 33 00 ]
20:18:09.730 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:09.730 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 25 00 28 33 ]
20:18:11.708 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 23 00 28 33 00 ]
20:18:11.802 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:11.802 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 23 00 28 33 ]
20:18:13.746 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 1C 00 28 33 00 ]
20:18:14.072 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:14.072 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1C 00 28 33 ]
20:18:15.867 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 0F 00 28 33 00 ]
20:18:15.945 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:15.945 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 0F 00 28 33 ]
20:18:17.918 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
20:18:18.089 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:18.089 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
20:18:20.050 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 F5 FF 28 33 00 ]
20:18:20.096 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:20.096 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 F5 FF 28 33 ]
20:18:22.115 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 E4 FF 28 33 00 ]
20:18:22.207 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:22.207 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 E4 FF 28 33 ]
20:18:24.202 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 CF FF 28 33 00 ]
20:18:24.249 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:24.249 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 CF FF 28 33 ]
20:18:26.259 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A8 FF 28 33 00 ]
20:18:26.508 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:26.508 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A8 FF 28 33 ]
20:18:28.349 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 84 FF 28 33 00 ]
20:18:28.551 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:28.551 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 84 FF 28 33 ]
20:18:30.463 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 FF 28 33 00 ]
20:18:30.604 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:30.604 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 FF 28 33 ]
20:18:32.565 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5D FF 28 33 00 ]
20:18:32.643 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:32.643 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5D FF 28 33 ]
20:18:34.646 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5E FF 28 33 00 ]
20:18:34.678 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:34.678 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5E FF 28 33 ]
20:18:36.693 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 6F FF 28 33 00 ]
20:18:36.769 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:36.769 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 6F FF 28 33 ]
20:18:38.750 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 8A FF 28 33 00 ]
20:18:39.060 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:39.060 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8A FF 28 33 ]
20:18:40.868 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 B8 FF 28 33 00 ]
20:18:41.054 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:41.054 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 B8 FF 28 33 ]
20:18:42.968 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
20:18:43.187 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:43.187 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
20:18:45.072 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A2 00 28 33 00 ]
20:18:45.149 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:45.149 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A2 00 28 33 ]
20:18:47.124 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 01 28 33 00 ]
20:18:47.248 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:47.248 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 01 28 33 ]
20:18:49.238 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 4F 01 28 33 00 ]
20:18:49.332 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:49.332 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 4F 01 28 33 ]
20:18:51.311 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 01 28 33 00 ]
20:18:51.452 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:51.452 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 01 28 33 ]
20:18:53.427 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 57 FF 28 33 00 ]
20:18:53.613 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:18:53.613 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 57 FF 28 33 ]
20:18:55.519 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 08 00 00 00 00 00 00 00 ]
20:18:55.550 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 08 03 ]
20:18:57.571 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 01 00 00 00 00 00 00 00 ]
20:18:57.681 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 01 01 ]
20:18:57.681 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 01 ]
20:18:59.669 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
20:18:59.747 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
20:19:01.734 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
20:19:01.827 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
20:19:03.840 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
20:19:04.105 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 07 01 ]
20:19:04.105 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 04 ]
20:19:05.947 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]
20:19:06.116 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:06.116 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 01 28 33 ]
20:19:08.042 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 00 28 33 00 ]
20:19:08.165 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:08.165 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 00 28 33 ]
20:19:10.145 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
20:19:10.208 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:10.253 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
20:19:12.243 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 14 00 28 33 00 ]
20:19:12.321 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:12.321 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 14 00 28 33 ]
20:19:14.328 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 00 28 33 00 ]
20:19:14.406 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:14.406 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 00 28 33 ]
20:19:16.397 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 25 00 28 33 00 ]
20:19:16.429 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:16.429 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 25 00 28 33 ]
20:19:18.464 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 23 00 28 33 00 ]
20:19:18.541 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:18.541 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 23 00 28 33 ]
20:19:20.534 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 1C 00 28 33 00 ]
20:19:20.783 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:20.783 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1C 00 28 33 ]
20:19:22.653 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 0F 00 28 33 00 ]
20:19:22.775 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:22.775 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 0F 00 28 33 ]
20:19:24.753 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
20:19:24.831 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:24.831 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
20:19:26.832 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 F5 FF 28 33 00 ]
20:19:26.971 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:26.971 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 F5 FF 28 33 ]
20:19:28.926 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 E4 FF 28 33 00 ]
20:19:29.097 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:29.097 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 E4 FF 28 33 ]
20:19:31.013 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 CF FF 28 33 00 ]
20:19:31.106 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:31.106 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 CF FF 28 33 ]
20:19:33.127 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A8 FF 28 33 00 ]
20:19:33.329 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:33.329 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A8 FF 28 33 ]
20:19:35.219 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 84 FF 28 33 00 ]
20:19:35.265 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:35.265 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 84 FF 28 33 ]
20:19:37.278 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 FF 28 33 00 ]
20:19:37.356 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:37.356 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 FF 28 33 ]
20:19:39.354 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5D FF 28 33 00 ]
20:19:39.433 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:39.433 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5D FF 28 33 ]
20:19:41.425 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5E FF 28 33 00 ]
20:19:41.457 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:41.457 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5E FF 28 33 ]
20:19:43.492 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 6F FF 28 33 00 ]
20:19:43.723 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:43.723 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 6F FF 28 33 ]
20:19:45.581 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 8A FF 28 33 00 ]
20:19:45.750 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:45.750 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8A FF 28 33 ]
20:19:47.678 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 B8 FF 28 33 00 ]
20:19:47.818 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:47.818 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 B8 FF 28 33 ]
20:19:49.788 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
20:19:49.865 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:49.865 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
20:19:51.859 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A2 00 28 33 00 ]
20:19:51.950 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:51.950 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A2 00 28 33 ]
20:19:53.940 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 01 28 33 00 ]
20:19:54.033 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:54.033 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 01 28 33 ]
20:19:56.027 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 4F 01 28 33 00 ]
20:19:56.462 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:56.462 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 4F 01 28 33 ]
20:19:58.105 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 01 28 33 00 ]
20:19:58.275 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:19:58.322 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 01 28 33 ]
20:20:00.213 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 57 FF 28 33 00 ]
20:20:00.290 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:00.337 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 57 FF 28 33 ]
20:20:02.267 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 08 00 00 00 00 00 00 00 ]
20:20:02.360 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 08 03 ]
20:20:04.371 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 01 00 00 00 00 00 00 00 ]
20:20:04.417 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 01 01 ]
20:20:04.417 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 01 ]
20:20:06.425 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
20:20:06.457 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
20:20:08.481 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
20:20:08.527 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
20:20:10.546 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
20:20:10.624 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 07 01 ]
20:20:10.624 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 04 ]
20:20:12.620 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]
20:20:12.698 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:12.698 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 01 28 33 ]
20:20:14.712 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 00 28 33 00 ]
20:20:14.806 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:14.806 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 00 28 33 ]
20:20:16.785 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
20:20:16.862 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:16.862 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
20:20:18.871 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 14 00 28 33 00 ]
20:20:18.980 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:18.980 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 14 00 28 33 ]
20:20:20.978 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 00 28 33 00 ]
20:20:21.070 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:21.070 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 00 28 33 ]
20:20:23.027 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 25 00 28 33 00 ]
20:20:23.396 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:23.396 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 25 00 28 33 ]
20:20:25.145 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 23 00 28 33 00 ]
20:20:25.223 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:25.223 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 23 00 28 33 ]
20:20:27.225 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 1C 00 28 33 00 ]
20:20:27.365 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:27.365 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1C 00 28 33 ]
20:20:29.329 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 0F 00 28 33 00 ]
20:20:29.376 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:29.376 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 0F 00 28 33 ]
20:20:31.379 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
20:20:31.469 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:31.469 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
20:20:33.446 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 F5 FF 28 33 00 ]
20:20:33.569 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:33.569 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 F5 FF 28 33 ]
20:20:35.559 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 E4 FF 28 33 00 ]
20:20:35.591 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:35.591 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 E4 FF 28 33 ]
20:20:37.619 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 CF FF 28 33 00 ]
20:20:37.852 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:37.852 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 CF FF 28 33 ]
20:20:39.714 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A8 FF 28 33 00 ]
20:20:39.977 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:39.977 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A8 FF 28 33 ]
20:20:41.827 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 84 FF 28 33 00 ]
20:20:41.966 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:41.966 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 84 FF 28 33 ]
20:20:43.925 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 FF 28 33 00 ]
20:20:43.973 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:43.973 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 FF 28 33 ]
20:20:45.950 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5D FF 28 33 00 ]
20:20:46.091 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:46.091 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5D FF 28 33 ]
20:20:48.091 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5E FF 28 33 00 ]
20:20:48.138 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:48.138 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5E FF 28 33 ]
20:20:50.141 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 6F FF 28 33 00 ]
20:20:50.188 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:50.188 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 6F FF 28 33 ]
20:20:52.205 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 8A FF 28 33 00 ]
20:20:52.513 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
20:20:52.513 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8A FF 28 33 ]

Thanks,

Joel

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
This is different from how the Elite Direto is responding, but that seems not to be a problem since you experience changing resistance.
I have uploaded a new version that hopefully accounts for the slightly different timing of the itsybitsy.. (???) and should avoid message cluttering during connection phase.
Furthermore I have introduced a Request for Machine Control in an early stage of the connection procedure, may be this helps waking up your trainer....
Best wishes,
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorghen,

I ordered the Feather but it hasn't arrived yet.

I had also started modifying the FTMS_Client_V25 to wait for feedback from everyone's services.

So I'm going to stop and try V.26 tonight.
I'll get back to you with the results.

I received the Bluethoot BLE dongle and tested the FTMS_Server_V.22.
It works so my key is good for the future.

Friendship
Joel,

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

I looked at your version V.26
I saw you change the time from 2.5 seconds to 5.
Personally I was looking at a different solution which consisted of:
Example:
if ( client_FitnessMachine_Service.discover(conn_handle) )
If false to restart the complete request and this for all the services which must answer!
I don't know if this is the right solution but its a lot of work.
if ( client_FitnessMachine_Service.discover(conn_handle) )
If False to restart the complete request and this for all the services that must respond!
I don't know if this is the right solution but its a lot of work.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jörghen,

Here are the results:
Unfortunately V0.26 does not work better than the others.
Here is the result of V0.25 modified by me.

And the code below

18:07:13.207 -> GA and Chars 'initialized'
18:07:13.207 -> DIS and Chars 'initialized'
18:07:13.207 -> Start Scanning for CPS, CSC and FTMS!
18:07:13.207 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
18:07:13.207 -> Timestamp MAC Address Rssi Data
18:07:13.207 -> 000001374 F8:9C:FC:53:5E:49 -62 09-02-16-18-26-18-18-18-0A-18
18:07:13.207 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
18:07:13.207 -> Now checking all Client Services and Characteristics!
18:07:13.207 -> If Mandatory Services Fail --> the Client will disconnect!
18:07:13.207 -> First checking Generic Access and Device Information Services and Characteristics!
18:07:13.461 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
18:07:13.461 -> Discovering Client FTM Feature Characteristic ... Discovering Client FTM Control Point Characteristic ... Found it!
18:07:14.047 -> Discovering Client FTM Status Characteristic ... Found it!
18:07:14.601 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
18:07:14.864 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
18:07:15.220 -> Ready to receive Client FTM Control Point Response Messages
18:07:15.267 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
18:07:15.267 -> Discovering Client FTM Supported Power Range Characteristic ... Ready to receive Client FTM Status values
18:07:15.267 -> >>> Couldn't enable notify for Client FTM Training Status Characteristic.
18:07:15.267 -> >>> Couldn't enable notify for Client FTM Indoor Bike Data Characteristic.
18:07:15.267 -> >>> Couldn't enable notify for Client CP Measurement Characteristic.
18:07:15.267 -> >>> Couldn't enable indicate for Client CP Control Point Characteristic.
18:07:15.267 -> >>> Couldn't enable notify for Client CSC Measurement Characteristic.
18:07:15.267 -> Client (Central) is Up and Running!
18:07:15.392 -> Found it!
18:07:15.484 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 00 00 00 00 ]
18:07:15.484 -> Discovering Client FTM Indoor Bike Data Characteristic ... Not Found! Not Mandatory
18:07:15.484 -> Discovering Client Cycling Power (CP) Service ... Not Found!
18:07:15.484 -> Disconnecting since Client Cyling Power Service is mandatory!
18:07:15.531 -> Client Disconnected, reason = 0x16
18:07:15.531 -> >>> Restart the Feather nRF52 Client for a new run! <<<
18:07:26.723 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
18:07:26.723 -> ----------------- Version 02.5 ------------------
18:07:26.723 -> Initialise the Bluefruit nRF52 module: Client (Central)
18:07:26.724 -> FTMS and Chars 'initialized'
18:07:26.724 -> CPS and Chars 'initialized'
18:07:26.724 -> CSCS and Chars 'initialized'
18:07:26.724 -> GA and Chars 'initialized'
18:07:26.724 -> DIS and Chars 'initialized'
18:07:26.724 -> Start Scanning for CPS, CSC and FTMS!
18:07:26.724 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
18:07:26.724 -> Timestamp MAC Address Rssi Data
18:07:26.724 -> 000001192 F8:9C:FC:53:5E:49 -62 09-02-16-18-26-18-18-18-0A-18
18:07:26.743 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
18:07:26.743 -> Now checking all Client Services and Characteristics!
18:07:26.743 -> If Mandatory Services Fail --> the Client will disconnect!
18:07:26.743 -> First checking Generic Access and Device Information Services and Characteristics!
18:07:26.747 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
18:07:26.747 -> Discovering Client FTM Feature Characteristic ... Discovering Client FTM Control Point Characteristic ... Found it!
18:07:27.137 -> Discovering Client FTM Status Characteristic ... Found it!
18:07:27.555 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
18:07:27.912 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
18:07:28.129 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
18:07:28.129 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
18:07:28.346 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
18:07:28.346 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
18:07:28.639 -> Discovering Client Cycling Power (CP) Service ... Ready to receive Client FTM Control Point Response Messages
18:07:28.731 -> Found it! CPS Max Payload: 20 Data Length: 27
18:07:28.731 -> Discovering Client CP Measurement characteristic ... Ready to receive Client FTM Status values
18:07:28.731 -> >>> Couldn't enable notify for Client FTM Training Status Characteristic.
18:07:28.809 -> Ready to receive Client FTM Indoor Bike Data values
18:07:28.809 -> Found it!
18:07:28.809 -> Discovering Client CP Control Point characteristic ... Ready to receive Client CP Measurement values
18:07:28.809 -> >>> Couldn't enable indicate for Client CP Control Point Characteristic.
18:07:28.809 -> >>> Couldn't enable notify for Client CSC Measurement Characteristic.
18:07:28.809 -> Client (Central) is Up and Running!
18:07:28.932 -> Not Found! NOT Mandatory!
18:07:28.932 -> Discovering Client CP Feature characteristic ... Found it!
18:07:29.446 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
18:07:29.446 -> Wheel revolution data supported
18:07:29.446 -> Crank revolution data supported
18:07:29.446 -> Discovering Client CP Sensor Location characteristic ... Found it!
18:07:29.646 -> -> Client Reads CP Location Sensor: Loc#: 0 Other
18:07:29.646 -> Discovering Cycling Speed and Cadence (CSC) Service ... Not Found! CSC Service is Not Mandatory!
18:07:29.646 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
18:07:29.646 -> Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
18:07:30.031 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
18:07:30.031 -> Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
18:07:30.819 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
18:07:30.864 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
18:07:31.036 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
18:07:31.036 -> Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
18:07:32.006 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
18:07:32.006 -> Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
18:07:32.870 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
18:07:32.916 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
18:07:33.195 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
18:07:33.195 -> Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
18:07:34.074 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
18:07:34.074 -> Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
18:07:34.925 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
18:07:35.266 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
18:07:35.266 -> Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
18:07:35.313 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 07 01 ]
18:07:35.313 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 04 ]
18:07:36.008 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
18:07:36.008 -> Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:07:37.011 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
18:07:37.011 -> Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:07:37.011 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]
18:07:37.213 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:07:37.213 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 01 28 33 ]
18:07:37.972 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
18:07:38.018 -> Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:07:38.984 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
18:07:38.984 -> Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:07:39.110 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 00 28 33 00 ]
18:07:39.188 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:07:39.188 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 00 28 33 ]
18:07:39.989 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
18:07:39.989 -> Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:07:41.147 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
18:07:41.147 -> Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:07:41.193 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
18:07:41.286 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:07:41.286 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
18:07:41.978 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
18:07:41.978 -> Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:07:43.072 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 09 05 88 00 00 00 00 00 03 00 00 14 00 78 00 0F 00 00 ]
18:07:43.072 -> Speed: 12 KPH Instantaneous Cadence: 68 RPM Average Cadence: 0 RPM Total Distance: 196608 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 120 Watt Heart Rate: 15 HBM
18:07:43.289 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 14 00 28 33 00 ]
18:07:43.321 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:07:43.321 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 14 00 28 33 ]
18:07:44.015 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 A3 06 1A 01 00 00 00 00 07 00 00 14 00 D5 00 25 00 00 ]
18:07:44.015 -> Speed: 16 KPH Instantaneous Cadence: 141 RPM Average Cadence: 0 RPM Total Distance: 458752 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 213 Watt Heart Rate: 37 HBM
18:07:45.252 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 B5 06 8F 01 00 00 00 00 0B 00 00 14 00 91 00 2F 00 00 ]
18:07:45.252 -> Speed: 17 KPH Instantaneous Cadence: 199 RPM Average Cadence: 0 RPM Total Distance: 720896 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 145 Watt Heart Rate: 47 HBM
18:07:45.344 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 00 28 33 00 ]
18:07:45.390 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:07:45.390 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 00 28 33 ]
18:07:46.008 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 15 07 EF 01 36 00 04 00 0F 00 00 14 00 BE 00 3C 00 00 ]
18:07:46.008 -> Speed: 18 KPH Instantaneous Cadence: 247 RPM Average Cadence: 27 RPM Total Distance: 983044 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 190 Watt Heart Rate: 60 HBM
18:07:46.999 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 B4 07 5D 02 56 00 0B 00 14 00 00 14 00 C5 00 48 00 00 ]
18:07:46.999 -> Speed: 19 KPH Instantaneous Cadence: 302 RPM Average Cadence: 43 RPM Total Distance: 1310731 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 197 Watt Heart Rate: 72 HBM
18:07:47.416 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 25 00 28 33 00 ]
18:07:47.667 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:07:47.667 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 25 00 28 33 ]
18:07:48.011 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 15 08 BA 02 66 00 12 00 19 00 00 14 00 A4 00 4F 00 00 ]
18:07:48.011 -> Speed: 20 KPH Instantaneous Cadence: 349 RPM Average Cadence: 51 RPM Total Distance: 1638418 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 164 Watt Heart Rate: 79 HBM
18:07:49.075 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 6C 08 09 03 70 00 19 00 1E 00 00 14 00 9D 00 54 00 00 ]
18:07:49.075 -> Speed: 21 KPH Instantaneous Cadence: 388 RPM Average Cadence: 56 RPM Total Distance: 1966105 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 157 Watt Heart Rate: 84 HBM
18:07:49.490 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 23 00 28 33 00 ]
18:07:49.568 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:07:49.568 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 23 00 28 33 ]
18:07:50.015 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 C7 08 67 03 76 00 1F 00 24 00 00 14 00 99 00 59 00 00 ]
18:07:50.015 -> Speed: 22 KPH Instantaneous Cadence: 435 RPM Average Cadence: 59 RPM Total Distance: 2359327 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 153 Watt Heart Rate: 89 HBM
18:07:51.031 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 4D 09 B8 03 7A 00 25 00 2A 00 00 14 00 8E 00 5C 00 00 ]
18:07:51.031 -> Speed: 23 KPH Instantaneous Cadence: 476 RPM Average Cadence: 61 RPM Total Distance: 2752549 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 142 Watt Heart Rate: 92 HBM
18:07:51.570 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 1C 00 28 33 00 ]
18:07:51.849 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:07:51.849 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1C 00 28 33 ]
18:07:51.973 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 70 09 00 04 80 00 2A 00 30 00 00 14 00 89 00 5F 00 00 ]
18:07:51.973 -> Speed: 24 KPH Instantaneous Cadence: 512 RPM Average Cadence: 64 RPM Total Distance: 3145770 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 137 Watt Heart Rate: 95 HBM
18:07:52.992 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 5E 09 40 04 86 00 2F 00 36 00 00 14 00 85 00 61 00 00 ]
18:07:52.992 -> Speed: 23 KPH Instantaneous Cadence: 544 RPM Average Cadence: 67 RPM Total Distance: 3538991 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 133 Watt Heart Rate: 97 HBM
18:07:53.670 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 0F 00 28 33 00 ]
18:07:53.748 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:07:53.748 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 0F 00 28 33 ]
18:07:53.978 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 65 09 7A 04 88 00 34 00 3C 00 00 14 00 78 00 62 00 00 ]
18:07:53.978 -> Speed: 24 KPH Instantaneous Cadence: 573 RPM Average Cadence: 68 RPM Total Distance: 3932212 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 120 Watt Heart Rate: 98 HBM
18:07:54.980 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 87 09 AD 04 8A 00 38 00 42 00 00 14 00 70 00 63 00 00 ]
18:07:54.980 -> Speed: 24 KPH Instantaneous Cadence: 598 RPM Average Cadence: 69 RPM Total Distance: 4325432 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 112 Watt Heart Rate: 99 HBM
18:07:55.749 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
18:07:55.886 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:07:55.886 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
18:07:56.009 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 5E 09 DC 04 8A 00 3C 00 48 00 00 14 00 5D 00 62 00 00 ]
18:07:56.009 -> Speed: 23 KPH Instantaneous Cadence: 622 RPM Average Cadence: 69 RPM Total Distance: 4718652 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 93 Watt Heart Rate: 98 HBM
18:07:57.015 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 A8 09 06 05 8C 00 40 00 4E 00 00 14 00 70 00 63 00 00 ]
18:07:57.015 -> Speed: 24 KPH Instantaneous Cadence: 643 RPM Average Cadence: 70 RPM Total Distance: 5111872 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 112 Watt Heart Rate: 99 HBM
18:07:57.849 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 F5 FF 28 33 00 ]
18:07:57.927 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:07:57.927 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 F5 FF 28 33 ]
18:07:57.974 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 0A 3D 05 8C 00 43 00 55 00 00 14 00 74 00 64 00 00 ]
18:07:57.974 -> Speed: 25 KPH Instantaneous Cadence: 670 RPM Average Cadence: 70 RPM Total Distance: 5570627 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 116 Watt Heart Rate: 100 HBM
18:07:59.038 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 D4 09 60 05 90 00 46 00 5B 00 00 14 00 7D 00 65 00 00 ]
18:07:59.038 -> Speed: 25 KPH Instantaneous Cadence: 688 RPM Average Cadence: 72 RPM Total Distance: 5963846 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 125 Watt Heart Rate: 101 HBM
18:07:59.950 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 E4 FF 28 33 00 ]
18:07:59.997 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:07:59.997 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 E4 FF 28 33 ]
18:07:59.997 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 23 0A 8E 05 92 00 49 00 62 00 00 14 00 75 00 65 00 00 ]
18:07:59.997 -> Speed: 25 KPH Instantaneous Cadence: 711 RPM Average Cadence: 73 RPM Total Distance: 6422601 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 117 Watt Heart Rate: 101 HBM
18:08:01.066 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 0D 0A B9 05 92 00 4C 00 69 00 00 14 00 6B 00 66 00 00 ]
18:08:01.066 -> Speed: 25 KPH Instantaneous Cadence: 732 RPM Average Cadence: 73 RPM Total Distance: 6881356 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 107 Watt Heart Rate: 102 HBM
18:08:01.990 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 4F 0A E1 05 94 00 4E 00 70 00 00 14 00 6C 00 66 00 00 ]
18:08:01.990 -> Speed: 26 KPH Instantaneous Cadence: 752 RPM Average Cadence: 74 RPM Total Distance: 7340110 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 108 Watt Heart Rate: 102 HBM
18:08:01.990 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 CF FF 28 33 00 ]
18:08:02.113 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:02.113 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 CF FF 28 33 ]
18:08:02.993 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 28 0A 06 06 94 00 51 00 77 00 00 14 00 63 00 66 00 00 ]
18:08:02.993 -> Speed: 26 KPH Instantaneous Cadence: 771 RPM Average Cadence: 74 RPM Total Distance: 7798865 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 99 Watt Heart Rate: 102 HBM
18:08:04.087 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A8 FF 28 33 00 ]
18:08:04.211 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 62 0A 28 06 98 00 53 00 7E 00 00 14 00 5A 00 65 00 00 ]
18:08:04.211 -> Speed: 26 KPH Instantaneous Cadence: 788 RPM Average Cadence: 76 RPM Total Distance: 8257619 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 90 Watt Heart Rate: 101 HBM
18:08:04.303 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:04.303 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A8 FF 28 33 ]
18:08:04.996 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 2E 0A 48 06 96 00 56 00 85 00 00 14 00 51 00 65 00 00 ]
18:08:04.996 -> Speed: 26 KPH Instantaneous Cadence: 804 RPM Average Cadence: 75 RPM Total Distance: 8716374 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 81 Watt Heart Rate: 101 HBM
18:08:06.088 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 AF 0A 66 06 96 00 58 00 8C 00 00 14 00 52 00 64 00 00 ]
18:08:06.088 -> Speed: 27 KPH Instantaneous Cadence: 819 RPM Average Cadence: 75 RPM Total Distance: 9175128 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 82 Watt Heart Rate: 100 HBM
18:08:06.181 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 84 FF 28 33 00 ]
18:08:06.303 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:06.303 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 84 FF 28 33 ]
18:08:06.995 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 9B 0A 83 06 A0 00 5A 00 93 00 00 14 00 64 00 64 00 00 ]
18:08:06.995 -> Speed: 27 KPH Instantaneous Cadence: 833 RPM Average Cadence: 80 RPM Total Distance: 9633882 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 100 Watt Heart Rate: 100 HBM
18:08:08.181 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 CA 0A 9D 06 A6 00 5C 00 9A 00 00 14 00 61 00 64 00 00 ]
18:08:08.182 -> Speed: 27 KPH Instantaneous Cadence: 846 RPM Average Cadence: 83 RPM Total Distance: 10092636 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 97 Watt Heart Rate: 100 HBM
18:08:08.274 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 FF 28 33 00 ]
18:08:08.412 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:08.412 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 FF 28 33 ]
18:08:08.999 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 0D 0B B6 06 A6 00 5E 00 A1 00 00 14 00 5E 00 64 00 00 ]
18:08:08.999 -> Speed: 28 KPH Instantaneous Cadence: 859 RPM Average Cadence: 83 RPM Total Distance: 10551390 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 94 Watt Heart Rate: 100 HBM
18:08:10.090 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 0E 0B CD 06 A2 00 60 00 A8 00 00 14 00 51 00 63 00 00 ]
18:08:10.138 -> Speed: 28 KPH Instantaneous Cadence: 870 RPM Average Cadence: 81 RPM Total Distance: 11010144 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 81 Watt Heart Rate: 99 HBM
18:08:10.373 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5D FF 28 33 00 ]
18:08:10.451 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:10.451 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5D FF 28 33 ]
18:08:11.013 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 39 0B E4 06 A6 00 62 00 AF 00 00 14 00 58 00 63 00 00 ]
18:08:11.013 -> Speed: 28 KPH Instantaneous Cadence: 882 RPM Average Cadence: 83 RPM Total Distance: 11468898 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 88 Watt Heart Rate: 99 HBM
18:08:11.978 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 6C 0B 02 07 A6 00 64 00 B7 00 00 14 00 50 00 62 00 00 ]
18:08:11.978 -> Speed: 29 KPH Instantaneous Cadence: 897 RPM Average Cadence: 83 RPM Total Distance: 11993188 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 80 Watt Heart Rate: 98 HBM
18:08:12.432 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5E FF 28 33 00 ]
18:08:12.668 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:12.668 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5E FF 28 33 ]
18:08:12.992 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 70 0B 20 07 AA 00 66 00 BF 00 00 14 00 4D 00 62 00 00 ]
18:08:12.993 -> Speed: 29 KPH Instantaneous Cadence: 912 RPM Average Cadence: 85 RPM Total Distance: 12517478 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 77 Watt Heart Rate: 98 HBM
18:08:13.995 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 B7 0B 3B 07 AE 00 68 00 C7 00 00 14 00 50 00 61 00 00 ]
18:08:13.995 -> Speed: 29 KPH Instantaneous Cadence: 925 RPM Average Cadence: 87 RPM Total Distance: 13041768 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 80 Watt Heart Rate: 97 HBM
18:08:14.550 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 6F FF 28 33 00 ]
18:08:14.768 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:14.768 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 6F FF 28 33 ]
18:08:14.984 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 A3 0B 56 07 B2 00 6A 00 CF 00 00 14 00 4C 00 61 00 00 ]
18:08:14.984 -> Speed: 29 KPH Instantaneous Cadence: 939 RPM Average Cadence: 89 RPM Total Distance: 13566058 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 76 Watt Heart Rate: 97 HBM
18:08:16.182 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 81 0B 6F 07 BA 00 6B 00 D7 00 00 14 00 39 00 60 00 00 ]
18:08:16.182 -> Speed: 29 KPH Instantaneous Cadence: 951 RPM Average Cadence: 93 RPM Total Distance: 14090347 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 57 Watt Heart Rate: 96 HBM
18:08:16.631 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 8A FF 28 33 00 ]
18:08:16.709 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:16.709 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8A FF 28 33 ]
18:08:17.003 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 9F 0B 86 07 BC 00 6D 00 DF 00 00 14 00 42 00 5F 00 00 ]
18:08:17.003 -> Speed: 29 KPH Instantaneous Cadence: 963 RPM Average Cadence: 94 RPM Total Distance: 14614637 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 66 Watt Heart Rate: 95 HBM
18:08:18.191 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 A0 0B 9D 07 BE 00 6F 00 E7 00 00 14 00 41 00 5E 00 00 ]
18:08:18.191 -> Speed: 29 KPH Instantaneous Cadence: 974 RPM Average Cadence: 95 RPM Total Distance: 15138927 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 65 Watt Heart Rate: 94 HBM
18:08:18.671 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 B8 FF 28 33 00 ]
18:08:18.794 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:18.794 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 B8 FF 28 33 ]
18:08:18.980 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 C3 0B B3 07 B6 00 71 00 EF 00 00 14 00 4E 00 5E 00 00 ]
18:08:18.980 -> Speed: 30 KPH Instantaneous Cadence: 985 RPM Average Cadence: 91 RPM Total Distance: 15663217 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 78 Watt Heart Rate: 94 HBM
18:08:20.077 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 99 0B C7 07 B2 00 72 00 F7 00 00 14 00 46 00 5D 00 00 ]
18:08:20.077 -> Speed: 29 KPH Instantaneous Cadence: 995 RPM Average Cadence: 89 RPM Total Distance: 16187506 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 70 Watt Heart Rate: 93 HBM
18:08:20.803 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
18:08:20.835 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:20.835 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
18:08:20.973 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 89 0B DB 07 B2 00 74 00 FF 00 00 14 00 47 00 5D 00 00 ]
18:08:20.973 -> Speed: 29 KPH Instantaneous Cadence: 1005 RPM Average Cadence: 89 RPM Total Distance: 16711796 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 71 Watt Heart Rate: 93 HBM
18:08:22.098 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 48 0B E6 07 AE 00 75 00 06 01 00 14 00 47 00 5C 00 00 ]
18:08:22.098 -> Speed: 28 KPH Instantaneous Cadence: 1011 RPM Average Cadence: 87 RPM Total Distance: 393333 m Resistance Level: 1 Instantaneous Power: 20 Watt Average Power: 71 Watt Heart Rate: 92 HBM
18:08:22.867 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A2 00 28 33 00 ]
18:08:22.913 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:22.913 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A2 00 28 33 ]
18:08:23.039 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 42 0B F1 07 B0 00 76 00 0D 01 00 14 00 59 00 5C 00 00 ]
18:08:23.039 -> Speed: 28 KPH Instantaneous Cadence: 1016 RPM Average Cadence: 88 RPM Total Distance: 852086 m Resistance Level: 1 Instantaneous Power: 20 Watt Average Power: 89 Watt Heart Rate: 92 HBM
18:08:24.006 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 0E 0B FC 07 AA 00 77 00 14 01 00 14 00 5F 00 5C 00 00 ]
18:08:24.006 -> Speed: 28 KPH Instantaneous Cadence: 1022 RPM Average Cadence: 85 RPM Total Distance: 1310839 m Resistance Level: 1 Instantaneous Power: 20 Watt Average Power: 95 Watt Heart Rate: 92 HBM
18:08:24.918 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 01 28 33 00 ]
18:08:25.012 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:25.012 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 01 28 33 ]
18:08:25.012 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 C9 0A 05 08 96 00 78 00 1B 01 00 14 00 70 00 5D 00 00 ]
18:08:25.012 -> Speed: 27 KPH Instantaneous Cadence: 1026 RPM Average Cadence: 75 RPM Total Distance: 1769592 m Resistance Level: 1 Instantaneous Power: 20 Watt Average Power: 112 Watt Heart Rate: 93 HBM
18:08:26.030 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 62 0A 0F 08 9C 00 78 00 22 01 00 14 00 95 00 5E 00 00 ]
18:08:26.030 -> Speed: 26 KPH Instantaneous Cadence: 1031 RPM Average Cadence: 78 RPM Total Distance: 2228344 m Resistance Level: 1 Instantaneous Power: 20 Watt Average Power: 149 Watt Heart Rate: 94 HBM
18:08:27.014 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 9F 0A 18 08 A0 00 79 00 29 01 00 14 00 A9 00 5F 00 00 ]
18:08:27.014 -> Speed: 27 KPH Instantaneous Cadence: 1036 RPM Average Cadence: 80 RPM Total Distance: 2687097 m Resistance Level: 1 Instantaneous Power: 20 Watt Average Power: 169 Watt Heart Rate: 95 HBM
18:08:27.014 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 4F 01 28 33 00 ]
18:08:27.107 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:27.107 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 4F 01 28 33 ]
18:08:27.989 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 FE 09 21 08 9C 00 7A 00 30 01 00 14 00 C0 00 61 00 00 ]
18:08:27.989 -> Speed: 25 KPH Instantaneous Cadence: 1040 RPM Average Cadence: 78 RPM Total Distance: 3145850 m Resistance Level: 1 Instantaneous Power: 20 Watt Average Power: 192 Watt Heart Rate: 97 HBM
18:08:28.992 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 02 0A 2A 08 98 00 7A 00 37 01 00 14 00 C9 00 63 00 00 ]
18:08:28.992 -> Speed: 25 KPH Instantaneous Cadence: 1045 RPM Average Cadence: 76 RPM Total Distance: 3604602 m Resistance Level: 1 Instantaneous Power: 20 Watt Average Power: 201 Watt Heart Rate: 99 HBM
18:08:29.114 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 01 28 33 00 ]
18:08:29.346 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:29.346 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 01 28 33 ]
18:08:29.995 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 A3 09 2B 08 94 00 7B 00 3D 01 00 14 00 CD 00 65 00 00 ]
18:08:29.995 -> Speed: 24 KPH Instantaneous Cadence: 1045 RPM Average Cadence: 74 RPM Total Distance: 3997819 m Resistance Level: 1 Instantaneous Power: 20 Watt Average Power: 205 Watt Heart Rate: 101 HBM
18:08:30.983 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 6B 09 2D 08 92 00 7B 00 43 01 00 14 00 D0 00 67 00 00 ]
18:08:30.983 -> Speed: 24 KPH Instantaneous Cadence: 1046 RPM Average Cadence: 73 RPM Total Distance: 4391035 m Resistance Level: 1 Instantaneous Power: 20 Watt Average Power: 208 Watt Heart Rate: 103 HBM
18:08:31.216 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 57 FF 28 33 00 ]
18:08:31.309 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:31.309 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 57 FF 28 33 ]
18:08:32.004 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 FE 09 34 08 8E 00 7C 00 4A 01 00 14 00 C7 00 68 00 00 ]
18:08:32.004 -> Speed: 25 KPH Instantaneous Cadence: 1050 RPM Average Cadence: 71 RPM Total Distance: 4849788 m Resistance Level: 1 Instantaneous Power: 20 Watt Average Power: 199 Watt Heart Rate: 104 HBM
18:08:33.234 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 3C 0A 3C 08 8E 00 7C 00 51 01 00 14 00 D2 00 6A 00 00 ]
18:08:33.234 -> Speed: 26 KPH Instantaneous Cadence: 1054 RPM Average Cadence: 71 RPM Total Distance: 5308540 m Resistance Level: 1 Instantaneous Power: 20 Watt Average Power: 210 Watt Heart Rate: 106 HBM
18:08:33.310 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 08 00 00 00 00 00 00 00 ]
18:08:33.388 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 08 03 ]
18:08:33.974 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 A0 0A 43 08 92 00 7C 00 58 01 00 14 00 B2 00 6B 00 00 ]
18:08:33.974 -> Speed: 27 KPH Instantaneous Cadence: 1057 RPM Average Cadence: 73 RPM Total Distance: 5767292 m Resistance Level: 1 Instantaneous Power: 20 Watt Average Power: 178 Watt Heart Rate: 107 HBM
18:08:34.984 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 EE 0A 4A 08 96 00 7D 00 5F 01 00 14 00 6F 00 6C 00 00 ]
18:08:34.984 -> Speed: 27 KPH Instantaneous Cadence: 1061 RPM Average Cadence: 75 RPM Total Distance: 6226045 m Resistance Level: 1 Instantaneous Power: 20 Watt Average Power: 111 Watt Heart Rate: 108 HBM
18:08:35.386 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 01 00 00 00 00 00 00 00 ]
18:08:35.479 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 01 01 ]
18:08:35.479 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 01 ]
18:08:35.989 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 44 0A 9C 00 14 00 3A 00 00 ]
18:08:35.989 -> Speed: 26 KPH Instantaneous Cadence: 78 RPM Resistance Level: 20 Instantaneous Power: 58 Watt Heart Rate: 0 HBM
18:08:36.992 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 AC 09 00 00 14 00 00 00 00 ]
18:08:36.992 -> Speed: 24 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
18:08:37.486 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
18:08:37.579 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
18:08:37.997 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 18 09 00 00 14 00 00 00 00 ]
18:08:37.997 -> Speed: 23 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
18:08:39.290 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 8A 08 00 00 14 00 00 00 00 ]
18:08:39.290 -> Speed: 21 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
18:08:39.584 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
18:08:39.833 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
18:08:39.956 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 FC 07 00 00 14 00 00 00 00 ]
18:08:39.956 -> Speed: 20 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
18:08:40.991 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 74 07 00 00 14 00 00 00 00 ]
18:08:40.991 -> Speed: 19 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
18:08:41.684 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
18:08:41.793 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 07 01 ]
18:08:41.793 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 04 ]
18:08:42.024 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 ED 06 AC 05 00 00 00 00 04 00 00 14 00 00 00 00 00 00 ]
18:08:42.024 -> Speed: 17 KPH Instantaneous Cadence: 726 RPM Average Cadence: 0 RPM Total Distance: 262144 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:08:43.125 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 6A 06 AB 05 00 00 00 00 08 00 00 14 00 00 00 00 00 00 ]
18:08:43.125 -> Speed: 16 KPH Instantaneous Cadence: 725 RPM Average Cadence: 0 RPM Total Distance: 524288 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:08:43.770 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]
18:08:43.863 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:43.863 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 01 28 33 ]
18:08:43.987 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 E9 05 AB 05 00 00 00 00 0C 00 00 14 00 00 00 00 00 00 ]
18:08:43.987 -> Speed: 15 KPH Instantaneous Cadence: 725 RPM Average Cadence: 0 RPM Total Distance: 786432 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:08:44.988 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 6C 05 51 05 00 00 00 00 0F 00 00 14 00 00 00 00 00 00 ]
18:08:44.988 -> Speed: 13 KPH Instantaneous Cadence: 680 RPM Average Cadence: 0 RPM Total Distance: 983040 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:08:45.858 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 00 28 33 00 ]
18:08:45.936 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:45.936 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 00 28 33 ]
18:08:45.982 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 F0 04 1A 05 00 00 00 00 12 00 00 14 00 00 00 00 00 00 ]
18:08:45.982 -> Speed: 12 KPH Instantaneous Cadence: 653 RPM Average Cadence: 0 RPM Total Distance: 1179648 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:08:47.261 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 7B 04 F6 04 00 00 00 00 15 00 00 14 00 00 00 00 00 00 ]
18:08:47.261 -> Speed: 11 KPH Instantaneous Cadence: 635 RPM Average Cadence: 0 RPM Total Distance: 1376256 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:08:47.940 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
18:08:47.972 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 07 04 A8 04 00 00 00 00 17 00 00 14 00 00 00 00 00 00 ]
18:08:47.972 -> Speed: 10 KPH Instantaneous Cadence: 596 RPM Average Cadence: 0 RPM Total Distance: 1507328 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:08:48.003 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:48.003 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
18:08:49.051 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 98 03 6E 04 00 00 00 00 19 00 00 14 00 00 00 00 00 00 ]
18:08:49.096 -> Speed: 9 KPH Instantaneous Cadence: 567 RPM Average Cadence: 0 RPM Total Distance: 1638400 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:08:50.008 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 2B 03 40 04 00 00 00 00 1B 00 00 14 00 00 00 00 00 00 ]
18:08:50.008 -> Speed: 8 KPH Instantaneous Cadence: 544 RPM Average Cadence: 0 RPM Total Distance: 1769472 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:08:50.008 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 14 00 28 33 00 ]
18:08:50.132 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:50.132 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 14 00 28 33 ]
18:08:51.171 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 C2 02 F8 03 00 00 00 00 1C 00 00 14 00 00 00 00 00 00 ]
18:08:51.171 -> Speed: 7 KPH Instantaneous Cadence: 508 RPM Average Cadence: 0 RPM Total Distance: 1835008 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:08:52.014 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 5C 02 BC 03 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
18:08:52.014 -> Speed: 6 KPH Instantaneous Cadence: 478 RPM Average Cadence: 0 RPM Total Distance: 1900544 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:08:52.133 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 00 28 33 00 ]
18:08:52.169 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:52.169 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 00 28 33 ]
18:08:52.969 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 FC 01 8B 03 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:08:52.969 -> Speed: 5 KPH Instantaneous Cadence: 453 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:08:54.032 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 45 03 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:08:54.032 -> Speed: 0 KPH Instantaneous Cadence: 418 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:08:54.172 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 25 00 28 33 00 ]
18:08:54.375 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:54.375 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 25 00 28 33 ]
18:08:55.011 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 09 03 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:08:55.056 -> Speed: 0 KPH Instantaneous Cadence: 388 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:08:55.994 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 D6 02 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:08:55.994 -> Speed: 0 KPH Instantaneous Cadence: 363 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:08:56.274 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 23 00 28 33 00 ]
18:08:56.366 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:56.366 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 23 00 28 33 ]
18:08:57.103 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 A8 02 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:08:57.103 -> Speed: 0 KPH Instantaneous Cadence: 340 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:08:58.006 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 80 02 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:08:58.006 -> Speed: 0 KPH Instantaneous Cadence: 320 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:08:58.393 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 1C 00 28 33 00 ]
18:08:58.486 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:08:58.486 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1C 00 28 33 ]
18:08:59.043 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 5D 02 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:08:59.043 -> Speed: 0 KPH Instantaneous Cadence: 302 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:08:59.970 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 3D 02 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:08:59.970 -> Speed: 0 KPH Instantaneous Cadence: 286 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:00.484 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 0F 00 28 33 00 ]
18:09:00.562 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:09:00.562 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 0F 00 28 33 ]
18:09:00.982 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 20 02 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:00.982 -> Speed: 0 KPH Instantaneous Cadence: 272 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:02.154 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 06 02 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:02.154 -> Speed: 0 KPH Instantaneous Cadence: 259 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:02.545 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
18:09:02.671 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:09:02.671 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
18:09:03.077 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 EF 01 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:03.077 -> Speed: 0 KPH Instantaneous Cadence: 247 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:04.037 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 D9 01 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:04.037 -> Speed: 0 KPH Instantaneous Cadence: 236 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:04.670 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 F5 FF 28 33 00 ]
18:09:04.993 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 C5 01 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:04.993 -> Speed: 0 KPH Instantaneous Cadence: 226 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:05.039 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:09:05.039 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 F5 FF 28 33 ]
18:09:05.976 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 B3 01 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:05.976 -> Speed: 0 KPH Instantaneous Cadence: 217 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:06.769 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 E4 FF 28 33 00 ]
18:09:06.848 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:09:06.848 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 E4 FF 28 33 ]
18:09:06.988 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 A3 01 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:06.988 -> Speed: 0 KPH Instantaneous Cadence: 209 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:07.992 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 93 01 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:07.992 -> Speed: 0 KPH Instantaneous Cadence: 201 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:08.857 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 CF FF 28 33 00 ]
18:09:08.980 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 85 01 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:08.980 -> Speed: 0 KPH Instantaneous Cadence: 194 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:09.026 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:09:09.026 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 CF FF 28 33 ]
18:09:10.279 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 77 01 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:10.279 -> Speed: 0 KPH Instantaneous Cadence: 187 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:10.944 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A8 FF 28 33 00 ]
18:09:10.990 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 6B 01 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:10.990 -> Speed: 0 KPH Instantaneous Cadence: 181 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:11.037 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:09:11.037 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A8 FF 28 33 ]
18:09:12.001 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 5F 01 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:12.001 -> Speed: 0 KPH Instantaneous Cadence: 175 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:12.989 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 54 01 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:12.989 -> Speed: 0 KPH Instantaneous Cadence: 170 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:13.025 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 84 FF 28 33 00 ]
18:09:13.104 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:09:13.104 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 84 FF 28 33 ]
18:09:13.972 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 4A 01 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:13.972 -> Speed: 0 KPH Instantaneous Cadence: 165 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:14.978 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 40 01 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:14.978 -> Speed: 0 KPH Instantaneous Cadence: 160 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:15.116 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 FF 28 33 00 ]
18:09:15.194 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:09:15.194 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 FF 28 33 ]
18:09:16.125 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 37 01 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:16.125 -> Speed: 0 KPH Instantaneous Cadence: 155 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:17.013 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 2E 01 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:17.013 -> Speed: 0 KPH Instantaneous Cadence: 151 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:17.184 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5D FF 28 33 00 ]
18:09:17.263 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:09:17.263 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5D FF 28 33 ]
18:09:18.010 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 26 01 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:18.010 -> Speed: 0 KPH Instantaneous Cadence: 147 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:19.015 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 1E 01 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]
18:09:19.015 -> Speed: 0 KPH Instantaneous Cadence: 143 RPM Average Cadence: 0 RPM Total Distance: 1966080 m Resistance Level: 0 Instantaneous Power: 20 Watt Average Power: 0 Watt Heart Rate: 0 HBM
18:09:19.248 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5E FF 28 33 00 ]
18:09:19.372 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:09:19.372 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5E FF 28 33 ]
18:09:20.050 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 17 01 00 00 00 00 1E 00 00 14 00 00 00 00 00 00 ]

// If FTM Feature is not found, disconnect, resume scanning, and return
while (!( client_FTM_Feature_Chr.discover() ))
{
if ( client_FTM_Feature_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
// Read FTM Feature Data
client_FTM_Feature_Chr.read(client_FTM_Feature_Data, 8);
#ifdef DEBUG
Serial.print(" -> Client Reads Raw FTM Feature bytes: [8] [ ");
for (int i = 0; i < sizeof(client_FTM_Feature_Data); i++) {
Serial.printf("%02X ", client_FTM_Feature_Data[i], HEX);
} // for
Serial.println("] ");
#endif
} else {
#ifdef DEBUG
Serial.println("Disconnecting since Client FTM Feature Characteristic is mandatory!");
#endif
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
Bluefruit.Connection(conn_handle);
Serial.print("Discovering Client FTM Feature not decouvert ... ");
// return;
}
}

As you can see in the second test it does not find the speed and cadence values.

Probably I should put more "While".

What is weird is the value of the heart rate because the sensor is not connected (battery removed)

18:26:23.470 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
18:26:23.470 -> ----------------- Version 02.5 ------------------
18:26:23.470 -> Initialise the Bluefruit nRF52 module: Client (Central)
18:26:23.718 -> FTMS and Chars 'initialized'
18:26:23.718 -> CPS and Chars 'initialized'
18:26:23.718 -> CSCS and Chars 'initialized'
18:26:23.718 -> GA and Chars 'initialized'
18:26:23.718 -> DIS and Chars 'initialized'
18:26:23.718 -> Start Scanning for CPS, CSC and FTMS!
18:26:23.720 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
18:26:23.720 -> Timestamp MAC Address Rssi Data
18:26:23.720 -> 000001552 F8:9C:FC:53:5E:49 -61 09-02-16-18-26-18-18-18-0A-18
18:26:23.720 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
18:26:23.720 -> Now checking all Client Services and Characteristics!
18:26:23.720 -> If Mandatory Services Fail --> the Client will disconnect!
18:26:23.720 -> First checking Generic Access and Device Information Services and Characteristics!
18:26:24.243 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
18:26:24.243 -> Discovering Client FTM Feature Characteristic ... Discovering Client FTM Control Point Characteristic ... Found it!
18:26:24.252 -> Discovering Client FTM Status Characteristic ... Found it!
18:26:24.544 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
18:26:24.823 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
18:26:25.225 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
18:26:25.225 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
18:26:25.457 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
18:26:25.457 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
18:26:25.781 -> Discovering Client Cycling Power (CP) Service ... Ready to receive Client FTM Control Point Response Messages
18:26:25.827 -> Found it! CPS Max Payload: 20 Data Length: 27
18:26:25.827 -> Discovering Client CP Measurement characteristic ... Ready to receive Client FTM Status values
18:26:25.827 -> >>> Couldn't enable notify for Client FTM Training Status Characteristic.
18:26:25.906 -> >>> Couldn't enable notify for Client FTM Indoor Bike Data Characteristic.
18:26:25.906 -> >>> Couldn't enable notify for Client CP Measurement Characteristic.
18:26:25.906 -> >>> Couldn't enable indicate for Client CP Control Point Characteristic.
18:26:25.906 -> >>> Couldn't enable notify for Client CSC Measurement Characteristic.
18:26:25.906 -> Client (Central) is Up and Running!
18:26:26.045 -> Found it!
18:26:26.045 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
18:26:26.541 -> Discovering Client CP Feature characteristic ... Found it!
18:26:26.726 -> -> Client Reads Raw CP Feature bytes: [4] [ 00 00 00 00 ]
18:26:26.726 -> Discovering Client CP Sensor Location characteristic ... NOT Found! NOT Mandatory!
18:26:26.726 -> Discovering Cycling Speed and Cadence (CSC) Service ... Not Found! CSC Service is Not Mandatory!
18:26:27.906 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
18:26:27.970 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
18:26:29.983 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
18:26:30.029 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
18:26:32.045 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
18:26:32.122 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 07 01 ]
18:26:32.122 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 04 ]
18:26:34.127 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]
18:26:34.174 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:26:34.174 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 01 28 33 ]
18:26:36.191 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 00 28 33 00 ]
18:26:36.237 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:26:36.237 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 00 28 33 ]
18:26:38.240 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
18:26:38.317 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:26:38.317 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
18:26:40.324 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 14 00 28 33 00 ]
18:26:40.402 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:26:40.402 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 14 00 28 33 ]
18:26:42.383 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 00 28 33 00 ]
18:26:42.508 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
18:26:42.508 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 00 28 33 ]
18:26:44.510 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 25 00 28 33 00 ]
18:26:44.588 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
I am puzzled about how and what you have changed in the code version 025. I see a while loop that waits for ever until the FTM_Feature_Char is discovered: while (!( client_FTM_Feature_Chr.discover() )) { et cetera }
FTM_Feature was never a problem....??? Did you put while loops in all discover calls...? For what purpose?
Whatever you did: one of the runs now shows -> Client Rec'd Raw FTM Indoor Bike Data: et cetera
That never ever happened before ...... ????
So please detail more and better what you have changed otherwise I am only guessing and that does not help progress...
Greetings,
Jörgen.

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
Still I would like to know more precisely what you have altered in the code of 025... that issue is still open!
Your code snippet is only relevant when you think a timing problem prevents the discovery of the relevant Char's..... (?)
Meanwhile I guessed that (along the same line of reasoning) enabling of the Char's with Notify or Indicate (at the Zwift Hub) might go wrong due to a timing problem...(ItsyBitsy? or Hub?). So I have inserted a timed check for notify/indicate result that gives the polling process two (2) seconds for response....
I wonder if this version 027 will bring us closer to a solution... (You still need to wake up your trainer and ride the trainer!!)

Do not take the IBD decoded data too serious, decoding the IBD data is very complicated and I would not be surprised that I understood it in a wrong way.... although it works fine with Elite Direto specifications! This is not critical for the final result, after all the MITM does not have to understand/decode everything, only what it is interested in...

By the way the FTMS_Zwift_Bridge code v023 can be tested with your setup.... (Notice that you have to pedal as well! Read the instructions)

Best wishes,
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorghen,

To answer the question should I always wake him up?

No with the modification I made I just have to turn on the trainer.
No need to pedal.
So the problem was not a problem of waking up but probably of receiving "char"!

Here is the V.025 that I had to modify.
There are 3 "While" that I had added.

I will test your V0.27.

Sincerely,
Joel

/*********************************************************************
This is programming code for the nRF52 based Bluefruit BLE boards

The code uses heavily the Adafruit supplied Bluefruit BLE libraries !!
Adafruit invests time and resources providing open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!

MIT license, check LICENSE for more information
All text must be included in any redistribution
*********************************************************************/

/*

  • This Feather-nRF52840 tested code scans for the CPS, CSC and FTMS
  • that the trainer is advertising, it tries to connect and then
  • enables .....
  • Requirements: FTMS trainer and Feather nRF52 board
    1. Upload and Run this code on the Feather-nRF52
    1. Start the Serial Monitor to catch verbose debugging and data info
    1. Power ON and Wake UP trainer -> do NOT connect with other devices
    1. Trainer and Feather should successfully pair or disconnect...
    1. Keep the Serial Monitor visible on top of all windows
    1. Move the trainer pedals and notice/feel changes in resistance...
  • The Client sends Resistance Parameters to the Trainer that coincide 
    
  • with the first 5 minutes of the Zwift Volcano Circuit!
    
    1. Inspect the info presented by Serial Monitor.....

*/

// -------------------------------------------------------------------------------------------
// COMPILER DIRECTIVE to allow/suppress SERIAL.PRINT messages that help debugging...
// Uncomment to activate
#define DEBUG
//#define DEBUG_CP_MEASUREMENT
//#define DEBUG_CSC_MEASUREMENT
// --------------------------------------------------------------------------------------------

#include <bluefruit.h>

const uint8_t MAX_PAYLOAD = 20; // Max 20 byte data size for single packet BLE transfer
uint16_t client_Connection_Handle = BLE_CONN_HANDLE_INVALID;

/* Generic Access
#define UUID16_SVC_GENERIC_ACCESS 0x1800
#define UUID16_CHR_DEVICE_NAME 0x2A00
#define UUID16_CHR_APPEARANCE 0x2A01
#define UUID16_CHR_PERIPHERAL_PREFERRED_CONNECTION_PARAMETERS 0x2A04
#define UUID16_CHR_CENTRAL_ADDRESS_RESOLUTION 0x2AA6
*/
BLEClientService client_GenericAccess_Service(UUID16_SVC_GENERIC_ACCESS);
BLEClientCharacteristic client_GA_Appearance_Chr(UUID16_CHR_APPEARANCE); // Read
uint16_t client_GA_Appearance_Value = 0;
BLEClientCharacteristic client_GA_DeviceName_Chr(UUID16_CHR_DEVICE_NAME);// Read, Write
unsigned char client_GA_DeviceName_Data[MAX_PAYLOAD] = {};

/* Cycling Power Service

  • CP Service: 0x1818
  • CP Characteristic: 0x2A63 (Measurement)
  • CP Characteristic: 0x2A65 (Feature)
  • CP Characteristic: 0x2A5D (Location)
  • CP Characteristic: 0x2A66 (Control Point)
    */
    BLEClientService client_CyclingPower_Service(UUID16_SVC_CYCLING_POWER);
    BLEClientCharacteristic client_CP_Measurement_Chr(UUID16_CHR_CYCLING_POWER_MEASUREMENT); // Notify, Read
    BLEClientCharacteristic client_CP_Feature_Chr(UUID16_CHR_CYCLING_POWER_FEATURE); // Read
    uint32_t client_CP_Feature_Flags = 0;
    BLEClientCharacteristic client_CP_Location_Chr(UUID16_CHR_SENSOR_LOCATION); // Read
    uint8_t client_CP_Location_Value = 0; // UINT8
    BLEClientCharacteristic client_CP_ControlPoint_Chr(UUID16_CHR_CYCLING_POWER_CONTROL_POINT); // Indicate, Write

const char* client_CP_Feature_Str[] = {
"Pedal power balance supported",
"Accumulated torque supported",
"Wheel revolution data supported",
"Crank revolution data supported",
"Extreme magnitudes supported",
"Extreme angles supported",
"Top/bottom dead angle supported",
"Accumulated energy supported",
"Offset compensation indicator supported",
"Offset compensation supported",
"Cycling power measurement characteristic content masking supported",
"Multiple sensor locations supported",
"Crank length adj. supported",
"Chain length adj. supported",
"Chain weight adj. supported",
"Span length adj. supported",
"Sensor measurement context",
"Instantaineous measurement direction supported",
"Factory calibrated date supported",
"Enhanced offset compensation supported" };

const char* client_Sensor_Location_Str[] = { "Other", "Top of shoe", "In shoe", "Hip", "Front wheel", "Left crank", "Right crank", "Left pedal",
"Right pedal", "Front hub", "Rear dropout", "Chainstay", "Rear wheel", "Rear hub", "Chest", "Spider", "Chain ring"};

/*

  • Cycling Speed and Cadence Service
  • CSC Service: 0x1816
  • CSC Measurement Characteristic: 0x2A5B
  • CSC Feature Characteristic: 0x2A5C
    /
    /
    CSC Control Point Characteristic:0x2A55 ---> not implemented
    // CSC Control Point op codes
    #define SC_CP_OP_SET_CUMULATIVE_VALUE 1
    #define SC_CP_OP_START_SENSOR_CALIBRATION 2
    #define SC_CP_OP_UPDATE_SENSOR_LOCATION 3
    #define SC_CP_OP_REQ_SUPPORTED_SENSOR_LOCATIONS 4
    #define SC_CP_OP_RESPONSE 16
    // CSC Control Point response values
    #define SC_CP_RESPONSE_SUCCESS 1
    #define SC_CP_RESPONSE_OP_NOT_SUPPORTED 2
    #define SC_CP_RESPONSE_INVALID_PARAM 3
    #define SC_CP_RESPONSE_OP_FAILED 4
    */

/CSC Measurement flags/
#define CSC_MEASUREMENT_WHEEL_REV_PRESENT 0x01
#define CSC_MEASUREMENT_CRANK_REV_PRESENT 0x02

/* CSC Feature flags */
#define CSC_FEATURE_WHEEL_REV_DATA 0x01
#define CSC_FEATURE_CRANK_REV_DATA 0x02
#define CSC_FEATURE_MULTIPLE_SENSOR_LOC 0x04

const char* client_CSC_Feature_Str[] = {"Wheel rev supported", "Crank rev supported", "Multiple locations supported"};

BLEClientService client_CyclingSpeedCadence_Service(UUID16_SVC_CYCLING_SPEED_AND_CADENCE);
BLEClientCharacteristic client_CSC_Measurement_Chr(UUID16_CHR_CSC_MEASUREMENT); // Notify, Read
BLEClientCharacteristic client_CSC_Feature_Chr(UUID16_CHR_CSC_FEATURE); // Read
const uint8_t CSC_FEATURE_FIXED_DATALEN = 2; // UINT16
uint16_t client_CSC_Feature_Flags = 0;
BLEClientCharacteristic client_CSC_Location_Chr(UUID16_CHR_SENSOR_LOCATION); // Read
uint8_t client_CSC_Location_Value = 0;

/* Client Service Device Information
#define UUID16_SVC_DEVICE_INFORMATION 0x180A
#define UUID16_CHR_MODEL_NUMBER_STRING 0x2A24
#define UUID16_CHR_SERIAL_NUMBER_STRING 0x2A25
#define UUID16_CHR_FIRMWARE_REVISION_STRING 0x2A26
#define UUID16_CHR_HARDWARE_REVISION_STRING 0x2A27
#define UUID16_CHR_SOFTWARE_REVISION_STRING 0x2A28
#define UUID16_CHR_MANUFACTURER_NAME_STRING 0x2A29
*/
BLEClientService client_DIS_Service(UUID16_SVC_DEVICE_INFORMATION);
BLEClientCharacteristic client_DIS_ManufacturerName_Chr(UUID16_CHR_MANUFACTURER_NAME_STRING); // Read
char client_DIS_Manufacturer_Str[MAX_PAYLOAD] = {};
BLEClientCharacteristic client_DIS_ModelNumber_Chr(UUID16_CHR_MODEL_NUMBER_STRING); // Read
char client_DIS_ModelNumber_Str[MAX_PAYLOAD] = {};
BLEClientCharacteristic client_DIS_SerialNumber_Chr(UUID16_CHR_SERIAL_NUMBER_STRING); // Read
char client_DIS_SerialNumber_Str[MAX_PAYLOAD] = {};

/*

  • Fitness Machine Service, uuid 0x1826 or 00001826-0000-1000-8000-00805F9B34FB
    #define UUID16_SVC_FITNESS_MACHINE 0x1826
    #define UUID16_CHR_FITNESS_MACHINE_FEATURE 0x2ACC
    #define UUID16_CHR_INDOOR_BIKE_DATA 0x2AD2
    #define UUID16_CHR_TRAINING_STATUS 0x2AD3
    #define UUID16_CHR_SUPPORTED_SPEED_RANGE 0x2AD4
    #define UUID16_CHR_SUPPORTED_INCLINATION_RANGE 0x2AD5
    #define UUID16_CHR_SUPPORTED_RESISTANCE_LEVEL_RANGE 0x2AD6
    #define UUID16_CHR_SUPPORTED_HEART_RATE_RANGE 0x2AD7
    #define UUID16_CHR_SUPPORTED_POWER_RANGE 0x2AD8
    #define UUID16_CHR_FITNESS_MACHINE_CONTROL_POINT 0x2AD9
    #define UUID16_CHR_FITNESS_MACHINE_STATUS 0x2ADA
    */
    BLEClientService client_FitnessMachine_Service(UUID16_SVC_FITNESS_MACHINE); // FTM Service
    // Service characteristics exposed by FTM Service
    BLEClientCharacteristic client_FTM_Feature_Chr(UUID16_CHR_FITNESS_MACHINE_FEATURE); // Fitness Machine Feature, mandatory, read
    const uint8_t FTM_FEATURE_FIXED_DATALEN = 8;
    uint8_t client_FTM_Feature_Data[FTM_FEATURE_FIXED_DATALEN];
    BLEClientCharacteristic client_FTM_IndoorBikeData_Chr(UUID16_CHR_INDOOR_BIKE_DATA); // Indoor Bike Data, optional, notify
    BLEClientCharacteristic client_FTM_TrainingStatus_Chr(UUID16_CHR_TRAINING_STATUS); // Training Status, optional, read & notify
    BLEClientCharacteristic client_FTM_SupportedResistanceLevelRange_Chr(UUID16_CHR_SUPPORTED_RESISTANCE_LEVEL_RANGE); // Supported Resistance Level, read, optional
    const uint8_t FTM_SRLR_FIXED_DATALEN = 6;
    uint8_t client_FTM_SupportedResistanceLevelRange_Data[FTM_SRLR_FIXED_DATALEN];
    BLEClientCharacteristic client_FTM_SupportedPowerRange_Chr(UUID16_CHR_SUPPORTED_POWER_RANGE); // Supported Power Levels, read, optional
    const uint8_t FTM_SPR_FIXED_DATALEN = 6;
    uint8_t client_FTM_SupportedPowerRange_Data[FTM_SPR_FIXED_DATALEN];
    BLEClientCharacteristic client_FTM_ControlPoint_Chr(UUID16_CHR_FITNESS_MACHINE_CONTROL_POINT); // Fitness Machine Control Point, optional, write & indicate
    BLEClientCharacteristic client_FTM_Status_Chr(UUID16_CHR_FITNESS_MACHINE_STATUS); // Fitness Machine Status, mandatory, notify

#define TIME_SPAN 2500 // Time span (delay) in millis 1000 = 1 second
#define CONTROL_POINT_TIME_SPAN 2000 // Time span for sending Control Point data
unsigned long TimeInterval = 0;

// TEST DATA set -----------------------------------------------------
// Test set (Zwift Volcano Circuit) with Control and 2D Resistance data to be sent to Control Point
uint8_t ControlPointMessageCount = 0;
const uint8_t ControlPointData[32][8] = {
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // Request Control
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // Request Control
{0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // Start or Resume
{0x11,0x00,0x00,0x22,0x01,0x28,0x33,0x00}, // Set Indoor Bike Simulation Parameters..
{0x11,0x00,0x00,0x09,0x00,0x28,0x33,0x00},
{0x11,0x00,0x00,0x00,0x00,0x28,0x33,0x00},
{0x11,0x00,0x00,0x14,0x00,0x28,0x33,0x00},
{0x11,0x00,0x00,0x22,0x00,0x28,0x33,0x00},
{0x11,0x00,0x00,0x25,0x00,0x28,0x33,0x00},
{0x11,0x00,0x00,0x23,0x00,0x28,0x33,0x00},
{0x11,0x00,0x00,0x1C,0x00,0x28,0x33,0x00},
{0x11,0x00,0x00,0x0F,0x00,0x28,0x33,0x00},
{0x11,0x00,0x00,0x00,0x00,0x28,0x33,0x00},
{0x11,0x00,0x00,0xF5,0xFF,0x28,0x33,0x00},
{0x11,0x00,0x00,0xE4,0xFF,0x28,0x33,0x00},
{0x11,0x00,0x00,0xCF,0xFF,0x28,0x33,0x00},
{0x11,0x00,0x00,0xA8,0xFF,0x28,0x33,0x00},
{0x11,0x00,0x00,0x84,0xFF,0x28,0x33,0x00},
{0x11,0x00,0x00,0x67,0xFF,0x28,0x33,0x00},
{0x11,0x00,0x00,0x5D,0xFF,0x28,0x33,0x00},
{0x11,0x00,0x00,0x5E,0xFF,0x28,0x33,0x00},
{0x11,0x00,0x00,0x6F,0xFF,0x28,0x33,0x00},
{0x11,0x00,0x00,0x8A,0xFF,0x28,0x33,0x00},
{0x11,0x00,0x00,0xB8,0xFF,0x28,0x33,0x00},
{0x11,0x00,0x00,0x00,0x00,0x28,0x33,0x00},
{0x11,0x00,0x00,0xA2,0x00,0x28,0x33,0x00},
{0x11,0x00,0x00,0x09,0x01,0x28,0x33,0x00},
{0x11,0x00,0x00,0x4F,0x01,0x28,0x33,0x00},
{0x11,0x00,0x00,0x67,0x01,0x28,0x33,0x00},
{0x11,0x00,0x00,0x57,0xFF,0x28,0x33,0x00},
{0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // Stop or Pause
{0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};// Reset
// TEST DATA set ---------------------------------------------------

void setup()
{
#ifdef DEBUG
Serial.begin(115200);
while ( !Serial ) delay(10); // for nrf52840 with native usb

Serial.println(" Feather nRF52 Client/Central: CPS, CSC and FTMS");
Serial.println("----------------- Version 02.5 ------------------");
Serial.println("Initialise the Bluefruit nRF52 module: Client (Central)");
#endif
// Initialize Bluefruit module
// begin (Peripheral = 0, Central = 1)
Bluefruit.begin(0, 1);

Setup_Client_FTMS();
Setup_Client_CPS();
Setup_Client_CSC();
Setup_Client_DIS();
Client_Start_Scanning();

while (Bluefruit.Scanner.isRunning()) { // do nothing else but scanning....
}
TimeInterval = millis() + TIME_SPAN; // ADD just enough delay
// wait enough time or go on when Client/Central is connected and all set!
while( TimeInterval > millis() ) {
}
// Scanning is finished! Are we connected?
// If NO connection is established -> Stop!
if( !(Bluefruit.connected()) ) {
#ifdef DEBUG
Serial.println("Stopped!");

#endif
return;
}
// Try to enable Client (Trainer) CPS, CSC and FTMS data streams...
Client_Enable_Notify_Indicate();
if( !(Bluefruit.connected()) ) { // Are we meanwhile disconnected?
#ifdef DEBUG
Serial.println("Stopped!");

#endif
return;
}
// After successful enable notify/indicate of all mandatory Char's continue!
#ifdef DEBUG
Serial.println("Client (Central) is Up and Running!");
#endif
// Set first timing for sending first set of Control Point Data
TimeInterval = millis() + CONTROL_POINT_TIME_SPAN;
}

void Setup_Client_FTMS(void)
{
// Initialize client FTM Service
client_FitnessMachine_Service.begin();
while( !(client_FitnessMachine_Service.begin()) ) {
Serial.println("Wait for FitnessMachine_Service.begin ");
}
// Initialize client FTM Feature characteristic
client_FTM_Feature_Chr.begin();

// Initialize client FTM Training Status characteristic
client_FTM_TrainingStatus_Chr.setNotifyCallback(client_FTM_TrainingStatus_Notify_callback);

client_FTM_TrainingStatus_Chr.begin();

// Initialize client FTM Supported Power Range characteristic
client_FTM_SupportedPowerRange_Chr.begin();

// Initialize client FTM Supported Resistance Level Range characteristic
client_FTM_SupportedResistanceLevelRange_Chr.begin();

// Initialize client FTM Indoor Bike Data characteristic
client_FTM_IndoorBikeData_Chr.setNotifyCallback(client_FTM_IndoorBikeData_Notify_callback);
client_FTM_IndoorBikeData_Chr.begin();

// Initialize client FTM Control Point characteristic
// For receiving Control Point Responses
client_FTM_ControlPoint_Chr.setIndicateCallback(client_FTM_ControlPoint_Indicate_callback);
client_FTM_ControlPoint_Chr.begin();

// Initialize client FTM Status characteristic
client_FTM_Status_Chr.setNotifyCallback(client_FTM_Status_Notify_callback);
client_FTM_Status_Chr.begin();
#ifdef DEBUG
Serial.println("FTMS and Chars 'initialized'");
#endif
}

void Setup_Client_CPS(void)
{
// Initialize CPS client
client_CyclingPower_Service.begin();

// Initialize CP Feature characteristics of client_CyclingPower_Service.
client_CP_Feature_Chr.begin();

// Initialize CP sensor location characteristics of client_CyclingPower_Service.
client_CP_Location_Chr.begin();

// set up callback for receiving measurement
client_CP_Measurement_Chr.setNotifyCallback(client_CP_Measurement_Chr_notify_callback);
client_CP_Measurement_Chr.begin();

// Initialize Control Point and set up Indicate callback for receiving responses (indicate!)
client_CP_ControlPoint_Chr.setIndicateCallback(client_CP_ControlPoint_Chr_indicate_callback);
client_CP_ControlPoint_Chr.begin();
#ifdef DEBUG
Serial.println("CPS and Chars 'initialized'");
#endif
}

void Setup_Client_CSC(void)
{
// Initialize CSC client
client_CyclingSpeedCadence_Service.begin();

// Initialize client characteristics of CSC.
client_CSC_Location_Chr.begin();

// Initialize CSC Feature characteristics of client_CSC.
client_CSC_Feature_Chr.begin();

// set up callback for receiving measurement
client_CSC_Measurement_Chr.setNotifyCallback(client_CSC_Measurement_Chr_notify_callback);
client_CSC_Measurement_Chr.begin();
#ifdef DEBUG
Serial.println("CSCS and Chars 'initialized'");
#endif
}

void Setup_Client_DIS(void)
{
// Initialize client Generic Access Service
client_GenericAccess_Service.begin();
// Initialize some characteristics of the Generic Access Service.
client_GA_DeviceName_Chr.begin();
client_GA_Appearance_Chr.begin();
#ifdef DEBUG
Serial.println("GA and Chars 'initialized'");
#endif
// Initialize client Device Information Service
client_DIS_Service.begin();
// Initialize some characteristics of the Device Information Service.
client_DIS_ManufacturerName_Chr.begin();
client_DIS_ModelNumber_Chr.begin();
client_DIS_SerialNumber_Chr.begin();
#ifdef DEBUG
Serial.println("DIS and Chars 'initialized'");
#endif
}

void loop()
{

if ( Bluefruit.connected() )
{
// If time is there, send test values of Indoor Bike Simulation Parameters to
// the Trainer's FTM Control Point to drive the FTM...
if(millis() > TimeInterval)
{
if(ControlPointMessageCount > 31) { ControlPointMessageCount = 0; } // start all over again!
uint8_t CPData[8] = {};
#ifdef DEBUG
Serial.print("Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ ");
#endif
// Transfer multidimensional test data to CPData buffer
for (int i = 0; i < sizeof(CPData); i++) {
CPData[i] = ControlPointData[ControlPointMessageCount][i];
#ifdef DEBUG
Serial.printf("%02X ", CPData[i], HEX);
#endif
}
#ifdef DEBUG
Serial.println("] ");
#endif
// client_FTM_ControlPoint_Chr.write(CPData, 8);
client_FTM_ControlPoint_Chr.write_resp(CPData, 8);
TimeInterval = millis() + CONTROL_POINT_TIME_SPAN;
ControlPointMessageCount++;
} // TimeInterval
} // Bluefruit connected
} // end loop

void Client_Start_Scanning(void)
{
/* Start Central Scanning

    • Enable auto scan if disconnected
    • Interval = 100 ms, window = 80 ms
    • Don't use active scan
    • Filter only accept CP service
    • Start(timeout) with timeout = 0 will scan forever (until connected)
      */

// Client/Central Callbacks defined
Bluefruit.Central.setDisconnectCallback(client_disconnect_callback);
Bluefruit.Central.setConnectCallback(client_connect_callback);

Bluefruit.Scanner.setRxCallback(client_scan_callback);
Bluefruit.Scanner.restartOnDisconnect(false); // default -> true !!! in test stage we do not want to RESTART -> false
Bluefruit.Scanner.filterRssi(-70); // original value of -80 , we want to scan only nearby peripherals, so get close to your device !!
Bluefruit.Scanner.setInterval(160, 80); // in unit of 0.625 ms
// only invoke callback if one of these services are advertised --> check for FTMS only later
Bluefruit.Scanner.filterUuid(UUID16_SVC_CYCLING_POWER, UUID16_SVC_CYCLING_SPEED_AND_CADENCE, UUID16_SVC_FITNESS_MACHINE);
Bluefruit.Scanner.useActiveScan(true);
Bluefruit.Scanner.start(0); // 0 = Don't stop scanning or n = after n/100 seconds
#ifdef DEBUG
Serial.println("Start Scanning for CPS, CSC and FTMS!");
delay(100); // To show print message !
#endif
}

void Client_Enable_Notify_Indicate(void)
{
// Reaching here means we are ready to go, let's enable Chars with Indicate/Notify
// ------------------------- Enable FTMS Notify and Indicate ---------------------------------------
if ( client_FTM_ControlPoint_Chr.enableIndicate() ) { // MANDATORY
#ifdef DEBUG
Serial.println("Ready to receive Client FTM Control Point Response Messages");
#endif
} else {
#ifdef DEBUG
Serial.println(">>> Couldn't enable indicate for Client FTM Control Point Characteristic.");
Serial.println("FTMS (trainer) is controlled by another Client (Training App)!");
#endif
Bluefruit.disconnect(client_Connection_Handle);
return;
}

if ( client_FTM_Status_Chr.enableNotify() ) { // MANDATORY
#ifdef DEBUG
Serial.println("Ready to receive Client FTM Status values");
#endif
} else {
#ifdef DEBUG
Serial.println(">>> Couldn't enable notify for Client FTM Status Characteristic.");
Serial.println("FTMS (trainer) is controlled by another Client (Training App)!");
#endif
Bluefruit.disconnect(client_Connection_Handle);
return;
}

if ( client_FTM_TrainingStatus_Chr.enableNotify() ) { // NOT MANDATORY
#ifdef DEBUG
Serial.println("Ready to receive Client FTM Training Status values");
#endif
} else {
#ifdef DEBUG
Serial.println(">>> Couldn't enable notify for Client FTM Training Status Characteristic.");
#endif
}

if ( client_FTM_IndoorBikeData_Chr.enableNotify() ) { // NOT MANDATORY
#ifdef DEBUG
Serial.println("Ready to receive Client FTM Indoor Bike Data values");
#endif
} else {
#ifdef DEBUG
Serial.println(">>> Couldn't enable notify for Client FTM Indoor Bike Data Characteristic.");
#endif
}
// ------------------------- Enable FTMS Notify and Indicate ---------------------------------------
// --------------------- Enable CP and CSC Notify and Indicate ------------------------------------
if ( client_CP_Measurement_Chr.enableNotify() ) { // NOT MANDATORY
#ifdef DEBUG
Serial.println("Ready to receive Client CP Measurement values");
#endif
} else {
#ifdef DEBUG
Serial.println(">>> Couldn't enable notify for Client CP Measurement Characteristic.");
#endif
}

if ( client_CP_ControlPoint_Chr.enableIndicate() ) { // NOT MANDATORY
#ifdef DEBUG
Serial.println("Ready to receive Client CP Control Point Responses");
#endif
} else {
#ifdef DEBUG
Serial.println(">>> Couldn't enable indicate for Client CP Control Point Characteristic.");
#endif
}

if ( client_CSC_Measurement_Chr.enableNotify() ) { // NOT MANDATORY
#ifdef DEBUG
Serial.println("Ready to receive Client CSC Measurement values");
#endif
} else {
#ifdef DEBUG
Serial.println(">>> Couldn't enable notify for Client CSC Measurement Characteristic.");
#endif
}
// ------------------------- Enable CP and CSC Notify and Indicate --------------------------------
}

/**

  • Hooked callback that triggered when a value is sent
  • @param chr Pointer client characteristic that event occurred,
  • @param data Pointer to received data
  • @param len Length of received data
    /
    void client_FTM_TrainingStatus_Notify_callback(BLEClientCharacteristic
    chr, uint8_t* data, uint16_t len)
    {
    #ifdef DEBUG
    uint8_t SDataLen = (uint8_t)len;
    uint8_t SDataBuf[SDataLen] = {};
    // Transfer first the contents of data to buffer (array of chars)
    Serial.printf(" -> Client Rec'd Raw FTM Training Status Data: [%d] [ ", len);
    for (int i = 0; i < sizeof(SDataBuf); i++) {
    SDataBuf[i] = *data++;
    Serial.printf("%02X ", SDataBuf[i], HEX);
    }
    Serial.println("] ");
    #endif
    }

/**

  • Hooked callback that triggered when a value is sent
  • @param chr Pointer client characteristic that event occurred,
  • @param data Pointer to received data
  • @param len Length of received data
    /
    void client_FTM_IndoorBikeData_Notify_callback(BLEClientCharacteristic
    chr, uint8_t* data, uint16_t len)
    {
    #ifdef DEBUG
    // testing
    ParseIndoorBikeData(data, len);
    #endif
    }

#ifdef DEBUG
void ParseIndoorBikeData(uint8_t* data, uint16_t len)
{
// ---> IBD Buffer Data Length depends on data flagged to be present !!!!
uint8_t IBDDataLen = (uint8_t)len;
uint8_t IBDDataBuf[IBDDataLen] = {};
// Transfer first the contents of data to buffer (array of chars)
Serial.printf(" -> Client Rec'd Raw FTM Indoor Bike Data: [%d] [ ", len);
for (int i = 0; i < sizeof(IBDDataBuf); i++) {
IBDDataBuf[i] = *data++;
Serial.printf("%02X ", IBDDataBuf[i], HEX);
}
Serial.println("]");
uint8_t offset = 0;
uint16_t flags = 0;
memcpy(&flags, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
offset += 2; // UINT16
if ((flags & 1) != 0) {
// More Data
Serial.print("More Data!");
}
// if ((flags & 2) != 0) { // (flags & 2) --> true or false Average Speed is always(?) there (tested with Elite Direto XR)
// Average Speed 0.01
uint16_t sim_Speed = 0;
memcpy(&sim_Speed, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Speed: %d KPH", (sim_Speed/100));
offset += 2; // UINT16
// }
if ((flags & 4) != 0) {
// Instantaneous Cadence 0.5
uint16_t inst_Cadence = 0;
memcpy(&inst_Cadence, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Instantaneous Cadence: %d RPM", (inst_Cadence/2));
offset += 2; // UINT16
}
if ((flags & 8) != 0) {
// Average Cadence 0.5
uint16_t av_Cadence = 0;
memcpy(&av_Cadence, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Average Cadence: %d RPM", (av_Cadence/2));
offset += 2; // UINT16
}
if ((flags & 16) != 0) {
// Total Distance 1
// Little endian format, transfer 24 bit to 32 bit variable
uint32_t tot_Distance = 0;
memcpy(&tot_Distance, &IBDDataBuf[offset], 3); // Transfer buffer fields to variable
Serial.printf(" Total Distance: %d m", tot_Distance);
offset += 3; // UINT24 16 + 8
}
if ((flags & 32) != 0) {
// Resistance Level 1
uint16_t res_Level = 0;
memcpy(&res_Level, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Resistance Level: %d ", res_Level);
offset += 2; // UINT16
}
if ((flags & 64) != 0) {
// Instantaneous Power 1
uint16_t inst_Power = 0;
memcpy(&inst_Power, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Instantaneous Power: %d Watt", inst_Power);
offset += 2; // UINT16
}
if ((flags & 128) != 0) {
// Average Power 1
uint16_t av_Power = 0;
memcpy(&av_Power, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Average Power: %d Watt", av_Power);
offset += 2; // UINT16
}
if ((flags & 256) != 0) {
// Expended Energy -> UINT16 UINT16 UINT8
// Total Energy UINT16 1
uint16_t tot_Energy = 0;
memcpy(&tot_Energy, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Tot. Energy: %d kCal", tot_Energy);
offset += 2; // UINT16
// Energy per hour UINT16 1
uint16_t Energy_hr = 0;
memcpy(&Energy_hr, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Energy/hr: %d kCal/hr", Energy_hr);
offset += 2; // UINT16
// Energy per minute UINT8 1
uint8_t Energy_pm = 0;
memcpy(&Energy_pm, &IBDDataBuf[offset], 1); // Transfer buffer fields to variable
Serial.printf(" Energy/m: %d kCal/m", Energy_pm);
offset += 1; // UINT8
}
if ((flags & 512) != 0) {
// Heart Rate 1
uint8_t Heart_Rate = 0;
memcpy(&Heart_Rate, &IBDDataBuf[offset], 1); // Transfer buffer fields to variable
Serial.printf(" Heart Rate: %d HBM", Heart_Rate);
offset += 1; // UINT8
}
if ((flags & 1024) != 0) {
// Metabolic Equivalent 0.1
uint8_t Mets = 0;
memcpy(&Mets, &IBDDataBuf[offset], 1); // Transfer buffer fields to variable
Serial.printf(" Metabolic Equivalent: %d ", Mets/10);
offset += 1; // UINT8
}
if ((flags & 2048) != 0) {
// Elapsed Time 1
uint16_t elap_time = 0;
memcpy(&elap_time, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Elapsed time: %d s", elap_time);
offset += 2; // UINT16
}
if ((flags & 4096) != 0) {
// Remaining Time 1
uint16_t rem_time = 0;
memcpy(&rem_time, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Remaining time: %d s", rem_time);
offset += 2; // UINT16
}
Serial.println();
}
#endif

/**

  • Hooked callback that triggered when a value is sent
  • @param chr Pointer client characteristic that event occurred!
  • @param data Pointer to received data
  • @param len Length of received data
    /
    void client_FTM_ControlPoint_Indicate_callback(BLEClientCharacteristic
    chr, uint8_t* data, uint16_t len)
    {
    #ifdef DEBUG
    uint8_t RespBufferLen = (uint8_t)len;
    uint8_t RespBuffer[RespBufferLen] = {}; // It is max 6 bytes long
    // Transfer first the contents of data to buffer (array of chars)
    Serial.print(" -> Client Rec'd Raw FTM Control Point Response Data: [ ");
    for (int i = 0; i < sizeof(RespBuffer); i++) {
    RespBuffer[i] = *data++;
    Serial.printf("%02X ", RespBuffer[i], HEX);
    }
    Serial.println("]");
    #endif
    }

/**

  • Hooked callback that triggered when a value is sent
  • @param chr Pointer client characteristic that event occurred,
  • @param data Pointer to received data
  • @param len Length of received data
    /
    void client_FTM_Status_Notify_callback(BLEClientCharacteristic
    chr, uint8_t* data, uint16_t len)
    {
    #ifdef DEBUG
    uint8_t SDataLen = (uint8_t)len;
    uint8_t SDataBuf[SDataLen] = {};
    // Transfer first the contents of data to buffer (array of chars)
    Serial.printf(" -> Client Rec'd Raw FTM Machine Status Data: [%d] [ ", len);
    for (int i = 0; i < sizeof(SDataBuf); i++) {
    SDataBuf[i] = *data++;
    Serial.printf("%02X ", SDataBuf[i], HEX);
    }
    Serial.println("] ");
    #endif
    }

// Byte swap unsigned short
uint16_t swap_uint16( uint16_t val )
{
return (val << 8) | (val >> 8 );
}

// Find certain uuid in the data of the received advertising packet
bool checkForUuidPresent(const uint16_t uuid, const uint8_t* reportData, uint8_t reportDataLen)
{
// Enter uuid in printed format like 0x1826 for UUID16_SVC_FITNESS_MACHINE
// uuid is internally stored in Little Endian
for (int i = 0; i < (reportDataLen); i++) { // step 1: never miss out a position!
if( memcmp(&uuid, (reportData+i), 2) == 0) {
return true;
}
}
return false;
}

/**

  • Callback invoked when scanner pick up an advertising data
  • @param report Structural advertising data
    /
    void client_scan_callback(ble_gap_evt_adv_report_t
    report)
    {
    // Since we configure the scanner with filterUuid(CPS, CSC, FTMS)
    // scan_callback is invoked for devices with usually CPS service advertised.
    // However, we only do business with FTMS enabled Trainer types so check
    // for UUID16_SVC_FITNESS_MACHINE to be present, if not --> keep scanning!
    if (!checkForUuidPresent(UUID16_SVC_FITNESS_MACHINE, report->data.p_data, report->data.len)) {
    return; // Keep scanning for FTMS trainer !!
    }
    #ifdef DEBUG
    Serial.println("Found advertising Peripheral with FTMS service!, see the Raw Data packet:");
    Serial.println(F("Timestamp MAC Address Rssi Data"));
    Serial.printf("%09d ", millis());
    // MAC is in little endian --> print reverse
    Serial.printBufferReverse(report->peer_addr.addr, 6, ':');
    Serial.print(F(" "));
    Serial.print(report->rssi);
    Serial.print(F(" "));
    Serial.printBuffer(report->data.p_data, report->data.len, '-');
    Serial.println();
    #endif
    Bluefruit.Central.connect(report);
    }

#ifdef DEBUG
void PrintPeerAddress(uint8_t addr[6])
{
for (int i = 1; i < 6; i++) {
// Display byte by byte in HEX reverse: little Endian
Serial.printf("%02X:",addr[(6-i)], HEX);
}
Serial.printf("%02X ",addr[0], HEX);
}
#endif

/**

  • Callback invoked when an connection is established
  • @param conn_handle
    /
    void client_connect_callback(uint16_t conn_handle)
    {
    char peripheral_name[MAX_PAYLOAD] = { 0 };
    uint8_t peripheral_addr[6] = {0};
    // Get the reference to current connection
    BLEConnection
    connection = Bluefruit.Connection(conn_handle);
    connection->getPeerName(peripheral_name, sizeof(peripheral_name));
    ble_gap_addr_t peer_address = connection->getPeerAddr();
    memcpy(peripheral_addr, peer_address.addr, 6);
    #ifdef DEBUG
    Serial.printf("Feather nRF52 (Central) connected to Trainer (Peripheral) device: [%s] MAC Address: ", peripheral_name);
    PrintPeerAddress(peripheral_addr);
    Serial.println();
    #endif
    client_Connection_Handle = conn_handle;
    #ifdef DEBUG
    Serial.println("Now checking all Client Services and Characteristics!");
    Serial.println("If Mandatory Services Fail --> the Client will disconnect!");
    #endif
    // ---------------------------- GA and DIS SERVICE ------------------------------------------
    #ifdef DEBUG
    Serial.println("First checking Generic Access and Device Information Services and Characteristics!");
    #endif
    // If Generic Access is not found then go on.... NOT FATAL !

while (!(client_GenericAccess_Service.discover(conn_handle))) {
if ( client_GenericAccess_Service.discover(conn_handle) ) {
#ifdef DEBUG
Serial.print(F("Found Client Generic Access\n"));
#endif
if ( client_GA_DeviceName_Chr.discover() ) {
client_GA_DeviceName_Chr.read(client_GA_DeviceName_Data, sizeof(client_GA_DeviceName_Data));
#ifdef DEBUG
Serial.printf(" -> Client Reads Device Name: [%s]\n", client_GA_DeviceName_Data);
#endif
}
if ( client_GA_Appearance_Chr.discover() ) {
client_GA_Appearance_Value = client_GA_Appearance_Chr.read16();
#ifdef DEBUG
Serial.printf(" -> Client Reads Appearance: [%d]\n", client_GA_Appearance_Value);
#endif
}
} // GA
}
while (!( client_DIS_Service.discover(conn_handle) )){
// If DIS is not found then go on.... NOT FATAL !
if ( client_DIS_Service.discover(conn_handle) ) {
#ifdef DEBUG
Serial.print(F("Found Client Device Information\n"));
#endif
// 1
if ( client_DIS_ManufacturerName_Chr.discover() ) {
// read and print out Manufacturer
if ( client_DIS_ManufacturerName_Chr.read(client_DIS_Manufacturer_Str, sizeof(client_DIS_Manufacturer_Str)) ) {
#ifdef DEBUG
Serial.printf(" -> Client Reads Manufacturer: [%s]\n", client_DIS_Manufacturer_Str);
#endif
}
} // 1
// 2
if ( client_DIS_ModelNumber_Chr.discover() ) {
// read and print out Model Number
if ( client_DIS_ModelNumber_Chr.read(client_DIS_ModelNumber_Str, sizeof(client_DIS_ModelNumber_Str)) ) {
#ifdef DEBUG
Serial.printf(" -> Client Reads Model Number: [%s]\n", client_DIS_ModelNumber_Str);
#endif
}
} // 2
// 3
if ( client_DIS_SerialNumber_Chr.discover() ) {
// read and print out Serial Number
if ( client_DIS_SerialNumber_Chr.read(client_DIS_SerialNumber_Str, sizeof(client_DIS_SerialNumber_Str)) ) {
#ifdef DEBUG
Serial.printf(" -> Client Reads Serial Number: [%s]\n", client_DIS_SerialNumber_Str);
#endif
}
} // 3
} // DIS
}

// ---------------------------- END GA and DIS SERVICE ------------------------------------------------

// -----------------------------FTM SERVICE ------------------------------------------------------------
#ifdef DEBUG
Serial.print("Discovering Mandatory Client Fitness Machine (FTM) Service ... ");
#endif
// If FTM is not found, disconnect, resume scanning, and return
if ( client_FitnessMachine_Service.discover(conn_handle) )
{
#ifdef DEBUG
BLEConnection* conn = Bluefruit.Connection(conn_handle);
uint16_t max_payload = conn->getMtu()-3;
uint16_t data_length = conn->getDataLength();
Serial.print("Found it! ");
Serial.printf("FTMS Max Payload: %d Data Length: %d\n", max_payload, data_length);
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found!");
Serial.println("Disconnecting since Client FTM Service is mandatory!");
#endif
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
return;
}

#ifdef DEBUG
Serial.print("Discovering Client FTM Feature Characteristic ... ");
#endif
// If FTM Feature is not found, disconnect, resume scanning, and return
while (!( client_FTM_Feature_Chr.discover() ))
{
if ( client_FTM_Feature_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
// Read FTM Feature Data
client_FTM_Feature_Chr.read(client_FTM_Feature_Data, 8);
#ifdef DEBUG
Serial.print(" -> Client Reads Raw FTM Feature bytes: [8] [ ");
for (int i = 0; i < sizeof(client_FTM_Feature_Data); i++) {
Serial.printf("%02X ", client_FTM_Feature_Data[i], HEX);
} // for
Serial.println("] ");
#endif
} else {
#ifdef DEBUG
Serial.println("Disconnecting since Client FTM Feature Characteristic is mandatory!");
#endif
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
Bluefruit.Connection(conn_handle);
Serial.print("Discovering Client FTM Feature not decouvert ... ");
// return;
}
}

#ifdef DEBUG
Serial.print("Discovering Client FTM Control Point Characteristic ... ");
#endif
// If FTM Control Point is not found, disconnect, resume scanning, and return
if ( client_FTM_ControlPoint_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found!");
Serial.println("Disconnecting since Client FTM Control Point Characteristic is mandatory!");
#endif
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
return;
}

#ifdef DEBUG
Serial.print("Discovering Client FTM Status Characteristic ... ");
#endif
// If FTM Status is not found, disconnect, resume scanning, and return
if ( client_FTM_Status_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found!");
Serial.println("Disconnecting since Client FTM Status Characteristic is mandatory!");
#endif
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
return;
}

#ifdef DEBUG
Serial.print("Discovering Client FTM Training Status Characteristic ... ");
#endif
// FTM Training Status is NOT MANDATORY
if ( client_FTM_TrainingStatus_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found! Not Mandatory");
#endif
}
/*
#ifdef DEBUG
Serial.println("Not Found!");
Serial.println("Disconnecting since Client FTM Characteristic is mandatory!");
#endif
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
return;
*/

#ifdef DEBUG
Serial.print("Discovering Client FTM Supported Resistance Level Range Characteristic ... ");
#endif
// FTM SupportedResistanceLevelRange is not mandatory!
if ( client_FTM_SupportedResistanceLevelRange_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
// Read Supported Resistance Level Range Data
client_FTM_SupportedResistanceLevelRange_Chr.read(client_FTM_SupportedResistanceLevelRange_Data, 6);
#ifdef DEBUG
Serial.print(" -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ ");
for (int i = 0; i < sizeof(client_FTM_SupportedResistanceLevelRange_Data); i++) {
Serial.printf("%02X ", client_FTM_SupportedResistanceLevelRange_Data[i], HEX);
} // for
Serial.println("] ");
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found! NOT mandatory!");
#endif
}
/*
Serial.println("Disconnecting since Client FTM Supported Resistance Level Range Characteristic is mandatory!");
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
return;
*/

#ifdef DEBUG
Serial.print("Discovering Client FTM Supported Power Range Characteristic ... ");
#endif
// FTM SupportedPowerRange is not mandatory!
if ( client_FTM_SupportedPowerRange_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
// Read Supported Resistance Level Range values
client_FTM_SupportedPowerRange_Chr.read(client_FTM_SupportedPowerRange_Data, 6);
#ifdef DEBUG
Serial.print(" -> Client Reads Raw FTM Supported Power Range bytes: [6] [ ");
for (int i = 0; i < sizeof(client_FTM_SupportedPowerRange_Data); i++) {
Serial.printf("%02X ", client_FTM_SupportedPowerRange_Data[i], HEX);
} // for
Serial.println("] ");
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found! NOT mandatory!");
#endif
}
/*
#ifdef DEBUG
Serial.println("Disconnecting since Client FTM Supported Power Range Characteristic is mandatory!");
#endif
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
return;
*/

#ifdef DEBUG
Serial.print("Discovering Client FTM Indoor Bike Data Characteristic ... ");
#endif
// FTM Indoor Bike Data is not mandatory
if ( client_FTM_IndoorBikeData_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found! Not Mandatory");
#endif
}
/*
#ifdef DEBUG
Serial.println("Not Found!");
Serial.println("Disconnecting since Client FTM Indoor Bike Data Characteristic is mandatory!");
#endif
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
return;
/
// ---------------------------- End FTM SERVICE ---------------------------------------------
// ---------------------------- CP SERVICE --------------------------------------------------
#ifdef DEBUG
Serial.print("Discovering Client Cycling Power (CP) Service ... ");
#endif
// If CPS is not found, disconnect, resume scanning, and return
if ( client_CyclingPower_Service.discover(conn_handle) )
{
#ifdef DEBUG
BLEConnection
conn = Bluefruit.Connection(conn_handle);
uint16_t max_payload = conn->getMtu()-3;
uint16_t data_length = conn->getDataLength();
Serial.print("Found it! ");
Serial.printf("CPS Max Payload: %d Data Length: %d\n", max_payload, data_length);
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found!");
Serial.println("Disconnecting since Client Cyling Power Service is mandatory!");
#endif
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
return;
}

#ifdef DEBUG
Serial.print("Discovering Client CP Measurement characteristic ... ");
#endif
if ( !client_CP_Measurement_Chr.discover() )
{
// Measurement chr is mandatory, if it is not found (valid), then disconnect
#ifdef DEBUG
Serial.println("Not Found!");
Serial.println("Disconnecting since Client CP Measurement Characteristic is mandatory!");
#endif
Bluefruit.disconnect(conn_handle);
return;
} else {
#ifdef DEBUG
Serial.println("Found it!");
#endif
}

#ifdef DEBUG
Serial.print("Discovering Client CP Control Point characteristic ... ");
#endif
if ( client_CP_ControlPoint_Chr.discover() )
{
// CP Control Point chr is not mandatory
#ifdef DEBUG
Serial.println("Found it!");
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found! NOT Mandatory!");
#endif
}

#ifdef DEBUG
Serial.print("Discovering Client CP Feature characteristic ... ");
#endif
if ( client_CP_Feature_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
// Configure the Cycle Power Feature characteristic
// Properties = Read
// Min Len = 1
// Max Len = 32
// B0:3 = UINT8 - Cycling Power Feature (MANDATORY)
// b0 = Pedal power balance supported; 0 = false, 1 = true
// b1 = Accumulated torque supported; 0 = false, 1 = true
// b2 = Wheel revolution data supported; 0 = false, 1 = true
// b3 = Crank revolution data supported; 0 = false, 1 = true
// b4 = Extreme magnatudes supported; 0 = false, 1 = true
// b5 = Extreme angles supported; 0 = false, 1 = true
// b6 = Top/bottom dead angle supported; 0 = false, 1 = true
// b7 = Accumulated energy supported; 0 = false, 1 = true
// b8 = Offset compensation indicator supported; 0 = false, 1 = true
// b9 = Offset compensation supported; 0 = false, 1 = true
// b10 = Cycling power measurement characteristic content masking supported; 0 = false, 1 = true
// b11 = Multiple sensor locations supported; 0 = false, 1 = true
// b12 = Crank length adj. supported; 0 = false, 1 = true
// b13 = Chain length adj. supported; 0 = false, 1 = true
// b14 = Chain weight adj. supported; 0 = false, 1 = true
// b15 = Span length adj. supported; 0 = false, 1 = true
// b16 = Sensor measurement context; 0 = force, 1 = torque
// b17 = Instantaineous measurement direction supported; 0 = false, 1 = true
// b18 = Factory calibrated date supported; 0 = false, 1 = true
// b19 = Enhanced offset compensation supported; 0 = false, 1 = true
// b20:21 = Distribtue system support; 0 = legacy, 1 = not supported, 2 = supported, 3 = RFU
// b22:32 = Reserved

// Read 32-bit client_CP_Feature_Chr value
client_CP_Feature_Flags = client_CP_Feature_Chr.read32();
#ifdef DEBUG
const uint8_t CPFC_FIXED_DATALEN = 4;
uint8_t cpfcData[CPFC_FIXED_DATALEN] = {(uint8_t)(client_CP_Feature_Flags & 0xff), (uint8_t)(client_CP_Feature_Flags >> 8),
(uint8_t)(client_CP_Feature_Flags >> 16), (uint8_t)(client_CP_Feature_Flags >> 24)};
Serial.print(" -> Client Reads Raw CP Feature bytes: [4] [ ");
for (int i = 0; i < CPFC_FIXED_DATALEN; i++) {
if ( i <= sizeof(cpfcData)) {
Serial.printf("%02X ", cpfcData[i], HEX);
}
}
Serial.println("] ");
for (int i = 0; i < sizeof(client_CP_Feature_Str); i++) {
if ( client_CP_Feature_Flags & (1 << i) )
{
Serial.println(client_CP_Feature_Str[i]);
}
}
#endif
} else {
#ifdef DEBUG
Serial.println("NOT Found! NOT Mandatory!");
#endif
}

#ifdef DEBUG
Serial.print("Discovering Client CP Sensor Location characteristic ... ");
#endif
if ( client_CP_Location_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
// The Sensor Location characteristic
// Properties = Read
// Min Len = 1
// Max Len = 1
// B0:1 = UINT8 - Sensor Location

// Read 8-bit client CP sensor location value
client_CP_Location_Value = client_CP_Location_Chr.read8();   

#ifdef DEBUG
Serial.print(" -> Client Reads CP Location Sensor: ");
Serial.printf("Loc#: %d %s\n", client_CP_Location_Value, client_Sensor_Location_Str[client_CP_Location_Value]);
#endif
} else {
#ifdef DEBUG
Serial.println("NOT Found! NOT Mandatory!");
#endif
}
// ---------------------------- END CP SERVICE ------------------------------------------------
// ---------------------------- CSC SERVICE --------------------------------------------------
#ifdef DEBUG
Serial.print("Discovering Cycling Speed and Cadence (CSC) Service ... ");
#endif
if ( client_CyclingSpeedCadence_Service.discover(conn_handle) ) // UUID16_SVC_CYCLING_SPEED_AND_CADENCE
{
#ifdef DEBUG
BLEConnection* conn = Bluefruit.Connection(conn_handle);
uint16_t max_payload = conn->getMtu()-3;
uint16_t data_length = conn->getDataLength();
Serial.print("Found it! ");
Serial.printf("CSCS Max Payload: %d Data Length: %d\n", max_payload, data_length);
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found! CSC Service is Not Mandatory!");
#endif
return; // NO CSC -> end of client_connect_callback !!
}
/*
// Is Mandatory
#ifdef DEBUG
Serial.println("Not Found and disconnecting!");
Serial.println("CSC Service is mandatory!");
#endif
Bluefruit.disconnect(conn_handle);
return;
*/

// Test for client CSC Characteristics when the client CSC Service is existing
#ifdef DEBUG
Serial.print("Discovering Client CSC Measurement CHR ... ");
#endif
if ( client_CSC_Measurement_Chr.discover() ) // UUID16_CHR_CSC_MEASUREMENT
{
#ifdef DEBUG
Serial.println("Found it! ");
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found! Not Mandatory!");
#endif
}
/*
// Is Mandatory
#ifdef DEBUG
Serial.println("Not Found!");
Serial.println("Disconnecting since Client CSC Measurement CHR is mandatory!");
#endif
Bluefruit.disconnect(conn_handle);
return;
*/

#ifdef DEBUG
Serial.print("Discovering Client CSC Location CHR ... ");
#endif
if ( client_CSC_Location_Chr.discover() ) // UUID16_CHR_SENSOR_LOCATION
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
// Read 16-bit client CSC sensor location value
client_CSC_Location_Value = client_CSC_Location_Chr.read8();
#ifdef DEBUG
Serial.print(" -> Client Reads CSC Location Sensor: ");
Serial.printf("Loc#: %d %s\n", client_CSC_Location_Value, client_Sensor_Location_Str[client_CSC_Location_Value]);
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found! NOT Mandatory!");
#endif
}

#ifdef DEBUG
Serial.print("Discovering Client CSC Feature CHR ... ");
#endif
if ( client_CSC_Feature_Chr.discover() ) // UUID16_CHR_CSC_FEATURE
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
// Read sensor CSC Feature value in 16 bit
client_CSC_Feature_Flags = client_CSC_Feature_Chr.read16();
#ifdef DEBUG
uint8_t cscfcData[CSC_FEATURE_FIXED_DATALEN] = { (uint8_t)(client_CSC_Feature_Flags & 0xff), (uint8_t)(client_CSC_Feature_Flags >> 8) }; // Little Endian Representation
Serial.printf(" -> Client Reads Raw CSC Feature bytes: [2] [ ");
for (int i = 0; i < sizeof(cscfcData); i++) {
Serial.printf("%02X ", cscfcData[i], HEX);
}
Serial.println("] ");
for (int i = 0; i < sizeof(client_CSC_Feature_Str); i++) {
if ( (client_CSC_Feature_Flags & (1 << i)) != 0 )
{
Serial.println(client_CSC_Feature_Str[i]);
}
}
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found! NOT Mandatory!");
#endif
}
// ---------------------------- END CSC SERVICE ---------------------------------------------
} // End client_connect_callback

/**

  • Callback invoked when a connection is dropped
  • @param conn_handle
  • @param reason is a BLE_HCI_STATUS_CODE which can be found in ble_hci.h
    */
    void client_disconnect_callback(uint16_t conn_handle, uint8_t reason)
    {
    client_Connection_Handle = BLE_CONN_HANDLE_INVALID;
    #ifdef DEBUG
    Serial.print("Client Disconnected, reason = 0x"); Serial.println(reason, HEX);
    Serial.println(">>> Restart the Feather nRF52 Client for a new run! <<<");
    #endif
    }

/**

  • Hooked callback that triggered when a measurement value is sent from peripheral
  • @param chr Pointer client characteristic that even occurred,
  •          in this example it should be cpmc
    
  • @param data Pointer to received data
  • @param len Length of received data
    /
    void client_CP_Measurement_Chr_notify_callback(BLEClientCharacteristic
    chr, uint8_t* data, uint16_t len)
    {
    #ifdef DEBUG_CP_MEASUREMENT
    uint8_t buffer[len]= {}; /*{ (uint8_t)(cpmcDef & 0xff), (uint8_t)(cpmcDef >> 8), // flags
    (uint8_t)(powerOut & 0xff), (uint8_t)(powerOut >> 8), // inst. power
    0, // bal
    0, 0, // torque
    0, 0, 0, 0, // cum. rev
    0, 0, // wheel time
    0, 0, // cum. crank
    0, 0, // crank time
    0, 0, // max force
    0, 0, // min force
    0, 0, // max tor
    0, 0, // min tor
    0, 0, // max ang
    0, 0, // min ang
    0, 0, // tdc
    0, 0, // bdc
    0, 0 }; // total energy
    */
    // Transfer first the contents of data to buffer (array of chars)
    Serial.printf(" -> Client Rec'd Raw CP Data: [%d] [ ", len);
    for (int i = 0; i < sizeof(buffer); i++) {
    if ( i <= sizeof(buffer)) {
    buffer[i] = *data++;
    Serial.printf("%02X ", buffer[i], HEX);
    }
    }
    Serial.print("] ");

uint8_t offset = 0;
// Get flags field
uint16_t flags = 0;
memcpy(&flags, &buffer[offset], 2); // Transfer buffer fields to variable
offset += 2; // UINT16
// Get Instantaneous Power values UINT16
uint16_t PowerValue = 0;
memcpy(&PowerValue, &buffer[offset], 2); // Transfer buffer fields to variable
offset += 2; // UINT16
Serial.printf("Instantaneous Power: %4d\n", PowerValue);
// Get the other CP measurement values
if ((flags & 1) != 0) {
// Power Balance Present
Serial.print(" --> Pedal Power Balance!");
}
if ((flags & 2) != 0) {
// Accumulated Torque
Serial.println(" --> Accumulated Torque!");
}
// etcetera...
#endif
} // End cpmc_notify_callback

/**

  • Hooked callback that triggered when a measurement value is sent from peripheral
  • @param chr Pointer client characteristic that even occurred,
  •          in this example it should be client_CP_ControlPoint_Chr
    
  • @param data Pointer to received data
  • @param len Length of received data
    /
    void client_CP_ControlPoint_Chr_indicate_callback(BLEClientCharacteristic
    chr, uint8_t* data, uint16_t len)
    {
    /*
    static const unsigned MAX_CONTROL_BYTES = 5;
    const uint8_t RESPONSE_SUCCESS = 1;
    const uint8_t RESPONSE_OP_CODE_NOT_SUPPORTED = 2;
    const uint8_t RESPONSE_INVALID_PARAMETER = 3;
    const uint8_t RESPONSE_OPERATION_FAILED = 4;
    const uint8_t OPCODE_RESPONSE_CODE = 32;
    Len = 3
    cpcpData[0] = Response Code = 0x20 // 32 Decimal
    cpcpData[1] = OpCode
    cpcpData[2] = responseValue
    Len = 5
    cpcpData[3] = (uint8_t)(responseParameter & 0xFF);
    cpcpData[4] = (uint8_t)(responseParameter >> 8);
    */

// Handle the response message

#ifdef DEBUG
uint8_t cpcpDataLen = (uint8_t)len;
uint8_t cpcpData[cpcpDataLen]= {};
// Transfer first the contents of data to buffer (array of chars)
Serial.printf(" -> Client Rec'd Raw CP Control Point Data: [%d] [ ", len);
for (int i = 0; i < sizeof(cpcpData); i++) {
cpcpData[i] = *data++;
Serial.printf("%02X ", cpcpData[i], HEX);
}
Serial.print("] ");
#endif
}

/**

  • Hooked callback that triggered when a measurement value is sent from peripheral
  • @param chr Pointer client characteristic that even occurred,
  •          in this example it should be cpmc
    
  • @param data Pointer to received data
  • @param len Length of received data
    /
    void client_CSC_Measurement_Chr_notify_callback(BLEClientCharacteristic
    chr, uint8_t* data, uint16_t len)
    {
    #ifdef DEBUG_CSC_MEASUREMENT
    uint8_t buffer[len]= {};
    // Transfer first the contents of data to buffer (array of chars)
    Serial.printf(" -> Client Rec'd Raw CSC Data: [%d] [ ", len);
    for (int i = 0; i < len; i++) {
    if ( i <= sizeof(buffer)) {
    buffer[i] = data++;
    Serial.printf("%02X ", buffer[i], HEX);
    }
    }
    Serial.print("] ");
    uint8_t offset = 0;
    // we define the offset that is to be used when reading the next field
    // Size of variables (e.g. 2 (16) or 4 bytes (32)) are constants in BluetoothGattCharacteristic
    // these represent the values you can find in the "Value Fields" table in the "Format" column
    // Read the Flags field at buffer[0]
    uint8_t flags = buffer[offset];
    offset += 1; // UINT8
    // we have to check the flags' nth bit to see if C1 field exists
    if ((flags & 1) != 0) {
    uint32_t cum_wheel_rev = 0;
    memcpy(&cum_wheel_rev, &buffer[offset], 4);
    offset += 4; // UINT32
    uint16_t last_wheel_event = 0;
    memcpy(&last_wheel_event, &buffer[offset], 2);
    offset += 2; // UINT16
    Serial.printf(" Cum. wheel rev.: %d Last wheel event: %d ", cum_wheel_rev, last_wheel_event);
    /
    Calculation of speed at the Collector can be derived from the wheel circumference and
  • data in two successive measurements. The Collector calculation can be performed as
  • shown below:
  • Speed = (Difference in two successive Cumulative Wheel Revolution values * Wheel Circumference)
  •     / (Difference in two successive Last Wheel Event Time values)
    

/
}
// we have to check the flags' nth bit to see if C2 field exists
if ((flags & 2) != 0) {
uint16_t cum_cranks = 0;
memcpy(&cum_cranks, &buffer[offset], 2);
offset += 2; // UINT16
uint16_t last_crank_event = 0;
memcpy(&last_crank_event, &buffer[offset], 2);
offset += 2; // UINT16
Serial.printf(" Cum cranks: %d Last crank event: %d", cum_cranks, last_crank_event);
/
Calculation of cadence at the Collector can be derived from data in two successive

  • measurements. The Collector calculation can be performed as shown below:
  • Cadence = (Difference in two successive Cumulative Crank Revolution values)
  •       / (Difference in two successive Last Crank Event Time values)        
    

*/
}
// etcetera...
Serial.println();
#endif
}

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Dear Jörghen,

Here is the disappointing result.

The problem is still the same no feedback with V0.27

Let's not lose heart!

123456789101112131415161718192021
/*********************************************************************
This is programming code for the nRF52 based Bluefruit BLE boards

The code uses heavily the Adafruit supplied Bluefruit BLE libraries !!
Adafruit invests time and resources providing open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!

MIT license, check LICENSE for more information
All text must be included in any redistribution

Message (Enter to send message to 'Adafruit ItsyBitsy nRF52840 Express' on 'COM11')
New Line
115200 baud
16:59:01.080 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
16:59:01.080 -> ----------------- Version 02.7 ------------------
16:59:01.080 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:59:01.205 -> FTMS and Chars 'initialized'
16:59:01.205 -> CPS and Chars 'initialized'
16:59:01.205 -> CSCS and Chars 'initialized'
16:59:01.205 -> GA and Chars 'initialized'
16:59:01.205 -> DIS and Chars 'initialized'
16:59:01.205 -> Start Scanning for CPS, CSC and FTMS!
16:59:01.434 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:59:01.434 -> Timestamp MAC Address Rssi Data
16:59:01.434 -> 000091471 F8:9C:FC:53:5E:49 -59 09-02-16-18-26-18-18-18-0A-18
16:59:01.575 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:59:01.575 -> Now checking all Client Services and Characteristics!
16:59:01.575 -> If Mandatory Services Fail --> the Client will disconnect!
16:59:01.575 -> First checking Generic Access and Device Information Services and Characteristics!
16:59:01.668 -> Found Client Generic Access
16:59:01.808 -> -> Client Reads Device Name: [Zwift Hub]
16:59:02.042 -> -> Client Reads Appearance: [0]
16:59:02.042 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
16:59:02.042 -> Disconnecting since Client FTM Service is mandatory!
16:59:02.121 -> Client Disconnected, reason = 0x16
16:59:02.121 -> >>> Restart the Feather nRF52 Client for a new run! <<<
16:59:12.257 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
16:59:12.257 -> ----------------- Version 02.7 ------------------
16:59:12.257 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:59:12.257 -> FTMS and Chars 'initialized'
16:59:12.257 -> CPS and Chars 'initialized'
16:59:12.257 -> CSCS and Chars 'initialized'
16:59:12.257 -> GA and Chars 'initialized'
16:59:12.257 -> DIS and Chars 'initialized'
16:59:12.257 -> Start Scanning for CPS, CSC and FTMS!
16:59:12.258 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:59:12.258 -> Timestamp MAC Address Rssi Data
16:59:12.258 -> 000001100 F8:9C:FC:53:5E:49 -55 09-02-16-18-26-18-18-18-0A-18
16:59:12.258 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:59:12.258 -> Now checking all Client Services and Characteristics!
16:59:12.258 -> If Mandatory Services Fail --> the Client will disconnect!
16:59:12.258 -> First checking Generic Access and Device Information Services and Characteristics!
16:59:12.266 -> Found Client Generic Access
16:59:12.266 -> -> Client Reads Device Name: [Zwift Hub]
16:59:12.266 -> -> Client Reads Appearance: [1152]
16:59:12.266 -> Found Client Device Information
16:59:12.266 -> -> Client Reads Manufacturer: [Zwift]

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Here is the result of FTMS_Zwift_Bridge_v023:

17:15:10.800 -> Feather nRF52840 MITM supporting: CPS, CSC and FTMS
17:15:10.800 -> ------------------ Version 02.3 ---------------------
17:15:10.804 -> FTM Service and Chars are 'initialized'
17:15:10.804 -> CP Service and Chars are 'initialized'
17:15:10.804 -> CSC Service and Chars are 'initialized'
17:15:10.804 -> Generic Access Service and Chars are 'initialized'
17:15:10.804 -> Device Information Service and Chars are 'initialized'
17:15:10.804 -> Start Client-side Scanning for CPS, CSC and FTMS!
17:15:10.805 -> Found advertising Peripheral with FTMS enabled! See Raw data packet:
17:15:10.805 -> Timestamp Addr Rssi Data
17:15:10.805 -> 000001606 F8:9C:FC:53:5E:49 -55 09-02-16-18-26-18-18-18-0A-18
17:15:10.805 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:15:10.805 -> Now checking all mandatory Client Services and Characteristics!
17:15:10.805 -> If Mandatory Services Fail --> the Client will disconnect!
17:15:10.805 -> First checking Generic Access and Device Information Services and Characteristics!
17:15:10.828 -> Found Client Generic Access
17:15:10.828 -> -> Client Reads Device Name: [Zwift Hub]
17:15:10.828 -> -> Client Reads Appearance: [1152]
17:15:10.828 -> Found Client Device Information
17:15:10.828 -> -> Client Reads Manufacturer: [Zwift]
17:15:10.829 -> -> Client Reads Model Number: [06]
17:15:10.920 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:15:10.920 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:15:11.008 -> Discovering Client FTM Feature Characteristic ... Found it!
17:15:11.124 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
17:15:11.124 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:15:11.703 -> Discovering Client FTM Status Characteristic ... Found it!
17:15:11.984 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:15:12.285 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:15:12.402 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
17:15:12.402 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
17:15:12.742 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 00 00 00 00 ]
17:15:12.742 -> Discovering Client FTM Indoor Bike Data Characteristic ... Not Found! Not Mandatory
17:15:12.742 -> Discovering Client Cycling Power (CP) Service ... Not Found!
17:15:12.742 -> Disconnecting since Client Cyling Power Service is mandatory!
17:15:12.834 -> Client disconnected from Peripheral Device: [Zwift Hub], reason: [16]
17:15:27.560 -> Feather nRF52840 MITM supporting: CPS, CSC and FTMS
17:15:27.560 -> ------------------ Version 02.3 ---------------------
17:15:27.822 -> FTM Service and Chars are 'initialized'
17:15:27.822 -> CP Service and Chars are 'initialized'
17:15:27.822 -> CSC Service and Chars are 'initialized'
17:15:27.822 -> Generic Access Service and Chars are 'initialized'
17:15:27.822 -> Device Information Service and Chars are 'initialized'
17:15:27.822 -> Start Client-side Scanning for CPS, CSC and FTMS!
17:15:27.836 -> Found advertising Peripheral with FTMS enabled! See Raw data packet:
17:15:27.836 -> Timestamp Addr Rssi Data
17:15:27.836 -> 000001270 F8:9C:FC:53:5E:49 -60 09-02-16-18-26-18-18-18-0A-18
17:15:27.836 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:15:27.836 -> Now checking all mandatory Client Services and Characteristics!
17:15:27.836 -> If Mandatory Services Fail --> the Client will disconnect!
17:15:27.836 -> First checking Generic Access and Device Information Services and Characteristics!

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

I'll see if with the "While" in the "Bridge V23" version if it's better

The cadence is OK but I don't have the Watts!?

20221215_181851

Here is the modified code and the results :

/*********************************************************************
This is programming code for the nRF52 based Bluefruit BLE boards

The code uses heavily the Adafruit supplied Bluefruit BLE libraries !!
Adafruit invests time and resources providing open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!

    MIT license, check LICENSE for more information
    All text must be included in any redistribution

*********************************************************************/

/* -----------------------------------------------------------------------------------------------------
This code should work with all indoor cycling trainers that fully support,
Fitness Machine Service, Cycling Power Service and Cycling Speed & Cadence Service

The code links a BLE Server (a peripheral to Zwift) and a BLE Client (a central to the Trainer) with a bridge
in between, the Feather nRF52 being man-in-the-middle (MITM).
The nRF52-bridge can control, filter and alter the bi-directional interchanged data!
The client-side (central) scans and connects with the trainer relevant services: FTMS, CPS and CSC. It collects
all cyling data of the services and passes these on to the server-side....
The client-side supplies the indoor trainer with target and resistance control data.
The server-side (peripheral) advertises and enables connection with cycling apps like Zwift and collects the app's
control commands, target and resistance data. It passes these on to the client-side....
The server-side supplies the app with the generated cycling data in return.

The client plus server (MITM) are transparent to the indoor trainer as well as to the training app Zwift or alike!

Requirements: Zwift app or alike, Feather nRF52 board and a FTMS/CPS/CSC supporting indoor trainer
1) Upload and Run this code on the Feather nRF52
2) Start the Serial Monitor to catch debugging info
3) Start/Power On the indoor trainer
4) Feather nRF52 and trainer (with <name>) will pair as reported in the output
5) Start Zwift on your computer or tablet and wait....
6) Search on the Zwift pairing screens for the Feather nRF52 a.k.a. "Sim <name>"
7) Pair: Power, Cadence and Controllable one after another with "Sim <name>"
8) Optionally one can pair as well devices for heartrate and/or steering (Sterzo)
9) Start the default Zwift ride or any ride you wish
  1. Make Serial Monitor output window visible on top of the Zwift window
  2. Hop on the bike: do the work and feel resistance change with the road
  3. Inspect the info presented by Serial Monitor.....
Your trainer's device <name> is modified by the bridge to "Sim <name>", to allow for a clear distinction
between the bridge (simulating your trainer) and your original trainer, when advertising the trainer's services!
You will notice this only when connecting to Zwift on the pairing screens! Notice: Zwift extends device names with
additional numbers for identification!

*/

// -------------------------------------------------------------------------------------------
// COMPILER DIRECTIVE to allow/suppress SERIAL.PRINT messages that help debugging...
// Uncomment to activate
#define DEBUG
// Restrict activating one or more of the following DEBUG directives --> process intensive
// Have caused spurious side effects like a loss of quality of service handling!!
//#define DEBUG_CP_MEASUREMENT
//#define DEBUG_CSC_MEASUREMENT
//#define DEBUG_FTM_INDOORBIKEDATA
// --------------------------------------------------------------------------------------------

#include <bluefruit.h>

const uint8_t MAX_PAYLOAD = 20; // Max 20 byte data size for single packet BLE transfer

// Struct containing Device info to administer dis/connected devices
typedef struct
{
uint8_t PeerAddress[6];
char PeerName[MAX_PAYLOAD];
uint16_t conn_handle;
bool IsConnected;
} Device_info_t;
// -----------------------------------------------------------------
// Your hardware MAC/DEVICE ADDRESSES
// Laptop/Desktop Device Address that runs Zwift, in printed format: [00:01:02:03:04:05]
// Little Endian: in reversed order !!!!
#define LAPTOPADDRESS {0x18,0x52,0x53,0x22,0x11,0x58}
// Trainer FTMS enabled Device Address, in printed format: [00:01:02:03:04:05]
// Little Endian: in reversed order !!!!
#define TRAINERADDRESS {0x49,0x5E,0x53,0xFC,0x9C,0xF8}

// -----------------------------------------------------------------
// Initialize connectable device registration
Device_info_t Trainer = {TRAINERADDRESS, {0x00}, BLE_CONN_HANDLE_INVALID, false};
Device_info_t Laptop = { LAPTOPADDRESS, {0x00}, BLE_CONN_HANDLE_INVALID, false};
Device_info_t Smartphone = { {0x00}, {0x00}, BLE_CONN_HANDLE_INVALID, false};
// ----------------------------------------------------------------------------------

/* Generic Access
#define UUID16_SVC_GENERIC_ACCESS 0x1800
#define UUID16_CHR_DEVICE_NAME 0x2A00
#define UUID16_CHR_APPEARANCE 0x2A01
#define UUID16_CHR_PERIPHERAL_PREFERRED_CONNECTION_PARAMETERS 0x2A04 ---> not implemented
#define UUID16_CHR_CENTRAL_ADDRESS_RESOLUTION 0x2AA6 ---> not implemented
*/
BLEClientService client_GenericAccess_Service(UUID16_SVC_GENERIC_ACCESS); // Optional
BLEClientCharacteristic client_GA_Appearance_Chr(UUID16_CHR_APPEARANCE); // Read
uint16_t client_GA_Appearance_Value = 0;
BLEClientCharacteristic client_GA_DeviceName_Chr(UUID16_CHR_DEVICE_NAME); // Read, Write
unsigned char client_GA_DeviceName_Data[MAX_PAYLOAD] = {};

/* Cycling Power Service
CP Service: 0x1818
CP Characteristic: 0x2A63 (Measurement)
CP Characteristic: 0x2A65 (Feature)
CP Characteristic: 0x2A5D (Location)
CP Characteristic: 0x2A66 (Control Point)
/
BLEClientService client_CyclingPower_Service(UUID16_SVC_CYCLING_POWER); // Mandatory
BLEClientCharacteristic client_CP_Measurement_Chr(UUID16_CHR_CYCLING_POWER_MEASUREMENT); // Notify, Read, Mandatory
BLEClientCharacteristic client_CP_Feature_Chr(UUID16_CHR_CYCLING_POWER_FEATURE); // Read, optional
uint32_t client_CP_Feature_Flags = 0;
const uint8_t CP_FEATURE_DATALEN = 4; // Set MaxLen to 4
const char
client_CP_Feature_Str[] = {
"Pedal power balance supported", "Accumulated torque supported", "Wheel revolution data supported", "Crank revolution data supported",
"Extreme magnitudes supported", "Extreme angles supported", "Top/bottom dead angle supported", "Accumulated energy supported",
"Offset compensation indicator supported", "Offset compensation supported", "Cycling power measurement characteristic content masking supported",
"Multiple sensor locations supported", "Crank length adj. supported", "Chain length adj. supported", "Chain weight adj. supported",
"Span length adj. supported", "Sensor measurement context", "Instantaineous measurement direction supported", "Factory calibrated date supported",
"Enhanced offset compensation supported"
};
BLEClientCharacteristic client_CP_Location_Chr(UUID16_CHR_SENSOR_LOCATION); // Read, optional
uint8_t client_CP_Location_Value = 0; // UINT8
const char* client_Sensor_Location_Str[] = { "Other", "Top of shoe", "In shoe", "Hip", "Front wheel", "Left crank", "Right crank", "Left pedal",
"Right pedal", "Front hub", "Rear dropout", "Chainstay", "Rear wheel", "Rear hub", "Chest", "Spider", "Chain ring"
};
BLEClientCharacteristic client_CP_ControlPoint_Chr(UUID16_CHR_CYCLING_POWER_CONTROL_POINT); // Indicate, Write, optional
const uint16_t CP_CONTROL_POINT_DATALEN = 5;

/*
Cycling Speed and Cadence Service
CSC Service: 0x1816
CSC Measurement Characteristic: 0x2A5B
CSC Feature Characteristic: 0x2A5C
CSC Location Characteristic: 0x2A5D
CSC Control Point Characteristic:0x2A55 ---> not implemented
/
BLEClientService client_CyclingSpeedCadence_Service(UUID16_SVC_CYCLING_SPEED_AND_CADENCE); // Mandatory
BLEClientCharacteristic client_CSC_Measurement_Chr(UUID16_CHR_CSC_MEASUREMENT); // Notify, Read, Mandatory
BLEClientCharacteristic client_CSC_Feature_Chr(UUID16_CHR_CSC_FEATURE); // Read, optional
const uint8_t CSC_FEATURE_FIXED_DATALEN = 2; // UINT16
uint16_t client_CSC_Feature_Flags = 0;
const char
client_CSC_Feature_Str[] = {"Wheel rev supported", "Crank rev supported", "Multiple locations supported"};
BLEClientCharacteristic client_CSC_Location_Chr(UUID16_CHR_SENSOR_LOCATION); // Read, optional
uint8_t client_CSC_Location_Value = 0;
// Shared with CPS --> client_Sensor_Location_Str[]

/* Service Device Information
#define UUID16_SVC_DEVICE_INFORMATION 0x180A
#define UUID16_CHR_MODEL_NUMBER_STRING 0x2A24
#define UUID16_CHR_SERIAL_NUMBER_STRING 0x2A25
#define UUID16_CHR_FIRMWARE_REVISION_STRING 0x2A26 ---> not implemented
#define UUID16_CHR_HARDWARE_REVISION_STRING 0x2A27 ---> not implemented
#define UUID16_CHR_SOFTWARE_REVISION_STRING 0x2A28 ---> not implemented
#define UUID16_CHR_MANUFACTURER_NAME_STRING 0x2A29
*/
BLEClientService client_DIS_Service(UUID16_SVC_DEVICE_INFORMATION); // Optional
BLEClientCharacteristic client_DIS_ManufacturerName_Chr(UUID16_CHR_MANUFACTURER_NAME_STRING); // Read
char client_DIS_Manufacturer_Str[MAX_PAYLOAD] = {};
BLEClientCharacteristic client_DIS_ModelNumber_Chr(UUID16_CHR_MODEL_NUMBER_STRING); // Read
char client_DIS_ModelNumber_Str[MAX_PAYLOAD] = {};
BLEClientCharacteristic client_DIS_SerialNumber_Chr(UUID16_CHR_SERIAL_NUMBER_STRING); // Read
char client_DIS_SerialNumber_Str[MAX_PAYLOAD] = {};

/* Fitness Machine Service
#define UUID16_SVC_FITNESS_MACHINE 0x1826
#define UUID16_CHR_FITNESS_MACHINE_FEATURE 0x2ACC
#define UUID16_CHR_INDOOR_BIKE_DATA 0x2AD2
#define UUID16_CHR_TRAINING_STATUS 0x2AD3
#define UUID16_CHR_SUPPORTED_SPEED_RANGE 0x2AD4 ---> not implemented
#define UUID16_CHR_SUPPORTED_INCLINATION_RANGE 0x2AD5 ---> not implemented
#define UUID16_CHR_SUPPORTED_RESISTANCE_LEVEL_RANGE 0x2AD6
#define UUID16_CHR_SUPPORTED_HEART_RATE_RANGE 0x2AD7 ---> not implemented
#define UUID16_CHR_SUPPORTED_POWER_RANGE 0x2AD8
#define UUID16_CHR_FITNESS_MACHINE_CONTROL_POINT 0x2AD9
#define UUID16_CHR_FITNESS_MACHINE_STATUS 0x2ADA
*/
BLEClientService client_FitnessMachine_Service(UUID16_SVC_FITNESS_MACHINE); // Mandatory
// Service characteristics exposed by FTM Service
BLEClientCharacteristic client_FTM_Feature_Chr(UUID16_CHR_FITNESS_MACHINE_FEATURE); // Mandatory, Read
const uint8_t FTM_FEATURE_FIXED_DATALEN = 8;
uint8_t client_FTM_Feature_Data[FTM_FEATURE_FIXED_DATALEN];
BLEClientCharacteristic client_FTM_IndoorBikeData_Chr(UUID16_CHR_INDOOR_BIKE_DATA); // Optional, Notify
BLEClientCharacteristic client_FTM_TrainingStatus_Chr(UUID16_CHR_TRAINING_STATUS); // Optional, Read & Notify
BLEClientCharacteristic client_FTM_SupportedResistanceLevelRange_Chr(UUID16_CHR_SUPPORTED_RESISTANCE_LEVEL_RANGE); // Mandatory, Read
const uint8_t FTM_SRLR_FIXED_DATALEN = 6;
uint8_t client_FTM_SupportedResistanceLevelRange_Data[FTM_SRLR_FIXED_DATALEN];
BLEClientCharacteristic client_FTM_SupportedPowerRange_Chr(UUID16_CHR_SUPPORTED_POWER_RANGE); // Mandatory, Read
const uint8_t FTM_SPR_FIXED_DATALEN = 6;
uint8_t client_FTM_SupportedPowerRange_Data[FTM_SPR_FIXED_DATALEN];
BLEClientCharacteristic client_FTM_ControlPoint_Chr(UUID16_CHR_FITNESS_MACHINE_CONTROL_POINT); // Mandatory, Write & Indicate
BLEClientCharacteristic client_FTM_Status_Chr(UUID16_CHR_FITNESS_MACHINE_STATUS); // Mandatory, Notify

// ------------------------------------ START of SERVER DEFINITIONS -----------------------------------------------------
/* Cycling Speed and Cadence Service */
BLEService server_CyclingSpeedCadence_Service = BLEService(UUID16_SVC_CYCLING_SPEED_AND_CADENCE);
BLECharacteristic server_CSC_Measurement_Chr = BLECharacteristic(UUID16_CHR_CSC_MEASUREMENT); // Notify, Read
BLECharacteristic server_CSC_Feature_Chr = BLECharacteristic(UUID16_CHR_CSC_FEATURE); // Read
BLECharacteristic server_CSC_Location_Chr = BLECharacteristic(UUID16_CHR_SENSOR_LOCATION); // Read

/* Cycling Power Service */
BLEService server_CylingPower_Service = BLEService(UUID16_SVC_CYCLING_POWER);
BLECharacteristic server_CP_Measurement_Chr = BLECharacteristic(UUID16_CHR_CYCLING_POWER_MEASUREMENT); // Notify, Read
BLECharacteristic server_CP_Feature_Chr = BLECharacteristic(UUID16_CHR_CYCLING_POWER_FEATURE); // Read
BLECharacteristic server_CP_Location_Chr = BLECharacteristic(UUID16_CHR_SENSOR_LOCATION); // Read
BLECharacteristic server_CP_ControlPoint_Chr = BLECharacteristic(UUID16_CHR_CYCLING_POWER_CONTROL_POINT); // Indicate, Write

/* Fitness Machine Service */
BLEService server_FitnessMachine_Service = BLEService(UUID16_SVC_FITNESS_MACHINE);
BLECharacteristic server_FTM_Feature_Chr = BLECharacteristic(UUID16_CHR_FITNESS_MACHINE_FEATURE); // Read
BLECharacteristic server_FTM_IndoorBikeData_Chr = BLECharacteristic(UUID16_CHR_INDOOR_BIKE_DATA); // Notify
BLECharacteristic server_FTM_TrainingStatus_Chr = BLECharacteristic(UUID16_CHR_TRAINING_STATUS); // Notify, Read
const uint8_t FTM_TRAINING_STATUS_FIXED_DATALEN = 2; // Fixed len
BLECharacteristic server_FTM_SupportedResistanceLevelRange_Chr = BLECharacteristic(UUID16_CHR_SUPPORTED_RESISTANCE_LEVEL_RANGE); // Read
BLECharacteristic server_FTM_SupportedPowerRange_Chr = BLECharacteristic(UUID16_CHR_SUPPORTED_POWER_RANGE); // Read
BLECharacteristic server_FTM_ControlPoint_Chr = BLECharacteristic(UUID16_CHR_FITNESS_MACHINE_CONTROL_POINT); // Write & Indicate
BLECharacteristic server_FTM_Status_Chr = BLECharacteristic(UUID16_CHR_FITNESS_MACHINE_STATUS); // Notify
const uint8_t FTM_STATUS_DATALEN = 7; // Max Len was: [3] --> Notice that with de Elite Direto the size is: [7] !!

/* Device Information Service helper class instance */
BLEDis server_bledis; // Read
unsigned char FirmwareRevStr[] = "0.0.0";
unsigned char HardwareRevStr[] = "0.0.0";
unsigned char SoftwareRevStr[] = "0.0.0";

/* NORDIC UART SERVICE a.k.a. NUS
NUS Service: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E
NUS RXD : 6E400002-B5A3-F393-E0A9-E50E24DCCA9E
NUS TXD : 6E400003-B5A3-F393-E0A9-E50E24DCCA9E
*/
const uint8_t UUID_NUS_SERVICE[] = {0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x01, 0x00, 0x40, 0x6E};
const uint8_t UUID_NUS_CHR_RXD[] = {0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x02, 0x00, 0x40, 0x6E};
const uint8_t UUID_NUS_CHR_TXD[] = {0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x03, 0x00, 0x40, 0x6E};
BLEService server_NordicUart_Service = BLEService(UUID_NUS_SERVICE);
BLECharacteristic server_NUS_RXD_Chr = BLECharacteristic(UUID_NUS_CHR_RXD); // Read (Receiving Data)
BLECharacteristic server_NUS_TXD_Chr = BLECharacteristic(UUID_NUS_CHR_TXD); // Notify (Sending Data)

// ----------------------------- The Fitness Machine Control Point data type structure --------------------------------
// ---------------------------- Decoding is done in: server_FTM_ControlPoint_Chr_callback ------------------------------
const uint8_t ftmcpRequestControl = 0x00;
const uint8_t ftmcpReset = 0x01;
const uint8_t ftmcpSetTargetSpeed = 0x02;
const uint8_t ftmcpSetTargetInclination = 0x03;
const uint8_t ftmcpSetTargetResistanceLevel = 0x04;
const uint8_t ftmcpSetTargetPower = 0x05;
const uint8_t ftmcpSetTargetHeartRate = 0x06;
const uint8_t ftmcpStartOrResume = 0x07;
const uint8_t ftmcpStopOrPause = 0x08;
const uint8_t ftmcpSetTargetedExpendedEngery = 0x09;
const uint8_t ftmcpSetTargetedNumberOfSteps = 0x0A;
const uint8_t ftmcpSetTargetedNumberOfStrided = 0x0B;
const uint8_t ftmcpSetTargetedDistance = 0x0C;
const uint8_t ftmcpSetTargetedTrainingTime = 0x0D;
const uint8_t ftmcpSetTargetedTimeInTwoHeartRateZones = 0x0E;
const uint8_t ftmcpSetTargetedTimeInThreeHeartRateZones = 0x0F;
const uint8_t ftmcpSetTargetedTimeInFiveHeartRateZones = 0x10;
const uint8_t ftmcpSetIndoorBikeSimulationParameters = 0x11;
const uint8_t ftmcpSetWheelCircumference = 0x12;
const uint8_t ftmcpSetSpinDownControl = 0x13;
const uint8_t ftmcpSetTargetedCadence = 0x14;

const uint8_t FTM_CONTROL_POINT_DATALEN = 19; // Control point consists of 1 opcode (byte) and maximum 18 bytes as parameters
// This ftmcp_data_t structure represents the control point data. The first octet represents the opcode of the request
// followed by a parameter array of maximum 18 octects
typedef struct attribute( ( packed ) )
{
uint8_t OPCODE;
uint8_t OCTETS[(FTM_CONTROL_POINT_DATALEN - 1)];
} ftmcp_data_t;
typedef union // The union type automatically maps the bytes member array to the ftmcp_data_t structure member values
{
ftmcp_data_t values;
uint8_t bytes[FTM_CONTROL_POINT_DATALEN];
} ftmcp_data_ut;
// Fitness Machine Control Point Data variable
ftmcp_data_ut server_FTM_Control_Point_Data;
// ----------------------- end of server_FTM_ControlPoint_Chr_callback definitions ----------------------------

// -------------------------------------- END OF SERVER DEFINITIONS -------------------------------------------

// --------------------------------------------------------------------------------
// Global Server variables for decoding of INDOOR BIKE RESISTANCE PARAMETERS
// --------------------------------------------------------------------------------
float wind_speed = 0; // meters per second, resolution 0.001
float grade = 0; // percentage, resolution 0.01
float crr = 0; // Coefficient of rolling resistance, resolution 0.0001
float cw = 0; // Wind resistance Kg/m, resolution 0.01;
// --------------------------------------------------------------------------------

#define TIME_SPAN 5000 // Time span in millis 1000 = 1 second
unsigned long TimeInterval = 0;

void setup()
{
#ifdef DEBUG
Serial.begin(115200);
while ( !Serial ) delay(10); // for nrf52840 with native usb
Serial.println("Feather nRF52840 MITM supporting: CPS, CSC and FTMS");
Serial.println("------------------ Version 02.3 ---------------------");
#endif
// Initialize Bluefruit with maximum connections as Peripheral = 1, Central = 1
Bluefruit.begin(1, 1);
Setup_Client_FTMS();
Setup_Client_CPS();
Setup_Client_CSC();
Setup_Client_DIS();
Client_Start_Scanning();

while (Bluefruit.Scanner.isRunning()) { // do nothing else but scanning....
yield();
}
// wait enough time or go on when Client/Central is connected and all set!
TimeInterval = millis() + TIME_SPAN; // ADD just enough delay
while ( (millis() < TimeInterval) || (!Trainer.IsConnected) ) {
yield();
}

// Configure and Start the Device Information Service
#ifdef DEBUG
Serial.println("Configuring the Server Device Information Service");
#endif
server_setupDIS();
// Setup the Cycle Power Service, Speed & Cadence Service and FTMS
#ifdef DEBUG
Serial.println("Configuring the Server Cycle Power Service");
#endif
server_setupCPS();
#ifdef DEBUG
Serial.println("Configuring the Server Cadence and Speed Service");
#endif
server_setupCSC();
#ifdef DEBUG
Serial.println("Configuring the Server Fitness Machine Service");
#endif
server_setupFTMS();
#ifdef DEBUG
Serial.println("Configuring the Server NUS Service");
#endif
server_setupNUS();
// Setup and start advertising
#ifdef DEBUG
Serial.println("Setting up the Server-side advertising payload(s)");
#endif
server_startADV();
#ifdef DEBUG
Serial.println("Server-side is CPS, CSC and FTMS advertising!");
#endif
while (Bluefruit.Advertising.isRunning()) { // ONLY advertise!
yield();
}
TimeInterval = millis() + TIME_SPAN; // ADD just enough DELAY
// wait enough time or go on when Server/Peripheral is connected and set!
while ( (millis() < TimeInterval) || (!Laptop.IsConnected) ) {
yield();
}
#ifdef DEBUG
Serial.println("Client- and Server-side are Up and Running!");
#endif
}

// ---------------------- CLIENT SIDE FUNCTIONS -------------------------
void Setup_Client_FTMS(void)
{
// Initialize client FTM Service
client_FitnessMachine_Service.begin();

// Initialize client FTM Feature characteristic
client_FTM_Feature_Chr.begin();

// Initialize client FTM Training Status characteristic
client_FTM_TrainingStatus_Chr.setNotifyCallback(client_FTM_TrainingStatus_Notify_callback);
client_FTM_TrainingStatus_Chr.begin();

// Initialize client FTM Supported Power Range characteristic
client_FTM_SupportedPowerRange_Chr.begin();

// Initialize client FTM Supported Resistance Level Range characteristic
client_FTM_SupportedResistanceLevelRange_Chr.begin();

// Initialize client FTM Indoor Bike Data characteristic
client_FTM_IndoorBikeData_Chr.setNotifyCallback(client_FTM_IndoorBikeData_Notify_callback);
client_FTM_IndoorBikeData_Chr.begin();

// Initialize client FTM Control Point characteristic
// For receiving Control Point Responses
client_FTM_ControlPoint_Chr.setIndicateCallback(client_FTM_ControlPoint_Indicate_callback);
client_FTM_ControlPoint_Chr.begin();

// Initialize client FTM Status characteristic
client_FTM_Status_Chr.setNotifyCallback(client_FTM_Status_Notify_callback);
client_FTM_Status_Chr.begin();
#ifdef DEBUG
Serial.println("FTM Service and Chars are 'initialized'");
#endif
}

void Setup_Client_CPS(void)
{
// Initialize CPS client
client_CyclingPower_Service.begin();

// Initialize CP Feature characteristics of client_CyclingPower_Service.
client_CP_Feature_Chr.begin();

// Initialize CP sensor location characteristics of client_CyclingPower_Service.
client_CP_Location_Chr.begin();

// set up callback for receiving measurement
client_CP_Measurement_Chr.setNotifyCallback(client_CP_Measurement_Chr_notify_callback);
client_CP_Measurement_Chr.begin();

// Initialize Control Point and set up Indicate callback for receiving responses (indicate!)
client_CP_ControlPoint_Chr.setIndicateCallback(client_CP_ControlPoint_Chr_indicate_callback);
client_CP_ControlPoint_Chr.begin();
#ifdef DEBUG
Serial.println("CP Service and Chars are 'initialized'");
#endif
}

void Setup_Client_CSC(void)
{
// Initialize CSC client
client_CyclingSpeedCadence_Service.begin();

// Initialize client characteristics of CSC.
client_CSC_Location_Chr.begin();

// Initialize CSC Feature characteristics of client_CSC.
client_CSC_Feature_Chr.begin();

// set up callback for receiving measurement
client_CSC_Measurement_Chr.setNotifyCallback(client_CSC_Measurement_Chr_notify_callback);
client_CSC_Measurement_Chr.begin();
#ifdef DEBUG
Serial.println("CSC Service and Chars are 'initialized'");
#endif
}

void Setup_Client_DIS(void)
{
// Initialize client Generic Access Service
client_GenericAccess_Service.begin();
// Initialize some characteristics of the Generic Access Service.
client_GA_DeviceName_Chr.begin();
client_GA_Appearance_Chr.begin();
#ifdef DEBUG
Serial.println("Generic Access Service and Chars are 'initialized'");
#endif
// Initialize client Device Information Service
client_DIS_Service.begin();
// Initialize some characteristics of the Device Information Service.
client_DIS_ManufacturerName_Chr.begin();
client_DIS_ModelNumber_Chr.begin();
client_DIS_SerialNumber_Chr.begin();
#ifdef DEBUG
Serial.println("Device Information Service and Chars are 'initialized'");
#endif
}

void loop()
{
} // end loop

void Client_Start_Scanning(void)
{
/* Start Central Scanning
- Enable auto scan if disconnected
- Interval = 100 ms, window = 80 ms
- Don't use active scan
- Filter only accept CP service
- Start(timeout) with timeout = 0 will scan forever (until connected)
*/
// Client/Central Callbacks defined
Bluefruit.Central.setDisconnectCallback(client_disconnect_callback);
Bluefruit.Central.setConnectCallback(client_connect_callback);
Bluefruit.Scanner.setRxCallback(client_scan_callback);
Bluefruit.Scanner.restartOnDisconnect(false); // default is true !!! this stage we do not want to RESTART
Bluefruit.Scanner.filterRssi(-70); // original value of -80 , we want to scan only nearby peripherals, so get close to your device !!
Bluefruit.Scanner.setInterval(160, 80); // in unit of 0.625 ms
// Invoke callback if CPS or CSC or FTMS is advertised
Bluefruit.Scanner.filterUuid(UUID16_SVC_CYCLING_POWER, UUID16_SVC_CYCLING_SPEED_AND_CADENCE, UUID16_SVC_FITNESS_MACHINE);
Bluefruit.Scanner.useActiveScan(true);
Bluefruit.Scanner.start(0); // 500 // 0 = Don't stop scanning or n = after n/100 seconds
#ifdef DEBUG
Serial.println("Start Client-side Scanning for CPS, CSC and FTMS!");
delay(100); // To show print message !
#endif
}

void Client_Enable_Notify_Indicate(void)
{
// --------------------- Enable CP and CSC Notify and Indicate ------------------------------------
// Reaching here means we are ready to go, let's enable notification on measurement chr
// ------------------------- Enable FTMS Notify and Indicate ---------------------------------------
if ( client_FTM_ControlPoint_Chr.enableIndicate() ) { // MANDATORY
#ifdef DEBUG
Serial.println("Ready to receive Client FTM Control Point Response Messages");
#endif
} else {
#ifdef DEBUG
Serial.println(">>> Couldn't enable indicate for Client FTM Control Point Characteristic.");
Serial.println("FTMS (trainer) is controlled by another Client (Training App)!");
#endif
Bluefruit.disconnect(Trainer.conn_handle);
return;
}

if ( client_FTM_Status_Chr.enableNotify() ) { // MANDATORY
#ifdef DEBUG
Serial.println("Ready to receive Client FTM Status values");
#endif
} else {
#ifdef DEBUG
Serial.println(">>> Couldn't enable notify for Client FTM Status Characteristic.");
Serial.println("FTMS (trainer) is controlled by another Client (Training App)!");
#endif
Bluefruit.disconnect(Trainer.conn_handle);
return;
}

if ( client_FTM_TrainingStatus_Chr.enableNotify() ) { // NOT MANDATORY
#ifdef DEBUG
Serial.println("Ready to receive Client FTM Training Status values");
#endif
} else {
#ifdef DEBUG
Serial.println(">>> Couldn't enable notify for Client FTM Training Status Characteristic.");
#endif
}

if ( client_FTM_IndoorBikeData_Chr.enableNotify() ) { // NOT MANDATORY
#ifdef DEBUG
Serial.println("Ready to receive Client FTM Indoor Bike Data values");
#endif
} else {
#ifdef DEBUG
Serial.println(">>> Couldn't enable notify for Client FTM Indoor Bike Data Characteristic.");
#endif
}
// ------------------------- Enable FTMS Notify and Indicate ---------------------------------------
// --------------------- Enable CP and CSC Notify and Indicate ------------------------------------
if ( client_CP_Measurement_Chr.enableNotify() ) { // NOT MANDATORY
#ifdef DEBUG
Serial.println("Ready to receive Client CP Measurement values");
#endif
} else {
#ifdef DEBUG
Serial.println(">>> Couldn't enable notify for Client CP Measurement Characteristic.");
#endif
}

if ( client_CP_ControlPoint_Chr.enableIndicate() ) { // NOT MANDATORY
#ifdef DEBUG
Serial.println("Ready to receive Client CP Control Point Responses");
#endif
} else {
#ifdef DEBUG
Serial.println(">>> Couldn't enable indicate for Client CP Control Point Characteristic.");
#endif
}

if ( client_CSC_Measurement_Chr.enableNotify() ) { // NOT MANDATORY
#ifdef DEBUG
Serial.println("Ready to receive Client CSC Measurement values");
#endif
} else {
#ifdef DEBUG
Serial.println(">>> Couldn't enable notify for Client CSC Measurement Characteristic.");
#endif
}
// ------------------------- Enable CP and CSC Notify and Indicate --------------------------------

} // ------------------------- Enable FTMS Notify and Indicate ---------------------------------------

/**
Hooked callback that triggered when a status value is sent
@param chr Pointer client characteristic
@param data Pointer to received data
@param len Length of received data
/
void client_FTM_TrainingStatus_Notify_callback(BLEClientCharacteristic
chr, uint8_t* data, uint16_t len)
{
// Client Training Status data is tranferred to the Server
// NO TREATMENT OF COMMAND !!!
server_FTM_TrainingStatus_Chr.notify(data, len); // Just pass on and process later!

#ifdef DEBUG
uint8_t SDataLen = (uint8_t)len;
uint8_t SDataBuf[SDataLen] = {};
// Transfer first the contents of data to buffer (array of chars)
Serial.printf(" -> Client Rec'd Raw FTM Training Status Data: [%d] [ ", len);
for (int i = 0; i < sizeof(SDataBuf); i++) {
SDataBuf[i] = *data++;
Serial.printf("%02X ", SDataBuf[i], HEX);
}
Serial.println("] ");
#endif
}

/**
Hooked callback that is triggered when an IBD value is sent
@param chr Pointer client characteristic
@param data Pointer to received data
@param len Length of received data
/
void client_FTM_IndoorBikeData_Notify_callback(BLEClientCharacteristic
chr, uint8_t* data, uint16_t len)
{
// Client IBD data is tranferred to the Server
// NO TREATMENT OF COMMAND !!!
if (server_FTM_IndoorBikeData_Chr.notifyEnabled(Laptop.conn_handle)) {
server_FTM_IndoorBikeData_Chr.notify(data, len); // Just pass on and process later!
}
#ifdef DEBUG_FTM_INDOORBIKEDATA
// Only when DEBUG_FTM_INDOORBIKEDATA is defined IDBData will be parsed and printed!
ParseIndoorBikeData(data, len);
#endif
}

#ifdef DEBUG_FTM_INDOORBIKEDATA
void ParseIndoorBikeData(uint8_t* data, uint16_t len)
{
// ---> IBD Buffer Data Length depends on data flagged to be present !!!!
uint8_t IBDDataLen = (uint8_t)len;
uint8_t IBDDataBuf[IBDDataLen] = {};
// Transfer first the contents of data to buffer (array of chars)
Serial.printf(" -> Client Rec'd Raw FTM IBD Data: [%d] [ ", len);
for (int i = 0; i < sizeof(IBDDataBuf); i++) {
IBDDataBuf[i] = *data++;
Serial.printf("%02X ", IBDDataBuf[i], HEX);
}
Serial.print("] ");

uint8_t offset = 0;
uint16_t flags = 0;
memcpy(&flags, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
offset += 2; // UINT16
if ((flags & 1) != 0) {
// More Data
Serial.print(" More Data!");
}
// if ((flags & 2) != 0) { // (flags & 2) --> true or false Average Speed is always(?) there (tested with Elite Direto XR)
// Average Speed 0.01
uint16_t sim_Speed = 0;
memcpy(&sim_Speed, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Speed: %d KPH", (sim_Speed / 100));
offset += 2; // UINT16
// }
if ((flags & 4) != 0) {
// Instantaneous Cadence 0.5
uint16_t inst_Cadence = 0;
memcpy(&inst_Cadence, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Instantaneous Cadence: %d RPM", (inst_Cadence / 2));
offset += 2; // UINT16
}
if ((flags & 8) != 0) {
// Average Cadence 0.5
uint16_t av_Cadence = 0;
memcpy(&av_Cadence, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Average Cadence: %d RPM", (av_Cadence / 2));
offset += 2; // UINT16
}
if ((flags & 16) != 0) {
// Total Distance 1
uint32_t tot_Distance = 0;
memcpy(&tot_Distance, &IBDDataBuf[offset], 3); // Transfer buffer fields to variable
Serial.printf(" Total Distance: %d m", tot_Distance);
offset += 3; // UINT24
}
if ((flags & 32) != 0) {
// Resistance Level 1
uint16_t res_Level = 0;
memcpy(&res_Level, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Resistance Level: %d ", res_Level);
offset += 2; // UINT16
}
if ((flags & 64) != 0) {
// Instantaneous Power 1
uint16_t inst_Power = 0;
memcpy(&inst_Power, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Instantaneous Power: %d Watt", inst_Power);
offset += 2; // UINT16
}
if ((flags & 128) != 0) {
// Average Power 1
uint16_t av_Power = 0;
memcpy(&av_Power, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Average Power: %d Watt", av_Power);
offset += 2; // UINT16
}
if ((flags & 256) != 0) {
// Expended Energy -> UINT16 UINT16 UINT8
// Total Energy UINT16 1
uint16_t tot_Energy = 0;
memcpy(&tot_Energy, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Tot. Energy: %d kCal", tot_Energy);
offset += 2; // UINT16
// Energy per hour UINT16 1
uint16_t Energy_hr = 0;
memcpy(&Energy_hr, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Energy/hr: %d kCal/hr", Energy_hr);
offset += 2; // UINT16
// Energy per minute UINT8 1
uint8_t Energy_pm = 0;
memcpy(&Energy_pm, &IBDDataBuf[offset], 1); // Transfer buffer fields to variable
Serial.printf(" Energy/m: %d kCal/m", Energy_pm);
offset += 1; // UINT8
}
if ((flags & 512) != 0) {
// Heart Rate 1
uint8_t Heart_Rate = 0;
memcpy(&Heart_Rate, &IBDDataBuf[offset], 1); // Transfer buffer fields to variable
Serial.printf(" Heart Rate: %d HBM", Heart_Rate);
offset += 1; // UINT8
}
if ((flags & 1024) != 0) {
// Metabolic Equivalent 0.1
uint8_t Mets = 0;
memcpy(&Mets, &IBDDataBuf[offset], 1); // Transfer buffer fields to variable
Serial.printf(" Metabolic Equivalent: %d ", Mets / 10);
offset += 1; // UINT8
}
if ((flags & 2048) != 0) {
// Elapsed Time 1
uint16_t elap_time = 0;
memcpy(&elap_time, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Elapsed time: %d s", elap_time);
offset += 2; // UINT16
}
if ((flags & 4096) != 0) {
// Remaining Time 1
uint16_t rem_time = 0;
memcpy(&rem_time, &IBDDataBuf[offset], 2); // Transfer buffer fields to variable
Serial.printf(" Remaining time: %d s", rem_time);
offset += 2; // UINT16
}
Serial.println();
}
#endif

/**
Hooked callback that triggered when a value is sent
@param chr Pointer client characteristic
@param data Pointer to received data
@param len Length of received data
/
void client_FTM_ControlPoint_Indicate_callback(BLEClientCharacteristic
chr, uint8_t* data, uint16_t len)
{
// The receipt of Control Point settings is acknowledged by the trainer: handle it
// Send Client's Response message to the Server
// NO TREATMENT OF COMMAND !!!
server_FTM_ControlPoint_Chr.indicate(data, len); // Just pass on and process later!

#ifdef DEBUG
uint8_t RespBufferLen = (uint8_t)len;
uint8_t RespBuffer[RespBufferLen] = {}; // It is max 6 bytes long
// Transfer first the contents of data to buffer (array of chars)
Serial.print(" -> Client Rec'd Control Point Response: [ ");
for (int i = 0; i < sizeof(RespBuffer); i++) {
RespBuffer[i] = *data++;
Serial.printf("%02X ", RespBuffer[i], HEX);
}
Serial.println("] ");
#endif
}

/**
Hooked callback that triggered when a value is sent
@param chr Pointer client characteristic
@param data Pointer to received data
@param len Length of received data
/
void client_FTM_Status_Notify_callback(BLEClientCharacteristic
chr, uint8_t* data, uint16_t len)
{
// Client's Machine Status data is tranferred to the Server
// NO TREATMENT OF COMMAND !!!
server_FTM_Status_Chr.notify(data, len); // Just pass on and process later!

#ifdef DEBUG
uint8_t SDataLen = (uint8_t)len;
uint8_t SDataBuf[SDataLen] = {};
// Transfer first the contents of data to buffer (array of chars)
Serial.printf(" -> Client Rec'd Raw FTM Machine Status Data: [%d] [ ", len);
for (int i = 0; i < sizeof(SDataBuf); i++) {
SDataBuf[i] = *data++;
Serial.printf("%02X ", SDataBuf[i], HEX);
}
Serial.println("] ");
#endif
}

// Byte swap unsigned short
uint16_t swap_uint16( uint16_t val )
{
return (val << 8) | (val >> 8 );
}

// Find certain uuid in the data of the received advertising packet
bool checkForUuidPresent(const uint16_t uuid, const uint8_t* reportData, uint8_t reportDataLen)
{
// Enter uuid in printed format like 0x1826 for UUID16_SVC_FITNESS_MACHINE
// uuid is internally stored in Little Endian
for (int i = 0; i < (reportDataLen); i++) { // step 1: never miss out a position!
if ( memcmp(&uuid, (reportData + i), 2) == 0) {
return true;
}
}
return false;
}

/**
Callback invoked when scanner pick up an advertising data
@param report Structural advertising data
/
void client_scan_callback(ble_gap_evt_adv_report_t
report)
{
// Since we configure the scanner with filterUuid(CPS, CSC, FTMS)
// scan_callback is invoked for devices with usually CPS service advertised.
// However, we only do business with FTMS enabled Trainer types so check
// for UUID16_SVC_FITNESS_MACHINE to be present, if not --> keep scanning!
uint8_t Device_Addr[6] = {0};
if (!checkForUuidPresent(UUID16_SVC_FITNESS_MACHINE, report->data.p_data, report->data.len)) {
return; // Keep scanning for FTMS trainer !!
}
memcpy(Device_Addr, report->peer_addr.addr, 6);
if ( !(memcmp(Device_Addr, Trainer.PeerAddress, 6) == 0) ) {
return; // Keep scanning for the required trainer !!
}
// Connect to device only with required services AND device address
if (Bluefruit.Scanner.isRunning()) {
Bluefruit.Scanner.stop();
}
#ifdef DEBUG
Serial.println("Found advertising Peripheral with FTMS enabled! See Raw data packet:");
Serial.println(F("Timestamp Addr Rssi Data"));
Serial.printf("%09d ", millis());
// MAC is in little endian --> print reverse
Serial.printBufferReverse(report->peer_addr.addr, 6, ':');
Serial.print(F(" "));
Serial.print(report->rssi);
Serial.print(F(" "));
Serial.printBuffer(report->data.p_data, report->data.len, '-');
Serial.println();
#endif
Bluefruit.Central.connect(report);
}

#ifdef DEBUG
void PrintPeerAddress(uint8_t addr[6])
{
for (int i = 1; i < 6; i++) {
// Display byte by byte in HEX reverse: little Endian
Serial.printf("%02X:", addr[(6 - i)], HEX);
}
Serial.printf("%02X ", addr[0], HEX);
}
#endif

/**
Callback invoked when a connection is established
@param conn_handle
/
void client_connect_callback(uint16_t conn_handle)
{
Trainer.conn_handle = conn_handle;
// Get the reference to current connection
BLEConnection
connection = Bluefruit.Connection(conn_handle);
connection->getPeerName(Trainer.PeerName, sizeof(Trainer.PeerName));
ble_gap_addr_t PeerAddr = connection->getPeerAddr(); // Fill BLE Gap struct
memcpy(Trainer.PeerAddress, PeerAddr.addr, 6); // Copy Peer Address from ble_gap_addr_t struct
#ifdef DEBUG
Serial.printf("Feather nRF52 (Central) connected to Trainer (Peripheral) device: [%s] MAC Address: ", Trainer.PeerName);
PrintPeerAddress(Trainer.PeerAddress);
Serial.println();
Serial.println("Now checking all mandatory Client Services and Characteristics!");
Serial.println("If Mandatory Services Fail --> the Client will disconnect!");
#endif
// ---------------------------- GA and DIS SERVICE ------------------------------------------
#ifdef DEBUG
Serial.println("First checking Generic Access and Device Information Services and Characteristics!");
#endif
// If Generic Access is not found then go on.... NOT FATAL !
while (!(client_GenericAccess_Service.discover(conn_handle))) {
if ( client_GenericAccess_Service.discover(conn_handle) ) {
#ifdef DEBUG
Serial.print(F("Found Client Generic Access\n"));
#endif
if ( client_GA_DeviceName_Chr.discover() ) {
client_GA_DeviceName_Chr.read(client_GA_DeviceName_Data, sizeof(client_GA_DeviceName_Data));
#ifdef DEBUG
Serial.printf(" -> Client Reads Device Name: [%s]\n", client_GA_DeviceName_Data);
#endif
}
if ( client_GA_Appearance_Chr.discover() ) {
client_GA_Appearance_Value = client_GA_Appearance_Chr.read16();
#ifdef DEBUG
Serial.printf(" -> Client Reads Appearance: [%d]\n", client_GA_Appearance_Value);
#endif
}
} // GA
}
// If DIS is not found then go on.... NOT FATAL !

while (!( client_DIS_Service.discover(conn_handle) )){
if ( client_DIS_Service.discover(conn_handle) ) {
#ifdef DEBUG
Serial.print(F("Found Client Device Information\n"));
#endif
// 1
if ( client_DIS_ManufacturerName_Chr.discover() ) {
// read and print out Manufacturer
if ( client_DIS_ManufacturerName_Chr.read(client_DIS_Manufacturer_Str, sizeof(client_DIS_Manufacturer_Str)) ) {
#ifdef DEBUG
Serial.printf(" -> Client Reads Manufacturer: [%s]\n", client_DIS_Manufacturer_Str);
#endif
}
} // 1
// 2
if ( client_DIS_ModelNumber_Chr.discover() ) {
// read and print out Model Number
if ( client_DIS_ModelNumber_Chr.read(client_DIS_ModelNumber_Str, sizeof(client_DIS_ModelNumber_Str)) ) {
#ifdef DEBUG
Serial.printf(" -> Client Reads Model Number: [%s]\n", client_DIS_ModelNumber_Str);
#endif
}
} // 2
// 3
if ( client_DIS_SerialNumber_Chr.discover() ) {
// read and print out Serial Number
if ( client_DIS_SerialNumber_Chr.read(client_DIS_SerialNumber_Str, sizeof(client_DIS_SerialNumber_Str)) ) {
#ifdef DEBUG
Serial.printf(" -> Client Reads Serial Number: [%s]\n", client_DIS_SerialNumber_Str);
#endif
}
} // 3
}
} // DIS
// ---------------------------- END GA and DIS SERVICE ------------------------------------------------

// -----------------------------FTM SERVICE ------------------------------------------------------------
#ifdef DEBUG
Serial.print("Discovering Mandatory Client Fitness Machine (FTM) Service ... ");
#endif
// If FTM is not found, disconnect, resume scanning, and return
if ( client_FitnessMachine_Service.discover(conn_handle) )
{
#ifdef DEBUG
BLEConnection* conn = Bluefruit.Connection(conn_handle);
uint16_t max_payload = conn->getMtu()-3;
uint16_t data_length = conn->getDataLength();
Serial.print("Found it! ");
Serial.printf("FTMS Max Payload: %d Data Length: %d\n", max_payload, data_length);
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found!");
Serial.println("Disconnecting since Client FTM Service is mandatory!");
#endif
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
return;
}

#ifdef DEBUG
Serial.print("Discovering Client FTM Feature Characteristic ... ");
#endif
// If FTM Feature is not found, disconnect, resume scanning, and return
while (!( client_FTM_Feature_Chr.discover() ))
{
if ( client_FTM_Feature_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
// Read FTM Feature Data
client_FTM_Feature_Chr.read(client_FTM_Feature_Data, 8);
#ifdef DEBUG
Serial.print(" -> Client Reads Raw FTM Feature bytes: [8] [ ");
for (int i = 0; i < sizeof(client_FTM_Feature_Data); i++) {
Serial.printf("%02X ", client_FTM_Feature_Data[i], HEX);
} // for
Serial.println("] ");
#endif
} else {
#ifdef DEBUG
Serial.println("Disconnecting since Client FTM Feature Characteristic is mandatory!");
#endif
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
Bluefruit.Connection(conn_handle);
Serial.print("Discovering Client FTM Feature not decouvert ... ");
// return;
}
}
#ifdef DEBUG
Serial.print("Discovering Client FTM Control Point Characteristic ... ");
#endif
// If FTM Control Point is not found, disconnect, resume scanning, and return
if ( client_FTM_ControlPoint_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
// Send a Request Control of Machine, OpCode == 0, no values!
const uint8_t RCM[1] = {0};
client_FTM_ControlPoint_Chr.write_resp(RCM, 1);
} else {
#ifdef DEBUG
Serial.println("Not Found!");
Serial.println("Disconnecting since Client FTM Control Point Characteristic is mandatory!");
#endif
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
Bluefruit.Connection(conn_handle);
Serial.print("Discovering Client FTM Feature not decouvert ... ");
return;
}

#ifdef DEBUG
Serial.print("Discovering Client FTM Status Characteristic ... ");
#endif
// If FTM Status is not found, disconnect, resume scanning, and return
if ( client_FTM_Status_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found!");
Serial.println("Disconnecting since Client FTM Status Characteristic is mandatory!");
#endif
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
return;
}

#ifdef DEBUG
Serial.print("Discovering Client FTM Training Status Characteristic ... ");
#endif
// FTM Training Status is NOT MANDATORY
if ( client_FTM_TrainingStatus_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found! Not Mandatory");
#endif
}
/*
#ifdef DEBUG
Serial.println("Not Found!");
Serial.println("Disconnecting since Client FTM Characteristic is mandatory!");
#endif
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
return;
*/

#ifdef DEBUG
Serial.print("Discovering Client FTM Supported Resistance Level Range Characteristic ... ");
#endif
// FTM SupportedResistanceLevelRange is not mandatory!
if ( client_FTM_SupportedResistanceLevelRange_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
// Read Supported Resistance Level Range Data
client_FTM_SupportedResistanceLevelRange_Chr.read(client_FTM_SupportedResistanceLevelRange_Data, 6);
#ifdef DEBUG
Serial.print(" -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ ");
for (int i = 0; i < sizeof(client_FTM_SupportedResistanceLevelRange_Data); i++) {
Serial.printf("%02X ", client_FTM_SupportedResistanceLevelRange_Data[i], HEX);
} // for
Serial.println("] ");
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found! NOT mandatory!");
#endif
}
/*
Serial.println("Disconnecting since Client FTM Supported Resistance Level Range Characteristic is mandatory!");
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
return;
*/

#ifdef DEBUG
Serial.print("Discovering Client FTM Supported Power Range Characteristic ... ");
#endif
// FTM SupportedPowerRange is not mandatory!
if ( client_FTM_SupportedPowerRange_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
// Read Supported Resistance Level Range values
client_FTM_SupportedPowerRange_Chr.read(client_FTM_SupportedPowerRange_Data, 6);
#ifdef DEBUG
Serial.print(" -> Client Reads Raw FTM Supported Power Range bytes: [6] [ ");
for (int i = 0; i < sizeof(client_FTM_SupportedPowerRange_Data); i++) {
Serial.printf("%02X ", client_FTM_SupportedPowerRange_Data[i], HEX);
} // for
Serial.println("] ");
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found! NOT mandatory!");
#endif
}
/*
#ifdef DEBUG
Serial.println("Disconnecting since Client FTM Supported Power Range Characteristic is mandatory!");
#endif
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
return;
*/

#ifdef DEBUG
Serial.print("Discovering Client FTM Indoor Bike Data Characteristic ... ");
#endif
// FTM Indoor Bike Data is not mandatory
if ( client_FTM_IndoorBikeData_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found! Not Mandatory");
#endif
}
/*
#ifdef DEBUG
Serial.println("Not Found!");
Serial.println("Disconnecting since Client FTM Indoor Bike Data Characteristic is mandatory!");
#endif
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
return;
/
// ---------------------------- End FTM SERVICE ---------------------------------------------
// ---------------------------- CP SERVICE --------------------------------------------------
#ifdef DEBUG
Serial.print("Discovering Client Cycling Power (CP) Service ... ");
#endif
// If CPS is not found, disconnect, resume scanning, and return
while (!( client_CyclingPower_Service.discover(conn_handle) ))
{
if ( client_CyclingPower_Service.discover(conn_handle) )
{
#ifdef DEBUG
BLEConnection
conn = Bluefruit.Connection(conn_handle);
uint16_t max_payload = conn->getMtu()-3;
uint16_t data_length = conn->getDataLength();
Serial.print("Found it! ");
Serial.printf("CPS Max Payload: %d Data Length: %d\n", max_payload, data_length);
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found!");
Serial.println("Disconnecting since Client Cyling Power Service is mandatory!");
#endif
// MANDATORY so disconnect since we couldn't find the service
Bluefruit.disconnect(conn_handle);
Bluefruit.Connection(conn_handle);
Serial.print("Discovering Cycling Power (CP) Service not decouvert ... ");
return;
}
}
#ifdef DEBUG
Serial.print("Discovering Client CP Measurement characteristic ... ");
#endif

if ( !client_CP_Measurement_Chr.discover() )
{
// Measurement chr is mandatory, if it is not found (valid), then disconnect
#ifdef DEBUG
Serial.println("Not Found!");
Serial.println("Disconnecting since Client CP Measurement Characteristic is mandatory!");
#endif
Bluefruit.disconnect(conn_handle);
return;
} else {
#ifdef DEBUG
Serial.println("Found it!");
#endif
}

#ifdef DEBUG
Serial.print("Discovering Client CP Control Point characteristic ... ");
#endif
if ( client_CP_ControlPoint_Chr.discover() )
{
// CP Control Point chr is not mandatory
#ifdef DEBUG
Serial.println("Found it!");
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found! NOT Mandatory!");
#endif
}

#ifdef DEBUG
Serial.print("Discovering Client CP Feature characteristic ... ");
#endif
if ( client_CP_Feature_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
// Configure the Cycle Power Feature characteristic
// Properties = Read
// Min Len = 1
// Max Len = 32
// B0:3 = UINT8 - Cycling Power Feature (MANDATORY)
// b0 = Pedal power balance supported; 0 = false, 1 = true
// b1 = Accumulated torque supported; 0 = false, 1 = true
// b2 = Wheel revolution data supported; 0 = false, 1 = true
// b3 = Crank revolution data supported; 0 = false, 1 = true
// b4 = Extreme magnatudes supported; 0 = false, 1 = true
// b5 = Extreme angles supported; 0 = false, 1 = true
// b6 = Top/bottom dead angle supported; 0 = false, 1 = true
// b7 = Accumulated energy supported; 0 = false, 1 = true
// b8 = Offset compensation indicator supported; 0 = false, 1 = true
// b9 = Offset compensation supported; 0 = false, 1 = true
// b10 = Cycling power measurement characteristic content masking supported; 0 = false, 1 = true
// b11 = Multiple sensor locations supported; 0 = false, 1 = true
// b12 = Crank length adj. supported; 0 = false, 1 = true
// b13 = Chain length adj. supported; 0 = false, 1 = true
// b14 = Chain weight adj. supported; 0 = false, 1 = true
// b15 = Span length adj. supported; 0 = false, 1 = true
// b16 = Sensor measurement context; 0 = force, 1 = torque
// b17 = Instantaineous measurement direction supported; 0 = false, 1 = true
// b18 = Factory calibrated date supported; 0 = false, 1 = true
// b19 = Enhanced offset compensation supported; 0 = false, 1 = true
// b20:21 = Distribtue system support; 0 = legacy, 1 = not supported, 2 = supported, 3 = RFU
// b22:32 = Reserved

// Read 32-bit client_CP_Feature_Chr value
client_CP_Feature_Flags = client_CP_Feature_Chr.read32();
#ifdef DEBUG
const uint8_t CPFC_FIXED_DATALEN = 4;
uint8_t cpfcData[CPFC_FIXED_DATALEN] = {(uint8_t)(client_CP_Feature_Flags & 0xff), (uint8_t)(client_CP_Feature_Flags >> 8),
(uint8_t)(client_CP_Feature_Flags >> 16), (uint8_t)(client_CP_Feature_Flags >> 24)};
Serial.print(" -> Client Reads Raw CP Feature bytes: [4] [ ");
for (int i = 0; i < CPFC_FIXED_DATALEN; i++) {
if ( i <= sizeof(cpfcData)) {
Serial.printf("%02X ", cpfcData[i], HEX);
}
}
Serial.println("] ");
for (int i = 0; i < sizeof(client_CP_Feature_Str); i++) {
if ( client_CP_Feature_Flags & (1 << i) )
{
Serial.println(client_CP_Feature_Str[i]);
}
}
#endif
} else {
#ifdef DEBUG
Serial.println("NOT Found! NOT Mandatory!");
#endif
}

#ifdef DEBUG
Serial.print("Discovering Client CP Sensor Location characteristic ... ");
#endif
if ( client_CP_Location_Chr.discover() )
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
// The Sensor Location characteristic
// Properties = Read
// Min Len = 1
// Max Len = 1
// B0:1 = UINT8 - Sensor Location

// Read 8-bit client CP sensor location value
client_CP_Location_Value = client_CP_Location_Chr.read8();   

#ifdef DEBUG
Serial.print(" -> Client Reads CP Location Sensor: ");
Serial.printf("Loc#: %d %s\n", client_CP_Location_Value, client_Sensor_Location_Str[client_CP_Location_Value]);
#endif
} else {
#ifdef DEBUG
Serial.println("NOT Found! NOT Mandatory!");
#endif
}
// ---------------------------- END CP SERVICE ------------------------------------------------
// ---------------------------- CSC SERVICE --------------------------------------------------
#ifdef DEBUG
Serial.print("Discovering Cycling Speed and Cadence (CSC) Service ... ");
#endif
if ( client_CyclingSpeedCadence_Service.discover(conn_handle) ) // UUID16_SVC_CYCLING_SPEED_AND_CADENCE
{
#ifdef DEBUG
BLEConnection* conn = Bluefruit.Connection(conn_handle);
uint16_t max_payload = conn->getMtu()-3;
uint16_t data_length = conn->getDataLength();
Serial.print("Found it! ");
Serial.printf("CSCS Max Payload: %d Data Length: %d\n", max_payload, data_length);
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found! CSC Service is Not Mandatory!");
#endif
return; // NO CSC -> end of client_connect_callback !!
}
/*
// Is Mandatory
#ifdef DEBUG
Serial.println("Not Found and disconnecting!");
Serial.println("CSC Service is mandatory!");
#endif
Bluefruit.disconnect(conn_handle);
return;
*/

// Test for client CSC Characteristics when the client CSC Service is existing
#ifdef DEBUG
Serial.print("Discovering Client CSC Measurement CHR ... ");
#endif
if ( client_CSC_Measurement_Chr.discover() ) // UUID16_CHR_CSC_MEASUREMENT
{
#ifdef DEBUG
Serial.println("Found it! ");
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found! Not Mandatory!");
#endif
}
/*
// Is Mandatory
#ifdef DEBUG
Serial.println("Not Found!");
Serial.println("Disconnecting since Client CSC Measurement CHR is mandatory!");
#endif
Bluefruit.disconnect(conn_handle);
return;
*/

#ifdef DEBUG
Serial.print("Discovering Client CSC Location CHR ... ");
#endif
if ( client_CSC_Location_Chr.discover() ) // UUID16_CHR_SENSOR_LOCATION
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
// Read 16-bit client CSC sensor location value
client_CSC_Location_Value = client_CSC_Location_Chr.read8();
#ifdef DEBUG
Serial.print(" -> Client Reads CSC Location Sensor: ");
Serial.printf("Loc#: %d %s\n", client_CSC_Location_Value, client_Sensor_Location_Str[client_CSC_Location_Value]);
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found! NOT Mandatory!");
#endif
}

#ifdef DEBUG
Serial.print("Discovering Client CSC Feature CHR ... ");
#endif
if ( client_CSC_Feature_Chr.discover() ) // UUID16_CHR_CSC_FEATURE
{
#ifdef DEBUG
Serial.println("Found it!");
#endif
// Read sensor CSC Feature value in 16 bit
client_CSC_Feature_Flags = client_CSC_Feature_Chr.read16();
#ifdef DEBUG
uint8_t cscfcData[CSC_FEATURE_FIXED_DATALEN] = { (uint8_t)(client_CSC_Feature_Flags & 0xff), (uint8_t)(client_CSC_Feature_Flags >> 8) }; // Little Endian Representation
Serial.printf(" -> Client Reads Raw CSC Feature bytes: [2] [ ");
for (int i = 0; i < sizeof(cscfcData); i++) {
Serial.printf("%02X ", cscfcData[i], HEX);
}
Serial.println("] ");
for (int i = 0; i < sizeof(client_CSC_Feature_Str); i++) {
if ( (client_CSC_Feature_Flags & (1 << i)) != 0 )
{
Serial.println(client_CSC_Feature_Str[i]);
}
}
#endif
} else {
#ifdef DEBUG
Serial.println("Not Found! NOT Mandatory!");
#endif
}
// ---------------------------- END CSC SERVICE ---------------------------------------------
// Only now set true after ALL Mandatory Services and Char's have been discovered !!!
Trainer.IsConnected = true;
} // End client_connect_callback

/**
Callback invoked when a connection is dropped
@param conn_handle
@param reason is a BLE_HCI_STATUS_CODE which can be found in ble_hci.h
*/
void client_disconnect_callback(uint16_t conn_handle, uint8_t reason)
{
#ifdef DEBUG
Serial.printf("Client disconnected from Peripheral Device: [%s], reason: [%02X]\n", Trainer.PeerName, reason, HEX);
#endif
Trainer.conn_handle = BLE_CONN_HANDLE_INVALID;
Trainer.IsConnected = false;
// Force server to disconnect!
if (Laptop.conn_handle != BLE_CONN_HANDLE_INVALID) {
Bluefruit.disconnect(Laptop.conn_handle);
}
}

/**
Hooked callback that triggered when a measurement value is sent from peripheral
@param chr Pointer client characteristic
in this example it should be cpmc
@param data Pointer to received data
@param len Length of received data
/
void client_CP_Measurement_Chr_notify_callback(BLEClientCharacteristic
chr, uint8_t* data, uint16_t len)
{
// Client CP Measurement data is tranferred to the Server (Zwift)
// NO TREATMENT OF RESPONSE !!!!!
if (server_CP_Measurement_Chr.notifyEnabled(Laptop.conn_handle)) {
server_CP_Measurement_Chr.notify(data, len); // Just pass on and process later!
}
#ifdef DEBUG_CP_MEASUREMENT
uint8_t buffer[len] = {};
// Transfer first the contents of data to buffer (array of chars)
Serial.printf(" -> Client Rec'd Raw CP Data: [%d] [ ", len);
for (int i = 0; i < sizeof(buffer); i++) {
if ( i <= sizeof(buffer)) {
buffer[i] = *data++;
Serial.printf("%02X ", buffer[i], HEX);
}
}
Serial.print("] ");
uint8_t offset = 0;
// Get flags field
uint16_t flags = 0;
memcpy(&flags, &buffer[offset], 2); // Transfer buffer fields to variable
offset += 2; // UINT16
// Get Instantaneous Power values UINT16
uint16_t PowerValue = 0;
memcpy(&PowerValue, &buffer[offset], 2); // Transfer buffer fields to variable
offset += 2; // UINT16
Serial.printf("Instantaneous Power: %4d\n", PowerValue);
// Get the other CP measurement values
if ((flags & 1) != 0) {
// Power Balance Present
Serial.print(" --> Pedal Power Balance!");
}
if ((flags & 2) != 0) {
// Accumulated Torque
Serial.println(" --> Accumulated Torque!");
}
// etcetera...
#endif
} // End cpmc_notify_callback

/**
Hooked callback that triggered when a response value is sent from peripheral
@param chr Pointer client characteristic
@param data Pointer to received data
@param len Length of received data
/
void client_CP_ControlPoint_Chr_indicate_callback(BLEClientCharacteristic
chr, uint8_t* data, uint16_t len)
{
// Send Client's response message to the Server (Zwift)
// NO TREATMENT OF RESPONSE !!!!!
server_CP_ControlPoint_Chr.indicate(data, len); // Just pass on and process later!

#ifdef DEBUG
uint8_t cpcpDataLen = (uint8_t)len;
uint8_t cpcpData[cpcpDataLen] = {};
// Transfer first the contents of data to buffer (array of chars)
Serial.printf(" -> Client Rec'd Raw CP Control Point Data: [%d] [ ", len);
for (int i = 0; i < sizeof(cpcpData); i++) {
cpcpData[i] = *data++;
Serial.printf("%02X ", cpcpData[i], HEX);
}
Serial.print("] ");
#endif
}

/**
Hooked callback that triggered when a measurement value is sent from peripheral
@param chr Pointer client characteristic
@param data Pointer to received data
@param len Length of received data
/
void client_CSC_Measurement_Chr_notify_callback(BLEClientCharacteristic
chr, uint8_t* data, uint16_t len)
{
// Client CSC Measurement data is transferred to the Server (Zwift)
// NO TREATMENT OF RESPONSE !!!!!
if (server_CSC_Measurement_Chr.notifyEnabled(Laptop.conn_handle)) {
server_CSC_Measurement_Chr.notify(data, len); // Just pass on and process later!
}
#ifdef DEBUG_CSC_MEASUREMENT
uint8_t buffer[len] = {};
// Transfer first the contents of data to buffer (array of chars)
Serial.printf(" -> Client Rec'd Raw CSC Data: [%d] [ ", len);
for (int i = 0; i < sizeof(buffer); i++) {
if ( i <= sizeof(buffer)) {
buffer[i] = *data++;
Serial.printf("%02X ", buffer[i], HEX);
}
}
Serial.print("] ");
uint8_t offset = 0;
// we define the offset that is to be used when reading the next field
// Size of variables (e.g. 2 (16) or 4 bytes (32)) are constants in BluetoothGattCharacteristic
// these represent the values you can find in the "Value Fields" table in the "Format" column
// Read the Flags field at buffer[0]
uint8_t flags = buffer[offset];
offset += 1; // UINT8
// we have to check the flags' nth bit to see if C1 field exists
if ((flags & 1) != 0) {
uint32_t cum_wheel_rev = 0;
memcpy(&cum_wheel_rev, &buffer[offset], 4);
offset += 4; // UINT32
uint16_t last_wheel_event = 0;
memcpy(&last_wheel_event, &buffer[offset], 2);
offset += 2; // UINT16
Serial.printf(" Cum. wheel rev.: %d Last wheel event: %d ", cum_wheel_rev, last_wheel_event);
}
// we have to check the flags' nth bit to see if C2 field exists
if ((flags & 2) != 0) {
uint16_t cum_cranks = 0;
memcpy(&cum_cranks, &buffer[offset], 2);
offset += 2; // UINT16
uint16_t last_crank_event = 0;
memcpy(&last_crank_event, &buffer[offset], 2);
offset += 2; // UINT16
Serial.printf(" Cum cranks: %d Last crank event: %d", cum_cranks, last_crank_event);
}
Serial.println();
#endif
}
// ---------------------- END of CLIENT SIDE FUNCTIONS -------------------------
// ---------------------- START of SERVER SIDE FUNCTIONS -------------------------

void server_setupNUS(void)
{
server_NordicUart_Service.begin();
// Add NUS TXD Characteristic
server_NUS_TXD_Chr.setProperties(CHR_PROPS_NOTIFY); // Type "notify"
server_NUS_TXD_Chr.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS); // readAccess, NO writeAccess
server_NUS_TXD_Chr.setMaxLen(MAX_PAYLOAD); // To be on the safe side!
server_NUS_TXD_Chr.setCccdWriteCallback(server_cccd_callback); // Optionally capture CCCD updates
server_NUS_TXD_Chr.begin();

// Add NUS RXD Characteristic
server_NUS_RXD_Chr.setProperties(CHR_PROPS_WRITE | CHR_PROPS_WRITE_WO_RESP); // Write with No response !!
server_NUS_RXD_Chr.setPermission(SECMODE_NO_ACCESS, SECMODE_OPEN);
server_NUS_RXD_Chr.setMaxLen(MAX_PAYLOAD); // Maxlen
server_NUS_RXD_Chr.setWriteCallback(server_NUS_RXD_Chr_callback);
server_NUS_RXD_Chr.begin();
}

void server_NUS_RXD_Chr_callback(uint16_t conn_hdl, BLECharacteristic* chr, uint8_t* data, uint16_t len)
{
// Read data received over NUS RXD from Mobile Phone
#ifdef DEBUG
uint8_t NusRxdDataLen = (uint8_t)len; // Get the actual length of data bytes and type cast to (uint8_t)
char NusRxdData[MAX_PAYLOAD + 1]; // Data is all ASCII !
memset(NusRxdData, 0, MAX_PAYLOAD); // set to zero
if (NusRxdDataLen > MAX_PAYLOAD) {
NusRxdDataLen = MAX_PAYLOAD; // Check for limit
}
memcpy(NusRxdData, data, NusRxdDataLen); // Transfer data to char array
// Display the raw packet data in actual length
Serial.printf(" -> Server NUS RXD Data [%d][%s]\n", NusRxdDataLen, NusRxdData);
#endif
}

void Construct_Dev_Name(void)
{
const char prefix[] = {'S', 'i', 'm', ' '}; // #4 Chars
size_t len = strlen((const char*)client_GA_DeviceName_Data); // Len of null terminated char array
int MaxLen = (MAX_PAYLOAD - sizeof(prefix) - 1); // 1 less for null terminating char
if (len > MaxLen) {
len = MaxLen;
}
int pos = MaxLen;
if (len > 0) {
// pfound points to the first occurence of " " (blank space char)
char pfound = strstr((const char)client_GA_DeviceName_Data, " ");
if (pfound != NULL) {
pos = int(pfound - (char*)client_GA_DeviceName_Data); // Convert to position in DevName
}
}
if ( pos > MaxLen ) {
pos = MaxLen; // Stay within char array allocated memory!
}
memmove(&client_GA_DeviceName_Data[sizeof(prefix)], &client_GA_DeviceName_Data, pos); // Make space: shift to the right
memcpy(&client_GA_DeviceName_Data, &prefix, sizeof(prefix)); // Insert prefix at begin of DevName
client_GA_DeviceName_Data[(pos + sizeof(prefix))] = 0; // Make null terminated char array at new position, skip rest!
}

void server_startADV(void)
{
// Setup and start advertising
// Supported tx_power values depending on mcu:
// - nRF52832: -40dBm, -20dBm, -16dBm, -12dBm, -8dBm, -4dBm, 0dBm, +3dBm and +4dBm.
// - nRF52840: -40dBm, -20dBm, -16dBm, -12dBm, -8dBm, -4dBm, 0dBm, +2dBm, +3dBm, +4dBm, +5dBm, +6dBm, +7dBm and +8dBm.
Bluefruit.setTxPower(4); // See above for supported values: +4dBm
// Set blink rate in advertising mode
Bluefruit.setConnLedInterval(250);

Construct_Dev_Name();

#ifdef DEBUG
Serial.printf("Setting Server Device Name to: [%s]\n", client_GA_DeviceName_Data);
#endif
Bluefruit.setName((const char*)client_GA_DeviceName_Data);
if (Bluefruit.setAppearance(client_GA_Appearance_Value))
{
#ifdef DEBUG
Serial.printf("Setting Server Appearance to: [%d]\n", client_GA_Appearance_Value);
#endif
}
// Set the connect/disconnect callback handlers
Bluefruit.Periph.setConnectCallback(server_connect_callback);
Bluefruit.Periph.setDisconnectCallback(server_disconnect_callback);

// Advertising packet
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
Bluefruit.Advertising.addTxPower();

// Test include only FTMS Service as defined above
Bluefruit.Advertising.addService(server_CylingPower_Service);
Bluefruit.Advertising.addService(server_CyclingSpeedCadence_Service);
Bluefruit.Advertising.addService(server_FitnessMachine_Service);
// No need to advertise NUS, Companion App detects it anyway!

// Include Bluefruit.Advertising.addName and 128-bit uuid(s) result in a packet space problem!!!
// Use secondary Scan Response packet (optional)
// if there is no room for 'Name' in Advertising packet
Bluefruit.ScanResponse.addName();

/* Start Advertising
- Enable auto advertising Yes/NO if disconnected
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
- Timeout for fast mode is 30 seconds
- Start(timeout) with timeout = 0 will advertise forever (until connected)
*/
Bluefruit.Advertising.restartOnDisconnect(true); // false --> at test stage we do NOT want to auto RESTART
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
}

void server_setupDIS(void)
{
// Configure and Start the Device Information Service
server_bledis.setManufacturer((const char*)client_DIS_Manufacturer_Str);
server_bledis.setModel((const char*)client_DIS_ModelNumber_Str);
// Notice that the Firmware Revision string is default set to
// the value of the Feather-nRF52 Board being used!
server_bledis.setFirmwareRev((const char*)FirmwareRevStr);
server_bledis.setSerialNum((const char*)client_DIS_SerialNumber_Str);
server_bledis.setHardwareRev((const char*)HardwareRevStr);
server_bledis.setSoftwareRev((const char*)SoftwareRevStr);
server_bledis.begin();
}

void server_setupFTMS(void)
{
server_FitnessMachine_Service.begin(); //

// Fitness Machine Feature, mandatory, read
server_FTM_Feature_Chr.setProperties(CHR_PROPS_READ);
server_FTM_Feature_Chr.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS);
server_FTM_Feature_Chr.setFixedLen(FTM_FEATURE_FIXED_DATALEN);
server_FTM_Feature_Chr.begin();
server_FTM_Feature_Chr.write(client_FTM_Feature_Data, FTM_FEATURE_FIXED_DATALEN);

// Indoor Bike Data, optional, notify
server_FTM_IndoorBikeData_Chr.setProperties(CHR_PROPS_NOTIFY); // because type "notify"
server_FTM_IndoorBikeData_Chr.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS); // readAccess, writeAccess
server_FTM_IndoorBikeData_Chr.setMaxLen(MAX_PAYLOAD); // To be on the safe side, when many features are set!
server_FTM_IndoorBikeData_Chr.setCccdWriteCallback(server_cccd_callback); // Optionally capture CCCD updates
server_FTM_IndoorBikeData_Chr.begin();

// Training Status, optional, read & notify
server_FTM_TrainingStatus_Chr.setProperties(CHR_PROPS_NOTIFY); // because type is "notify"
server_FTM_TrainingStatus_Chr.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS); // readAccess, writeAccess
server_FTM_TrainingStatus_Chr.setFixedLen(FTM_TRAINING_STATUS_FIXED_DATALEN);
server_FTM_TrainingStatus_Chr.setCccdWriteCallback(server_cccd_callback); // Optionally capture CCCD updates
server_FTM_TrainingStatus_Chr.begin();

// Supported Resistance Level Range, read, optional
server_FTM_SupportedResistanceLevelRange_Chr.setProperties(CHR_PROPS_READ);
server_FTM_SupportedResistanceLevelRange_Chr.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS);
server_FTM_SupportedResistanceLevelRange_Chr.setFixedLen(FTM_SRLR_FIXED_DATALEN);
server_FTM_SupportedResistanceLevelRange_Chr.begin();
server_FTM_SupportedResistanceLevelRange_Chr.write(client_FTM_SupportedResistanceLevelRange_Data, FTM_SRLR_FIXED_DATALEN);

// Supported Power Range, read, optional
server_FTM_SupportedPowerRange_Chr.setProperties(CHR_PROPS_READ);
server_FTM_SupportedPowerRange_Chr.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS);
server_FTM_SupportedPowerRange_Chr.setFixedLen(FTM_SPR_FIXED_DATALEN);
server_FTM_SupportedPowerRange_Chr.begin();
server_FTM_SupportedPowerRange_Chr.write(client_FTM_SupportedPowerRange_Data, FTM_SPR_FIXED_DATALEN);

// Fitness Machine Control Point, optional, write
server_FTM_ControlPoint_Chr.setProperties(CHR_PROPS_INDICATE | CHR_PROPS_WRITE); // CHR_PROPS_READ // | CHR_PROPS_WRITE_WO_RESP); // Write with No response !!
server_FTM_ControlPoint_Chr.setPermission(SECMODE_OPEN, SECMODE_OPEN); // readAccess, writeAccess DO NOT SET: SECMODE_NO_ACCESS !
server_FTM_ControlPoint_Chr.setMaxLen(FTM_CONTROL_POINT_DATALEN); // Maxlen of Client written data: (1) OpCode and (FTM_CONTROL_POINT_DATALEN-1) OCTETS
server_FTM_ControlPoint_Chr.setWriteCallback(server_FTM_ControlPoint_Chr_callback);
server_FTM_ControlPoint_Chr.begin();

// Fitness Machine Status, mandatory, notify BLENotify,
server_FTM_Status_Chr.setProperties(CHR_PROPS_NOTIFY); // because type is "notify"
server_FTM_Status_Chr.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS); // readAccess, writeAccess
server_FTM_Status_Chr.setMaxLen(FTM_STATUS_DATALEN);
server_FTM_Status_Chr.setCccdWriteCallback(server_cccd_callback); // Optionally capture CCCD updates
server_FTM_Status_Chr.begin();
}

void server_FTM_ControlPoint_Chr_callback(uint16_t conn_hdl, BLECharacteristic* chr, uint8_t* data, uint16_t len)
{
// Server FTM Control Point data is tranferred to the Client
// NO TREATMENT OF COMMAND !!!
client_FTM_ControlPoint_Chr.write_resp(data, len); // Just pass on and process later!
// Seems to cause hickups in response stream
// client_FTM_ControlPoint_Chr.write(data, len); // Just pass on and process later!

uint8_t ftmcpDataLen = (uint8_t)len;
memset(server_FTM_Control_Point_Data.bytes, 0, sizeof(server_FTM_Control_Point_Data.bytes));
// Transfer the contents of data to server_FTM_Control_Point_Data.bytes
for (int i = 0; i < ftmcpDataLen; i++) {
server_FTM_Control_Point_Data.bytes[i] = data++;
}
/
Decodes an incoming Fitness Machine Control Point request */
#ifdef DEBUG
Serial.printf(" -> Server Rec'd Raw FTM Control Point Data [len: %d] ", ftmcpDataLen);
Serial.printf("[OpCode: %02X] [Values: ", server_FTM_Control_Point_Data.values.OPCODE, HEX);
for (int i = 0; i < ftmcpDataLen; i++) {
Serial.printf("%02X ", server_FTM_Control_Point_Data.values.OCTETS[i], HEX);
}
Serial.println("]");
#endif
switch (server_FTM_Control_Point_Data.values.OPCODE) {
case ftmcpRequestControl: {
#ifdef DEBUG
Serial.println("Request Control of Machine!");
#endif
break;
}
case ftmcpStartOrResume: {
#ifdef DEBUG
Serial.println("Start or Resume Machine!");
#endif
break;
}
case ftmcpStopOrPause: {
#ifdef DEBUG
Serial.println("Stop or Pause Machine, Parameter: Stop!");
#endif
break;
}
case ftmcpSetIndoorBikeSimulationParameters: {
// Short is 16 bit signed, so the windspeed is converted from two bytes to signed value. Highest bit is sign bit
short ws = (server_FTM_Control_Point_Data.values.OCTETS[0] << 8) + server_FTM_Control_Point_Data.values.OCTETS[1];
wind_speed = ws / 1000.0;
// Short is 16 bit signed, so a negative grade is correctly converted from two bytes to signed value. Highest bit is sign bit
short gr = (server_FTM_Control_Point_Data.values.OCTETS[3] << 8) + server_FTM_Control_Point_Data.values.OCTETS[2];
grade = gr / 100.0;
crr = server_FTM_Control_Point_Data.values.OCTETS[4] / 10000.0;
cw = server_FTM_Control_Point_Data.values.OCTETS[5] / 100.0;
#ifdef DEBUG // Remember, if debugging with Zwift, that these values are divided by 2 if in Zwift 50% settings!
Serial.print("Set Indoor Bike Simulation Parameters --> ");
Serial.print("Wind speed (1000): "); Serial.print(wind_speed);
Serial.print(" | Grade (100): "); Serial.print(grade);
Serial.print(" | Crr (10000): "); Serial.print(crr);
Serial.print(" | Cw (100): "); Serial.println(cw);
#endif
break;
}
case ftmcpReset: {
#ifdef DEBUG
Serial.println("Reset Machine!");
#endif
break;
}
case ftmcpSetTargetResistanceLevel:
case ftmcpSetTargetSpeed:
case ftmcpSetTargetInclination:
case ftmcpSetTargetPower:
case ftmcpSetTargetHeartRate:
case ftmcpSetTargetedExpendedEngery:
case ftmcpSetTargetedNumberOfSteps:
case ftmcpSetTargetedNumberOfStrided:
case ftmcpSetTargetedDistance:
case ftmcpSetTargetedTrainingTime:
case ftmcpSetTargetedTimeInTwoHeartRateZones:
case ftmcpSetTargetedTimeInThreeHeartRateZones:
case ftmcpSetTargetedTimeInFiveHeartRateZones:
case ftmcpSetWheelCircumference:
case ftmcpSetSpinDownControl:
case ftmcpSetTargetedCadence:
{
#ifdef DEBUG
Serial.println("Unresolved OpCode!");
#endif
break;
}
} // switch
}

void server_setupCPS(void)
{
// Configure the Cycling Power service
server_CylingPower_Service.begin();

server_CP_Measurement_Chr.setProperties(CHR_PROPS_NOTIFY); // type is "notify"
server_CP_Measurement_Chr.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS); // readAccess, writeAccess
server_CP_Measurement_Chr.setMaxLen(MAX_PAYLOAD); // Will work in most cases!
server_CP_Measurement_Chr.setCccdWriteCallback(server_cccd_callback); // Optionally capture CCCD updates
server_CP_Measurement_Chr.begin();

server_CP_ControlPoint_Chr.setProperties(CHR_PROPS_INDICATE | CHR_PROPS_WRITE); // Indicate and Write !!
server_CP_ControlPoint_Chr.setPermission(SECMODE_OPEN, SECMODE_OPEN); // readAccess, writeAccess DO NOT SET: SECMODE_NO_ACCESS !
server_CP_ControlPoint_Chr.setMaxLen(CP_CONTROL_POINT_DATALEN); // The charactersitic's data set varies in length
server_CP_ControlPoint_Chr.setCccdWriteCallback(server_cccd_callback); // Optionally capture CCCD updates
server_CP_ControlPoint_Chr.begin();
server_CP_ControlPoint_Chr.setWriteCallback(server_CP_ControlPoint_Chr_callback); // Respond to events with "Write with Response" !!

server_CP_Feature_Chr.setProperties(CHR_PROPS_READ);
server_CP_Feature_Chr.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS);
server_CP_Feature_Chr.setMaxLen(CP_FEATURE_DATALEN);
server_CP_Feature_Chr.begin();
server_CP_Feature_Chr.write32(client_CP_Feature_Flags);

server_CP_Location_Chr.setProperties(CHR_PROPS_READ);
server_CP_Location_Chr.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS);
server_CP_Location_Chr.setFixedLen(1); // UINT8
server_CP_Location_Chr.begin();
server_CP_Location_Chr.write8(client_CP_Location_Value); // Set the characteristic
}

void server_setupCSC()
{
// Configure the Cadence and Speed service
server_CyclingSpeedCadence_Service.begin();

server_CSC_Measurement_Chr.setProperties(CHR_PROPS_NOTIFY); // because type "notify"
server_CSC_Measurement_Chr.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS); // readAccess, writeAccess
server_CSC_Measurement_Chr.setMaxLen(MAX_PAYLOAD);
server_CSC_Measurement_Chr.setCccdWriteCallback(server_cccd_callback); // Optionally capture CCCD updates
server_CSC_Measurement_Chr.begin();

// Set the CSC Feature characteristic
server_CSC_Feature_Chr.setProperties(CHR_PROPS_READ);
server_CSC_Feature_Chr.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS);
server_CSC_Feature_Chr.setFixedLen(CSC_FEATURE_FIXED_DATALEN);
server_CSC_Feature_Chr.begin();
server_CSC_Feature_Chr.write16(client_CSC_Feature_Flags);

// Configure the Sensor Location characteristic
server_CSC_Location_Chr.setProperties(CHR_PROPS_READ);
server_CSC_Location_Chr.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS);
server_CSC_Location_Chr.setFixedLen(1);
server_CSC_Location_Chr.begin();
server_CSC_Location_Chr.write8(client_CSC_Location_Value); // Set the characteristic
}

void server_CP_ControlPoint_Chr_callback(uint16_t conn_hdl, BLECharacteristic* chr, uint8_t* data, uint16_t len)
{
// Server CP Control Point data from Zwift is transferred to the Trainer
// NO TREATMENT OF COMMAND !!!
client_CP_ControlPoint_Chr.write_resp(data, len); // Just pass on and process later!
// Not sure this is the right choice!
// client_CP_ControlPoint_Chr.write(data, len); // Just pass on and process later!

#ifdef DEBUG
uint8_t cpcpDataLen = (uint8_t)len; // Get the actual length of data bytes and type cast to (uint8_t)
uint8_t cpcpData[cpcpDataLen];
memset(cpcpData, 0, cpcpDataLen); // set to zero
// Display the raw request packet actual length
Serial.printf(" -> Server CP Control Point Data [%d] [ ", cpcpDataLen);
// Transfer the contents of data to cpcpData
for (int i = 0; i < cpcpDataLen; i++) {
if ( i <= sizeof(cpcpData)) {
cpcpData[i] = *data++;
// Display the raw request packet byte by byte in HEX
Serial.printf("%02X ", cpcpData[i], HEX);
}
}
Serial.println(" ] ");
#endif
}

void server_connect_callback(uint16_t conn_handle)
{
char Peer_Name[MAX_PAYLOAD] = {0};
uint8_t Peer_Addr[6] = {0};
// Get the reference to current connection
BLEConnection* connection = Bluefruit.Connection(conn_handle);
connection->getPeerName(Peer_Name, sizeof(Peer_Name));
ble_gap_addr_t peer_address = connection->getPeerAddr();
memcpy(Peer_Addr, peer_address.addr, 6);
#ifdef DEBUG
Serial.printf("Feather nRF52 (Peripheral) connected to Central device: [%s] MAC Address: ", Peer_Name);
PrintPeerAddress(Peer_Addr);
Serial.println();
#endif
// Who has been exactly connected?
// [1] Laptop is connecting
if (memcmp(Peer_Addr, Laptop.PeerAddress, 6) == 0 ) { // Check Laptop MAC address
// Laptop/PC is connecting !
memcpy(Laptop.PeerName, Peer_Name, sizeof(Peer_Name));
Laptop.conn_handle = conn_handle;
Laptop.IsConnected = true;
// MITM Server is connected with Central (Laptop/Smartphone) and ONLY
// now enable the peripheral (trainer) to stream CPS, CSC and FTMS data...
if(Trainer.IsConnected) { Client_Enable_Notify_Indicate(); }
#ifdef DEBUG
Serial.println("Waiting for Central (Zwift) to set CCCD Notify/Indicate (enable) and start....");
#endif
return; // We are done here!
}
// [2] Smartphone is connecting
memcpy(Smartphone.PeerName, Peer_Name, sizeof(Peer_Name));
Smartphone.conn_handle = conn_handle;
Smartphone.IsConnected = true;
memcpy(Smartphone.PeerAddress, Peer_Addr, 6);
#ifdef DEBUG
Serial.println("Waiting for Central (Phone) to set NUS Txd 'Notify' and start....");
#endif
}

/*
Callback invoked when a connection is dropped
@param conn_handle connection where this event happens
@param reason is a BLE_HCI_STATUS_CODE
*/
void server_disconnect_callback(uint16_t conn_handle, uint8_t reason)
{
if (Laptop.conn_handle == conn_handle ) { // Laptop/Desktop is disconnected
Laptop.conn_handle = BLE_CONN_HANDLE_INVALID;
Laptop.IsConnected = false;
#ifdef DEBUG
Serial.printf("Server disconnected from Central (Laptop): [%s], reason: [%02X]\n", Laptop.PeerName, reason, HEX);
#endif
}
if (Smartphone.conn_handle == conn_handle ) { // Smartphone is disconnected
Smartphone.conn_handle = BLE_CONN_HANDLE_INVALID;
Smartphone.IsConnected = false;
#ifdef DEBUG
Serial.printf("Server disconnected from Central (Phone): [%s], reason: [%02X]\n", Smartphone.PeerName, reason, HEX);
#endif
}
Bluefruit.Advertising.start(0);
}

void server_cccd_callback(uint16_t conn_handle, BLECharacteristic* chr, uint16_t cccd_value)
{
// When changed, display the Notify/Indicate Status for all characteristics
#ifdef DEBUG
Serial.printf("Central Device Updated CCCD to: [%d] --> ", cccd_value);
#endif
// Check the characteristic UUID this CCCD callback is associated with,
// in case this handler is used for multiple CCCD records.
if (chr->uuid == server_CP_Measurement_Chr.uuid) {
if (chr->notifyEnabled(conn_handle)) {
#ifdef DEBUG
Serial.print("Server CP: Measurement 'Notify' enabled");
#endif
} else {
#ifdef DEBUG
Serial.print("Server CP: Measurement 'Notify' disabled");
#endif
}
}

if (chr->uuid == server_CP_ControlPoint_Chr.uuid) {
if (chr->indicateEnabled(conn_handle)) {
#ifdef DEBUG
Serial.print("Server CP: ControlPoint 'Indicate' enabled");
#endif
} else {
#ifdef DEBUG
Serial.print("Server CP: ControlPoint 'Indicate' disabled");
#endif
}
}

if (chr->uuid == server_CSC_Measurement_Chr.uuid) {
if (chr->notifyEnabled(conn_handle)) {
#ifdef DEBUG
Serial.print("Server CSC: Measurement 'Notify' enabled");
#endif
} else {
#ifdef DEBUG
Serial.print("Server CSC: Measurement 'Notify' disabled");
#endif
}
}

if (chr->uuid == server_FTM_IndoorBikeData_Chr.uuid) {
if (chr->notifyEnabled(conn_handle)) {
#ifdef DEBUG
Serial.print("Server FTM: IndoorBikeData 'Notify' enabled");
#endif
} else {
#ifdef DEBUG
Serial.print("Server FTM: IndoorBikeData 'Notify' disabled");
#endif
}
}

if (chr->uuid == server_FTM_TrainingStatus_Chr.uuid) { // Zwift is NOT interested at all !!!
if (chr->notifyEnabled(conn_handle)) {
#ifdef DEBUG
Serial.print("Server FTM: TrainingStatus 'Notify' enabled");
#endif
} else {
#ifdef DEBUG
Serial.print("Server FTM: TrainingStatus 'Notify' disabled");
#endif
}
}

if (chr->uuid == server_FTM_Status_Chr.uuid) {
if (chr->notifyEnabled(conn_handle)) {
#ifdef DEBUG
Serial.print("Server FTM: Status 'Notify' enabled");
#endif
} else {
#ifdef DEBUG
Serial.print("Server FTM: Status 'Notify' disabled");
#endif
}
}

if (chr->uuid == server_FTM_ControlPoint_Chr.uuid) {
if (chr->indicateEnabled(conn_handle)) {
#ifdef DEBUG
Serial.print("Server FTM: ControlPoint 'Indicate' enabled");
#endif
} else {
#ifdef DEBUG
Serial.print("Server FTM: ControlPoint 'Indicate' disabled");
#endif
}
}

if (chr->uuid == server_NUS_TXD_Chr.uuid) {
if (chr->notifyEnabled(conn_handle)) {
#ifdef DEBUG
Serial.print("Server NUS: TXD 'Notify' enabled");
#endif
} else {
#ifdef DEBUG
Serial.print("Server NUS: TXD 'Notify' disabled");
#endif
}
}

#ifdef DEBUG
Serial.println();
#endif
} // end Server CCCD callback
// ---------------------- END of SERVER SIDE FUNCTIONS -------------------------

Result :

18:15:39.969 -> Feather nRF52840 MITM supporting: CPS, CSC and FTMS
18:15:39.969 -> ------------------ Version 02.3 ---------------------
18:15:39.969 -> FTM Service and Chars are 'initialized'
18:15:39.969 -> CP Service and Chars are 'initialized'
18:15:39.969 -> CSC Service and Chars are 'initialized'
18:15:39.969 -> Generic Access Service and Chars are 'initialized'
18:15:39.969 -> Device Information Service and Chars are 'initialized'
18:15:39.969 -> Start Client-side Scanning for CPS, CSC and FTMS!
18:15:39.969 -> Found advertising Peripheral with FTMS enabled! See Raw data packet:
18:15:39.969 -> Timestamp Addr Rssi Data
18:15:39.969 -> 000001090 F8:9C:FC:53:5E:49 -60 09-02-16-18-26-18-18-18-0A-18
18:15:39.969 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
18:15:39.969 -> Now checking all mandatory Client Services and Characteristics!
18:15:39.969 -> If Mandatory Services Fail --> the Client will disconnect!
18:15:39.969 -> First checking Generic Access and Device Information Services and Characteristics!
18:15:39.969 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
18:15:39.969 -> Discovering Client FTM Feature Characteristic ... Discovering Client FTM Control Point Characteristic ... Found it!
18:15:40.064 -> Discovering Client FTM Status Characteristic ... Found it!
18:15:40.391 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
18:15:40.672 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
18:15:40.827 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
18:15:40.827 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
18:15:41.088 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
18:15:41.088 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
18:15:41.368 -> Discovering Client Cycling Power (CP) Service ... Discovering Client CP Measurement characteristic ... Found it!
18:15:41.724 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
18:15:42.005 -> Discovering Client CP Feature characteristic ... Found it!
18:15:42.175 -> -> Client Reads Raw CP Feature bytes: [4] [ 00 00 00 00 ]
18:15:42.175 -> Discovering Client CP Sensor Location characteristic ... NOT Found! NOT Mandatory!
18:15:42.175 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
18:15:42.346 -> Discovering Client CSC Measurement CHR ... Found it!
18:15:42.532 -> Discovering Client CSC Location CHR ... Found it!
18:15:42.718 -> -> Client Reads CSC Location Sensor: Loc#: 0 Other
18:15:42.718 -> Discovering Client CSC Feature CHR ... Not Found! NOT Mandatory!
18:15:44.315 -> Configuring the Server Device Information Service
18:15:44.315 -> Configuring the Server Cycle Power Service
18:15:44.315 -> Configuring the Server Cadence and Speed Service
18:15:44.315 -> Configuring the Server Fitness Machine Service
18:15:44.315 -> Configuring the Server NUS Service
18:15:44.315 -> Setting up the Server-side advertising payload(s)
18:15:44.315 -> Setting Server Device Name to: [Sim ]
18:15:44.315 -> Setting Server Appearance to: [0]
18:15:44.315 -> Server-side is CPS, CSC and FTMS advertising!
18:17:45.853 -> Feather nRF52 (Peripheral) connected to Central device: [DESKTOP-1CC9OQN] MAC Address: 58:11:22:53:52:18
18:17:45.853 -> Ready to receive Client FTM Control Point Response Messages
18:17:45.900 -> Ready to receive Client FTM Status values
18:17:45.900 -> >>> Couldn't enable notify for Client FTM Training Status Characteristic.
18:17:46.024 -> >>> Couldn't enable notify for Client FTM Indoor Bike Data Characteristic.
18:17:46.024 -> Ready to receive Client CP Measurement values
18:17:46.024 -> >>> Couldn't enable indicate for Client CP Control Point Characteristic.
18:17:46.057 -> Ready to receive Client CSC Measurement values
18:17:46.057 -> Waiting for Central (Zwift) to set CCCD Notify/Indicate (enable) and start....
18:17:50.388 -> Client- and Server-side are Up and Running!
18:17:51.217 -> Central Device Updated CCCD to: [1] --> Server CP: Measurement 'Notify' enabled
18:17:51.639 -> Central Device Updated CCCD to: [1] --> Server CSC: Measurement 'Notify' enabled
18:17:52.343 -> Central Device Updated CCCD to: [1] --> Server FTM: IndoorBikeData 'Notify' enabled
18:17:53.126 -> Central Device Updated CCCD to: [1] --> Server FTM: Status 'Notify' enabled
18:19:20.062 -> -> Server Rec'd Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
18:19:20.062 -> Request Control of Machine!
18:19:20.235 -> -> Client Rec'd Control Point Response: [ 80 00 01 ]
18:19:20.360 -> -> Server Rec'd Raw FTM Control Point Data [len: 1] [OpCode: 01] [Values: 00 ]
18:19:20.360 -> Reset Machine!
18:19:20.360 -> -> Server Rec'd Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
18:19:20.360 -> Request Control of Machine!
18:19:20.626 -> -> Client Rec'd Control Point Response: [ 80 01 01 ]
18:19:20.626 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 01 ]
18:19:25.543 -> -> Server Rec'd Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
18:19:25.543 -> Request Control of Machine!
18:19:25.589 -> -> Client Rec'd Control Point Response: [ 80 00 01 ]
18:19:25.730 -> -> Server Rec'd Raw FTM Control Point Data [len: 1] [OpCode: 07] [Values: 00 ]
18:19:25.730 -> Start or Resume Machine!
18:19:25.869 -> -> Client Rec'd Control Point Response: [ 80 07 01 ]
18:19:25.869 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 04 ]
18:19:26.804 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 CC 00 28 33 00 ]
18:19:26.804 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.04 | Crr (10000): 0.00 | Cw (100): 0.51
18:19:26.945 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:19:26.945 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 CC 00 28 33 ]
18:19:55.908 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 84 00 28 33 00 ]
18:19:55.908 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.32 | Crr (10000): 0.00 | Cw (100): 0.51
18:19:56.293 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:19:56.293 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 84 00 28 33 ]
18:19:57.253 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 04 00 28 33 00 ]
18:19:57.253 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.04 | Crr (10000): 0.00 | Cw (100): 0.51
18:19:57.458 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:19:57.458 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 04 00 28 33 ]
18:19:58.366 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 2D 01 28 33 00 ]
18:19:58.366 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 3.01 | Crr (10000): 0.00 | Cw (100): 0.51
18:19:58.538 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:19:58.538 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 2D 01 28 33 ]
18:19:59.475 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 2C 01 28 33 00 ]
18:19:59.475 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 3.00 | Crr (10000): 0.00 | Cw (100): 0.51
18:19:59.616 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:19:59.616 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 2C 01 28 33 ]
18:20:01.176 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 2B 01 28 33 00 ]
18:20:01.176 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.99 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:01.362 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:01.362 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 2B 01 28 33 ]
18:20:04.460 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 2A 01 28 33 00 ]
18:20:04.460 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.98 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:04.664 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:04.664 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 2A 01 28 33 ]
18:20:06.262 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 29 01 28 33 00 ]
18:20:06.262 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.97 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:06.434 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:06.434 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 29 01 28 33 ]
18:20:08.944 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 28 01 28 33 00 ]
18:20:08.944 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.96 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:09.069 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:09.069 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 28 01 28 33 ]
18:20:11.448 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 27 01 28 33 00 ]
18:20:11.448 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.95 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:11.494 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:11.494 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 27 01 28 33 ]
18:20:13.321 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 26 01 28 33 00 ]
18:20:13.321 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.94 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:13.477 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:13.477 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 26 01 28 33 ]
18:20:15.857 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 25 01 28 33 00 ]
18:20:15.857 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.93 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:16.183 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:16.183 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 25 01 28 33 ]
18:20:17.808 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 24 01 28 33 00 ]
18:20:17.808 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.92 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:18.059 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:18.059 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 24 01 28 33 ]
18:20:18.953 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 23 01 28 33 00 ]
18:20:18.953 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.91 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:19.139 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:19.139 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 23 01 28 33 ]
18:20:21.451 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 22 01 28 33 00 ]
18:20:21.451 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.90 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:21.670 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:21.670 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 01 28 33 ]
18:20:22.628 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 21 01 28 33 00 ]
18:20:22.628 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.89 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:22.722 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:22.722 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 21 01 28 33 ]
18:20:24.290 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 20 01 28 33 00 ]
18:20:24.290 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.88 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:24.370 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:24.370 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 20 01 28 33 ]
18:20:25.946 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 1F 01 28 33 00 ]
18:20:25.946 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.87 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:26.165 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:26.165 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1F 01 28 33 ]
18:20:26.994 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 1E 01 28 33 00 ]
18:20:26.994 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.86 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:27.150 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:27.150 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1E 01 28 33 ]
18:20:28.998 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 1D 01 28 33 00 ]
18:20:28.998 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.85 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:29.170 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:29.170 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1D 01 28 33 ]
18:20:29.985 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 1C 01 28 33 00 ]
18:20:29.985 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.84 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:30.311 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:30.311 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1C 01 28 33 ]
18:20:31.250 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 1B 01 28 33 00 ]
18:20:31.250 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.83 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:31.328 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
8:20:31.328 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1B 01 28 33 ]
18:20:32.141 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 1A 01 28 33 00 ]
18:20:32.141 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.82 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:32.234 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:32.234 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1A 01 28 33 ]
18:20:33.843 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 19 01 28 33 00 ]
18:20:33.843 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.81 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:33.984 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:33.984 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 19 01 28 33 ]
18:20:34.948 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 18 01 28 33 00 ]
18:20:34.948 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.80 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:35.200 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:35.200 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 18 01 28 33 ]
18:20:36.098 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 17 01 28 33 00 ]
18:20:36.098 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.79 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:36.331 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:36.331 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 17 01 28 33 ]
18:20:37.287 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 16 01 28 33 00 ]
18:20:37.287 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.78 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:37.507 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:37.507 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 16 01 28 33 ]
18:20:38.335 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 14 01 28 33 00 ]
18:20:38.335 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.76 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:38.569 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
18:20:38.569 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 14 01 28 33 ]
18:20:39.430 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 13 01 28 33 00 ]
18:20:39.430 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.75 | Crr (10000): 0.00 | Cw (100): 0.51
18:20:39.525 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
With respect to FTMS_Zwift_Bridge:
You inserted several While loops (in client_connect_callback): No doubt that you also have seen that these have negative (side-)effects, GA- and DIS readings are missed -> No manufacturer name, model number, et cetera. --> consequence later:
empty variables:

18:15:44.315 -> Setting Server Device Name to: [Sim ]
18:15:44.315 -> Setting Server Appearance to: [0]

I do not see for example the trainer send IndoorBikeData to Zwift as a response to the resistance parameter settings..... nor a different output as we have seen before...
My conclusion is:
I am sorry but I do not see any improvement in the output/behavior, with some While loops, on the contrary.
Next time just run the original uploaded FTMS Zwift Bridge version 023.

I am still missing the test of the latest uploaded FTMS_Client v027 (please without you inserting extra while loops).

Keep faith, somehow we will tackle the Hub connection problem!
Beste wishes,
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Dear Jörghen,

Here is the disappointing result.

The problem is still the same no feedback with V0.27

Let's not lose heart!

123456789101112131415161718192021
/*********************************************************************
This is programming code for the nRF52 based Bluefruit BLE boards

The code uses heavily the Adafruit supplied Bluefruit BLE libraries !!
Adafruit invests time and resources providing open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!

MIT license, check LICENSE for more information
All text must be included in any redistribution

Message (Enter to send message to 'Adafruit ItsyBitsy nRF52840 Express' on 'COM11')
New Line
115200 baud
16:59:01.080 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
16:59:01.080 -> ----------------- Version 02.7 ------------------
16:59:01.080 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:59:01.205 -> FTMS and Chars 'initialized'
16:59:01.205 -> CPS and Chars 'initialized'
16:59:01.205 -> CSCS and Chars 'initialized'
16:59:01.205 -> GA and Chars 'initialized'
16:59:01.205 -> DIS and Chars 'initialized'
16:59:01.205 -> Start Scanning for CPS, CSC and FTMS!
16:59:01.434 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:59:01.434 -> Timestamp MAC Address Rssi Data
16:59:01.434 -> 000091471 F8:9C:FC:53:5E:49 -59 09-02-16-18-26-18-18-18-0A-18
16:59:01.575 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:59:01.575 -> Now checking all Client Services and Characteristics!
16:59:01.575 -> If Mandatory Services Fail --> the Client will disconnect!
16:59:01.575 -> First checking Generic Access and Device Information Services and Characteristics!
16:59:01.668 -> Found Client Generic Access
16:59:01.808 -> -> Client Reads Device Name: [Zwift Hub]
16:59:02.042 -> -> Client Reads Appearance: [0]
16:59:02.042 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
16:59:02.042 -> Disconnecting since Client FTM Service is mandatory!
16:59:02.121 -> Client Disconnected, reason = 0x16
16:59:02.121 -> >>> Restart the Feather nRF52 Client for a new run! <<<
16:59:12.257 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
16:59:12.257 -> ----------------- Version 02.7 ------------------
16:59:12.257 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:59:12.257 -> FTMS and Chars 'initialized'
16:59:12.257 -> CPS and Chars 'initialized'
16:59:12.257 -> CSCS and Chars 'initialized'
16:59:12.257 -> GA and Chars 'initialized'
16:59:12.257 -> DIS and Chars 'initialized'
16:59:12.257 -> Start Scanning for CPS, CSC and FTMS!
16:59:12.258 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:59:12.258 -> Timestamp MAC Address Rssi Data
16:59:12.258 -> 000001100 F8:9C:FC:53:5E:49 -55 09-02-16-18-26-18-18-18-0A-18
16:59:12.258 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:59:12.258 -> Now checking all Client Services and Characteristics!
16:59:12.258 -> If Mandatory Services Fail --> the Client will disconnect!
16:59:12.258 -> First checking Generic Access and Device Information Services and Characteristics!
16:59:12.266 -> Found Client Generic Access
16:59:12.266 -> -> Client Reads Device Name: [Zwift Hub]
16:59:12.266 -> -> Client Reads Appearance: [1152]
16:59:12.266 -> Found Client Device Information
16:59:12.266 -> -> Client Reads Manufacturer: [Zwift]

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Here is the result of FTMS_Zwift_Bridge_v023:

17:15:10.800 -> Feather nRF52840 MITM supporting: CPS, CSC and FTMS
17:15:10.800 -> ------------------ Version 02.3 ---------------------
17:15:10.804 -> FTM Service and Chars are 'initialized'
17:15:10.804 -> CP Service and Chars are 'initialized'
17:15:10.804 -> CSC Service and Chars are 'initialized'
17:15:10.804 -> Generic Access Service and Chars are 'initialized'
17:15:10.804 -> Device Information Service and Chars are 'initialized'
17:15:10.804 -> Start Client-side Scanning for CPS, CSC and FTMS!
17:15:10.805 -> Found advertising Peripheral with FTMS enabled! See Raw data packet:
17:15:10.805 -> Timestamp Addr Rssi Data
17:15:10.805 -> 000001606 F8:9C:FC:53:5E:49 -55 09-02-16-18-26-18-18-18-0A-18
17:15:10.805 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:15:10.805 -> Now checking all mandatory Client Services and Characteristics!
17:15:10.805 -> If Mandatory Services Fail --> the Client will disconnect!
17:15:10.805 -> First checking Generic Access and Device Information Services and Characteristics!
17:15:10.828 -> Found Client Generic Access
17:15:10.828 -> -> Client Reads Device Name: [Zwift Hub]
17:15:10.828 -> -> Client Reads Appearance: [1152]
17:15:10.828 -> Found Client Device Information
17:15:10.828 -> -> Client Reads Manufacturer: [Zwift]
17:15:10.829 -> -> Client Reads Model Number: [06]
17:15:10.920 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:15:10.920 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:15:11.008 -> Discovering Client FTM Feature Characteristic ... Found it!
17:15:11.124 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
17:15:11.124 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:15:11.703 -> Discovering Client FTM Status Characteristic ... Found it!
17:15:11.984 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:15:12.285 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:15:12.402 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
17:15:12.402 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
17:15:12.742 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 00 00 00 00 ]
17:15:12.742 -> Discovering Client FTM Indoor Bike Data Characteristic ... Not Found! Not Mandatory
17:15:12.742 -> Discovering Client Cycling Power (CP) Service ... Not Found!
17:15:12.742 -> Disconnecting since Client Cyling Power Service is mandatory!
17:15:12.834 -> Client disconnected from Peripheral Device: [Zwift Hub], reason: [16]
17:15:27.560 -> Feather nRF52840 MITM supporting: CPS, CSC and FTMS
17:15:27.560 -> ------------------ Version 02.3 ---------------------
17:15:27.822 -> FTM Service and Chars are 'initialized'
17:15:27.822 -> CP Service and Chars are 'initialized'
17:15:27.822 -> CSC Service and Chars are 'initialized'
17:15:27.822 -> Generic Access Service and Chars are 'initialized'
17:15:27.822 -> Device Information Service and Chars are 'initialized'
17:15:27.822 -> Start Client-side Scanning for CPS, CSC and FTMS!
17:15:27.836 -> Found advertising Peripheral with FTMS enabled! See Raw data packet:
17:15:27.836 -> Timestamp Addr Rssi Data
17:15:27.836 -> 000001270 F8:9C:FC:53:5E:49 -60 09-02-16-18-26-18-18-18-0A-18
17:15:27.836 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:15:27.836 -> Now checking all mandatory Client Services and Characteristics!
17:15:27.836 -> If Mandatory Services Fail --> the Client will disconnect!
17:15:27.836 -> First checking Generic Access and Device Information Services and Characteristics!

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
I think we should first exclude an unexpected behavior/contribution/interference of ItsyBitsy before we undertake new test actions. A failing ItsyBitsy would be the simple explanation but I do not expect it to be that easy!

I find the results very unpredictable and that bothers me most! So I have to ask the question: are the circumstances/procedures every test exactly the same? Could you give me a complete summary of what your procedure is step by step?
Please also include when devices are switched on and or reset and what apps are active (like nRF Connect, Zwift, Rouvy, ESP32 boards...) that have access to BLE and might (in theory) connect over BLE..., when in time do you wake up the trainer and when are you moving the pedals on the trainer...
The last run shows FTMS to be discovered and Cycling Power of the same device is not..? Can there be a device (smartphone) that auto connects to CP in the meantime, it is very unlikely that only FTMS is exposed and CP NOT?
Unless the connection process is completely disturbed by an (un)known agent or CP is simply occupied by another device I find the results unimaginably. I have made so many BLE applications (with so many different devices) and I never came across such erratic behavior. Never a Char-discovery ever failed unless it was simply NOT implemented on the other side (device)...? No way that one had to pull it in a While loop... call it and you get the answer: yes the Char/SVC is there or not!

By the way what is this:

Message (Enter to send message to 'Adafruit ItsyBitsy nRF52840 Express' on 'COM11')

Where does it come from?
Do you use some special application on the PC other than Arduino IDE and the regular Serial Monitor on com# to fill the screen?
Regards,
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorghen,

This comes from the Arduino IDE 2.0, no doubt that I copied it with the rest before pasting it.

I received the Feather just now I resume all the tests with and more detail !!

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Dear Jörgen,

I redid all the tests with the feather nRF52840.
from V22 to 27.

There is no Bluetooth (Watch, Gsm, Google nest) active nearby.
The only thing I hadn't thought of before was my desktop's USB dongle for my mouse.
So I removed it and started all over again without it!

I did a Scan with nRFConnect There is no device found, no server and then I turned off my mobile

All tests were done twice with the same version.

-1 turn on the trainer and then turn on the FTMS.
-2 Switch on the FTMS and then train it.

I do not pedal to wake up because on Zwift with the Bluethoot USB dongle it is not necessary for him to discover the services.
Likewise on an ESP program that I showed you; the services are present just when the trainer is switched on.

17:13:06.265 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
17:13:06.265 -> ----------------- Version 02.2 ------------------
17:13:06.265 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:13:06.265 -> FTMS and Chars 'initialized'
17:13:06.265 -> CPS and Chars 'initialized'
17:13:06.265 -> CSCS and Chars 'initialized'
17:13:06.265 -> GA and Chars 'initialized'
17:13:06.265 -> DIS and Chars 'initialized'
17:13:06.265 -> Start Scanning for CPS, CSC and FTMS!
17:13:06.266 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:13:06.266 -> Timestamp MAC Address Rssi Data
17:13:06.266 -> 000001249 F8:9C:FC:53:5E:49 -54 09-02-16-18-26-18-18-18-0A-18
17:13:07.123 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:13:07.123 -> Now checking mandatory Client Services and Characteristics!
17:13:07.123 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:13:07.124 -> Discovering Client CP Measurement characteristic ... Found it!
17:13:07.124 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
17:13:07.133 -> Discovering Client CP Feature characteristic ... Found it!
17:13:07.285 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
17:13:07.285 -> Wheel revolution data supported
17:13:07.285 -> Crank revolution data supported
17:13:07.285 -> Discovering Client CP Sensor Location characteristic ... Found it!
17:13:07.469 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
17:13:07.469 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
17:13:07.533 -> Discovering Client CSC Measurement CHR ... Found it!
17:13:07.905 -> Discovering Client CSC Location CHR ... Found it!
17:13:07.905 -> -> Client Reads CSC Location Sensor: Loc#: 0 Other
17:13:07.905 -> Discovering Client CSC Feature CHR ... Not Found! NOT Mandatory!
17:13:07.905 -> Discovering Client Fitness Machine (FTM) Service ... Not Found!
17:13:07.905 -> Disconnecting since Client FTM Service is mandatory!
17:13:08.074 -> Client Disconnected, reason = 0x16
17:13:08.074 -> >>> Restart the Feather nRF52 Client for a new run! <<<
17:13:08.818 -> >>> Couldn't enable notify for Client CP Measurement Characteristic.
17:13:08.818 -> >>> Couldn't enable indicate for Client CP Control Point Characteristic.
17:13:08.818 -> >>> Couldn't enable notify for Client CSC Measurement Characteristic.
17:13:08.818 -> >>> Couldn't enable notify for Client FTM Training Status Characteristic.
17:13:08.818 -> FTMS (trainer) is controlled by another Client (Training App)!
17:13:08.818 -> Client (Central) is Up and Running!

17:13:52.954 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
17:13:52.954 -> ----------------- Version 02.2 ------------------
17:13:52.954 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:13:52.954 -> FTMS and Chars 'initialized'
17:13:52.954 -> CPS and Chars 'initialized'
17:13:52.954 -> CSCS and Chars 'initialized'
17:13:52.954 -> GA and Chars 'initialized'
17:13:52.954 -> DIS and Chars 'initialized'
17:13:52.954 -> Start Scanning for CPS, CSC and FTMS!
17:14:04.080 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:14:04.080 -> Timestamp MAC Address Rssi Data
17:14:04.080 -> 000012677 F8:9C:FC:53:5E:49 -51 09-02-16-18-26-18-18-18-0A-18
17:14:04.205 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:14:04.205 -> Now checking mandatory Client Services and Characteristics!
17:14:04.205 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:14:04.330 -> Discovering Client CP Measurement characteristic ... Found it!
17:14:04.794 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
17:14:04.963 -> Discovering Client CP Feature characteristic ... Found it!
17:14:05.147 -> -> Client Reads Raw CP Feature bytes: [4] [ 00 00 00 00 ]
17:14:05.147 -> Discovering Client CP Sensor Location characteristic ... NOT Found! NOT Mandatory!
17:14:05.147 -> Discovering Cycling Speed and Cadence (CSC) Service ... Not Found and disconnecting!
17:14:05.147 -> CSC Service is mandatory!
17:14:05.239 -> Client Disconnected, reason = 0x16
17:14:05.239 -> >>> Restart the Feather nRF52 Client for a new run! <<<
17:14:06.639 -> >>> Couldn't enable notify for Client CP Measurement Characteristic.
17:14:06.639 -> >>> Couldn't enable indicate for Client CP Control Point Characteristic.
17:14:06.639 -> >>> Couldn't enable notify for Client CSC Measurement Characteristic.
17:14:06.639 -> >>> Couldn't enable notify for Client FTM Training Status Characteristic.
17:14:06.639 -> FTMS (trainer) is controlled by another Client (Training App)!
17:14:06.639 -> Client (Central) is Up and Running!

17:18:37.912 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
17:18:37.912 -> ----------------- Version 02.3 ------------------
17:18:37.912 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:18:37.913 -> FTMS and Chars 'initialized'
17:18:37.913 -> CPS and Chars 'initialized'
17:18:37.913 -> CSCS and Chars 'initialized'
17:18:37.913 -> GA and Chars 'initialized'
17:18:37.913 -> DIS and Chars 'initialized'
17:18:37.913 -> Start Scanning for CPS, CSC and FTMS!
17:18:37.937 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:18:37.937 -> Timestamp MAC Address Rssi Data
17:18:37.937 -> 000001832 F8:9C:FC:53:5E:49 -51 09-02-16-18-26-18-18-18-0A-18
17:18:37.939 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:18:37.939 -> Now checking mandatory Client Services and Characteristics!
17:18:37.939 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:18:38.075 -> Discovering Client CP Measurement characteristic ... Found it!
17:18:38.376 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
17:18:38.547 -> Discovering Client CP Feature characteristic ... Found it!
17:18:38.702 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
17:18:38.702 -> Wheel revolution data supported
17:18:38.702 -> Crank revolution data supported
17:18:38.702 -> Discovering Client CP Sensor Location characteristic ... Found it!
17:18:38.872 -> -> Client Reads CP Location Sensor: Loc#: 0 Other
17:18:38.872 -> Discovering Cycling Speed and Cadence (CSC) Service ... Not Found and disconnecting!
17:18:38.872 -> CSC Service is mandatory!
17:18:39.057 -> Client Disconnected, reason = 0x16
17:18:39.057 -> >>> Restart the Feather nRF52 Client for a new run! <<<
17:18:40.313 -> Stopped!

17:20:02.831 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
17:20:02.831 -> ----------------- Version 02.3 ------------------
17:20:02.831 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:20:02.831 -> FTMS and Chars 'initialized'
17:20:02.831 -> CPS and Chars 'initialized'
17:20:02.831 -> CSCS and Chars 'initialized'
17:20:02.831 -> GA and Chars 'initialized'
17:20:02.831 -> DIS and Chars 'initialized'
17:20:02.831 -> Start Scanning for CPS, CSC and FTMS!
17:20:09.489 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:20:09.489 -> Timestamp MAC Address Rssi Data
17:20:09.489 -> 000008794 F8:9C:FC:53:5E:49 -60 09-02-16-18-26-18-18-18-0A-18
17:20:09.722 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:20:09.722 -> Now checking mandatory Client Services and Characteristics!
17:20:09.722 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:20:09.956 -> Discovering Client CP Measurement characteristic ... Found it!
17:20:10.142 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
17:20:10.331 -> Discovering Client CP Feature characteristic ... Found it!
17:20:10.502 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
17:20:10.502 -> Wheel revolution data supported
17:20:10.502 -> Crank revolution data supported
17:20:10.502 -> Discovering Client CP Sensor Location characteristic ... Found it!
17:20:10.721 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
17:20:10.721 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
17:20:10.935 -> Discovering Client CSC Measurement CHR ... Found it!
17:20:11.265 -> Discovering Client CSC Location CHR ... Found it!
17:20:11.265 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
17:20:11.265 -> Discovering Client CSC Feature CHR ... Found it!
17:20:11.452 -> -> Client Reads Raw CSC Feature bytes: [2] [ 00 00 ]
17:20:11.452 -> Discovering Client Fitness Machine (FTM) Service ... Not Found!
17:20:11.452 -> Disconnecting since Client FTM Service is mandatory!
17:20:11.547 -> Client Disconnected, reason = 0x16
17:20:11.547 -> >>> Restart the Feather nRF52 Client for a new run! <<<
17:20:12.140 -> Stopped!

17:21:55.142 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
17:21:55.142 -> ----------------- Version 02.4 ------------------
17:21:55.142 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:21:55.142 -> FTMS and Chars 'initialized'
17:21:55.142 -> CPS and Chars 'initialized'
17:21:55.142 -> CSCS and Chars 'initialized'
17:21:55.142 -> GA and Chars 'initialized'
17:21:55.142 -> DIS and Chars 'initialized'
17:21:55.142 -> Start Scanning for CPS, CSC and FTMS!
17:21:55.142 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:21:55.142 -> Timestamp MAC Address Rssi Data
17:21:55.142 -> 000001279 F8:9C:FC:53:5E:49 -54 09-02-16-18-26-18-18-18-0A-18
17:21:55.142 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:21:55.142 -> Now checking all Client Services and Characteristics!
17:21:55.142 -> If Mandatory Services Fail --> the Client will disconnect!
17:21:55.142 -> First checking Generic Access and Device Information Services and Characteristics!
17:21:55.143 -> Found Client Generic Access
17:21:55.143 -> -> Client Reads Device Name: [Zwift Hub]
17:21:55.174 -> -> Client Reads Appearance: [1152]
17:21:55.174 -> Found Client Device Information
17:21:55.753 -> -> Client Reads Manufacturer: [Zwift]
17:21:55.753 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
17:21:55.753 -> Disconnecting since Client FTM Service is mandatory!
17:21:55.800 -> Client Disconnected, reason = 0x16
17:21:55.801 -> >>> Restart the Feather nRF52 Client for a new run! <<<
17:21:56.993 -> Stopped!

17:22:57.468 -> ----------------- Version 02.4 ------------------
17:22:57.468 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:22:58.154 -> FTMS and Chars 'initialized'
17:22:58.154 -> CPS and Chars 'initialized'
17:22:58.154 -> CSCS and Chars 'initialized'
17:22:58.154 -> GA and Chars 'initialized'
17:22:58.154 -> DIS and Chars 'initialized'
17:22:58.154 -> Start Scanning for CPS, CSC and FTMS!
17:23:04.954 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:23:04.954 -> Timestamp MAC Address Rssi Data
17:23:04.954 -> 000008494 F8:9C:FC:53:5E:49 -52 09-02-16-18-26-18-18-18-0A-18
17:23:05.310 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:23:05.310 -> Now checking all Client Services and Characteristics!
17:23:05.310 -> If Mandatory Services Fail --> the Client will disconnect!
17:23:05.310 -> First checking Generic Access and Device Information Services and Characteristics!
17:23:05.495 -> Found Client Generic Access
17:23:05.495 -> -> Client Reads Device Name: [Zwift Hub]
17:23:05.713 -> -> Client Reads Appearance: [1152]
17:23:05.713 -> Found Client Device Information
17:23:06.067 -> -> Client Reads Manufacturer: [Zwift]
17:23:06.067 -> -> Client Reads Model Number: [06]
17:23:06.207 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:23:06.207 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:23:06.468 -> Discovering Client FTM Feature Characteristic ... Found it!
17:23:06.653 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
17:23:06.653 -> Discovering Client FTM Training Status Characteristic ... Not Found!
17:23:07.030 -> Disconnecting since Client FTM Characteristic is mandatory!
17:23:07.062 -> Client Disconnected, reason = 0x16
17:23:07.062 -> >>> Restart the Feather nRF52 Client for a new run! <<<
17:23:07.695 -> Stopped!

17:25:53.099 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
17:25:53.099 -> ----------------- Version 02.5 ------------------
17:25:53.099 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:25:53.099 -> FTMS and Chars 'initialized'
17:25:53.099 -> CPS and Chars 'initialized'
17:25:53.099 -> CSCS and Chars 'initialized'
17:25:53.099 -> GA and Chars 'initialized'
17:25:53.099 -> DIS and Chars 'initialized'
17:25:53.099 -> Start Scanning for CPS, CSC and FTMS!
17:25:53.099 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:25:53.099 -> Timestamp MAC Address Rssi Data
17:25:53.099 -> 000001091 F8:9C:FC:53:5E:49 -56 09-02-16-18-26-18-18-18-0A-18
17:25:53.099 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:25:53.099 -> Now checking all Client Services and Characteristics!
17:25:53.099 -> If Mandatory Services Fail --> the Client will disconnect!
17:25:53.099 -> First checking Generic Access and Device Information Services and Characteristics!
17:25:53.325 -> Found Client Generic Access
17:25:53.325 -> -> Client Reads Device Name: [Zwift Hub]
17:25:53.666 -> -> Client Reads Appearance: [1152]
17:25:53.666 -> Found Client Device Information
17:25:54.036 -> -> Client Reads Manufacturer: [Zwift]
17:25:54.036 -> -> Client Reads Model Number: [06]
17:25:54.345 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:25:54.345 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:25:54.484 -> Discovering Client FTM Feature Characteristic ... Found it!
17:25:54.623 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
17:25:54.623 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:25:54.982 -> Discovering Client FTM Status Characteristic ... Ready to receive Client FTM Control Point Response Messages
17:25:54.982 -> >>> Couldn't enable notify for Client FTM Status Characteristic.
17:25:54.982 -> FTMS (trainer) is controlled by another Client (Training App)!
17:25:54.982 -> Client (Central) is Up and Running!
17:25:55.058 -> Found it!
17:25:55.058 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:25:55.058 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Not Found! NOT mandatory!
17:25:55.058 -> Discovering Client FTM Supported Power Range Characteristic ... Not Found! NOT mandatory!
17:25:55.058 -> Discovering Client FTM Indoor Bike Data Characteristic ... Not Found! Not Mandatory
17:25:55.058 -> Discovering Client Cycling Power (CP) Service ... Not Found!
17:25:55.058 -> Disconnecting since Client Cyling Power Service is mandatory!
17:25:55.058 -> Client Disconnected, reason = 0x16
17:25:55.058 -> >>> Restart the Feather nRF52 Client for a new run! <<<

17:26:41.726 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
17:26:41.726 -> ----------------- Version 02.5 ------------------
17:26:41.726 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:26:41.726 -> FTMS and Chars 'initialized'
17:26:41.726 -> CPS and Chars 'initialized'
17:26:41.726 -> CSCS and Chars 'initialized'
17:26:41.726 -> GA and Chars 'initialized'
17:26:41.726 -> DIS and Chars 'initialized'
17:26:41.726 -> Start Scanning for CPS, CSC and FTMS!
17:26:48.666 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:26:48.666 -> Timestamp MAC Address Rssi Data
17:26:48.666 -> 000008960 F8:9C:FC:53:5E:49 -57 09-02-16-18-26-18-18-18-0A-18
17:26:49.019 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:26:49.019 -> Now checking all Client Services and Characteristics!
17:26:49.019 -> If Mandatory Services Fail --> the Client will disconnect!
17:26:49.019 -> First checking Generic Access and Device Information Services and Characteristics!
17:26:49.376 -> Found Client Generic Access
17:26:49.376 -> -> Client Reads Device Name: [Zwift Hub]
17:26:49.732 -> -> Client Reads Appearance: [1152]
17:26:49.732 -> Found Client Device Information
17:26:50.007 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
17:26:50.007 -> Disconnecting since Client FTM Service is mandatory!
17:26:50.101 -> Client Disconnected, reason = 0x16
17:26:50.101 -> >>> Restart the Feather nRF52 Client for a new run! <<<
17:26:51.400 -> Stopped!

17:29:23.561 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
17:29:23.561 -> ----------------- Version 02.6 ------------------
17:29:23.561 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:29:24.053 -> FTMS and Chars 'initialized'
17:29:24.053 -> CPS and Chars 'initialized'
17:29:24.053 -> CSCS and Chars 'initialized'
17:29:24.053 -> GA and Chars 'initialized'
17:29:24.053 -> DIS and Chars 'initialized'
17:29:24.053 -> Start Scanning for CPS, CSC and FTMS!
17:29:24.053 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:29:24.053 -> Timestamp MAC Address Rssi Data
17:29:24.053 -> 000000990 F8:9C:FC:53:5E:49 -58 09-02-16-18-26-18-18-18-0A-18
17:29:24.058 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:29:24.058 -> Now checking all Client Services and Characteristics!
17:29:24.058 -> If Mandatory Services Fail --> the Client will disconnect!
17:29:24.058 -> First checking Generic Access and Device Information Services and Characteristics!
17:29:24.058 -> Found Client Generic Access
17:29:24.284 -> -> Client Reads Device Name: [Zwift Hub]
17:29:24.469 -> -> Client Reads Appearance: [1152]
17:29:24.516 -> Found Client Device Information
17:29:24.736 -> -> Client Reads Manufacturer: [Zwift]
17:29:24.968 -> -> Client Reads Model Number: [06]
17:29:25.139 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:29:25.139 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:29:25.264 -> Discovering Client FTM Feature Characteristic ... Found it!
17:29:25.576 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
17:29:25.576 -> Discovering Client FTM Control Point Characteristic ... Not Found!
17:29:25.576 -> Disconnecting since Client FTM Control Point Characteristic is mandatory!
17:29:25.623 -> Client Disconnected, reason = 0x16
17:29:25.623 -> >>> Restart the Feather nRF52 Client for a new run! <<<

17:30:45.419 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
17:30:45.419 -> ----------------- Version 02.6 ------------------
17:30:45.419 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:30:45.420 -> FTMS and Chars 'initialized'
17:30:45.420 -> CPS and Chars 'initialized'
17:30:45.420 -> CSCS and Chars 'initialized'
17:30:45.420 -> GA and Chars 'initialized'
17:30:45.420 -> DIS and Chars 'initialized'
17:30:45.420 -> Start Scanning for CPS, CSC and FTMS!
17:31:20.566 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:31:20.566 -> Timestamp MAC Address Rssi Data
17:31:20.566 -> 000037231 F8:9C:FC:53:5E:49 -58 09-02-16-18-26-18-18-18-0A-18
17:31:20.876 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:31:20.876 -> Now checking all Client Services and Characteristics!
17:31:20.876 -> If Mandatory Services Fail --> the Client will disconnect!
17:31:20.876 -> First checking Generic Access and Device Information Services and Characteristics!
17:31:21.015 -> Found Client Generic Access
17:31:21.384 -> -> Client Reads Device Name: []
17:31:21.384 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
17:31:21.384 -> Disconnecting since Client FTM Service is mandatory!
17:31:21.476 -> Client Disconnected, reason = 0x16
17:31:21.476 -> >>> Restart the Feather nRF52 Client for a new run! <<<

17:35:49.982 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
17:35:49.982 -> ----------------- Version 02.7 ------------------
17:35:49.982 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:35:50.410 -> FTMS and Chars 'initialized'
17:35:50.410 -> CPS and Chars 'initialized'
17:35:50.410 -> CSCS and Chars 'initialized'
17:35:50.410 -> GA and Chars 'initialized'
17:35:50.410 -> DIS and Chars 'initialized'
17:35:50.410 -> Start Scanning for CPS, CSC and FTMS!
17:36:08.272 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:36:08.272 -> Timestamp MAC Address Rssi Data
17:36:08.272 -> 000019071 F8:9C:FC:53:5E:49 -54 09-02-16-18-26-18-18-18-0A-18
17:36:08.460 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:36:08.460 -> Now checking all Client Services and Characteristics!
17:36:08.460 -> If Mandatory Services Fail --> the Client will disconnect!
17:36:08.460 -> First checking Generic Access and Device Information Services and Characteristics!
17:36:08.585 -> Found Client Generic Access
17:36:08.864 -> -> Client Reads Device Name: []
17:36:08.864 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
17:36:08.864 -> Disconnecting since Client FTM Service is mandatory!
17:36:08.864 -> Client Disconnected, reason = 0x16
17:36:08.864 -> >>> Restart the Feather nRF52 Client for a new run! <<<
17:36:13.400 -> Stopped!

17:36:53.019 -> FTMS and Chars 'initialized'
17:36:53.019 -> CPS and Chars 'initialized'
17:36:53.019 -> CSCS and Chars 'initialized'
17:36:53.019 -> GA and Chars 'initialized'
17:36:53.019 -> DIS and Chars 'initialized'
17:36:53.019 -> Start Scanning for CPS, CSC and FTMS!
17:36:53.020 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:36:53.020 -> Timestamp MAC Address Rssi Data
17:36:53.020 -> 000001308 F8:9C:FC:53:5E:49 -60 09-02-16-18-26-18-18-18-0A-18
17:36:53.020 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:36:53.020 -> Now checking all Client Services and Characteristics!
17:36:53.020 -> If Mandatory Services Fail --> the Client will disconnect!
17:36:53.020 -> First checking Generic Access and Device Information Services and Characteristics!
17:36:53.021 -> Found Client Generic Access
17:36:53.021 -> -> Client Reads Device Name: [Zwift Hub]
17:36:53.152 -> -> Client Reads Appearance: [1152]
17:36:53.154 -> Found Client Device Information
17:36:53.309 -> -> Client Reads Manufacturer: [Zwift]
17:36:53.712 -> -> Client Reads Model Number: [06]
17:36:53.881 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:36:53.881 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:36:53.928 -> Discovering Client FTM Feature Characteristic ... Found it!
17:36:54.098 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
17:36:54.098 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:36:54.653 -> Discovering Client FTM Status Characteristic ... Not Found!
17:36:54.653 -> Disconnecting since Client FTM Status Characteristic is mandatory!
17:36:54.888 -> Client Disconnected, reason = 0x16
17:36:54.888 -> >>> Restart the Feather nRF52 Client for a new run! <<<
17:36:57.446 -> Stopped!

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
I have uploaded a new FTMS_Client version 028!

  1. Upload and Run this code on the Feather-nRF52
  2. Start the Serial Monitor to catch verbose debugging and data info
  3. Power ON/Wake UP trainer -> do NOT connect with other devices

I think we have stumbled on a timing problem, now and then a run is more or less succesfull, never it stops at exactly the same point! Only once sofar the code execution really reached the end...... So it is possible!

I have inserted calls to delay(SOME_TIME) in the Client_Connect_Callback function to handle possible time-outs that may occur during discover SVC or Char's... The delay time is now set to 100 ms! Just a guess! Depending on what the result is, you can increase or decrease the value and see how the result is influenced positively or negatively....
Give it a try and fingers crossed,
Jörgen

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Dear Jörghen,

I had to increase the delay to 200
The system starts in any direction 9/10 times

I have given you several examples of start-ups because I believe that certain services are there at certain start-ups and not at others!

The resistance is well felt during the test :)

JACKPOT !!!!!!!
Congratulation !!! 👍

11:40:31.097 -> -> Client Reads Appearance: [1152]
11:40:31.210 -> Found Client Device Information
11:40:31.489 -> -> Client Reads Manufacturer: [Zwift]
11:40:31.944 -> -> Client Reads Model Number: [06]
11:40:32.161 -> -> Client Reads Serial Number: [06-F89CFC535E49]
11:40:32.302 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
11:40:32.537 -> Discovering Client FTM Feature Characteristic ... Found it!
11:40:32.742 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
11:40:32.835 -> Discovering Client FTM Control Point Characteristic ... Found it!
11:40:33.212 -> Discovering Client FTM Status Characteristic ... Found it!
11:40:33.620 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
11:40:34.229 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
11:40:34.403 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
11:40:34.497 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
11:40:34.747 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 00 00 00 00 ]
11:40:34.839 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
11:40:35.057 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
11:40:35.134 -> Discovering Client Cycling Power (CP) Service ... Ready to receive Client FTM Control Point Response Messages
11:40:35.181 -> Found it! CPS Max Payload: 20 Data Length: 27
11:40:35.273 -> Ready to receive Client FTM Status values
11:40:35.273 -> Discovering Client CP Measurement characteristic ... Found it!
11:40:35.756 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
11:40:36.023 -> Discovering Client CP Feature characteristic ... Found it!
11:40:36.023 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
11:40:36.023 -> Wheel revolution data supported
11:40:36.023 -> Crank revolution data supported
11:40:36.162 -> Discovering Client CP Sensor Location characteristic ... Found it!
11:40:36.255 -> -> Client Reads CP Location Sensor: Loc#: 0 Other
11:40:36.379 -> Discovering Cycling Speed and Cadence (CSC) Service ... Not Found! CSC Service is Not Mandatory!
11:40:37.221 -> >>> Couldn't enable notify for Client FTM Training Status Characteristic.
11:40:37.300 -> Ready to receive Client FTM Indoor Bike Data values
11:40:37.300 -> Ready to receive Client CP Measurement values
11:40:38.365 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
11:40:38.365 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
11:40:39.220 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 0B 02 00 00 14 00 00 00 00 ]
11:40:39.220 -> Instant. Speed: 5 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
11:40:39.314 -> >>> Couldn't enable indicate for Client CP Control Point Characteristic.
11:40:40.385 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 07 03 00 00 14 00 11 00 00 ]
11:40:40.385 -> Instant. Speed: 7 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 17 Watt Heart Rate: 0 HBM
11:40:41.272 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 58 04 00 00 14 00 40 00 00 ]
11:40:41.272 -> Instant. Speed: 11 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 64 Watt Heart Rate: 0 HBM
11:40:41.320 -> >>> Couldn't enable notify for Client CSC Measurement Characteristic.
11:40:41.320 -> Client (Central) is Up and Running!
11:40:42.206 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 78 05 00 00 14 00 90 00 00 ]
11:40:42.206 -> Instant. Speed: 14 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 144 Watt Heart Rate: 0 HBM
11:40:43.237 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 CF 05 20 00 14 00 71 00 00 ]
11:40:43.237 -> Instant. Speed: 14 KPH Instantaneous Cadence: 16 RPM Resistance Level: 20 Instantaneous Power: 113 Watt Heart Rate: 0 HBM
11:40:43.315 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
11:40:43.581 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
11:40:44.313 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 25 06 46 00 14 00 71 00 00 ]
11:40:44.313 -> Instant. Speed: 15 KPH Instantaneous Cadence: 35 RPM Resistance Level: 20 Instantaneous Power: 113 Watt Heart Rate: 0 HBM
11:40:45.311 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 96 06 5A 00 14 00 94 00 00 ]
11:40:45.311 -> Instant. Speed: 16 KPH Instantaneous Cadence: 45 RPM Resistance Level: 20 Instantaneous Power: 148 Watt Heart Rate: 0 HBM
11:40:45.405 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
11:40:45.763 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
11:40:46.212 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 D5 06 68 00 14 00 7E 00 00 ]
11:40:46.212 -> Instant. Speed: 17 KPH Instantaneous Cadence: 52 RPM Resistance Level: 20 Instantaneous Power: 126 Watt Heart Rate: 0 HBM
11:40:47.194 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 16 07 72 00 14 00 6D 00 00 ]
11:40:47.194 -> Instant. Speed: 18 KPH Instantaneous Cadence: 57 RPM Resistance Level: 20 Instantaneous Power: 109 Watt Heart Rate: 0 HBM
11:40:47.506 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
11:40:47.646 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 07 01 ]
11:40:47.646 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 04 ]
11:40:48.206 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 71 07 17 07 7A 00 7A 00 05 00 00 14 00 61 00 61 00 00 ]
11:40:48.206 -> Instant. Speed: 19 KPH Average Speed: 18 KPH Instantaneous Cadence: 61 RPM Average Cadence: 61 RPM Total Distance: 5 m Resistance Level: 20 Instantaneous Power: 97 Watt Average Power: 97 Watt Heart Rate: 0 HBM
11:40:49.611 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]
11:40:49.690 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 EC 07 17 07 80 00 7D 00 0A 00 00 14 00 62 00 61 00 00 ]
11:40:49.737 -> Instant. Speed: 20 KPH Average Speed: 18 KPH Instantaneous Cadence: 64 RPM Average Cadence: 62 RPM Total Distance: 10 m Resistance Level: 20 Instantaneous Power: 98 Watt Average Power: 97 Watt Heart Rate: 0 HBM
11:40:49.814 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:40:49.814 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 01 28 33 ]
11:40:50.545 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 1E 08 17 07 82 00 7E 00 0F 00 00 14 00 63 00 62 00 00 ]
11:40:50.545 -> Instant. Speed: 20 KPH Average Speed: 18 KPH Instantaneous Cadence: 65 RPM Average Cadence: 63 RPM Total Distance: 15 m Resistance Level: 20 Instantaneous Power: 99 Watt Average Power: 98 Watt Heart Rate: 0 HBM
11:40:51.247 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 D3 07 17 07 86 00 80 00 14 00 00 14 00 5F 00 61 00 00 ]
11:40:51.247 -> Instant. Speed: 20 KPH Average Speed: 18 KPH Instantaneous Cadence: 67 RPM Average Cadence: 64 RPM Total Distance: 20 m Resistance Level: 20 Instantaneous Power: 95 Watt Average Power: 97 Watt Heart Rate: 0 HBM
11:40:51.715 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 00 28 33 00 ]
11:40:51.887 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:40:51.887 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 00 28 33 ]
11:40:52.338 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 A2 07 17 07 88 00 82 00 19 00 00 14 00 6A 00 63 00 00 ]
11:40:52.338 -> Instant. Speed: 19 KPH Average Speed: 18 KPH Instantaneous Cadence: 68 RPM Average Cadence: 65 RPM Total Distance: 25 m Resistance Level: 20 Instantaneous Power: 106 Watt Average Power: 99 Watt Heart Rate: 0 HBM
11:40:53.228 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 19 08 17 07 88 00 83 00 1E 00 00 14 00 85 00 68 00 00 ]
11:40:53.228 -> Instant. Speed: 20 KPH Average Speed: 18 KPH Instantaneous Cadence: 68 RPM Average Cadence: 65 RPM Total Distance: 30 m Resistance Level: 20 Instantaneous Power: 133 Watt Average Power: 104 Watt Heart Rate: 0 HBM
11:40:53.821 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
11:40:54.224 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:40:54.224 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
11:40:54.224 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 38 08 17 07 88 00 83 00 23 00 00 14 00 74 00 6A 00 00 ]
11:40:54.224 -> Instant. Speed: 21 KPH Average Speed: 18 KPH Instantaneous Cadence: 68 RPM Average Cadence: 65 RPM Total Distance: 35 m Resistance Level: 20 Instantaneous Power: 116 Watt Average Power: 106 Watt Heart Rate: 0 HBM
11:40:55.302 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 4E 08 17 07 8A 00 84 00 28 00 00 14 00 67 00 69 00 00 ]
11:40:55.302 -> Instant. Speed: 21 KPH Average Speed: 18 KPH Instantaneous Cadence: 69 RPM Average Cadence: 66 RPM Total Distance: 40 m Resistance Level: 20 Instantaneous Power: 103 Watt Average Power: 105 Watt Heart Rate: 0 HBM
11:40:55.908 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 14 00 28 33 00 ]
11:40:56.034 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:40:56.034 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 14 00 28 33 ]
11:40:56.206 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 D1 08 3F 07 8C 00 85 00 2E 00 00 14 00 57 00 67 00 00 ]
11:40:56.206 -> Instant. Speed: 22 KPH Average Speed: 18 KPH Instantaneous Cadence: 70 RPM Average Cadence: 66 RPM Total Distance: 46 m Resistance Level: 20 Instantaneous Power: 87 Watt Average Power: 103 Watt Heart Rate: 0 HBM
11:40:57.159 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 7F 08 3B 07 94 00 86 00 33 00 00 14 00 5A 00 66 00 00 ]
11:40:57.205 -> Instant. Speed: 21 KPH Average Speed: 18 KPH Instantaneous Cadence: 74 RPM Average Cadence: 67 RPM Total Distance: 51 m Resistance Level: 20 Instantaneous Power: 90 Watt Average Power: 102 Watt Heart Rate: 0 HBM
11:40:57.986 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 00 28 33 00 ]
11:40:58.159 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:40:58.159 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 00 28 33 ]
11:40:58.284 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 AC 08 58 07 96 00 88 00 39 00 00 14 00 47 00 63 00 00 ]
11:40:58.284 -> Instant. Speed: 22 KPH Average Speed: 18 KPH Instantaneous Cadence: 75 RPM Average Cadence: 68 RPM Total Distance: 57 m Resistance Level: 20 Instantaneous Power: 71 Watt Average Power: 99 Watt Heart Rate: 0 HBM
11:40:59.254 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 84 08 71 07 96 00 89 00 3F 00 00 14 00 58 00 62 00 00 ]
11:40:59.254 -> Instant. Speed: 21 KPH Average Speed: 19 KPH Instantaneous Cadence: 75 RPM Average Cadence: 68 RPM Total Distance: 63 m Resistance Level: 20 Instantaneous Power: 88 Watt Average Power: 98 Watt Heart Rate: 0 HBM
11:41:00.125 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 25 00 28 33 00 ]
11:41:00.344 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 E7 08 86 07 20 00 81 00 45 00 00 14 00 5F 00 62 00 00 ]
11:41:00.344 -> Instant. Speed: 22 KPH Average Speed: 19 KPH Instantaneous Cadence: 16 RPM Average Cadence: 64 RPM Total Distance: 69 m Resistance Level: 20 Instantaneous Power: 95 Watt Average Power: 98 Watt Heart Rate: 0 HBM
11:41:00.344 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:00.344 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 25 00 28 33 ]
11:41:01.324 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 C5 08 98 07 6E 00 7F 00 4B 00 00 14 00 57 00 61 00 00 ]
11:41:01.324 -> Instant. Speed: 22 KPH Average Speed: 19 KPH Instantaneous Cadence: 55 RPM Average Cadence: 63 RPM Total Distance: 75 m Resistance Level: 20 Instantaneous Power: 87 Watt Average Power: 97 Watt Heart Rate: 0 HBM
11:41:02.199 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 23 00 28 33 00 ]
11:41:02.245 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 B2 08 A8 07 8C 00 80 00 51 00 00 14 00 5C 00 61 00 00 ]
11:41:02.245 -> Instant. Speed: 22 KPH Average Speed: 19 KPH Instantaneous Cadence: 70 RPM Average Cadence: 64 RPM Total Distance: 81 m Resistance Level: 20 Instantaneous Power: 92 Watt Average Power: 97 Watt Heart Rate: 0 HBM
11:41:02.245 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:02.245 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 23 00 28 33 ]
11:41:03.228 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 BB 08 B5 07 94 00 81 00 57 00 00 14 00 5D 00 60 00 00 ]
11:41:03.228 -> Instant. Speed: 22 KPH Average Speed: 19 KPH Instantaneous Cadence: 74 RPM Average Cadence: 64 RPM Total Distance: 87 m Resistance Level: 20 Instantaneous Power: 93 Watt Average Power: 96 Watt Heart Rate: 0 HBM
11:41:04.228 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 1C 00 28 33 00 ]
11:41:04.306 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 07 09 C1 07 94 00 82 00 5D 00 00 14 00 55 00 60 00 00 ]
11:41:04.306 -> Instant. Speed: 23 KPH Average Speed: 19 KPH Instantaneous Cadence: 74 RPM Average Cadence: 65 RPM Total Distance: 93 m Resistance Level: 20 Instantaneous Power: 85 Watt Average Power: 96 Watt Heart Rate: 0 HBM
11:41:04.400 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:04.400 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1C 00 28 33 ]
11:41:05.210 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 D4 08 CC 07 98 00 84 00 63 00 00 14 00 5B 00 5F 00 00 ]
11:41:05.210 -> Instant. Speed: 22 KPH Average Speed: 19 KPH Instantaneous Cadence: 76 RPM Average Cadence: 66 RPM Total Distance: 99 m Resistance Level: 20 Instantaneous Power: 91 Watt Average Power: 95 Watt Heart Rate: 0 HBM
11:41:06.189 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 E1 08 D5 07 9C 00 85 00 69 00 00 14 00 5E 00 5F 00 00 ]
11:41:06.190 -> Instant. Speed: 22 KPH Average Speed: 20 KPH Instantaneous Cadence: 78 RPM Average Cadence: 66 RPM Total Distance: 105 m Resistance Level: 20 Instantaneous Power: 94 Watt Average Power: 95 Watt Heart Rate: 0 HBM
11:41:06.329 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 0F 00 28 33 00 ]
11:41:06.829 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:06.829 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 0F 00 28 33 ]
11:41:07.264 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 BD 08 DE 07 9C 00 86 00 6F 00 00 14 00 61 00 5F 00 00 ]
11:41:07.264 -> Instant. Speed: 22 KPH Average Speed: 20 KPH Instantaneous Cadence: 78 RPM Average Cadence: 67 RPM Total Distance: 111 m Resistance Level: 20 Instantaneous Power: 97 Watt Average Power: 95 Watt Heart Rate: 0 HBM
11:41:08.339 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 1F 09 E6 07 98 00 87 00 75 00 00 14 00 58 00 5F 00 00 ]
11:41:08.339 -> Instant. Speed: 23 KPH Average Speed: 20 KPH Instantaneous Cadence: 76 RPM Average Cadence: 67 RPM Total Distance: 117 m Resistance Level: 20 Instantaneous Power: 88 Watt Average Power: 95 Watt Heart Rate: 0 HBM
11:41:08.431 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
11:41:08.618 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:08.618 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
11:41:09.414 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 D6 08 ED 07 9E 00 88 00 7B 00 00 14 00 54 00 5E 00 00 ]
11:41:09.414 -> Instant. Speed: 22 KPH Average Speed: 20 KPH Instantaneous Cadence: 79 RPM Average Cadence: 68 RPM Total Distance: 123 m Resistance Level: 20 Instantaneous Power: 84 Watt Average Power: 94 Watt Heart Rate: 0 HBM
11:41:10.240 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 E6 08 F3 07 A2 00 89 00 81 00 00 14 00 53 00 5E 00 00 ]
11:41:10.240 -> Instant. Speed: 22 KPH Average Speed: 20 KPH Instantaneous Cadence: 81 RPM Average Cadence: 68 RPM Total Distance: 129 m Resistance Level: 20 Instantaneous Power: 83 Watt Average Power: 94 Watt Heart Rate: 0 HBM
11:41:10.550 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 F5 FF 28 33 00 ]
11:41:10.691 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:10.691 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 F5 FF 28 33 ]
11:41:11.235 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 C4 08 F9 07 9C 00 8A 00 87 00 00 14 00 44 00 5D 00 00 ]
11:41:11.235 -> Instant. Speed: 22 KPH Average Speed: 20 KPH Instantaneous Cadence: 78 RPM Average Cadence: 69 RPM Total Distance: 135 m Resistance Level: 20 Instantaneous Power: 68 Watt Average Power: 93 Watt Heart Rate: 0 HBM
11:41:12.235 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 04 09 FF 07 9C 00 8A 00 8D 00 00 14 00 43 00 5C 00 00 ]
11:41:12.235 -> Instant. Speed: 23 KPH Average Speed: 20 KPH Instantaneous Cadence: 78 RPM Average Cadence: 69 RPM Total Distance: 141 m Resistance Level: 20 Instantaneous Power: 67 Watt Average Power: 92 Watt Heart Rate: 0 HBM
11:41:12.639 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 E4 FF 28 33 00 ]
11:41:12.857 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:12.857 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 E4 FF 28 33 ]
11:41:13.217 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 09 09 04 08 A0 00 8B 00 93 00 00 14 00 4C 00 5B 00 00 ]
11:41:13.217 -> Instant. Speed: 23 KPH Average Speed: 20 KPH Instantaneous Cadence: 80 RPM Average Cadence: 69 RPM Total Distance: 147 m Resistance Level: 20 Instantaneous Power: 76 Watt Average Power: 91 Watt Heart Rate: 0 HBM
11:41:14.169 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 E7 08 08 08 9E 00 8C 00 99 00 00 14 00 4A 00 5B 00 00 ]
11:41:14.216 -> Instant. Speed: 22 KPH Average Speed: 20 KPH Instantaneous Cadence: 79 RPM Average Cadence: 70 RPM Total Distance: 153 m Resistance Level: 20 Instantaneous Power: 74 Watt Average Power: 91 Watt Heart Rate: 0 HBM
11:41:14.745 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 CF FF 28 33 00 ]
11:41:14.902 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:14.902 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 CF FF 28 33 ]
11:41:15.183 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 1D 09 0D 08 9E 00 8D 00 9F 00 00 14 00 48 00 5A 00 00 ]
11:41:15.183 -> Instant. Speed: 23 KPH Average Speed: 20 KPH Instantaneous Cadence: 79 RPM Average Cadence: 70 RPM Total Distance: 159 m Resistance Level: 20 Instantaneous Power: 72 Watt Average Power: 90 Watt Heart Rate: 0 HBM
11:41:16.368 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 1E 09 11 08 A0 00 8D 00 A5 00 00 14 00 49 00 59 00 00 ]
11:41:16.368 -> Instant. Speed: 23 KPH Average Speed: 20 KPH Instantaneous Cadence: 80 RPM Average Cadence: 70 RPM Total Distance: 165 m Resistance Level: 20 Instantaneous Power: 73 Watt Average Power: 89 Watt Heart Rate: 0 HBM
11:41:16.853 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A8 FF 28 33 00 ]
11:41:16.992 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:16.992 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A8 FF 28 33 ]
11:41:17.366 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 17 09 14 08 9E 00 8E 00 AB 00 00 14 00 3F 00 58 00 00 ]
11:41:17.366 -> Instant. Speed: 23 KPH Average Speed: 20 KPH Instantaneous Cadence: 79 RPM Average Cadence: 71 RPM Total Distance: 171 m Resistance Level: 20 Instantaneous Power: 63 Watt Average Power: 88 Watt Heart Rate: 0 HBM
11:41:18.255 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 6F 09 18 08 A2 00 8E 00 B1 00 00 14 00 44 00 58 00 00 ]
11:41:18.255 -> Instant. Speed: 24 KPH Average Speed: 20 KPH Instantaneous Cadence: 81 RPM Average Cadence: 71 RPM Total Distance: 177 m Resistance Level: 20 Instantaneous Power: 68 Watt Average Power: 88 Watt Heart Rate: 0 HBM
11:41:18.941 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 84 FF 28 33 00 ]
11:41:19.158 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:19.158 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 84 FF 28 33 ]
11:41:19.252 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 65 09 1B 08 9E 00 8F 00 B7 00 00 14 00 4E 00 57 00 00 ]
11:41:19.252 -> Instant. Speed: 24 KPH Average Speed: 20 KPH Instantaneous Cadence: 79 RPM Average Cadence: 71 RPM Total Distance: 183 m Resistance Level: 20 Instantaneous Power: 78 Watt Average Power: 87 Watt Heart Rate: 0 HBM
11:41:20.216 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 5B 09 1E 08 A6 00 90 00 BD 00 00 14 00 39 00 56 00 00 ]
11:41:20.216 -> Instant. Speed: 23 KPH Average Speed: 20 KPH Instantaneous Cadence: 83 RPM Average Cadence: 72 RPM Total Distance: 189 m Resistance Level: 20 Instantaneous Power: 57 Watt Average Power: 86 Watt Heart Rate: 0 HBM
11:41:21.042 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 FF 28 33 00 ]
11:41:21.215 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 9C 09 21 08 B0 00 91 00 C3 00 00 14 00 32 00 55 00 00 ]
11:41:21.215 -> Instant. Speed: 24 KPH Average Speed: 20 KPH Instantaneous Cadence: 88 RPM Average Cadence: 72 RPM Total Distance: 195 m Resistance Level: 20 Instantaneous Power: 50 Watt Average Power: 85 Watt Heart Rate: 0 HBM
11:41:21.215 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:21.215 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 FF 28 33 ]
11:41:22.182 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 A5 09 24 08 B0 00 91 00 C9 00 00 14 00 3A 00 55 00 00 ]
11:41:22.182 -> Instant. Speed: 24 KPH Average Speed: 20 KPH Instantaneous Cadence: 88 RPM Average Cadence: 72 RPM Total Distance: 201 m Resistance Level: 20 Instantaneous Power: 58 Watt Average Power: 85 Watt Heart Rate: 0 HBM
11:41:23.149 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5D FF 28 33 00 ]
11:41:23.196 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 8D 09 27 08 A2 00 92 00 CF 00 00 14 00 26 00 53 00 00 ]
11:41:23.196 -> Instant. Speed: 24 KPH Average Speed: 20 KPH Instantaneous Cadence: 81 RPM Average Cadence: 73 RPM Total Distance: 207 m Resistance Level: 20 Instantaneous Power: 38 Watt Average Power: 83 Watt Heart Rate: 0 HBM
11:41:23.196 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:23.196 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5D FF 28 33 ]
11:41:24.179 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 AC 09 29 08 8A 00 92 00 D5 00 00 14 00 26 00 52 00 00 ]
11:41:24.179 -> Instant. Speed: 24 KPH Average Speed: 20 KPH Instantaneous Cadence: 69 RPM Average Cadence: 73 RPM Total Distance: 213 m Resistance Level: 20 Instantaneous Power: 38 Watt Average Power: 82 Watt Heart Rate: 0 HBM
11:41:25.221 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5E FF 28 33 00 ]
11:41:25.441 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 7D 09 2B 08 66 00 90 00 DB 00 00 14 00 29 00 51 00 00 ]
11:41:25.441 -> Instant. Speed: 24 KPH Average Speed: 20 KPH Instantaneous Cadence: 51 RPM Average Cadence: 72 RPM Total Distance: 219 m Resistance Level: 20 Instantaneous Power: 41 Watt Average Power: 81 Watt Heart Rate: 0 HBM
11:41:25.549 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:25.549 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5E FF 28 33 ]
11:41:26.249 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 8C 09 2E 08 5A 00 8F 00 E1 00 00 14 00 29 00 50 00 00 ]
11:41:26.249 -> Instant. Speed: 24 KPH Average Speed: 20 KPH Instantaneous Cadence: 45 RPM Average Cadence: 71 RPM Total Distance: 225 m Resistance Level: 20 Instantaneous Power: 41 Watt Average Power: 80 Watt Heart Rate: 0 HBM
11:41:27.260 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 9A 09 30 08 5E 00 8E 00 E7 00 00 14 00 26 00 4F 00 00 ]
11:41:27.260 -> Instant. Speed: 24 KPH Average Speed: 20 KPH Instantaneous Cadence: 47 RPM Average Cadence: 71 RPM Total Distance: 231 m Resistance Level: 20 Instantaneous Power: 38 Watt Average Power: 79 Watt Heart Rate: 0 HBM
11:41:27.307 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 6F FF 28 33 00 ]
11:41:27.447 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:27.447 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 6F FF 28 33 ]
11:41:28.242 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 87 09 32 08 66 00 8D 00 ED 00 00 14 00 22 00 4E 00 00 ]
11:41:28.242 -> Instant. Speed: 24 KPH Average Speed: 20 KPH Instantaneous Cadence: 51 RPM Average Cadence: 70 RPM Total Distance: 237 m Resistance Level: 20 Instantaneous Power: 34 Watt Average Power: 78 Watt Heart Rate: 0 HBM
11:41:29.224 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 5C 09 34 08 66 00 8C 00 F3 00 00 14 00 2E 00 4D 00 00 ]
11:41:29.224 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 51 RPM Average Cadence: 70 RPM Total Distance: 243 m Resistance Level: 20 Instantaneous Power: 46 Watt Average Power: 77 Watt Heart Rate: 0 HBM
11:41:29.410 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 8A FF 28 33 00 ]
11:41:29.782 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:29.782 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8A FF 28 33 ]
11:41:30.296 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 EB 08 35 08 00 00 89 00 F9 00 00 14 00 00 00 4B 00 00 ]
11:41:30.296 -> Instant. Speed: 22 KPH Average Speed: 21 KPH Instantaneous Cadence: 0 RPM Average Cadence: 68 RPM Total Distance: 249 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 75 Watt Heart Rate: 0 HBM
11:41:31.196 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 AA 09 37 08 00 00 86 00 FF 00 00 14 00 00 00 49 00 00 ]
11:41:31.196 -> Instant. Speed: 24 KPH Average Speed: 21 KPH Instantaneous Cadence: 0 RPM Average Cadence: 67 RPM Total Distance: 255 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 73 Watt Heart Rate: 0 HBM
11:41:31.523 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 B8 FF 28 33 00 ]
11:41:31.757 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:31.757 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 B8 FF 28 33 ]
11:41:32.458 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 CB 09 39 08 50 00 84 00 05 01 00 14 00 35 00 49 00 00 ]
11:41:32.458 -> Instant. Speed: 25 KPH Average Speed: 21 KPH Instantaneous Cadence: 40 RPM Average Cadence: 66 RPM Total Distance: 261 m Resistance Level: 20 Instantaneous Power: 53 Watt Average Power: 73 Watt Heart Rate: 0 HBM
11:41:33.472 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 E4 09 3A 08 56 00 83 00 0B 01 00 14 00 33 00 48 00 00 ]
11:41:33.472 -> Instant. Speed: 25 KPH Average Speed: 21 KPH Instantaneous Cadence: 43 RPM Average Cadence: 65 RPM Total Distance: 267 m Resistance Level: 20 Instantaneous Power: 51 Watt Average Power: 72 Watt Heart Rate: 0 HBM
11:41:33.612 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
11:41:33.830 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:33.830 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
11:41:34.376 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 25 0A 44 08 56 00 82 00 12 01 00 14 00 33 00 48 00 00 ]
11:41:34.376 -> Instant. Speed: 25 KPH Average Speed: 21 KPH Instantaneous Cadence: 43 RPM Average Cadence: 65 RPM Total Distance: 274 m Resistance Level: 20 Instantaneous Power: 51 Watt Average Power: 72 Watt Heart Rate: 0 HBM
11:41:35.450 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 1B 0A 4C 08 54 00 81 00 19 01 00 14 00 2E 00 47 00 00 ]
11:41:35.450 -> Instant. Speed: 25 KPH Average Speed: 21 KPH Instantaneous Cadence: 42 RPM Average Cadence: 64 RPM Total Distance: 281 m Resistance Level: 20 Instantaneous Power: 46 Watt Average Power: 71 Watt Heart Rate: 0 HBM
11:41:35.712 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A2 00 28 33 00 ]
11:41:35.993 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:35.993 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A2 00 28 33 ]
11:41:36.259 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 1F 0A 55 08 5E 00 81 00 20 01 00 14 00 27 00 47 00 00 ]
11:41:36.259 -> Instant. Speed: 25 KPH Average Speed: 21 KPH Instantaneous Cadence: 47 RPM Average Cadence: 64 RPM Total Distance: 288 m Resistance Level: 20 Instantaneous Power: 39 Watt Average Power: 71 Watt Heart Rate: 0 HBM
11:41:37.320 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 AE 09 56 08 64 00 80 00 26 01 00 14 00 27 00 46 00 00 ]
11:41:37.320 -> Instant. Speed: 24 KPH Average Speed: 21 KPH Instantaneous Cadence: 50 RPM Average Cadence: 64 RPM Total Distance: 294 m Resistance Level: 20 Instantaneous Power: 39 Watt Average Power: 70 Watt Heart Rate: 0 HBM
11:41:37.818 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 01 28 33 00 ]
11:41:38.148 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:38.148 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 01 28 33 ]
11:41:38.241 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 65 09 57 08 5C 00 7F 00 2C 01 00 14 00 1F 00 45 00 00 ]
11:41:38.241 -> Instant. Speed: 24 KPH Average Speed: 21 KPH Instantaneous Cadence: 46 RPM Average Cadence: 63 RPM Total Distance: 300 m Resistance Level: 20 Instantaneous Power: 31 Watt Average Power: 69 Watt Heart Rate: 0 HBM
11:41:39.209 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 0B 09 57 08 54 00 7E 00 32 01 00 14 00 1F 00 45 00 00 ]
11:41:39.209 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 42 RPM Average Cadence: 63 RPM Total Distance: 306 m Resistance Level: 20 Instantaneous Power: 31 Watt Average Power: 69 Watt Heart Rate: 0 HBM
11:41:39.909 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 4F 01 28 33 00 ]
11:41:40.021 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:40.021 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 4F 01 28 33 ]
11:41:40.301 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 19 09 58 08 50 00 7E 00 38 01 00 14 00 4C 00 45 00 00 ]
11:41:40.301 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 40 RPM Average Cadence: 63 RPM Total Distance: 312 m Resistance Level: 20 Instantaneous Power: 76 Watt Average Power: 69 Watt Heart Rate: 0 HBM
11:41:41.281 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 8B 08 59 08 50 00 7D 00 3E 01 00 14 00 7A 00 46 00 00 ]
11:41:41.281 -> Instant. Speed: 21 KPH Average Speed: 21 KPH Instantaneous Cadence: 40 RPM Average Cadence: 62 RPM Total Distance: 318 m Resistance Level: 20 Instantaneous Power: 122 Watt Average Power: 70 Watt Heart Rate: 0 HBM
11:41:41.999 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 01 28 33 00 ]
11:41:42.203 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:42.203 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 01 28 33 ]
11:41:42.203 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 E7 08 5A 08 30 00 7B 00 44 01 00 14 00 7A 00 47 00 00 ]
11:41:42.203 -> Instant. Speed: 22 KPH Average Speed: 21 KPH Instantaneous Cadence: 24 RPM Average Cadence: 61 RPM Total Distance: 324 m Resistance Level: 20 Instantaneous Power: 122 Watt Average Power: 71 Watt Heart Rate: 0 HBM
11:41:43.463 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 27 08 54 08 70 00 7B 00 49 01 00 14 00 62 00 47 00 00 ]
11:41:43.463 -> Instant. Speed: 20 KPH Average Speed: 21 KPH Instantaneous Cadence: 56 RPM Average Cadence: 61 RPM Total Distance: 329 m Resistance Level: 20 Instantaneous Power: 98 Watt Average Power: 71 Watt Heart Rate: 0 HBM
11:41:44.118 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 57 FF 28 33 00 ]
11:41:44.258 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 85 08 55 08 86 00 7B 00 4F 01 00 14 00 C1 00 49 00 00 ]
11:41:44.258 -> Instant. Speed: 21 KPH Average Speed: 21 KPH Instantaneous Cadence: 67 RPM Average Cadence: 61 RPM Total Distance: 335 m Resistance Level: 20 Instantaneous Power: 193 Watt Average Power: 73 Watt Heart Rate: 0 HBM
11:41:44.337 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:44.337 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 57 FF 28 33 ]
11:41:45.414 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 E0 08 55 08 8C 00 7C 00 55 01 00 14 00 B9 00 4B 00 00 ]
11:41:45.414 -> Instant. Speed: 22 KPH Average Speed: 21 KPH Instantaneous Cadence: 70 RPM Average Cadence: 62 RPM Total Distance: 341 m Resistance Level: 20 Instantaneous Power: 185 Watt Average Power: 75 Watt Heart Rate: 0 HBM
11:41:46.191 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 08 00 00 00 00 00 00 00 ]
11:41:46.238 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 28 09 56 08 8E 00 7C 00 5B 01 00 14 00 C6 00 4D 00 00 ]
11:41:46.238 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 71 RPM Average Cadence: 62 RPM Total Distance: 347 m Resistance Level: 20 Instantaneous Power: 198 Watt Average Power: 77 Watt Heart Rate: 0 HBM
11:41:46.238 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 08 03 ]
11:41:47.396 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 38 09 57 08 98 00 7C 00 61 01 00 14 00 71 00 4E 00 00 ]
11:41:47.396 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 76 RPM Average Cadence: 62 RPM Total Distance: 353 m Resistance Level: 20 Instantaneous Power: 113 Watt Average Power: 78 Watt Heart Rate: 0 HBM
11:41:48.212 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 81 09 58 08 9E 00 7D 00 67 01 00 14 00 3F 00 4E 00 00 ]
11:41:48.212 -> Instant. Speed: 24 KPH Average Speed: 21 KPH Instantaneous Cadence: 79 RPM Average Cadence: 62 RPM Total Distance: 359 m Resistance Level: 20 Instantaneous Power: 63 Watt Average Power: 78 Watt Heart Rate: 0 HBM
11:41:48.253 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 01 00 00 00 00 00 00 00 ]
11:41:48.394 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 01 01 ]
11:41:48.394 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 01 ]
11:41:49.269 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 C7 09 A6 00 14 00 31 00 00 ]
11:41:49.315 -> Instant. Speed: 25 KPH Instantaneous Cadence: 83 RPM Resistance Level: 20 Instantaneous Power: 49 Watt Heart Rate: 0 HBM
11:41:50.351 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
11:41:50.477 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 AB 09 AC 00 14 00 38 00 00 ]
11:41:50.477 -> Instant. Speed: 24 KPH Instantaneous Cadence: 86 RPM Resistance Level: 20 Instantaneous Power: 56 Watt Heart Rate: 0 HBM
11:41:50.570 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
11:41:51.365 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 B0 09 9E 00 14 00 3C 00 00 ]
11:41:51.365 -> Instant. Speed: 24 KPH Instantaneous Cadence: 79 RPM Resistance Level: 20 Instantaneous Power: 60 Watt Heart Rate: 0 HBM
11:41:52.239 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 E7 09 84 00 14 00 4C 00 00 ]
11:41:52.285 -> Instant. Speed: 25 KPH Instantaneous Cadence: 66 RPM Resistance Level: 20 Instantaneous Power: 76 Watt Heart Rate: 0 HBM
11:41:52.457 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
11:41:52.535 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
11:41:53.362 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 F0 09 7A 00 14 00 4C 00 00 ]
11:41:53.362 -> Instant. Speed: 25 KPH Instantaneous Cadence: 61 RPM Resistance Level: 20 Instantaneous Power: 76 Watt Heart Rate: 0 HBM
11:41:54.534 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
11:41:54.613 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 0A 90 00 14 00 58 00 00 ]
11:41:54.613 -> Instant. Speed: 25 KPH Instantaneous Cadence: 72 RPM Resistance Level: 20 Instantaneous Power: 88 Watt Heart Rate: 0 HBM
11:41:54.798 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 07 01 ]
11:41:54.798 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 04 ]
11:41:55.252 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 A4 09 81 08 A2 00 A2 00 06 00 00 14 00 59 00 59 00 00 ]
11:41:55.252 -> Instant. Speed: 24 KPH Average Speed: 21 KPH Instantaneous Cadence: 81 RPM Average Cadence: 81 RPM Total Distance: 6 m Resistance Level: 20 Instantaneous Power: 89 Watt Average Power: 89 Watt Heart Rate: 0 HBM
11:41:56.231 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 A7 09 81 08 AA 00 A6 00 0C 00 00 14 00 5A 00 59 00 00 ]
11:41:56.231 -> Instant. Speed: 24 KPH Average Speed: 21 KPH Instantaneous Cadence: 85 RPM Average Cadence: 83 RPM Total Distance: 12 m Resistance Level: 20 Instantaneous Power: 90 Watt Average Power: 89 Watt Heart Rate: 0 HBM
11:41:56.655 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]
11:41:56.874 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:56.874 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 01 28 33 ]
11:41:57.190 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 9E 09 81 08 A8 00 A6 00 12 00 00 14 00 53 00 57 00 00 ]
11:41:57.190 -> Instant. Speed: 24 KPH Average Speed: 21 KPH Instantaneous Cadence: 84 RPM Average Cadence: 83 RPM Total Distance: 18 m Resistance Level: 20 Instantaneous Power: 83 Watt Average Power: 87 Watt Heart Rate: 0 HBM
11:41:58.221 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 45 09 81 08 A8 00 A7 00 18 00 00 14 00 50 00 55 00 00 ]
11:41:58.221 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 84 RPM Average Cadence: 83 RPM Total Distance: 24 m Resistance Level: 20 Instantaneous Power: 80 Watt Average Power: 85 Watt Heart Rate: 0 HBM
11:41:58.736 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 00 28 33 00 ]
11:41:59.018 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:41:59.018 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 00 28 33 ]
11:41:59.203 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 35 09 81 08 A6 00 A6 00 1E 00 00 14 00 73 00 5B 00 00 ]
11:41:59.203 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 83 RPM Average Cadence: 83 RPM Total Distance: 30 m Resistance Level: 20 Instantaneous Power: 115 Watt Average Power: 91 Watt Heart Rate: 0 HBM
11:42:00.276 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 60 09 81 08 A2 00 A6 00 24 00 00 14 00 B0 00 69 00 00 ]
11:42:00.276 -> Instant. Speed: 24 KPH Average Speed: 21 KPH Instantaneous Cadence: 81 RPM Average Cadence: 83 RPM Total Distance: 36 m Resistance Level: 20 Instantaneous Power: 176 Watt Average Power: 105 Watt Heart Rate: 0 HBM
11:42:00.833 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
11:42:01.239 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:42:01.285 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
11:42:01.285 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 8D 09 81 08 A4 00 A5 00 2A 00 00 14 00 9C 00 70 00 00 ]
11:42:01.285 -> Instant. Speed: 24 KPH Average Speed: 21 KPH Instantaneous Cadence: 82 RPM Average Cadence: 82 RPM Total Distance: 42 m Resistance Level: 20 Instantaneous Power: 156 Watt Average Power: 112 Watt Heart Rate: 0 HBM
11:42:02.267 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 71 09 81 08 A0 00 A5 00 30 00 00 14 00 61 00 6E 00 00 ]
11:42:02.267 -> Instant. Speed: 24 KPH Average Speed: 21 KPH Instantaneous Cadence: 80 RPM Average Cadence: 82 RPM Total Distance: 48 m Resistance Level: 20 Instantaneous Power: 97 Watt Average Power: 110 Watt Heart Rate: 0 HBM
11:42:02.952 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 14 00 28 33 00 ]
11:42:03.169 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:42:03.169 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 14 00 28 33 ]
11:42:03.264 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 5C 09 81 08 A2 00 A4 00 36 00 00 14 00 59 00 6C 00 00 ]
11:42:03.264 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 81 RPM Average Cadence: 82 RPM Total Distance: 54 m Resistance Level: 20 Instantaneous Power: 89 Watt Average Power: 108 Watt Heart Rate: 0 HBM
11:42:04.248 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 26 09 81 08 A6 00 A4 00 3C 00 00 14 00 52 00 69 00 00 ]
11:42:04.248 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 83 RPM Average Cadence: 82 RPM Total Distance: 60 m Resistance Level: 20 Instantaneous Power: 82 Watt Average Power: 105 Watt Heart Rate: 0 HBM
11:42:05.043 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 00 28 33 00 ]
11:42:05.137 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:42:05.137 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 00 28 33 ]
11:42:05.231 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 56 09 81 08 A8 00 A5 00 42 00 00 14 00 43 00 66 00 00 ]
11:42:05.231 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 84 RPM Average Cadence: 82 RPM Total Distance: 66 m Resistance Level: 20 Instantaneous Power: 67 Watt Average Power: 102 Watt Heart Rate: 0 HBM
11:42:06.225 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 3E 09 81 08 A2 00 A4 00 48 00 00 14 00 55 00 64 00 00 ]
11:42:06.225 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 81 RPM Average Cadence: 82 RPM Total Distance: 72 m Resistance Level: 20 Instantaneous Power: 85 Watt Average Power: 100 Watt Heart Rate: 0 HBM
11:42:07.145 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 25 00 28 33 00 ]
11:42:07.223 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 5B 09 81 08 A0 00 A4 00 4E 00 00 14 00 4A 00 62 00 00 ]
11:42:07.223 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 80 RPM Average Cadence: 82 RPM Total Distance: 78 m Resistance Level: 20 Instantaneous Power: 74 Watt Average Power: 98 Watt Heart Rate: 0 HBM
11:42:07.223 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:42:07.223 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 25 00 28 33 ]
11:42:08.206 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 4C 09 81 08 A0 00 A4 00 54 00 00 14 00 5D 00 62 00 00 ]
11:42:08.206 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 80 RPM Average Cadence: 82 RPM Total Distance: 84 m Resistance Level: 20 Instantaneous Power: 93 Watt Average Power: 98 Watt Heart Rate: 0 HBM
11:42:09.183 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 42 09 81 08 A0 00 A3 00 5A 00 00 14 00 55 00 61 00 00 ]
11:42:09.183 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 80 RPM Average Cadence: 81 RPM Total Distance: 90 m Resistance Level: 20 Instantaneous Power: 85 Watt Average Power: 97 Watt Heart Rate: 0 HBM
11:42:09.217 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 23 00 28 33 00 ]
11:42:09.375 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:42:09.375 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 23 00 28 33 ]
11:42:10.247 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 32 09 81 08 A2 00 A3 00 60 00 00 14 00 5F 00 61 00 00 ]
11:42:10.247 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 81 RPM Average Cadence: 81 RPM Total Distance: 96 m Resistance Level: 20 Instantaneous Power: 95 Watt Average Power: 97 Watt Heart Rate: 0 HBM
11:42:11.318 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 1C 00 28 33 00 ]
11:42:11.539 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 17 09 81 08 A0 00 A3 00 66 00 00 14 00 4E 00 60 00 00 ]
11:42:11.539 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 80 RPM Average Cadence: 81 RPM Total Distance: 102 m Resistance Level: 20 Instantaneous Power: 78 Watt Average Power: 96 Watt Heart Rate: 0 HBM
11:42:11.632 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:42:11.632 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1C 00 28 33 ]
11:42:12.349 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 4C 09 81 08 9E 00 A3 00 6C 00 00 14 00 53 00 5F 00 00 ]
11:42:12.349 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 79 RPM Average Cadence: 81 RPM Total Distance: 108 m Resistance Level: 20 Instantaneous Power: 83 Watt Average Power: 95 Watt Heart Rate: 0 HBM
11:42:13.427 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 0F 00 28 33 00 ]
11:42:13.490 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 46 09 81 08 9E 00 A2 00 72 00 00 14 00 56 00 5E 00 00 ]
11:42:13.490 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 79 RPM Average Cadence: 81 RPM Total Distance: 114 m Resistance Level: 20 Instantaneous Power: 86 Watt Average Power: 94 Watt Heart Rate: 0 HBM
11:42:13.569 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
11:42:13.614 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 0F 00 28 33 ]
11:42:14.223 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 0B 09 81 08 A2 00 A2 00 78 00 00 14 00 58 00 5E 00 00 ]
11:42:14.223 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 81 RPM Average Cadence: 81 RPM Total Distance: 120 m Resistance Level: 20 Instantaneous Power: 88 Watt Average Power: 94 Watt Heart Rate: 0 HBM
11:42:15.205 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 43 09 81 08 A0 00 A2 00 7E 00 00 14 00 5A 00 5E 00 00 ]
11:42:15.205 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 80 RPM Average Cadence: 81 RPM Total Distance: 126 m Resistance Level: 20 Instantaneous Power: 90 Watt Average Power: 94 Watt Heart Rate: 0 HBM
11:42:15.518 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]

11:55:16.952 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
11:55:16.952 -> ----------------- Version 02.8 ------------------
11:55:16.952 -> Initialise the Bluefruit nRF52 module: Client (Central)
11:55:16.952 -> FTMS and Chars 'initialized'
11:55:16.952 -> CPS and Chars 'initialized'
11:55:16.952 -> CSCS and Chars 'initialized'
11:55:16.952 -> GA and Chars 'initialized'
11:55:16.952 -> DIS and Chars 'initialized'
11:55:16.952 -> Start Scanning for CPS, CSC and FTMS!
11:55:16.952 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
11:55:16.952 -> Timestamp MAC Address Rssi Data
11:55:16.952 -> 000001201 F8:9C:FC:53:5E:49 -57 09-02-16-18-26-18-18-18-0A-18
11:55:16.952 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
11:55:16.952 -> Now checking all Client Services and Characteristics!
11:55:16.952 -> If Mandatory Services Fail --> the Client will disconnect!
11:55:16.960 -> First checking Generic Access and Device Information Services and Characteristics!
11:55:16.960 -> Found Client Generic Access
11:55:17.141 -> -> Client Reads Device Name: [Zwift Hub]
11:55:17.563 -> -> Client Reads Appearance: [0]
11:55:17.842 -> Found Client Device Information
11:55:18.310 -> -> Client Reads Manufacturer: [Zwift]
11:55:18.622 -> -> Client Reads Model Number: [06]
11:55:19.060 -> -> Client Reads Serial Number: [06-F89CFC535E49]
11:55:19.246 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
11:55:19.744 -> Discovering Client FTM Feature Characteristic ... Found it!
11:55:19.929 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
11:55:20.116 -> Discovering Client FTM Control Point Characteristic ... Found it!
11:55:20.660 -> Discovering Client FTM Status Characteristic ... Found it!
11:55:21.423 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
11:55:21.470 -> Discovering Client FTM Training Status Characteristic ... Ready to receive Client FTM Control Point Response Messages
11:55:21.747 -> Ready to receive Client FTM Status values
11:55:21.747 -> Not Found! Not Mandatory
11:55:21.964 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
11:55:22.147 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 00 00 00 00 ]
11:55:22.335 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
11:55:22.615 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 00 00 00 00 ]
11:55:22.802 -> Discovering Client FTM Indoor Bike Data Characteristic ... Not Found! Not Mandatory
11:55:23.068 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
11:55:23.502 -> Discovering Client CP Measurement characteristic ... Found it!
11:55:23.719 -> Discovering Client CP Control Point characteristic ... >>> Couldn't enable notify for Client FTM Training Status Characteristic.
11:55:23.856 -> Not Found! NOT Mandatory!
11:55:24.307 -> Discovering Client CP Feature characteristic ... Found it!
11:55:24.307 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
11:55:24.307 -> Wheel revolution data supported
11:55:24.307 -> Crank revolution data supported
11:55:24.572 -> Discovering Client CP Sensor Location characteristic ... Found it!
11:55:24.665 -> -> Client Reads CP Location Sensor: Loc#: 0 Other
11:55:24.930 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
11:55:25.565 -> Discovering Client CSC Measurement CHR ... Found it!
11:55:25.689 -> >>> Couldn't enable notify for Client FTM Indoor Bike Data Characteristic.
11:55:25.768 -> Discovering Client CSC Location CHR ... Ready to receive Client CP Measurement values
11:55:25.893 -> Found it!
11:55:25.893 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
11:55:26.207 -> Discovering Client CSC Feature CHR ... Found it!
11:55:26.207 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
11:55:26.207 -> Wheel rev supported
11:55:26.207 -> Crank rev supported
11:55:27.766 -> >>> Couldn't enable indicate for Client CP Control Point Characteristic.
11:55:27.806 -> Ready to receive Client CSC Measurement values
11:55:27.806 -> Client (Central) is Up and Running!
11:55:29.812 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
11:55:29.889 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
11:55:31.910 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]

11:58:33.742 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
11:58:34.020 -> Discovering Client FTM Feature Characteristic ... Found it!
11:58:34.283 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
11:58:34.487 -> Discovering Client FTM Control Point Characteristic ... Found it!
11:58:35.014 -> Discovering Client FTM Status Characteristic ... Found it!
11:58:35.685 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
11:58:35.762 -> Ready to receive Client FTM Control Point Response Messages
11:58:35.762 -> Discovering Client FTM Training Status Characteristic ... Ready to receive Client FTM Status values
11:58:35.966 -> Not Found! Not Mandatory
11:58:36.151 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
11:58:36.323 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 00 00 00 00 ]
11:58:36.539 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
11:58:36.817 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
11:58:37.314 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
11:58:37.608 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
11:58:37.827 -> Discovering Client CP Measurement characteristic ... >>> Couldn't enable notify for Client FTM Training Status Characteristic.
11:58:37.905 -> Ready to receive Client FTM Indoor Bike Data values
11:58:37.905 -> Found it!
11:58:38.121 -> Ready to receive Client CP Measurement values
11:58:38.121 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
11:58:38.710 -> Discovering Client CP Feature characteristic ... Found it!
11:58:38.710 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
11:58:38.710 -> Wheel revolution data supported
11:58:38.710 -> Crank revolution data supported
11:58:39.161 -> Discovering Client CP Sensor Location characteristic ... Found it!
11:58:39.208 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
11:58:39.548 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
11:58:39.907 -> Discovering Client CSC Measurement CHR ... Found it!
11:58:39.985 -> >>> Couldn't enable indicate for Client CP Control Point Characteristic.
11:58:40.016 -> Ready to receive Client CSC Measurement values
11:58:40.016 -> Client (Central) is Up and Running!
11:58:40.110 -> Discovering Client CSC Location CHR ... Found it!
11:58:40.559 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
11:58:40.762 -> Discovering Client CSC Feature CHR ... Found it!
11:58:40.932 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
11:58:40.932 -> Wheel rev supported
11:58:40.932 -> Crank rev supported
11:58:41.119 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
11:58:41.119 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
11:58:41.119 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
11:58:41.119 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
11:58:41.119 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
11:58:41.119 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
11:58:41.164 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
11:58:41.164 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance

:02:21.226 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
12:02:21.226 -> ----------------- Version 02.8 ------------------
12:02:21.226 -> Initialise the Bluefruit nRF52 module: Client (Central)
12:02:21.435 -> FTMS and Chars 'initialized'
12:02:21.435 -> CPS and Chars 'initialized'
12:02:21.435 -> CSCS and Chars 'initialized'
12:02:21.435 -> GA and Chars 'initialized'
12:02:21.435 -> DIS and Chars 'initialized'
12:02:21.435 -> Start Scanning for CPS, CSC and FTMS!
12:02:21.435 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
12:02:21.435 -> Timestamp MAC Address Rssi Data
12:02:21.435 -> 000001359 F8:9C:FC:53:5E:49 -54 09-02-16-18-26-18-18-18-0A-18
12:02:21.440 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
12:02:21.440 -> Now checking all Client Services and Characteristics!
12:02:21.440 -> If Mandatory Services Fail --> the Client will disconnect!
12:02:21.468 -> First checking Generic Access and Device Information Services and Characteristics!
12:02:21.604 -> Found Client Generic Access
12:02:21.959 -> -> Client Reads Device Name: [Zwift Hub]
12:02:22.503 -> -> Client Reads Appearance: [1152]
12:02:22.831 -> Found Client Device Information
12:02:23.268 -> -> Client Reads Manufacturer: [Zwift]
12:02:24.091 -> -> Client Reads Serial Number: [06-F89CFC535E49]
12:02:24.296 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
12:02:24.574 -> Discovering Client FTM Feature Characteristic ... Found it!
12:02:24.716 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
12:02:24.946 -> Discovering Client FTM Control Point Characteristic ... Not Found!
12:02:24.946 -> Disconnecting since Client FTM Control Point Characteristic is mandatory!
12:02:24.993 -> Client Disconnected, reason = 0x16
12:02:24.993 -> >>> Restart the Feather nRF52 Client for a new run! <<<
12:02:26.206 -> Stopped!
12:02:46.062 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
12:02:46.062 -> ----------------- Version 02.8 ------------------
12:02:46.062 -> Initialise the Bluefruit nRF52 module: Client (Central)
12:02:46.062 -> FTMS and Chars 'initialized'
12:02:46.062 -> CPS and Chars 'initialized'
12:02:46.062 -> CSCS and Chars 'initialized'
12:02:46.062 -> GA and Chars 'initialized'
12:02:46.062 -> DIS and Chars 'initialized'
12:02:46.062 -> Start Scanning for CPS, CSC and FTMS!
12:02:46.478 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
12:02:46.478 -> Timestamp MAC Address Rssi Data
12:02:46.478 -> 000001488 F8:9C:FC:53:5E:49 -52 09-02-16-18-26-18-18-18-0A-18
12:02:46.500 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
12:02:46.500 -> Now checking all Client Services and Characteristics!
12:02:46.500 -> If Mandatory Services Fail --> the Client will disconnect!
12:02:46.500 -> First checking Generic Access and Device Information Services and Characteristics!
12:02:46.592 -> Found Client Generic Access
12:02:46.964 -> -> Client Reads Device Name: [Zwift Hub]
12:02:47.320 -> -> Client Reads Appearance: [1152]
12:02:47.583 -> Found Client Device Information
12:02:47.880 -> -> Client Reads Manufacturer: [Zwift]
12:02:48.252 -> -> Client Reads Model Number: [06]
12:02:48.655 -> -> Client Reads Serial Number: [06-F89CFC535E49]
12:02:48.842 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
12:02:49.124 -> Discovering Client FTM Feature Characteristic ... Found it!
12:02:49.340 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
12:02:49.560 -> Discovering Client FTM Control Point Characteristic ... Found it!
12:02:50.137 -> Discovering Client FTM Status Characteristic ... Found it!
12:02:50.586 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
12:02:50.977 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
12:02:51.020 -> Found it!
12:02:51.020 -> Ready to receive Client FTM Control Point Response Messages
12:02:51.066 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
12:02:51.252 -> Ready to receive Client FTM Status values
12:02:51.252 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
12:02:51.518 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
12:02:51.920 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
12:02:52.156 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
12:02:52.620 -> Discovering Client CP Measurement characteristic ... Found it!
12:02:52.979 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
12:02:53.119 -> >>> Couldn't enable notify for Client FTM Training Status Characteristic.
12:02:53.165 -> Discovering Client CP Feature characteristic ... Ready to receive Client FTM Indoor Bike Data values
12:02:53.229 -> Found it!
12:02:53.229 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
12:02:53.229 -> Wheel revolution data supported
12:02:53.229 -> Crank revolution data supported
12:02:53.229 -> Ready to receive Client CP Measurement values
12:02:53.514 -> Discovering Client CP Sensor Location characteristic ... Found it!
12:02:53.607 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
12:02:53.918 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
12:02:54.540 -> Discovering Client CSC Measurement CHR ... Found it!
12:02:54.898 -> Discovering Client CSC Location CHR ... Found it!
12:02:54.898 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
12:02:55.256 -> Discovering Client CSC Feature CHR ... Found it!
12:02:55.256 -> >>> Couldn't enable indicate for Client CP Control Point Characteristic.
12:02:55.302 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
12:02:55.302 -> Wheel rev supported
12:02:55.302 -> Crank rev supported
12:02:55.302 -> Ready to receive Client CSC Measurement values
12:02:55.302 -> Client (Central) is Up and Running!
12:02:55.489 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
12:02:55.489 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
12:02:55.489 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
12:02:55.489 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
12:02:56.207 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
12:02:56.207 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
12:02:57.216 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
12:02:57.216 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
12:02:57.293 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
12:02:57.371 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Jörghen,

I took the FTMS_BRIDGE_V023 and added the delay as in the FTMS Client.

Here is the result :

The Cyclist moves correctly and power and cadence are correct.

I can't turn on the cardio frequency meter otherwise everything crashes!!
20221217_151846

20221217_152053

5:18:07.676 -> First checking Generic Access and Device Information Services and Characteristics!
15:18:07.676 -> Found Client Generic Access
15:18:07.697 -> -> Client Reads Device Name: [Zwift Hub]
15:18:07.860 -> -> Client Reads Appearance: [1152]
15:18:08.067 -> Found Client Device Information
15:18:08.697 -> -> Client Reads Manufacturer: [Zwift]
15:18:09.116 -> -> Client Reads Model Number: [06]
15:18:09.474 -> -> Client Reads Serial Number: [06-F89CFC535E49]
15:18:09.657 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
15:18:09.967 -> Discovering Client FTM Feature Characteristic ... Found it!
15:18:10.154 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
15:18:10.340 -> Discovering Client FTM Control Point Characteristic ... Found it!
15:18:10.947 -> Discovering Client FTM Status Characteristic ... Found it!
15:18:11.442 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
15:18:12.155 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
15:18:12.247 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
15:18:12.463 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
15:18:12.727 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
15:18:12.942 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
15:18:13.516 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
15:18:13.780 -> Discovering Client CP Measurement characteristic ... Found it!
15:18:14.197 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
15:18:14.570 -> Discovering Client CP Feature characteristic ... Found it!
15:18:14.723 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
15:18:14.723 -> Wheel revolution data supported
15:18:14.723 -> Crank revolution data supported
15:18:14.908 -> Discovering Client CP Sensor Location characteristic ... Found it!
15:18:15.186 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
15:18:15.372 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
15:18:15.635 -> Discovering Client CSC Measurement CHR ... Found it!
15:18:15.977 -> Discovering Client CSC Location CHR ... Found it!
15:18:16.133 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
15:18:16.335 -> Discovering Client CSC Feature CHR ... Found it!
15:18:16.519 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
15:18:16.519 -> Wheel rev supported
15:18:16.519 -> Crank rev supported
15:18:16.705 -> Configuring the Server Device Information Service
15:18:16.705 -> Configuring the Server Cycle Power Service
15:18:16.705 -> Configuring the Server Cadence and Speed Service
15:18:16.705 -> Configuring the Server Fitness Machine Service
15:18:16.705 -> Configuring the Server NUS Service
15:18:16.705 -> Setting up the Server-side advertising payload(s)
15:18:16.705 -> Setting Server Device Name to: [Sim Zwift]
15:18:16.705 -> Setting Server Appearance to: [1152]
15:18:16.705 -> Server-side is CPS, CSC and FTMS advertising!
15:18:17.278 -> Feather nRF52 (Peripheral) connected to Central device: [DESKTOP-1CC9OQN] MAC Address: 58:11:22:53:52:18
15:18:17.278 -> Ready to receive Client FTM Control Point Response Messages
15:18:17.278 -> Ready to receive Client FTM Status values
15:18:17.278 -> >>> Couldn't enable notify for Client FTM Training Status Characteristic.
15:18:17.401 -> Ready to receive Client FTM Indoor Bike Data values
15:18:17.434 -> Ready to receive Client CP Measurement values
15:18:17.434 -> >>> Couldn't enable indicate for Client CP Control Point Characteristic.
15:18:17.527 -> >>> Couldn't enable notify for Client CSC Measurement Characteristic.
15:18:17.527 -> Waiting for Central (Zwift) to set CCCD Notify/Indicate (enable) and start....
15:18:22.114 -> Client- and Server-side are Up and Running!
15:18:22.469 -> Central Device Updated CCCD to: [1] --> Server CP: Measurement 'Notify' enabled
15:18:22.940 -> Central Device Updated CCCD to: [1] --> Server CSC: Measurement 'Notify' enabled
15:18:23.568 -> Central Device Updated CCCD to: [1] --> Server FTM: IndoorBikeData 'Notify' enabled
15:18:24.361 -> Central Device Updated CCCD to: [1] --> Server FTM: Status 'Notify' enabled
15:19:30.101 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 B2 FF 28 33 00 ]
15:19:30.101 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): -0.78 | Crr (10000): 0.00 | Cw (100): 0.51
15:19:30.271 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
15:19:30.271 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 B2 FF 28 33 ]
15:19:39.262 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 00 00 28 33 00 ]
15:19:39.262 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.00 | Crr (10000): 0.00 | Cw (100): 0.51
15:19:39.354 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
15:19:39.354 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,

I took the FTMS_BRIDGE_V023 and added the delay as in the FTMS Client.

Well done! And....very good result.....

I can't turn on the cardio frequency meter otherwise everything crashes!!

That sounds dramatic.... However, I was just a little bit googling and ended up with a popular friend DCRainmaker:

->Protocol Compatibility: ANT+ FE-C, ANT+ Power, Bluetooth Smart Trainer Control, Bluetooth Smart Power (everything you need)
–>Unique Party Trick: Can rebroadcast your heart rate sensor within a single channel, ideal for Apple TV Zwift users (who are Bluetooth channel limited)

Additionally, it’s here you can do heart rate bridging/pairing. This allows you to pair your chest strap with the Zwift Hub, and then get pass-through heart rate, so that the trainer handles the HR connection to the app on behalf of your strap. The main/singular reason you’d want to do this is for Apple TV usage of Zwift or other apps. That’s because Apple TV has a two concurrent connection limit (plus the remote). So if you wanted to do steering in Zwift, then this wouldn’t be possible since you’d have one connection for the trainer, and then one for your heart rate sensor (leaving none for steering).

But with HR bridging, the heart rate sensor data gets funneled in the same ‘channel’ as the trainer data, so it only counts as one channel – not two. You can simply search for your HR strap in this menu and then pair to it.

The question is: What is your setup? What settings do you use in the Zwift Hub Companion App with respect to HBM?

Now, before we start riding, we should double-check the Zwift app for any firmware updates. This is done via the Zwift Companion App (which is the smartphone one). You’ll see a new option for Zwift hardware, and you can check/update it there..

The bottom line is:
Should the Simcline FTMS code in the end allocate Apple TV users that buy a Zwift Hub and expect HBM to be rebroadcasted?
Notice that this feature is NOT FTMS standard but an extra goodie of the Zwift company!

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
Did you spent any time on fine tuning the SOME_TIME in the FTMS_Client latest version? Before we are spending time on other parts we have to get this delay function to be optimized (for Zwift Hub specifically) and that is something I can't do, not having a Zwift Hub at hand... so I am relying on you.
Regards,
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorghen,

Yes I tested several different delays from 200 to 300 ms I put the different ones for you
results but for me 250 ms is the best at 200 I don't always have the same results at 250 it's perfect!

The cardio frequency meter problem is solved, I had disconnected it from the trainer with Zwift Compagion.

I put it back and now it's ok

20221219_162330

300 ms

16:55:20.353 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
16:55:20.353 -> ----------------- Version 02.8 ------------------
16:55:20.353 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:55:20.353 -> FTMS and Chars 'initialized'
16:55:20.353 -> CPS and Chars 'initialized'
16:55:20.353 -> CSCS and Chars 'initialized'
16:55:20.353 -> GA and Chars 'initialized'
16:55:20.353 -> DIS and Chars 'initialized'
16:55:20.353 -> Start Scanning for CPS, CSC and FTMS!
16:55:20.354 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:55:20.354 -> Timestamp MAC Address Rssi Data
16:55:20.354 -> 000001217 F8:9C:FC:53:5E:49 -57 09-02-16-18-26-18-18-18-0A-18
16:55:20.354 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address:F8:9C:FC:53:5E:49
16:55:20.354 -> Now checking all Client Services and Characteristics!
16:55:20.354 -> If Mandatory Services Fail --> the Client will disconnect!
16:55:20.380 -> First checking Generic Access and Device Information Services and Characteristics!
16:55:20.380 -> Found Client Generic Access
16:55:20.381 -> -> Client Reads Device Name: [Zwift Hub]
16:55:20.720 -> -> Client Reads Appearance: [1152]
16:55:21.076 -> Found Client Device Information
16:55:21.463 -> -> Client Reads Manufacturer: [Zwift]
16:55:21.818 -> -> Client Reads Model Number: [06]
16:55:22.220 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:55:22.527 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
16:55:22.881 -> Discovering Client FTM Feature Characteristic ... Found it!
16:55:22.958 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
16:55:23.264 -> Discovering Client FTM Control Point Characteristic ... Found it!
16:55:23.709 -> Discovering Client FTM Status Characteristic ... Found it!
16:55:24.109 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
16:55:24.519 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
16:55:24.558 -> Found it!
16:55:24.558 -> Ready to receive Client FTM Control Point Response Messages
16:55:24.604 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
16:55:24.880 -> Ready to receive Client FTM Status values
16:55:24.880 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
16:55:25.050 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
16:55:25.448 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
16:55:25.773 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
16:55:26.177 -> Discovering Client CP Measurement characteristic ... Found it!
16:55:26.640 -> Discovering Client CP Control Point characteristic ... >>> Couldn't enable notify for Client FTM Training Status Characteristic.
16:55:26.686 -> Not Found! NOT Mandatory!
16:55:26.765 -> Ready to receive Client FTM Indoor Bike Data values
16:55:26.765 -> Ready to receive Client CP Measurement values
16:55:27.089 -> Discovering Client CP Feature characteristic ... Found it!
16:55:27.089 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
16:55:27.089 -> Wheel revolution data supported
16:55:27.089 -> Crank revolution data supported
16:55:27.433 -> Discovering Client CP Sensor Location characteristic ... Found it!
16:55:27.479 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
16:55:27.820 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
16:55:28.277 -> Discovering Client CSC Measurement CHR ... Found it!
16:55:28.629 -> Discovering Client CSC Location CHR ... Found it!
16:55:28.629 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
16:55:28.769 -> >>> Couldn't enable indicate for Client CP Control Point Characteristic.
16:55:28.769 -> Ready to receive Client CSC Measurement values
16:55:28.769 -> Client (Central) is Up and Running!
16:55:28.940 -> Discovering Client CSC Feature CHR ... Found it!
16:55:29.034 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
16:55:29.034 -> Wheel rev supported
16:55:29.034 -> Crank rev supported
16:55:29.342 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
16:55:29.342 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM

250 ms

16:51:06.619 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
16:51:06.619 -> ----------------- Version 02.8 ------------------
16:51:06.619 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:51:06.619 -> FTMS and Chars 'initialized'
16:51:06.619 -> CPS and Chars 'initialized'
16:51:06.619 -> CSCS and Chars 'initialized'
16:51:06.619 -> GA and Chars 'initialized'
16:51:06.619 -> DIS and Chars 'initialized'
16:51:06.619 -> Start Scanning for CPS, CSC and FTMS!
16:51:06.619 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:51:06.619 -> Timestamp MAC Address Rssi Data
16:51:06.619 -> 000001406 F8:9C:FC:53:5E:49 -56 09-02-16-18-26-18-18-18-0A-18
16:51:06.619 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:51:06.619 -> Now checking all Client Services and Characteristics!
16:51:06.619 -> If Mandatory Services Fail --> the Client will disconnect!
16:51:06.619 -> First checking Generic Access and Device Information Services and Characteristics!
16:51:06.620 -> Found Client Generic Access
16:51:06.629 -> -> Client Reads Device Name: [Zwift Hub]
16:51:06.891 -> -> Client Reads Appearance: [1152]
16:51:07.186 -> Found Client Device Information
16:51:07.498 -> -> Client Reads Manufacturer: [Zwift]
16:51:07.855 -> -> Client Reads Model Number: [06]
16:51:08.176 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:51:08.407 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
16:51:08.702 -> Discovering Client FTM Feature Characteristic ... Found it!
16:51:08.791 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
16:51:09.053 -> Discovering Client FTM Control Point Characteristic ... Found it!
16:51:09.395 -> Discovering Client FTM Status Characteristic ... Found it!
16:51:09.802 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
16:51:10.176 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
16:51:10.254 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
16:51:10.475 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
16:51:10.630 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
16:51:10.897 -> Discovering Client FTM Indoor Bike Data Characteristic ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
16:51:10.897 -> Ready to receive Client FTM Control Point Response Messages
16:51:10.897 -> Found it!
16:51:11.177 -> Ready to receive Client FTM Status values
16:51:11.177 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
16:51:11.537 -> Discovering Client CP Measurement characteristic ... Found it!
16:51:11.896 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
16:51:12.256 -> Discovering Client CP Feature characteristic ... Found it!
16:51:12.256 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
16:51:12.256 -> Wheel revolution data supported
16:51:12.256 -> Crank revolution data supported
16:51:12.565 -> Discovering Client CP Sensor Location characteristic ... Found it!
16:51:12.581 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
16:51:12.903 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
16:51:12.937 -> >>> Couldn't enable notify for Client FTM Training Status Characteristic.
16:51:13.108 -> Ready to receive Client FTM Indoor Bike Data values
16:51:13.108 -> Ready to receive Client CP Measurement values
16:51:13.294 -> Discovering Client CSC Measurement CHR ... Found it!
16:51:13.635 -> Discovering Client CSC Location CHR ... Found it!
16:51:13.635 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
16:51:13.959 -> Discovering Client CSC Feature CHR ... Found it!
16:51:13.959 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
16:51:13.959 -> Wheel rev supported
16:51:13.959 -> Crank rev supported
16:51:14.192 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
16:51:14.192 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
16:51:14.192 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]

200 ms

17:14:15.007 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
17:14:15.007 -> ----------------- Version 02.8 ------------------
17:14:15.007 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:14:15.422 -> FTMS and Chars 'initialized'
17:14:15.422 -> CPS and Chars 'initialized'
17:14:15.422 -> CSCS and Chars 'initialized'
17:14:15.422 -> GA and Chars 'initialized'
17:14:15.422 -> DIS and Chars 'initialized'
17:14:15.422 -> Start Scanning for CPS, CSC and FTMS!
17:14:15.422 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:14:15.422 -> Timestamp MAC Address Rssi Data
17:14:15.422 -> 000000633 F8:9C:FC:53:5E:49 -55 09-02-16-18-26-18-18-18-0A-18
17:14:15.422 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:14:15.422 -> Now checking all Client Services and Characteristics!
17:14:15.422 -> If Mandatory Services Fail --> the Client will disconnect!
17:14:15.422 -> First checking Generic Access and Device Information Services and Characteristics!
17:14:15.432 -> Found Client Generic Access
17:14:16.068 -> -> Client Reads Device Name: [Zwift Hub]
17:14:16.074 -> -> Client Reads Appearance: [0]
17:14:16.137 -> Found Client Device Information
17:14:16.494 -> -> Client Reads Manufacturer: [Zwift]
17:14:16.833 -> -> Client Reads Model Number: [06]
17:14:17.190 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:14:17.378 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:14:17.675 -> Discovering Client FTM Feature Characteristic ... Found it!
17:14:17.892 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
17:14:18.064 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:14:18.467 -> Discovering Client FTM Status Characteristic ... Found it!
17:14:18.928 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:14:19.473 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:14:19.566 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
17:14:19.721 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
17:14:19.767 -> Ready to receive Client FTM Control Point Response Messages
17:14:19.767 -> Discovering Client FTM Supported Power Range Characteristic ... >>> Couldn't enable notify for Client FTM Status Characteristic.
17:14:19.845 -> FTMS (trainer) is controlled by another Client (Training App)!
17:14:19.845 -> Client (Central) is Up and Running!
17:14:19.969 -> Not Found! NOT mandatory!
17:14:20.173 -> Discovering Client FTM Indoor Bike Data Characteristic ... Not Found! Not Mandatory
17:14:20.344 -> Discovering Client Cycling Power (CP) Service ... Not Found!
17:14:20.344 -> Disconnecting since Client Cyling Power Service is mandatory!
17:14:20.344 -> Client Disconnected, reason = 0x16
17:14:20.344 -> >>> Restart the Feather nRF52 Client for a new run! <<<

200 ms

17:15:00.572 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
17:15:00.572 -> ----------------- Version 02.8 ------------------
17:15:00.572 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:15:00.572 -> FTMS and Chars 'initialized'
17:15:00.572 -> CPS and Chars 'initialized'
17:15:00.572 -> CSCS and Chars 'initialized'
17:15:00.572 -> GA and Chars 'initialized'
17:15:00.572 -> DIS and Chars 'initialized'
17:15:00.572 -> Start Scanning for CPS, CSC and FTMS!
17:15:00.572 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:15:00.572 -> Timestamp MAC Address Rssi Data
17:15:00.572 -> 000001199 F8:9C:FC:53:5E:49 -55 09-02-16-18-26-18-18-18-0A-18
17:15:00.595 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:15:00.595 -> Now checking all Client Services and Characteristics!
17:15:00.595 -> If Mandatory Services Fail --> the Client will disconnect!
17:15:00.595 -> First checking Generic Access and Device Information Services and Characteristics!
17:15:00.595 -> Found Client Generic Access
17:15:00.690 -> -> Client Reads Device Name: [Zwift Hub]
17:15:01.141 -> -> Client Reads Appearance: [1152]
17:15:01.422 -> Found Client Device Information
17:15:01.890 -> -> Client Reads Manufacturer: [Zwift]
17:15:02.356 -> -> Client Reads Model Number: [06]
17:15:02.682 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:15:02.899 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:15:03.349 -> Discovering Client FTM Feature Characteristic ... Found it!
17:15:03.489 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
17:15:03.690 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:15:04.158 -> Discovering Client FTM Status Characteristic ... Found it!
17:15:04.763 -> Discovering Client FTM Training Status Characteristic ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
17:15:05.073 -> Not Found! Not Mandatory
17:15:05.198 -> Ready to receive Client FTM Control Point Response Messages
17:15:05.198 -> Ready to receive Client FTM Status values
17:15:05.276 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:15:05.461 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
17:15:05.677 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
17:15:05.971 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
17:15:06.519 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:15:06.862 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:15:07.173 -> Discovering Client CP Measurement characteristic ... >>> Couldn't enable notify for Client FTM Training Status Characteristic.
17:15:07.220 -> Found it!
17:15:07.312 -> Ready to receive Client FTM Indoor Bike Data values
17:15:07.312 -> Ready to receive Client CP Measurement values
17:15:07.544 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
17:15:07.918 -> Discovering Client CP Feature characteristic ... Found it!
17:15:07.918 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
17:15:07.918 -> Wheel revolution data supported
17:15:07.918 -> Crank revolution data supported
17:15:08.199 -> Discovering Client CP Sensor Location characteristic ... Found it!
17:15:08.324 -> -> Client Reads CP Location Sensor: Loc#: 0 Other
17:15:08.513 -> Discovering Cycling Speed and Cadence (CSC) Service ... Not Found! CSC Service is Not Mandatory!
17:15:08.513 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
17:15:08.513 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
It looks like the Zwift Hub needs a 250 ms delay, indeed! This is surprisingly long, I know trainers that need a delay of 0.0 seconds to work perfectly....time after time! I have done some additional testing and changed the code in such a way that:

  1. I have slightly changed the pattern of the delay calls in client connect, now there are 24 calls: delaying about 6 seconds....
  2. I have included the forced delay time elsewhere --> cluttering of the output is now minimized (I hope)
  3. I have included code for decoding the FTM Feature
    Version 029 has been uploaded and you are invited to give it a try again with the Zwift Hub trainer!
    Best wishes,
    Jörgen

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorghen,

The HRM is connected but the value is not transmitted with each request! I don't know if it's serious?

Here are the results of FTMS_0.29 :

14:46:22.160 -> Feather nRF52 Client/Central: CPS, CSC and FTMS
14:46:22.160 -> ----------------- Version 02.9 ------------------
14:46:22.160 -> Processor: Feather nRF52840
14:46:22.160 -> Initialise the Bluefruit nRF52 module: Client (Central)
14:46:22.161 -> FTMS and Chars 'initialized'
14:46:22.161 -> CPS and Chars 'initialized'
14:46:22.161 -> CSCS and Chars 'initialized'
14:46:22.161 -> GA and Chars 'initialized'
14:46:22.161 -> DIS and Chars 'initialized'
14:46:22.161 -> Start Scanning for CPS, CSC and FTMS!
14:46:22.161 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
14:46:22.161 -> Timestamp MAC Address Rssi Data
14:46:22.161 -> 000001328 F8:9C:FC:53:5E:49 -59 09-02-16-18-26-18-18-18-0A-18
14:46:22.161 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
14:46:22.161 -> Now checking all Client Services and Characteristics!
14:46:22.161 -> If Mandatory Services Fail --> the Client will disconnect!
14:46:22.161 -> First checking Generic Access and Device Information Services and Characteristics!
14:46:22.183 -> Found Client Generic Access
14:46:22.183 -> -> Client Reads Device Name: [Zwift Hub]
14:46:22.524 -> -> Client Reads Appearance: [1152]
14:46:22.533 -> Found Client Device Information
14:46:22.832 -> -> Client Reads Manufacturer: [Zwift]
14:46:23.252 -> -> Client Reads Model Number: [06]
14:46:23.575 -> -> Client Reads Serial Number: [06-F89CFC535E49]
14:46:23.808 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
14:46:24.105 -> Discovering Client FTM Feature Characteristic ... Found it!
14:46:24.182 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
14:46:24.182 -> - Fitness Machine Features:
14:46:24.182 -> Average Speed Supported
14:46:24.182 -> Cadence Supported
14:46:24.182 -> Total Distance Supported
14:46:24.182 -> Resistance Level Supported
14:46:24.182 -> Heart Rate Measurement Supported
14:46:24.182 -> Power Measurement Supported
14:46:24.182 -> - Target Setting Features:
14:46:24.182 -> Resistance Target Setting Supported
14:46:24.182 -> Power Target Setting Supported
14:46:24.182 -> Indoor Bike Simulation Parameters Supported
14:46:24.182 -> Wheel Circumference Configuration Supported
14:46:24.182 -> Spin Down Control Supported
14:46:24.431 -> Discovering Client FTM Control Point Characteristic ... Found it!
14:46:24.788 -> Discovering Client FTM Status Characteristic ... Found it!
14:46:25.162 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
14:46:25.566 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
14:46:25.660 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
14:46:25.926 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
14:46:26.051 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
14:46:26.302 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
14:46:26.616 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
14:46:26.895 -> Discovering Client CP Measurement characteristic ... Found it!
14:46:27.206 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
14:46:27.560 -> Discovering Client CP Feature characteristic ... Found it!
14:46:27.636 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
14:46:27.636 -> Wheel revolution data supported
14:46:27.636 -> Crank revolution data supported
14:46:27.868 -> Discovering Client CP Sensor Location characteristic ... Found it!
14:46:27.959 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
14:46:28.204 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
14:46:28.530 -> Discovering Client CSC Measurement CHR ... Found it!
14:46:28.853 -> Discovering Client CSC Location CHR ... Found it!
14:46:28.885 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
14:46:29.158 -> Discovering Client CSC Feature CHR ... Found it!
14:46:29.272 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
14:46:29.272 -> Wheel rev supported
14:46:29.272 -> Crank rev supported
14:46:29.781 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
14:46:29.859 -> Ready to receive Client FTM Control Point Response Messages
14:46:29.859 -> Ready to receive Client FTM Status values
14:46:31.836 -> >>> Couldn't enable notify for Client FTM Training Status Characteristic.
14:46:31.975 -> Ready to receive Client FTM Indoor Bike Data values
14:46:31.975 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 E5 08 00 00 14 00 7D 00 00 ]
14:46:31.975 -> Instant. Speed: 22 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 125 Watt Heart Rate: 0 HBM
14:46:32.976 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 38 09 4C 00 14 00 78 00 00 ]
14:46:32.976 -> Instant. Speed: 23 KPH Instantaneous Cadence: 38 RPM Resistance Level: 20 Instantaneous Power: 120 Watt Heart Rate: 0 HBM
14:46:33.839 -> >>> Couldn't enable indicate for Client CP Control Point Characteristic.
14:46:33.932 -> Ready to receive Client CP Measurement values
14:46:33.932 -> Ready to receive Client CSC Measurement values
14:46:33.978 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 67 09 70 00 14 00 79 00 00 ]
14:46:33.978 -> Instant. Speed: 24 KPH Instantaneous Cadence: 56 RPM Resistance Level: 20 Instantaneous Power: 121 Watt Heart Rate: 0 HBM
14:46:34.983 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 A7 09 7E 00 14 00 97 00 00 ]
14:46:34.983 -> Instant. Speed: 24 KPH Instantaneous Cadence: 63 RPM Resistance Level: 20 Instantaneous Power: 151 Watt Heart Rate: 0 HBM
14:46:35.938 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
14:46:35.970 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 CD 09 86 00 14 00 83 00 00 ]
14:46:35.970 -> Instant. Speed: 25 KPH Instantaneous Cadence: 67 RPM Resistance Level: 20 Instantaneous Power: 131 Watt Heart Rate: 0 HBM
14:46:35.970 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
14:46:36.973 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 A9 09 8A 00 14 00 84 00 00 ]
14:46:36.973 -> Instant. Speed: 24 KPH Instantaneous Cadence: 69 RPM Resistance Level: 20 Instantaneous Power: 132 Watt Heart Rate: 0 HBM
14:46:37.978 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 B9 09 8E 00 14 00 84 00 00 ]
14:46:37.978 -> Instant. Speed: 24 KPH Instantaneous Cadence: 71 RPM Resistance Level: 20 Instantaneous Power: 132 Watt Heart Rate: 0 HBM
14:46:37.978 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
14:46:38.009 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
14:46:38.965 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 CB 09 8E 00 14 00 75 00 4F ]
14:46:38.965 -> Instant. Speed: 25 KPH Instantaneous Cadence: 71 RPM Resistance Level: 20 Instantaneous Power: 117 Watt Heart Rate: 79 HBM
14:46:39.978 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 71 09 8E 00 14 00 77 00 00 ]
14:46:39.978 -> Instant. Speed: 24 KPH Instantaneous Cadence: 71 RPM Resistance Level: 20 Instantaneous Power: 119 Watt Heart Rate: 0 HBM
14:46:40.017 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
14:46:40.141 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 07 01 ]
14:46:40.141 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 04 ]
14:46:40.975 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 5F 09 81 08 8C 00 8C 00 06 00 00 14 00 76 00 76 00 00 ]
14:46:40.975 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 70 RPM Average Cadence: 70 RPM Total Distance: 6 m Resistance Level: 20 Instantaneous Power: 118 Watt Average Power: 118 Watt Heart Rate: 0 HBM
14:46:42.040 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 74 09 81 08 8E 00 8D 00 0C 00 00 14 00 74 00 75 00 00 ]
14:46:42.040 -> Instant. Speed: 24 KPH Average Speed: 21 KPH Instantaneous Cadence: 71 RPM Average Cadence: 70 RPM Total Distance: 12 m Resistance Level: 20 Instantaneous Power: 116 Watt Average Power: 117 Watt Heart Rate: 0 HBM
14:46:42.118 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]
14:46:42.395 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:46:42.395 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 01 28 33 ]
14:46:43.042 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 49 09 81 08 8A 00 8C 00 12 00 00 14 00 73 00 74 00 00 ]
14:46:43.042 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 69 RPM Average Cadence: 70 RPM Total Distance: 18 m Resistance Level: 20 Instantaneous Power: 115 Watt Average Power: 116 Watt Heart Rate: 0 HBM
14:46:44.030 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 03 09 81 08 8A 00 8B 00 18 00 00 14 00 7F 00 77 00 00 ]
14:46:44.030 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 69 RPM Average Cadence: 69 RPM Total Distance: 24 m Resistance Level: 20 Instantaneous Power: 127 Watt Average Power: 119 Watt Heart Rate: 0 HBM
14:46:44.217 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 00 28 33 00 ]
14:46:44.387 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:46:44.387 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 00 28 33 ]
14:46:45.022 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 5E 09 81 08 88 00 8A 00 1E 00 00 14 00 87 00 7A 00 00 ]
14:46:45.023 -> Instant. Speed: 23 KPH Average Speed: 21 KPH Instantaneous Cadence: 68 RPM Average Cadence: 69 RPM Total Distance: 30 m Resistance Level: 20 Instantaneous Power: 135 Watt Average Power: 122 Watt Heart Rate: 0 HBM
14:46:45.997 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 B7 09 81 08 88 00 8A 00 24 00 00 14 00 9F 00 80 00 56 ]
14:46:45.997 -> Instant. Speed: 24 KPH Average Speed: 21 KPH Instantaneous Cadence: 68 RPM Average Cadence: 69 RPM Total Distance: 36 m Resistance Level: 20 Instantaneous Power: 159 Watt Average Power: 128 Watt Heart Rate: 86 HBM
14:46:46.308 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
14:46:46.448 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:46:46.448 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
14:46:47.003 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 79 09 81 08 88 00 8A 00 2A 00 00 14 00 8B 00 81 00 00 ]
14:46:47.003 -> Instant. Speed: 24 KPH Average Speed: 21 KPH Instantaneous Cadence: 68 RPM Average Cadence: 69 RPM Total Distance: 42 m Resistance Level: 20 Instantaneous Power: 139 Watt Average Power: 129 Watt Heart Rate: 0 HBM
14:46:47.991 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 A7 09 81 08 8A 00 8A 00 30 00 00 14 00 73 00 80 00 00 ]
14:46:47.991 -> Instant. Speed: 24 KPH Average Speed: 21 KPH Instantaneous Cadence: 69 RPM Average Cadence: 69 RPM Total Distance: 48 m Resistance Level: 20 Instantaneous Power: 115 Watt Average Power: 128 Watt Heart Rate: 0 HBM
14:46:48.411 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 14 00 28 33 00 ]
14:46:48.503 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:46:48.503 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 14 00 28 33 ]
14:46:48.983 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 B1 09 81 08 8C 00 8A 00 36 00 00 14 00 64 00 7C 00 00 ]
14:46:48.983 -> Instant. Speed: 24 KPH Average Speed: 21 KPH Instantaneous Cadence: 70 RPM Average Cadence: 69 RPM Total Distance: 54 m Resistance Level: 20 Instantaneous Power: 100 Watt Average Power: 124 Watt Heart Rate: 0 HBM
14:46:49.953 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 91 09 81 08 8C 00 8A 00 3C 00 00 14 00 66 00 7A 00 00 ]
14:46:49.953 -> Instant. Speed: 24 KPH Average Speed: 21 KPH Instantaneous Cadence: 70 RPM Average Cadence: 69 RPM Total Distance: 60 m Resistance Level: 20 Instantaneous Power: 102 Watt Average Power: 122 Watt Heart Rate: 0 HBM
14:46:50.511 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 00 28 33 00 ]
14:46:50.867 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:46:50.867 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 00 28 33 ]
14:46:51.131 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 FA 09 A2 08 8E 00 8A 00 43 00 00 14 00 5C 00 77 00 00 ]
14:46:51.131 -> Instant. Speed: 25 KPH Average Speed: 22 KPH Instantaneous Cadence: 71 RPM Average Cadence: 69 RPM Total Distance: 67 m Resistance Level: 20 Instantaneous Power: 92 Watt Average Power: 119 Watt Heart Rate: 0 HBM
14:46:52.042 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 C9 09 9F 08 90 00 8B 00 49 00 00 14 00 63 00 76 00 00 ]
14:46:52.042 -> Instant. Speed: 25 KPH Average Speed: 22 KPH Instantaneous Cadence: 72 RPM Average Cadence: 69 RPM Total Distance: 73 m Resistance Level: 20 Instantaneous Power: 99 Watt Average Power: 118 Watt Heart Rate: 0 HBM
14:46:52.597 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 25 00 28 33 00 ]
14:46:52.751 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:46:52.751 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 25 00 28 33 ]
14:46:53.028 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 B3 09 9D 08 90 00 8B 00 4F 00 00 14 00 5D 00 74 00 00 ]
14:46:53.028 -> Instant. Speed: 24 KPH Average Speed: 22 KPH Instantaneous Cadence: 72 RPM Average Cadence: 69 RPM Total Distance: 79 m Resistance Level: 20 Instantaneous Power: 93 Watt Average Power: 116 Watt Heart Rate: 0 HBM
14:46:54.015 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 B9 09 9B 08 92 00 8C 00 55 00 00 14 00 55 00 71 00 00 ]
14:46:54.015 -> Instant. Speed: 24 KPH Average Speed: 22 KPH Instantaneous Cadence: 73 RPM Average Cadence: 70 RPM Total Distance: 85 m Resistance Level: 20 Instantaneous Power: 85 Watt Average Power: 113 Watt Heart Rate: 0 HBM
14:46:54.709 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 23 00 28 33 00 ]
14:46:54.833 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:46:54.833 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 23 00 28 33 ]
14:46:55.003 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 AF 09 99 08 94 00 8C 00 5B 00 00 14 00 8F 00 73 00 00 ]
14:46:55.003 -> Instant. Speed: 24 KPH Average Speed: 22 KPH Instantaneous Cadence: 74 RPM Average Cadence: 70 RPM Total Distance: 91 m Resistance Level: 20 Instantaneous Power: 143 Watt Average Power: 115 Watt Heart Rate: 0 HBM
14:46:56.070 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 2B 0A AF 08 92 00 8C 00 62 00 00 14 00 50 00 71 00 00 ]
14:46:56.070 -> Instant. Speed: 26 KPH Average Speed: 22 KPH Instantaneous Cadence: 73 RPM Average Cadence: 70 RPM Total Distance: 98 m Resistance Level: 20 Instantaneous Power: 80 Watt Average Power: 113 Watt Heart Rate: 0 HBM
14:46:56.812 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 1C 00 28 33 00 ]
14:46:56.969 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:46:56.969 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1C 00 28 33 ]
14:46:56.969 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 F0 09 C1 08 94 00 8D 00 69 00 00 14 00 83 00 72 00 00 ]
14:46:56.969 -> Instant. Speed: 25 KPH Average Speed: 22 KPH Instantaneous Cadence: 74 RPM Average Cadence: 70 RPM Total Distance: 105 m Resistance Level: 20 Instantaneous Power: 131 Watt Average Power: 114 Watt Heart Rate: 0 HBM
14:46:57.983 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 B5 09 BE 08 94 00 8D 00 6F 00 00 14 00 74 00 72 00 00 ]
14:46:57.983 -> Instant. Speed: 24 KPH Average Speed: 22 KPH Instantaneous Cadence: 74 RPM Average Cadence: 70 RPM Total Distance: 111 m Resistance Level: 20 Instantaneous Power: 116 Watt Average Power: 114 Watt Heart Rate: 0 HBM
14:46:58.909 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 0F 00 28 33 00 ]
14:46:59.063 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 A3 09 BA 08 90 00 8D 00 75 00 00 14 00 4E 00 70 00 00 ]
14:46:59.064 -> Instant. Speed: 24 KPH Average Speed: 22 KPH Instantaneous Cadence: 72 RPM Average Cadence: 70 RPM Total Distance: 117 m Resistance Level: 20 Instantaneous Power: 78 Watt Average Power: 112 Watt Heart Rate: 0 HBM
14:46:59.064 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:46:59.064 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 0F 00 28 33 ]
14:47:00.039 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 A9 09 B8 08 90 00 8D 00 7B 00 00 14 00 63 00 70 00 00 ]
14:47:00.039 -> Instant. Speed: 24 KPH Average Speed: 22 KPH Instantaneous Cadence: 72 RPM Average Cadence: 70 RPM Total Distance: 123 m Resistance Level: 20 Instantaneous Power: 99 Watt Average Power: 112 Watt Heart Rate: 0 HBM
14:47:01.027 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
14:47:01.027 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 09 0A C6 08 8E 00 8D 00 82 00 00 14 00 66 00 6F 00 00 ]
14:47:01.027 -> Instant. Speed: 25 KPH Average Speed: 22 KPH Instantaneous Cadence: 71 RPM Average Cadence: 70 RPM Total Distance: 130 m Resistance Level: 20 Instantaneous Power: 102 Watt Average Power: 111 Watt Heart Rate: 0 HBM
14:47:01.120 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:47:01.120 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
14:47:02.030 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 DC 09 C3 08 90 00 8E 00 88 00 00 14 00 6B 00 6F 00 00 ]
14:47:02.030 -> Instant. Speed: 25 KPH Average Speed: 22 KPH Instantaneous Cadence: 72 RPM Average Cadence: 71 RPM Total Distance: 136 m Resistance Level: 20 Instantaneous Power: 107 Watt Average Power: 111 Watt Heart Rate: 0 HBM
14:47:03.021 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 E3 09 C0 08 90 00 8E 00 8E 00 00 14 00 63 00 6E 00 00 ]
14:47:03.021 -> Instant. Speed: 25 KPH Average Speed: 22 KPH Instantaneous Cadence: 72 RPM Average Cadence: 71 RPM Total Distance: 142 m Resistance Level: 20 Instantaneous Power: 99 Watt Average Power: 110 Watt Heart Rate: 0 HBM
14:47:03.085 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 F5 FF 28 33 00 ]
14:47:03.284 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:47:03.284 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 F5 FF 28 33 ]
14:47:04.006 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 09 0A CD 08 92 00 8E 00 95 00 00 14 00 6A 00 6E 00 00 ]
14:47:04.006 -> Instant. Speed: 25 KPH Average Speed: 22 KPH Instantaneous Cadence: 73 RPM Average Cadence: 71 RPM Total Distance: 149 m Resistance Level: 20 Instantaneous Power: 106 Watt Average Power: 110 Watt Heart Rate: 0 HBM
14:47:04.996 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 FF 09 D8 08 92 00 8E 00 9C 00 00 14 00 67 00 6E 00 00 ]
14:47:04.996 -> Instant. Speed: 25 KPH Average Speed: 22 KPH Instantaneous Cadence: 73 RPM Average Cadence: 71 RPM Total Distance: 156 m Resistance Level: 20 Instantaneous Power: 103 Watt Average Power: 110 Watt Heart Rate: 0 HBM
14:47:05.214 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 E4 FF 28 33 00 ]
14:47:05.353 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:47:05.353 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 E4 FF 28 33 ]
14:47:05.985 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 2F 0A E3 08 94 00 8E 00 A3 00 00 14 00 62 00 6D 00 61 ]
14:47:05.985 -> Instant. Speed: 26 KPH Average Speed: 22 KPH Instantaneous Cadence: 74 RPM Average Cadence: 71 RPM Total Distance: 163 m Resistance Level: 20 Instantaneous Power: 98 Watt Average Power: 109 Watt Heart Rate: 97 HBM
14:47:06.972 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 EA 09 DF 08 94 00 8E 00 A9 00 00 14 00 68 00 6D 00 61 ]
14:47:06.972 -> Instant. Speed: 25 KPH Average Speed: 22 KPH Instantaneous Cadence: 74 RPM Average Cadence: 71 RPM Total Distance: 169 m Resistance Level: 20 Instantaneous Power: 104 Watt Average Power: 109 Watt Heart Rate: 97 HBM
14:47:07.312 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 CF FF 28 33 00 ]
14:47:07.512 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:47:07.512 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 CF FF 28 33 ]
14:47:07.973 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 0A 0A E9 08 92 00 8E 00 B0 00 00 14 00 50 00 6C 00 00 ]
14:47:07.973 -> Instant. Speed: 25 KPH Average Speed: 22 KPH Instantaneous Cadence: 73 RPM Average Cadence: 71 RPM Total Distance: 176 m Resistance Level: 20 Instantaneous Power: 80 Watt Average Power: 108 Watt Heart Rate: 0 HBM
14:47:09.038 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 F0 09 F2 08 92 00 8F 00 B7 00 00 14 00 47 00 6B 00 00 ]
14:47:09.038 -> Instant. Speed: 25 KPH Average Speed: 22 KPH Instantaneous Cadence: 73 RPM Average Cadence: 71 RPM Total Distance: 183 m Resistance Level: 20 Instantaneous Power: 71 Watt Average Power: 107 Watt Heart Rate: 0 HBM
14:47:09.424 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A8 FF 28 33 00 ]
14:47:09.549 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:47:09.594 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A8 FF 28 33 ]
14:47:10.017 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 76 0A FA 08 94 00 8F 00 BE 00 00 14 00 5B 00 6A 00 00 ]
14:47:10.017 -> Instant. Speed: 26 KPH Average Speed: 22 KPH Instantaneous Cadence: 74 RPM Average Cadence: 71 RPM Total Distance: 190 m Resistance Level: 20 Instantaneous Power: 91 Watt Average Power: 106 Watt Heart Rate: 0 HBM
14:47:11.028 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 3A 0A 02 09 94 00 8F 00 C5 00 00 14 00 58 00 6A 00 00 ]
14:47:11.028 -> Instant. Speed: 26 KPH Average Speed: 23 KPH Instantaneous Cadence: 74 RPM Average Cadence: 71 RPM Total Distance: 197 m Resistance Level: 20 Instantaneous Power: 88 Watt Average Power: 106 Watt Heart Rate: 0 HBM
14:47:11.499 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 84 FF 28 33 00 ]
14:47:11.618 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:47:11.655 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 84 FF 28 33 ]
14:47:12.108 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 59 0A 09 09 96 00 8F 00 CC 00 00 14 00 4E 00 69 00 00 ]
14:47:12.108 -> Instant. Speed: 26 KPH Average Speed: 23 KPH Instantaneous Cadence: 75 RPM Average Cadence: 71 RPM Total Distance: 204 m Resistance Level: 20 Instantaneous Power: 78 Watt Average Power: 105 Watt Heart Rate: 0 HBM
14:47:12.996 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 CC 09 05 09 98 00 8F 00 D2 00 00 14 00 1F 00 67 00 00 ]
14:47:12.996 -> Instant. Speed: 25 KPH Average Speed: 23 KPH Instantaneous Cadence: 76 RPM Average Cadence: 71 RPM Total Distance: 210 m Resistance Level: 20 Instantaneous Power: 31 Watt Average Power: 103 Watt Heart Rate: 0 HBM
14:47:13.627 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 FF 28 33 00 ]
14:47:13.998 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:47:13.998 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 FF 28 33 ]
14:47:13.998 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 25 09 01 09 00 00 8B 00 D8 00 00 14 00 00 00 64 00 64 ]
14:47:13.998 -> Instant. Speed: 23 KPH Average Speed: 23 KPH Instantaneous Cadence: 0 RPM Average Cadence: 69 RPM Total Distance: 216 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 100 Watt Heart Rate: 100 HBM
14:47:14.971 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 82 08 FE 08 00 00 87 00 DE 00 00 14 00 00 00 61 00 00 ]
14:47:14.971 -> Instant. Speed: 21 KPH Average Speed: 23 KPH Instantaneous Cadence: 0 RPM Average Cadence: 67 RPM Total Distance: 222 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 97 Watt Heart Rate: 0 HBM
14:47:15.724 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5D FF 28 33 00 ]
14:47:15.972 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:47:15.972 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5D FF 28 33 ]
14:47:15.972 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 E7 07 F0 08 00 00 83 00 E3 00 00 14 00 00 00 5E 00 00 ]
14:47:15.972 -> Instant. Speed: 20 KPH Average Speed: 22 KPH Instantaneous Cadence: 0 RPM Average Cadence: 65 RPM Total Distance: 227 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 94 Watt Heart Rate: 0 HBM
14:47:16.973 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 4E 07 E3 08 00 00 80 00 E8 00 00 14 00 00 00 5B 00 00 ]
14:47:16.973 -> Instant. Speed: 18 KPH Average Speed: 22 KPH Instantaneous Cadence: 0 RPM Average Cadence: 64 RPM Total Distance: 232 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 91 Watt Heart Rate: 0 HBM
14:47:17.825 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5E FF 28 33 00 ]
14:47:17.935 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:47:17.935 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5E FF 28 33 ]
14:47:18.014 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 BC 06 CE 08 00 00 7C 00 EC 00 00 14 00 00 00 59 00 00 ]
14:47:18.014 -> Instant. Speed: 17 KPH Average Speed: 22 KPH Instantaneous Cadence: 0 RPM Average Cadence: 62 RPM Total Distance: 236 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 89 Watt Heart Rate: 0 HBM
14:47:19.033 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 2A 06 B9 08 00 00 79 00 F0 00 00 14 00 00 00 57 00 00 ]
14:47:19.033 -> Instant. Speed: 15 KPH Average Speed: 22 KPH Instantaneous Cadence: 0 RPM Average Cadence: 60 RPM Total Distance: 240 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 87 Watt Heart Rate: 0 HBM
14:47:19.920 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 6F FF 28 33 00 ]
14:47:20.012 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:47:20.012 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 6F FF 28 33 ]
14:47:20.012 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 A0 05 9D 08 00 00 76 00 F3 00 00 14 00 00 00 55 00 00 ]
14:47:20.012 -> Instant. Speed: 14 KPH Average Speed: 22 KPH Instantaneous Cadence: 0 RPM Average Cadence: 59 RPM Total Distance: 243 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 85 Watt Heart Rate: 0 HBM
14:47:21.023 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 17 05 81 08 00 00 73 00 F6 00 00 14 00 00 00 52 00 00 ]
14:47:21.023 -> Instant. Speed: 13 KPH Average Speed: 21 KPH Instantaneous Cadence: 0 RPM Average Cadence: 57 RPM Total Distance: 246 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 82 Watt Heart Rate: 0 HBM
14:47:21.987 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 94 04 67 08 00 00 71 00 F9 00 00 14 00 00 00 50 00 00 ]
14:47:21.987 -> Instant. Speed: 11 KPH Average Speed: 21 KPH Instantaneous Cadence: 0 RPM Average Cadence: 56 RPM Total Distance: 249 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 80 Watt Heart Rate: 0 HBM
14:47:22.029 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 8A FF 28 33 00 ]
14:47:22.167 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:47:22.167 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8A FF 28 33 ]
14:47:22.985 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 15 04 46 08 00 00 6E 00 FB 00 00 14 00 00 00 4F 00 00 ]
14:47:22.985 -> Instant. Speed: 10 KPH Average Speed: 21 KPH Instantaneous Cadence: 0 RPM Average Cadence: 55 RPM Total Distance: 251 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 79 Watt Heart Rate: 0 HBM
14:47:23.993 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 99 03 27 08 00 00 6B 00 FD 00 00 14 00 00 00 4D 00 00 ]
14:47:23.993 -> Instant. Speed: 9 KPH Average Speed: 20 KPH Instantaneous Cadence: 0 RPM Average Cadence: 53 RPM Total Distance: 253 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 77 Watt Heart Rate: 0 HBM
14:47:24.132 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 B8 FF 28 33 00 ]
14:47:24.258 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
14:47:24.258 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 B8 FF 28 33 ]
14:47:24.939 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 25 03 08 08 00 00 69 00 FF 00 00 14 00 00 00 4B 00 00 ]
14:47:24.939 -> Instant. Speed: 8 KPH Average Speed: 20 KPH Instantaneous Cadence: 0 RPM Average Cadence: 52 RPM Total Distance: 255 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 75 Watt Heart Rate: 0 HBM

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
That looks perfect! The whole connect procedure took more than 7 seconds. No cluttering of print output anymore, no failing discover- or read actions! At the very moment the IBD Char is enabled the trainer starts to send IBD data. Perfect! The trainer is being ready!

IBD data will always contain an empty HBM value. No problem! This code does NOT support Zwift's special party trick for Apple TV users!

If you connect your heart rate strap: DO NOT connect it with the Zwift Hub trainer (switch OFF that feature in the Zwift Companion app) but connect it with Zwift (or Rouvy or any controlling app) directly using its specific name like 'Garmin HRM strap' or whatever name yours has! If you see on the Zwift pairing screen a Heart Rate connection with the name: 'Sim nRF52', you know that things are wrongly connected! That configuration is NOT supported!

Thanks for your testing effort! I will prepare now accordingly the FTMS_Zwift_Bridge code!
Have a nice day!
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Jörghen,

Concern the HRM and test bridge, it is by connecting it to the Zwift hub that the system works if I do not do so then the system breaks down !?

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
Uploaded as promised an up-to-date version for FTMS_Zwift_Bridge_v024

I wondered, does the highlighted FTM Feature mean: trainer is NOW set for HRM rebroadcasting?
If you switch it to OFF (with the Companion App) is this FTM Feature then missing (OFF state) ???

Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
14:46:24.182 -> - Fitness Machine Features:
14:46:24.182 -> Average Speed Supported
14:46:24.182 -> Cadence Supported
14:46:24.182 -> Total Distance Supported
14:46:24.182 -> Resistance Level Supported
14:46:24.182 -> Heart Rate Measurement Supported
14:46:24.182 -> Power Measurement Supported
14:46:24.182 -> - Target Setting Features:
14:46:24.182 -> Resistance Target Setting Supported
14:46:24.182 -> Power Target Setting Supported
14:46:24.182 -> Indoor Bike Simulation Parameters Supported
14:46:24.182 -> Wheel Circumference Configuration Supported
14:46:24.182 -> Spin Down Control Supported

--> Not to difficult to test with Client_FTMS_v029.... NO Heart Rate band needed! Make the change and just check the decoded FTM Feature output...for a change! Reverse the process and see if the feature comes back again!
Enjoy your day!
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorghen,

I tested the FTMS_BRIDGE V24 version

No problem encountered

Here are the results.

We find the "grade" value to evolve by half the value on Zwift, it's normal since I set the difficulty value of the trainer to 50%.

image

I checked the result with HRM connected via Companion or not. There is no change in the presentation of the service it remains present.

I don't think you need to look for an answer of why it works?

image

Just a question. What is the value:
Wind speed (1000): 0.00 | Rank (100): 0.51 | Crr(10000): 0.00 | Cw(100): 0.51

17:31:54.953 -> Feather nRF52840 MITM supporting: CPS, CSC and FTMS
17:31:54.953 -> ------------------ Version 02.4 ---------------------
17:31:55.408 -> FTM Service and Chars are 'initialized'
17:31:55.408 -> CP Service and Chars are 'initialized'
17:31:55.408 -> CSC Service and Chars are 'initialized'
17:31:55.408 -> Generic Access Service and Chars are 'initialized'
17:31:55.408 -> Device Information Service and Chars are 'initialized'
17:31:55.408 -> Start Client-side Scanning for CPS, CSC and FTMS!
17:32:08.832 -> Found advertising Peripheral with FTMS enabled! See Raw data packet:
17:32:08.832 -> Timestamp Addr Rssi Data
17:32:08.832 -> 000015263 F8:9C:FC:53:5E:49 -58 09-02-16-18-26-18-18-18-0A-18
17:32:09.045 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:32:09.045 -> Now checking all mandatory Client Services and Characteristics!
17:32:09.045 -> If Mandatory Services Fail --> the Client will disconnect!
17:32:09.294 -> First checking Generic Access and Device Information Services and Characteristics!
17:32:09.373 -> Found Client Generic Access
17:32:09.793 -> -> Client Reads Device Name: [Zwift Hub]
17:32:10.326 -> -> Client Reads Appearance: [0]
17:32:10.731 -> Found Client Device Information
17:32:11.087 -> -> Client Reads Manufacturer: [Zwift]
17:32:11.651 -> -> Client Reads Model Number: [06]
17:32:12.091 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:32:12.324 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:32:12.651 -> Discovering Client FTM Feature Characteristic ... Found it!
17:32:12.882 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
17:32:12.882 -> - Fitness Machine Features:
17:32:12.882 -> - Target Setting Features:
17:32:13.158 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:32:13.702 -> Discovering Client FTM Status Characteristic ... Found it!
17:32:14.192 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:32:14.566 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:32:14.656 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
17:32:14.920 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
17:32:15.044 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
17:32:15.310 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:32:15.661 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:32:15.913 -> Discovering Client CP Measurement characteristic ... Found it!
17:32:16.268 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
17:32:16.576 -> Discovering Client CP Feature characteristic ... Found it!
17:32:16.685 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
17:32:16.685 -> Wheel revolution data supported
17:32:16.685 -> Crank revolution data supported
17:32:16.916 -> Discovering Client CP Sensor Location characteristic ... Found it!
17:32:17.009 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
17:32:17.271 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
17:32:17.349 -> Configuring the Server Device Information Service
17:32:17.349 -> Configuring the Server Cycle Power Service
17:32:17.349 -> Configuring the Server Cadence and Speed Service
17:32:17.349 -> Configuring the Server Fitness Machine Service
17:32:17.349 -> Configuring the Server NUS Service
17:32:17.349 -> Setting up the Server-side advertising payload(s)
17:32:17.349 -> Setting Server Device Name to: [Sim Zwift]
17:32:17.349 -> Setting Server Appearance to: [0]
17:32:17.349 -> Server-side is CPS, CSC and FTMS advertising!
17:32:17.533 -> Discovering Client CSC Measurement CHR ... Found it!
17:32:17.919 -> Discovering Client CSC Location CHR ... Found it!
17:32:18.044 -> -> Client Reads CSC Location Sensor: Loc#: 0 Other
17:32:18.275 -> Discovering Client CSC Feature CHR ... Found it!
17:32:18.399 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
17:32:18.399 -> Wheel rev supported
17:32:18.399 -> Crank rev supported
17:34:12.339 -> Client- and Server-side are Up and Running!
17:34:14.345 -> Ready to receive Client FTM Indoor Bike Data values
17:34:14.345 -> >>> Couldn't enable indicate for Client CP Control Point Characteristic.
17:34:14.383 -> Ready to receive Client CP Measurement values
17:34:14.430 -> Ready to receive Client CSC Measurement values
17:34:14.430 -> Waiting for Central (Zwift) to set CCCD Notify/Indicate (enable) and start....
17:34:16.038 -> Central Device Updated CCCD to: [1] --> Server CP: Measurement 'Notify' enabled
17:34:16.586 -> Central Device Updated CCCD to: [1] --> Server CSC: Measurement 'Notify' enabled
17:34:17.291 -> Central Device Updated CCCD to: [1] --> Server FTM: IndoorBikeData 'Notify' enabled
17:34:18.057 -> Central Device Updated CCCD to: [1] --> Server FTM: Status 'Notify' enabled
17:34:42.216 -> -> Server Rec'd Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
17:34:42.216 -> Request Control of Machine!
17:34:42.311 -> -> Client Rec'd Control Point Response: [ 80 00 01 ]
17:34:42.451 -> -> Server Rec'd Raw FTM Control Point Data [len: 1] [OpCode: 01] [Values: 00 ]
17:34:42.451 -> Reset Machine!
17:34:42.451 -> -> Server Rec'd Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
17:34:42.451 -> Request Control of Machine!
17:34:42.593 -> -> Client Rec'd Control Point Response: [ 80 01 01 ]
17:34:42.593 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 01 ]
17:34:47.592 -> -> Server Rec'd Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
17:34:47.592 -> Request Control of Machine!
17:34:47.639 -> -> Client Rec'd Control Point Response: [ 80 00 01 ]
17:34:47.716 -> -> Server Rec'd Raw FTM Control Point Data [len: 1] [OpCode: 07] [Values: 00 ]
17:34:47.716 -> Start or Resume Machine!
17:34:47.811 -> -> Client Rec'd Control Point Response: [ 80 07 01 ]
17:34:47.811 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 04 ]
17:34:48.743 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 FD 00 28 33 00 ]
17:34:48.743 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 2.53 | Crr (10000): 0.00 | Cw (100): 0.51
17:34:48.882 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:34:48.882 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 FD 00 28 33 ]
17:36:06.275 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 B1 00 28 33 00 ]
17:36:06.318 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.77 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:06.401 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:06.401 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 B1 00 28 33 ]
17:36:07.326 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 33 00 28 33 00 ]
17:36:07.326 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.51 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:07.372 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:07.372 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 33 00 28 33 ]
17:36:32.918 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 32 00 28 33 00 ]
17:36:32.918 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.50 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:33.010 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:33.010 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 32 00 28 33 ]
17:36:36.157 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 33 00 28 33 00 ]
17:36:36.157 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.51 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:36.267 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:36.267 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 33 00 28 33 ]
17:36:37.107 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 35 00 28 33 00 ]
17:36:37.107 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.53 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:37.154 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:37.199 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 35 00 28 33 ]
17:36:38.079 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 39 00 28 33 00 ]
17:36:38.079 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.57 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:38.156 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:38.156 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 39 00 28 33 ]
17:36:39.030 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 40 00 28 33 00 ]
17:36:39.030 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.64 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:39.155 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:39.155 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 40 00 28 33 ]
17:36:40.061 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 4E 00 28 33 00 ]
17:36:40.061 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.78 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:40.141 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:40.141 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 4E 00 28 33 ]
17:36:41.046 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 61 00 28 33 00 ]
17:36:41.046 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.97 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:41.311 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:41.311 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 61 00 28 33 ]
17:36:42.122 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 71 00 28 33 00 ]
17:36:42.122 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.13 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:42.387 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:42.387 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 71 00 28 33 ]
17:36:43.231 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 75 00 28 33 00 ]
17:36:43.231 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.17 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:43.278 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:43.278 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 75 00 28 33 ]
17:36:44.194 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 68 00 28 33 00 ]
17:36:44.194 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.04 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:44.273 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:44.273 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 68 00 28 33 ]
17:36:45.161 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 4E 00 28 33 00 ]
17:36:45.161 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.78 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:45.300 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:45.300 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 4E 00 28 33 ]
17:36:46.203 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 2A 00 28 33 00 ]
17:36:46.203 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.42 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:46.250 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:46.250 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 2A 00 28 33 ]
17:36:47.123 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 1C 00 28 33 00 ]
17:36:47.123 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.28 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:47.247 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:47.247 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1C 00 28 33 ]
17:36:48.139 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 21 00 28 33 00 ]
17:36:48.139 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.33 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:48.328 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:48.328 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 21 00 28 33 ]
17:36:49.215 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 1F 00 28 33 00 ]
17:36:49.215 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.31 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:49.324 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:49.324 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1F 00 28 33 ]
17:36:50.197 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 1A 00 28 33 00 ]
17:36:50.197 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.26 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:50.290 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:50.290 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1A 00 28 33 ]
17:36:51.183 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 13 00 28 33 00 ]
17:36:51.183 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.19 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:51.276 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:51.276 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 13 00 28 33 ]
17:36:52.208 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 09 00 28 33 00 ]
17:36:52.208 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.09 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:52.286 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:52.286 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 00 28 33 ]
17:36:53.143 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 00 00 28 33 00 ]
17:36:53.143 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.00 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:53.221 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:53.221 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
17:36:54.051 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 F9 FF 28 33 00 ]
17:36:54.051 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): -0.07 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:54.271 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:54.271 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 F9 FF 28 33 ]
17:36:55.143 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 EF FF 28 33 00 ]
17:36:55.143 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): -0.17 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:55.235 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:55.235 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 EF FF 28 33 ]
17:36:56.109 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 E3 FF 28 33 00 ]
17:36:56.109 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): -0.29 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:56.141 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:56.141 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 E3 FF 28 33 ]
17:36:56.998 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 D4 FF 28 33 00 ]
17:36:56.998 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): -0.44 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:57.044 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:57.044 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 D4 FF 28 33 ]
17:36:57.934 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 BE FF 28 33 00 ]
17:36:57.934 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): -0.66 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:58.044 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:58.044 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 BE FF 28 33 ]
17:36:58.901 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 9F FF 28 33 00 ]
17:36:58.901 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): -0.97 | Crr (10000): 0.00 | Cw (100): 0.51
17:36:59.072 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:36:59.072 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 9F FF 28 33 ]
17:36:59.932 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 86 FF 28 33 00 ]
17:36:59.932 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): -1.22 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:00.119 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:00.119 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 86 FF 28 33 ]
17:37:00.979 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 74 FF 28 33 00 ]
17:37:00.979 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): -1.40 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:01.105 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:01.105 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 74 FF 28 33 ]
17:37:01.980 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 6D FF 28 33 00 ]
17:37:01.980 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): -1.47 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:02.104 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:02.104 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 6D FF 28 33 ]
17:37:02.964 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 72 FF 28 33 00 ]
17:37:02.964 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): -1.42 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:03.183 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:03.183 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 72 FF 28 33 ]
17:37:04.026 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 88 FF 28 33 00 ]
17:37:04.026 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): -1.20 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:04.072 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:04.072 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 88 FF 28 33 ]
17:37:04.994 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 AD FF 28 33 00 ]
17:37:04.994 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): -0.83 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:05.180 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:05.180 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 AD FF 28 33 ]
17:37:05.974 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 E6 FF 28 33 00 ]
17:37:05.974 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): -0.26 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:06.053 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:06.053 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 E6 FF 28 33 ]
17:37:06.926 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 23 00 28 33 00 ]
17:37:06.926 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.35 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:07.037 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:07.037 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 23 00 28 33 ]
17:37:07.913 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 67 00 28 33 00 ]
17:37:07.913 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.03 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:08.039 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:08.039 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 00 28 33 ]
17:37:08.930 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 8B 00 28 33 00 ]
17:37:08.930 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.39 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:09.009 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:09.009 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8B 00 28 33 ]
17:37:09.993 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 96 00 28 33 00 ]
17:37:09.993 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.50 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:10.134 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:10.134 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 96 00 28 33 ]
17:37:11.022 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 93 00 28 33 00 ]
17:37:11.022 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.47 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:11.101 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:11.101 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 93 00 28 33 ]
17:37:11.973 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 8B 00 28 33 00 ]
17:37:11.973 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.39 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:12.160 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:12.160 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8B 00 28 33 ]
17:37:13.062 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 7F 00 28 33 00 ]
17:37:13.062 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.27 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:13.156 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:13.156 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 7F 00 28 33 ]
17:37:14.073 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 76 00 28 33 00 ]
17:37:14.073 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.18 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:14.340 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:14.340 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 76 00 28 33 ]
17:37:15.183 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 71 00 28 33 00 ]
17:37:15.183 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.13 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:15.322 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:15.322 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 71 00 28 33 ]
17:37:16.215 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 70 00 28 33 00 ]
17:37:16.215 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.12 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:16.305 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:16.305 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 70 00 28 33 ]
17:37:17.211 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 6D 00 28 33 00 ]
17:37:17.211 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.09 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:17.477 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:17.477 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 6D 00 28 33 ]
17:37:37.763 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 6B 00 28 33 00 ]
17:37:37.763 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.07 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:37.950 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:37.950 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 6B 00 28 33 ]
17:37:38.760 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 65 00 28 33 00 ]
17:37:38.760 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.01 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:38.808 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:38.808 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 65 00 28 33 ]
17:37:39.744 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 61 00 28 33 00 ]
17:37:39.744 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.97 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:39.916 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:39.916 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 61 00 28 33 ]
17:37:40.808 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 5B 00 28 33 00 ]
17:37:40.808 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.91 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:41.027 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:41.027 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5B 00 28 33 ]
17:37:41.945 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 56 00 28 33 00 ]
17:37:41.945 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.86 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:42.039 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:42.039 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 56 00 28 33 ]
17:37:42.909 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 57 00 28 33 00 ]
17:37:42.909 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.87 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:43.081 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:43.081 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 57 00 28 33 ]
17:37:43.954 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 5E 00 28 33 00 ]
17:37:43.954 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 0.94 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:44.032 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:44.032 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5E 00 28 33 ]
17:37:44.982 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 67 00 28 33 00 ]
17:37:44.982 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.03 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:45.121 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:45.121 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 00 28 33 ]
17:37:45.979 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 6F 00 28 33 00 ]
17:37:45.979 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.11 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:46.103 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:46.103 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 6F 00 28 33 ]
17:37:46.957 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 75 00 28 33 00 ]
17:37:46.957 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.17 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:47.127 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:47.127 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 75 00 28 33 ]
17:37:48.183 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 7A 00 28 33 00 ]
17:37:48.183 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.22 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:48.277 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:48.277 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 7A 00 28 33 ]
17:37:49.026 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 7E 00 28 33 00 ]
17:37:49.026 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.26 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:49.165 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:49.165 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 7E 00 28 33 ]
17:37:49.989 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 80 00 28 33 00 ]
17:37:49.989 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.28 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:50.067 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:50.067 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 80 00 28 33 ]
17:37:50.941 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 83 00 28 33 00 ]
17:37:50.941 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.31 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:51.066 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:51.066 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 83 00 28 33 ]
17:37:51.796 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 84 00 28 33 00 ]
17:37:51.796 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.32 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:51.984 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:51.984 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 84 00 28 33 ]
17:37:52.936 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 86 00 28 33 00 ]
17:37:52.936 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.34 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:53.030 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:53.030 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 86 00 28 33 ]
17:37:53.949 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 88 00 28 33 00 ]
17:37:53.949 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.36 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:54.027 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:54.027 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 88 00 28 33 ]
17:37:54.792 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 8A 00 28 33 00 ]
17:37:54.792 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.38 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:54.961 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:54.961 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8A 00 28 33 ]
17:37:55.786 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 8B 00 28 33 00 ]
17:37:55.786 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.39 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:55.910 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:55.910 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8B 00 28 33 ]
17:37:56.766 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 8C 00 28 33 00 ]
17:37:56.766 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.40 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:56.797 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:56.797 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8C 00 28 33 ]
17:37:57.734 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 8D 00 28 33 00 ]
17:37:57.734 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.41 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:57.954 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:57.954 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8D 00 28 33 ]
17:37:59.588 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 8E 00 28 33 00 ]
17:37:59.588 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.42 | Crr (10000): 0.00 | Cw (100): 0.51
17:37:59.681 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:37:59.681 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8E 00 28 33 ]
17:38:02.050 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 8F 00 28 33 00 ]
17:38:02.050 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.43 | Crr (10000): 0.00 | Cw (100): 0.51
17:38:02.129 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:38:02.129 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8F 00 28 33 ]
17:38:05.208 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 90 00 28 33 00 ]
17:38:05.208 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.44 | Crr (10000): 0.00 | Cw (100): 0.51
17:38:05.366 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:38:05.366 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 90 00 28 33 ]
17:38:15.990 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 8F 00 28 33 00 ]
17:38:15.990 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.43 | Crr (10000): 0.00 | Cw (100): 0.51
17:38:16.069 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:38:16.069 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8F 00 28 33 ]
17:38:21.556 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 8E 00 28 33 00 ]
17:38:21.557 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.42 | Crr (10000): 0.00 | Cw (100): 0.51
17:38:21.648 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:38:21.648 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8E 00 28 33 ]
17:38:23.971 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 8D 00 28 33 00 ]
17:38:23.971 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.41 | Crr (10000): 0.00 | Cw (100): 0.51
17:38:24.158 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:38:24.158 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8D 00 28 33 ]
17:38:25.746 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 8C 00 28 33 00 ]
17:38:25.746 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.40 | Crr (10000): 0.00 | Cw (100): 0.51
17:38:25.918 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:38:25.918 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8C 00 28 33 ]
17:38:28.284 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 8B 00 28 33 00 ]
17:38:28.284 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.39 | Crr (10000): 0.00 | Cw (100): 0.51
17:38:28.409 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:38:28.409 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8B 00 28 33 ]
17:39:28.747 -> -> Server Rec'd Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 6D 00 28 33 00 ]
17:39:28.747 -> Set Indoor Bike Simulation Parameters --> Wind speed (1000): 0.00 | Grade (100): 1.09 | Crr (10000): 0.00 | Cw (100): 0.51
17:39:28.856 -> -> Client Rec'd Control Point Response: [ 80 11 01 ]
17:39:28.856 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 6D 00 28 33 ]
17:40:21.715 -> Server disconnected from Central (Laptop): [], reason: [13]

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
Thanks for your effort and well done!
Not a bad result, however a few readings are missed in the beginning, that needs my(!) attention:

17:32:10.326 -> -> Client Reads Appearance: [0]
17:32:12.882 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]

You have to help me to clarify the HRM (Heart Rate Measurement) connection context, I need to precisely understand how critical devices are connected......that helps making the code more robust for different situations and "une déformation professionnelle" !
In the recent run, I see HRM is paired (on the screen shots you included) and showing real BPM (like 70 Beats Per Minute)
--> do you use a Heart Rate Strap, or an other device? Can you give me the type and brand name?
--> is the Zwift Game App (on the PC) connected directly with your Heart Rate Strap? OR
--> is the Zwift HUB Trainer connected with your Heart Rate Strap and then the trainer is connected with the Zwift Game App (on the PC)?

I am pleasantly surprised about the following Client_FTMS test result:

I checked the result with HRM connected via Companion or not. There is no change in the presentation of the service it remains present.

--> I assume that in both (above) cases the real time BPM data are shown, is that correct?
Apparently the Zwift Game app (on the PC) is using the Indoor Bike Data for extracting the BPM when it is not connected directly with your heart rate strap. You have seen in previous FTMS_Client runs that a BPM field is present in IBData!
I have to think about possible consequences but again this is a clever feature!

Now remains the following issue:

I can't turn on the cardio frequency meter otherwise everything crashes!!

What is the present status? Can you crash the code in certain situations?

I hope you will take some time to answer the questions and again thank you for doing the testing so quickly!
Regards,
Jörgen.

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Page 62 of 78 of Fitness Machine Service 1.0, section: 4.16.2.18 Set Indoor Bike Simulation Parameters Procedure

Wind Speed, Grade (Road Inclination), Crr (Coefficient of Rolling Resistance), Cw (Wind Resistance Coefficient)

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorghen,

here are the results of several series of launches with Zwift_Bridge_v024.
All results are not always the same.

The starting procedure is always the same.

1 trainer on all the time. I don't turn it off between feather starts.

2 feather start.

no bluetooth key in the connected pc

no HRM

17:10:13.858 -> Feather nRF52840 MITM supporting: CPS, CSC and FTMS
17:10:13.858 -> ------------------ Version 02.4 ---------------------
17:10:13.858 -> FTM Service and Chars are 'initialized'
17:10:13.858 -> CP Service and Chars are 'initialized'
17:10:13.858 -> CSC Service and Chars are 'initialized'
17:10:13.858 -> Generic Access Service and Chars are 'initialized'
17:10:13.858 -> Device Information Service and Chars are 'initialized'
17:10:13.858 -> Start Client-side Scanning for CPS, CSC and FTMS!
17:10:25.700 -> Found advertising Peripheral with FTMS enabled! See Raw data packet:
17:10:25.700 -> Timestamp Addr Rssi Data
17:10:25.700 -> 000014056 F8:9C:FC:53:5E:49 -54 09-02-16-18-26-18-18-18-0A-18
17:10:25.902 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:10:25.902 -> Now checking all mandatory Client Services and Characteristics!
17:10:25.902 -> If Mandatory Services Fail --> the Client will disconnect!
17:10:26.167 -> First checking Generic Access and Device Information Services and Characteristics!
17:10:26.385 -> Found Client Generic Access
17:10:26.893 -> -> Client Reads Device Name: [Zwift Hub]
17:10:27.339 -> -> Client Reads Appearance: [1152]
17:10:27.714 -> Found Client Device Information
17:10:28.116 -> -> Client Reads Manufacturer: [Zwift]
17:10:28.533 -> -> Client Reads Model Number: [06]
17:10:28.933 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:10:29.164 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:10:29.474 -> Discovering Client FTM Feature Characteristic ... Found it!
17:10:29.934 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
17:10:29.934 -> - Fitness Machine Features:
17:10:29.934 -> - Target Setting Features:
17:10:30.197 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:10:30.802 -> Discovering Client FTM Status Characteristic ... Found it!
17:10:31.422 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:10:32.144 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:10:32.331 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
17:10:32.564 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
17:10:32.964 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
17:10:33.226 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:10:33.767 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:10:34.062 -> Discovering Client CP Measurement characteristic ... Configuring the Server Device Information Service
17:10:34.200 -> Configuring the Server Cycle Power Service
17:10:34.200 -> Configuring the Server Cadence and Speed Service
17:10:34.200 -> Configuring the Server Fitness Machine Service
17:10:34.200 -> Configuring the Server NUS Service
17:10:34.200 -> Setting up the Server-side advertising payload(s)
17:10:34.200 -> Setting Server Device Name to: [Sim Zwift]
17:10:34.200 -> Setting Server Appearance to: [1152]
17:10:34.200 -> Server-side is CPS, CSC and FTMS advertising!
17:10:34.415 -> Found it!
17:10:34.662 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
17:10:35.264 -> Discovering Client CP Feature characteristic ... Found it!
17:10:35.433 -> -> Client Reads Raw CP Feature bytes: [4] [ 00 00 00 00 ]
17:10:35.664 -> Discovering Client CP Sensor Location characteristic ... Found it!
17:10:35.835 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
17:10:36.067 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
17:10:36.407 -> Discovering Client CSC Measurement CHR ... Found it!
17:10:37.148 -> Discovering Client CSC Location CHR ... Found it!
17:10:37.318 -> -> Client Reads CSC Location Sensor: Loc#: 0 Other
17:10:37.582 -> Discovering Client CSC Feature CHR ... Found it!
17:10:37.737 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
17:10:37.737 -> Wheel rev supported
17:10:37.737 -> Crank rev supported

17:12:28.287 -> Feather nRF52840 MITM supporting: CPS, CSC and FTMS
17:12:28.287 -> ------------------ Version 02.4 ---------------------
17:12:28.296 -> FTM Service and Chars are 'initialized'
17:12:28.296 -> CP Service and Chars are 'initialized'
17:12:28.296 -> CSC Service and Chars are 'initialized'
17:12:28.296 -> Generic Access Service and Chars are 'initialized'
17:12:28.296 -> Device Information Service and Chars are 'initialized'
17:12:28.296 -> Start Client-side Scanning for CPS, CSC and FTMS!
17:12:28.296 -> Found advertising Peripheral with FTMS enabled! See Raw data packet:
17:12:28.296 -> Timestamp Addr Rssi Data
17:12:28.296 -> 000001049 F8:9C:FC:53:5E:49 -60 09-02-16-18-26-18-18-18-0A-18
17:12:28.296 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:12:28.296 -> Now checking all mandatory Client Services and Characteristics!
17:12:28.296 -> If Mandatory Services Fail --> the Client will disconnect!
17:12:28.296 -> First checking Generic Access and Device Information Services and Characteristics!
17:12:28.296 -> Found Client Generic Access
17:12:28.658 -> -> Client Reads Device Name: [Zwift Hub]
17:12:29.207 -> -> Client Reads Appearance: [1152]
17:12:29.746 -> Found Client Device Information
17:12:30.164 -> -> Client Reads Manufacturer: [Zwift]
17:12:30.535 -> -> Client Reads Model Number: [06]
17:12:31.018 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:12:31.281 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:12:31.620 -> Discovering Client FTM Feature Characteristic ... Found it!
17:12:31.883 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
17:12:31.884 -> - Fitness Machine Features:
17:12:31.884 -> Average Speed Supported
17:12:31.884 -> Cadence Supported
17:12:31.884 -> Total Distance Supported
17:12:31.884 -> Resistance Level Supported
17:12:31.884 -> Heart Rate Measurement Supported
17:12:31.884 -> Power Measurement Supported
17:12:31.884 -> - Target Setting Features:
17:12:31.884 -> Resistance Target Setting Supported
17:12:31.884 -> Power Target Setting Supported
17:12:31.884 -> Indoor Bike Simulation Parameters Supported
17:12:31.884 -> Wheel Circumference Configuration Supported
17:12:31.884 -> Spin Down Control Supported
17:12:32.114 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:12:32.643 -> Discovering Client FTM Status Characteristic ... Found it!
17:12:33.182 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:12:33.645 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:12:33.829 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
17:12:34.063 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
17:12:34.373 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 00 00 01 00 ]
17:12:34.651 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:12:35.130 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:12:35.518 -> Discovering Client CP Measurement characteristic ... Found it!
17:12:35.964 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
17:12:36.381 -> Configuring the Server Device Information Service
17:12:36.381 -> Configuring the Server Cycle Power Service
17:12:36.381 -> Configuring the Server Cadence and Speed Service
17:12:36.381 -> Configuring the Server Fitness Machine Service
17:12:36.381 -> Configuring the Server NUS Service
17:12:36.381 -> Setting up the Server-side advertising payload(s)
17:12:36.381 -> Setting Server Device Name to: [Sim Zwift]
17:12:36.381 -> Setting Server Appearance to: [1152]
17:12:36.382 -> Server-side is CPS, CSC and FTMS advertising!
17:12:36.614 -> Discovering Client CP Feature characteristic ... Found it!
17:12:37.032 -> -> Client Reads Raw CP Feature bytes: [4] [ 00 00 00 00 ]
17:12:37.264 -> Discovering Client CP Sensor Location characteristic ... Found it!
17:12:37.605 -> -> Client Reads CP Location Sensor: Loc#: 0 Other
17:12:37.869 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
17:12:38.193 -> Discovering Client CSC Measurement CHR ... Found it!
17:12:38.707 -> Discovering Client CSC Location CHR ... Found it!
17:12:39.112 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
17:12:39.345 -> Discovering Client CSC Feature CHR ... Found it!
17:12:39.561 -> -> Client Reads Raw CSC Feature bytes: [2] [ 00 00 ]

17:13:38.895 -> Feather nRF52840 MITM supporting: CPS, CSC and FTMS
17:13:38.895 -> ------------------ Version 02.4 ---------------------
17:13:38.895 -> FTM Service and Chars are 'initialized'
17:13:38.895 -> CP Service and Chars are 'initialized'
17:13:38.895 -> CSC Service and Chars are 'initialized'
17:13:38.895 -> Generic Access Service and Chars are 'initialized'
17:13:38.895 -> Device Information Service and Chars are 'initialized'
17:13:38.895 -> Start Client-side Scanning for CPS, CSC and FTMS!
17:13:38.895 -> Found advertising Peripheral with FTMS enabled! See Raw data packet:
17:13:38.895 -> Timestamp Addr Rssi Data
17:13:38.895 -> 000001080 F8:9C:FC:53:5E:49 -58 09-02-16-18-26-18-18-18-0A-18
17:13:38.895 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:13:38.895 -> Now checking all mandatory Client Services and Characteristics!
17:13:38.895 -> If Mandatory Services Fail --> the Client will disconnect!
17:13:38.913 -> First checking Generic Access and Device Information Services and Characteristics!
17:13:38.913 -> Found Client Generic Access
17:13:39.159 -> -> Client Reads Device Name: [Zwift Hub]
17:13:39.533 -> -> Client Reads Appearance: [1152]
17:13:39.904 -> Found Client Device Information
17:13:40.399 -> -> Client Reads Manufacturer: [Zwift]
17:13:40.952 -> -> Client Reads Model Number: [06]
17:13:41.558 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:13:41.819 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:13:42.098 -> Discovering Client FTM Feature Characteristic ... Found it!
17:13:42.331 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
17:13:42.331 -> - Fitness Machine Features:
17:13:42.331 -> Average Speed Supported
17:13:42.331 -> Cadence Supported
17:13:42.331 -> Total Distance Supported
17:13:42.331 -> Resistance Level Supported
17:13:42.331 -> Heart Rate Measurement Supported
17:13:42.331 -> Power Measurement Supported
17:13:42.331 -> - Target Setting Features:
17:13:42.331 -> Resistance Target Setting Supported
17:13:42.331 -> Power Target Setting Supported
17:13:42.331 -> Indoor Bike Simulation Parameters Supported
17:13:42.331 -> Wheel Circumference Configuration Supported
17:13:42.331 -> Spin Down Control Supported
17:13:42.546 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:13:43.352 -> Discovering Client FTM Status Characteristic ... Found it!
17:13:43.891 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:13:44.481 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:13:44.650 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 00 00 00 00 ]
17:13:44.911 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
17:13:45.190 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 00 00 00 00 ]
17:13:45.452 -> Discovering Client FTM Indoor Bike Data Characteristic ... Not Found! Not Mandatory
17:13:45.684 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:13:46.038 -> Discovering Client CP Measurement characteristic ... Found it!
17:13:46.518 -> Discovering Client CP Control Point characteristic ... Configuring the Server Device Information Service
17:13:46.750 -> Configuring the Server Cycle Power Service
17:13:46.750 -> Configuring the Server Cadence and Speed Service
17:13:46.750 -> Configuring the Server Fitness Machine Service
17:13:46.750 -> Configuring the Server NUS Service
17:13:46.750 -> Setting up the Server-side advertising payload(s)
17:13:46.750 -> Setting Server Device Name to: [Sim Zwift]
17:13:46.750 -> Setting Server Appearance to: [1152]
17:13:46.750 -> Server-side is CPS, CSC and FTMS advertising!
17:13:46.750 -> Not Found! NOT Mandatory!
17:13:47.013 -> Discovering Client CP Feature characteristic ... Found it!
17:13:47.618 -> -> Client Reads Raw CP Feature bytes: [4] [ 00 00 00 00 ]

17:35:58.763 -> Feather nRF52840 MITM supporting: CPS, CSC and FTMS
17:35:58.763 -> ------------------ Version 02.4 ---------------------
17:35:58.778 -> FTM Service and Chars are 'initialized'
17:35:58.778 -> CP Service and Chars are 'initialized'
17:35:58.778 -> CSC Service and Chars are 'initialized'
17:35:58.778 -> Generic Access Service and Chars are 'initialized'
17:35:58.778 -> Device Information Service and Chars are 'initialized'
17:35:58.778 -> Start Client-side Scanning for CPS, CSC and FTMS!
17:35:58.778 -> Found advertising Peripheral with FTMS enabled! See Raw data packet:
17:35:58.778 -> Timestamp Addr Rssi Data
17:35:58.778 -> 000001224 F8:9C:FC:53:5E:49 -64 09-02-16-18-26-18-18-18-0A-18
17:35:58.953 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:35:58.953 -> Now checking all mandatory Client Services and Characteristics!
17:35:58.953 -> If Mandatory Services Fail --> the Client will disconnect!
17:35:59.173 -> First checking Generic Access and Device Information Services and Characteristics!
17:35:59.251 -> Found Client Generic Access
17:35:59.686 -> -> Client Reads Device Name: [Zwift Hub]
17:36:00.138 -> -> Client Reads Appearance: [0]
17:36:00.435 -> Found Client Device Information
17:36:00.890 -> -> Client Reads Manufacturer: [Zwift]
17:36:01.249 -> -> Client Reads Model Number: [06]
17:36:01.655 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:36:01.919 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:36:02.342 -> Discovering Client FTM Feature Characteristic ... Found it!
17:36:02.468 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
17:36:02.468 -> - Fitness Machine Features:
17:36:02.468 -> Average Speed Supported
17:36:02.468 -> Cadence Supported
17:36:02.468 -> Total Distance Supported
17:36:02.468 -> Resistance Level Supported
17:36:02.468 -> Heart Rate Measurement Supported
17:36:02.468 -> Power Measurement Supported
17:36:02.468 -> - Target Setting Features:
17:36:02.468 -> Resistance Target Setting Supported
17:36:02.468 -> Power Target Setting Supported
17:36:02.468 -> Indoor Bike Simulation Parameters Supported
17:36:02.468 -> Wheel Circumference Configuration Supported
17:36:02.468 -> Spin Down Control Supported
17:36:02.702 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:36:03.218 -> Discovering Client FTM Status Characteristic ... Found it!
17:36:03.798 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:36:04.318 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:36:04.555 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 00 00 00 00 ]
17:36:04.838 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
17:36:05.060 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
17:36:05.313 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:36:05.737 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:36:06.194 -> Discovering Client CP Measurement characteristic ... Found it!
17:36:06.572 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
17:36:06.912 -> Configuring the Server Device Information Service
17:36:06.912 -> Configuring the Server Cycle Power Service
17:36:06.912 -> Configuring the Server Cadence and Speed Service
17:36:06.912 -> Configuring the Server Fitness Machine Service
17:36:06.912 -> Configuring the Server NUS Service
17:36:06.912 -> Setting up the Server-side advertising payload(s)
17:36:06.912 -> Setting Server Device Name to: [Sim Zwift]
17:36:06.912 -> Setting Server Appearance to: [0]
17:36:06.912 -> Server-side is CPS, CSC and FTMS advertising!
17:36:06.976 -> Discovering Client CP Feature characteristic ... Found it!
17:36:07.229 -> -> Client Reads Raw CP Feature bytes: [4] [ 00 00 00 00 ]
17:36:07.497 -> Discovering Client CP Sensor Location characteristic ... Found it!
17:36:07.762 -> -> Client Reads CP Location Sensor: Loc#: 0 Other
17:36:08.028 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
17:36:08.483 -> Discovering Client CSC Measurement CHR ... Found it!
17:36:09.095 -> Discovering Client CSC Location CHR ... Found it!
17:36:09.251 -> -> Client Reads CSC Location Sensor: Loc#: 0 Other
17:36:09.517 -> Discovering Client CSC Feature CHR ... Found it!
17:36:09.690 -> -> Client Reads Raw CSC Feature bytes: [2] [ 00 00 ]

17:37:27.836 -> Feather nRF52840 MITM supporting: CPS, CSC and FTMS
17:37:27.836 -> ------------------ Version 02.4 ---------------------
17:37:27.836 -> FTM Service and Chars are 'initialized'
17:37:27.836 -> CP Service and Chars are 'initialized'
17:37:27.836 -> CSC Service and Chars are 'initialized'
17:37:27.836 -> Generic Access Service and Chars are 'initialized'
17:37:27.836 -> Device Information Service and Chars are 'initialized'
17:37:27.836 -> Start Client-side Scanning for CPS, CSC and FTMS!
17:37:27.836 -> Found advertising Peripheral with FTMS enabled! See Raw data packet:
17:37:27.836 -> Timestamp Addr Rssi Data
17:37:27.836 -> 000001115 F8:9C:FC:53:5E:49 -65 09-02-16-18-26-18-18-18-0A-18
17:37:27.854 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:37:27.854 -> Now checking all mandatory Client Services and Characteristics!
17:37:27.854 -> If Mandatory Services Fail --> the Client will disconnect!
17:37:27.854 -> First checking Generic Access and Device Information Services and Characteristics!
17:37:27.998 -> Found Client Generic Access
17:37:28.482 -> -> Client Reads Device Name: [Zwift Hub]
17:37:28.941 -> -> Client Reads Appearance: [0]
17:37:29.428 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:37:29.743 -> Discovering Client FTM Feature Characteristic ... Found it!
17:37:29.885 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
17:37:29.885 -> - Fitness Machine Features:
17:37:29.885 -> - Target Setting Features:
17:37:30.136 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:37:30.624 -> Discovering Client FTM Status Characteristic ... Found it!
17:37:31.320 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:37:31.839 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:37:31.980 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
17:37:32.214 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
17:37:32.682 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
17:37:32.933 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:37:33.343 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:37:33.656 -> Discovering Client CP Measurement characteristic ... Found it!
17:37:34.240 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
17:37:34.730 -> Discovering Client CP Feature characteristic ... Found it!
17:37:34.856 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
17:37:34.856 -> Wheel revolution data supported
17:37:34.856 -> Crank revolution data supported
17:37:35.124 -> Discovering Client CP Sensor Location characteristic ... Found it!
17:37:35.298 -> -> Client Reads CP Location Sensor: Loc#: 0 Other
17:37:35.580 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
17:37:35.612 -> Configuring the Server Device Information Service
17:37:35.612 -> Configuring the Server Cycle Power Service
17:37:35.612 -> Configuring the Server Cadence and Speed Service
17:37:35.612 -> Configuring the Server Fitness Machine Service
17:37:35.612 -> Configuring the Server NUS Service
17:37:35.612 -> Setting up the Server-side advertising payload(s)
17:37:35.660 -> Setting Server Device Name to: [Sim Zwift]
17:37:35.660 -> Setting Server Appearance to: [0]
17:37:35.660 -> Server-side is CPS, CSC and FTMS advertising!
17:37:35.865 -> Discovering Client CSC Measurement CHR ... Found it!
17:37:36.400 -> Discovering Client CSC Location CHR ... Found it!
17:37:36.556 -> -> Client Reads CSC Location Sensor: Loc#: 0 Other
17:37:36.840 -> Discovering Client CSC Feature CHR ... Found it!
17:37:37.090 -> -> Client Reads Raw CSC Feature bytes: [2] [ 00 00 ]

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

16718951153404273190133769202357

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

16718953174052921516159992068587

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
Nice design! Do I see it correctly: is the linear gliding system built in, inside the actuator? It looks quite sturdy!
You are going to mount the electronics on the lower platform...with a time-of-flight sensor for distance measuring?
Is the relatively fixed floor board construction capable to allocate your bike rocking (left/right) movement when you are standing up during climbs or during all out sprints? With a rocker plate things are quite mobile!
Again, I like what I see!
Have nice days and enjoy your time with family!

I will upload new versions in the following days!
Best wishes,
Jörgen.

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

I have uploaded a new version of FTMS_Server (v03) that is supporting the HRM service, exactly the way Zwift Hub is doing!
Notice that your avatar now has a heart rate, aside of power, cadence and speed!

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
I have uploaded a new version of FTMS_Client (v03). Not only is the HRM service fully supported but the code has been reworked in many parts....
I have inserted a.o. an experimental attempt to prevent the time out situation when the client connects and starts to discover which SVC's and Char's are exposed... You are invited to run the code to see for the result... (by the way it should fully support your HRM strap connected to the trainer!)
At first I am mostly interested in how the connect process is running....

  1. Please run the code first with its present settings and only look at (and Copy/Paste) the first phase until regular measurements are being received from the trainer....
  2. When results are disappointing then change the poll_delay variable setting (line: 45) to a higher value in steps of 50 ms... until the connect process is executed flawless... Previously you have reached that status only at 250 ms....

I am not sure of having tackled the problem... Thanks in advance for you effort!
Best wishes,
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorghen,

All my best wishes for Christmas past.
I hope you enjoyed it.

Here are the results for the server part V03
Capture d’écran 2022-12-27 123804 1
Capture d’écran 2022-12-27 123831 2

12:30:45.073 -> Feather nRF52 Server/Peripheral: CPS, CSC, HBM and FTMS
12:30:45.073 -> -------------------- Version 3.0 ----------------------
12:30:45.073 -> Processor: Feather nRF52840
12:30:45.073 -> Initialise the Bluefruit nRF52 module: Server (Peripheral)
12:30:45.197 -> Configuring the Server Device Information Service
12:30:45.197 -> Configuring the Server Cycle Power Service
12:30:45.197 -> Configuring the Server Cadence and Speed Service
12:30:45.197 -> Configuring the Server Fitness Machine Service
12:30:45.197 -> Configuring the Server HRM Service
12:30:45.197 -> Configuring the Server NUS Service
12:30:45.197 -> Setting up the Server advertising payload(s)
12:30:45.197 -> Setting Server Device Name to: [Sim nRF52]
12:30:45.197 -> Setting Server Appearance to [1152] Generic: Cycling
12:30:45.197 -> Server is advertising: CPS, CSC and FTMS
12:31:58.661 -> Feather nRF52 (Peripheral) connected to (Central) device: [] MAC Address: 58:11:22:53:52:18
12:31:58.661 -> Waiting for Central Device to set 'Notify' enabled for relevant Characteristics...
12:32:00.671 -> Server (Peripheral) is Up and Running!
12:32:03.944 -> Central Updated CCCD to: [1] --> Server CP: Measurement 'Notify' enabled
12:32:04.350 -> Central Updated CCCD to: [1] --> Server CSC: Measurement 'Notify' enabled
12:32:05.038 -> Central Updated CCCD to: [1] --> Server FTM: IndoorBikeData 'Notify' enabled
12:32:05.816 -> Central Updated CCCD to: [1] --> Server FTM: FitnessMachineStatus 'Notify' enabled
12:32:06.362 -> Central Updated CCCD to: [1] --> Server HR: Measurement 'Notify' enabled
12:33:38.595 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
12:33:38.642 -> Request Control of Machine!
12:33:38.769 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 01] [Values: 00 ]
12:33:38.862 -> Reset Machine!
12:33:38.862 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
12:33:39.000 -> Request Control of Machine!
12:33:39.000 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 07] [Values: 00 ]
12:33:39.045 -> Start or Resume Machine!
12:33:39.872 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 8D 00 28 33
12:33:39.872 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 8D 00 28 33 00 ]
12:33:39.904 -> Set Indoor Bike Simulation Parameters!
12:33:39.904 -> Wind speed (1000): 0.00 | Grade (100): 1.41 | Crr (10000): 0.00 | Cw (100): 0.51
12:35:44.177 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 EE 00 28 33 00 ]
12:35:44.254 -> Set Indoor Bike Simulation Parameters!
12:35:44.254 -> Wind speed (1000): 0.00 | Grade (100): 2.38 | Crr (10000): 0.00 | Cw (100): 0.51
12:35:45.392 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 15 00 28 33 00 ]
12:35:45.438 -> Set Indoor Bike Simulation Parameters!
12:35:45.438 -> Wind speed (1000): 0.00 | Grade (100): 0.21 | Crr (10000): 0.00 | Cw (100): 0.51
12:35:46.063 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 0E 00 28 33 00 ]
12:35:46.107 -> Set Indoor Bike Simulation Parameters!
12:35:46.107 -> Wind speed (1000): 0.00 | Grade (100): 0.14 | Crr (10000): 0.00 | Cw (100): 0.51
12:35:46.882 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 00 00 28 33 00 ]
12:35:46.961 -> Set Indoor Bike Simulation Parameters!
12:35:46.961 -> Wind speed (1000): 0.00 | Grade (100): 0.00 | Crr (10000): 0.00 | Cw (100): 0.51
12:35:47.789 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 FF FF 28 33 00 ]
12:35:47.835 -> Set Indoor Bike Simulation Parameters!
12:35:47.835 -> Wind speed (1000): 0.00 | Grade (100): -0.01 | Crr (10000): 0.00 | Cw (100): 0.51
12:35:48.694 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 00 00 28 33 00 ]
12:35:48.742 -> Set Indoor Bike Simulation Parameters!
12:35:48.742 -> Wind speed (1000): 0.00 | Grade (100): 0.00 | Crr (10000): 0.00 | Cw (100): 0.51
12:35:56.409 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 FF FF 28 33 00 ]
12:35:56.488 -> Set Indoor Bike Simulation Parameters!
12:35:56.488 -> Wind speed (1000): 0.00 | Grade (100): -0.01 | Crr (10000): 0.00 | Cw (100): 0.51
12:35:57.250 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 07 00 28 33 00 ]
12:35:57.282 -> Set Indoor Bike Simulation Parameters!
12:35:57.282 -> Wind speed (1000): 0.00 | Grade (100): 0.07 | Crr (10000): 0.00 | Cw (100): 0.51
12:35:58.079 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 00 00 28 33 00 ]
12:35:58.125 -> Set Indoor Bike Simulation Parameters!
12:35:58.125 -> Wind speed (1000): 0.00 | Grade (100): 0.00 | Crr (10000): 0.00 | Cw (100): 0.51
12:35:59.047 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 1D 00 28 33 00 ]
12:35:59.141 -> Set Indoor Bike Simulation Parameters!
12:35:59.141 -> Wind speed (1000): 0.00 | Grade (100): 0.29 | Crr (10000): 0.00 | Cw (100): 0.51
12:35:59.862 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 4A 00 28 33 00 ]
12:35:59.909 -> Set Indoor Bike Simulation Parameters!
12:35:59.909 -> Wind speed (1000): 0.00 | Grade (100): 0.74 | Crr (10000): 0.00 | Cw (100): 0.51
12:36:00.766 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 48 00 28 33 00 ]
12:36:00.843 -> Set Indoor Bike Simulation Parameters!
12:36:00.843 -> Wind speed (1000): 0.00 | Grade (100): 0.72 | Crr (10000): 0.00 | Cw (100): 0.51
12:36:01.685 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 27 00 28 33 00 ]
12:36:01.732 -> Set Indoor Bike Simulation Parameters!
12:36:01.732 -> Wind speed (1000): 0.00 | Grade (100): 0.39 | Crr (10000): 0.00 | Cw (100): 0.51
12:36:02.638 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 19 00 28 33 00 ]
12:36:02.732 -> Set Indoor Bike Simulation Parameters!
12:36:02.732 -> Wind speed (1000): 0.00 | Grade (100): 0.25 | Crr (10000): 0.00 | Cw (100): 0.51
12:36:03.573 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 1E 00 28 33 00 ]
12:36:03.620 -> Set Indoor Bike Simulation Parameters!
12:36:03.620 -> Wind speed (1000): 0.00 | Grade (100): 0.30 | Crr (10000): 0.00 | Cw (100): 0.51
12:36:05.154 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 1D 00 28 33 00 ]
12:36:05.232 -> Set Indoor Bike Simulation Parameters!
12:36:05.232 -> Wind speed (1000): 0.00 | Grade (100): 0.29 | Crr (10000): 0.00 | Cw (100): 0.51
12:36:06.073 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 1C 00 28 33 00 ]
12:36:06.104 -> Set Indoor Bike Simulation Parameters!
12:36:06.104 -> Wind speed (1000): 0.00 | Grade (100): 0.28 | Crr (10000): 0.00 | Cw (100): 0.51
12:36:07.664 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 1B 00 28 33 00 ]
12:36:07.695 -> Set Indoor Bike Simulation Parameters!
12:36:07.695 -> Wind speed (1000): 0.00 | Grade (100): 0.27 | Crr (10000): 0.00 | Cw (100): 0.51
12:36:08.426 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 11 00 28 33 00 ]
12:36:08.506 -> Set Indoor Bike Simulation Parameters!
12:36:08.506 -> Wind speed (1000): 0.00 | Grade (100): 0.17 | Crr (10000): 0.00 | Cw (100): 0.51
12:36:09.330 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 1D 00 28 33 00 ]
12:36:09.377 -> Set Indoor Bike Simulation Parameters!
12:36:09.377 -> Wind speed (1000): 0.00 | Grade (100): 0.29 | Crr (10000): 0.00 | Cw (100): 0.51
12:36:10.231 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 2E 00 28 33 00 ]
12:36:10.276 -> Set Indoor Bike Simulation Parameters!
12:36:10.276 -> Wind speed (1000): 0.00 | Grade (100): 0.46 | Crr (10000): 0.00 | Cw (100): 0.51
12:36:11.041 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 33 00 28 33 00 ]
12:36:11.072 -> Set Indoor Bike Simulation Parameters!
12:36:11.072 -> Wind speed (1000): 0.00 | Grade (100): 0.51 | Crr (10000): 0.00 | Cw (100): 0.51
12:36:11.930 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 34 00 28 33 00 ]
12:36:12.008 -> Set Indoor Bike Simulation Parameters!
12:36:12.008 -> Wind speed (1000): 0.00 | Grade (100): 0.52 | Crr (10000): 0.00 | Cw (100): 0.51
12:36:12.804 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 31 00 28 33 00 ]
12:36:12.882 -> Set Indoor Bike Simulation Parameters!
12:36:12.882 -> Wind speed (1000): 0.00 | Grade (100): 0.49 | Crr (10000): 0.00 | Cw (100): 0.51
12:36:14.365 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 37 00 28 33 00 ]
12:36:14.444 -> Set Indoor Bike Simulation Parameters!

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Here are the results for FTMS Client V029
It is always at 250 ms that the result is the best beyond 250 there is no change.

For the HRM this remains obscure.
It works very well via the bridge and via the server.
But we only see it from time to time on the client.

50 ms
12:45:29.684 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
12:45:29.684 -> ------------------- Version 03.0 --------------------
12:45:29.684 -> Processor: Feather nRF52840
12:45:29.684 -> Initialise the Bluefruit nRF52 module: Client (Central)
12:45:30.137 -> FTMS and Chars 'initialized'
12:45:30.137 -> CPS and Chars 'initialized'
12:45:30.137 -> CSCS and Chars 'initialized'
12:45:30.137 -> GA and Chars 'initialized'
12:45:30.137 -> DIS and Chars 'initialized'
12:45:30.137 -> HRMS and Chars 'initialized'
12:45:30.137 -> Start Scanning for CPS, CSC and FTMS!
12:45:30.664 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
12:45:30.664 -> Timestamp MAC Address Rssi Data
12:45:30.664 -> 000002051 F8:9C:FC:53:5E:49 -67 09-02-16-18-26-18-18-18-0A-18
12:45:31.474 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [] MAC Address: F8:9C:FC:53:5E:49
12:45:31.474 -> Now checking all Client Services and Characteristics!
12:45:31.474 -> If Mandatory Services Fail --> the Client will disconnect!
12:45:31.474 -> Checking Generic Access and Device Information!
12:45:31.474 -> Start BLEDiscovery... does it help ?
12:45:31.693 -> Found Client Generic Access
12:45:31.896 -> -> Client Reads Device Name: [Zwift Hub]
12:45:32.174 -> -> Client Reads Appearance: [0]
12:45:32.219 -> Not Found Client Device Information!
12:45:32.219 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
12:45:32.266 -> Disconnecting since Client FTM Service is mandatory!
12:45:32.390 -> Client Disconnected, reason = 0x16
12:45:32.390 -> >>> Restart the Feather nRF52 Client for a new run! <<<
12:45:34.986 -> Stopped!

100 ms
12:47:15.766 -> Processor: Feather nRF52840
12:47:15.766 -> Initialise the Bluefruit nRF52 module: Client (Central)
12:47:15.766 -> FTMS and Chars 'initialized'
12:47:15.766 -> CPS and Chars 'initialized'
12:47:15.766 -> CSCS and Chars 'initialized'
12:47:15.766 -> GA and Chars 'initialized'
12:47:15.766 -> DIS and Chars 'initialized'
12:47:15.766 -> HRMS and Chars 'initialized'
12:47:15.766 -> Start Scanning for CPS, CSC and FTMS!
12:47:15.775 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
12:47:15.775 -> Timestamp MAC Address Rssi Data
12:47:15.775 -> 000001271 F8:9C:FC:53:5E:49 -67 09-02-16-18-26-18-18-18-0A-18
12:47:15.804 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [] MAC Address: F8:9C:FC:53:5E:49
12:47:15.804 -> Now checking all Client Services and Characteristics!
12:47:15.804 -> If Mandatory Services Fail --> the Client will disconnect!
12:47:15.804 -> Checking Generic Access and Device Information!
12:47:15.804 -> Start BLEDiscovery... does it help ?
12:47:16.023 -> Not Found Client Generic Access
12:47:16.116 -> Not Found Client Device Information!
12:47:16.116 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
12:47:16.209 -> Disconnecting since Client FTM Service is mandatory!
12:47:16.209 -> Client Disconnected, reason = 0x3E
12:47:16.209 -> >>> Restart the Feather nRF52 Client for a new run! <<<
12:47:20.839 -> Stopped!

150 ms

12:49:18.061 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
12:49:18.061 -> ------------------- Version 03.0 --------------------
12:49:18.061 -> Processor: Feather nRF52840
12:49:18.061 -> Initialise the Bluefruit nRF52 module: Client (Central)
12:49:18.061 -> FTMS and Chars 'initialized'
12:49:18.061 -> CPS and Chars 'initialized'
12:49:18.061 -> CSCS and Chars 'initialized'
12:49:18.061 -> GA and Chars 'initialized'
12:49:18.061 -> DIS and Chars 'initialized'
12:49:18.061 -> HRMS and Chars 'initialized'
12:49:18.061 -> Start Scanning for CPS, CSC and FTMS!
12:49:18.061 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
12:49:18.061 -> Timestamp MAC Address Rssi Data
12:49:18.061 -> 000001456 F8:9C:FC:53:5E:49 -66 09-02-16-18-26-18-18-18-0A-18
12:49:18.071 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
12:49:18.071 -> Now checking all Client Services and Characteristics!
12:49:18.071 -> If Mandatory Services Fail --> the Client will disconnect!
12:49:18.071 -> Checking Generic Access and Device Information!
12:49:18.071 -> Start BLEDiscovery... does it help ?
12:49:18.071 -> Found Client Generic Access
12:49:18.334 -> -> Client Reads Device Name: [Zwift Hub]
12:49:18.860 -> -> Client Reads Appearance: [0]
12:49:19.277 -> Found Client Device Information
12:49:19.682 -> -> Client Reads Manufacturer: [Zwift]
12:49:20.211 -> -> Client Reads Model Number: [06]
12:49:20.494 -> -> Client Reads Serial Number: [06-F89CFC535E49]
12:49:20.494 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
12:49:20.866 -> Discovering Client FTM Control Point Characteristic ... Found it!
12:49:21.737 -> Discovering Client FTM Status Characteristic ... Found it!
12:49:22.457 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
12:49:22.952 -> Discovering Client FTM Feature Characteristic ... Found it!
12:49:23.403 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
12:49:23.403 -> - Fitness Machine Features:
12:49:23.403 -> Average Speed Supported
12:49:23.403 -> Cadence Supported
12:49:23.403 -> Total Distance Supported
12:49:23.403 -> Resistance Level Supported
12:49:23.403 -> Heart Rate Measurement Supported
12:49:23.403 -> Power Measurement Supported
12:49:23.403 -> - Target Setting Features:
12:49:23.403 -> Resistance Target Setting Supported
12:49:23.403 -> Power Target Setting Supported
12:49:23.403 -> Indoor Bike Simulation Parameters Supported
12:49:23.403 -> Wheel Circumference Configuration Supported
12:49:23.403 -> Spin Down Control Supported
12:49:23.403 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
12:49:23.993 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
12:49:24.334 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
12:49:24.334 -> Discovering Client FTM Supported Power Range Characteristic ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
12:49:24.520 -> Ready to receive Client FTM Control Point Response Messages
12:49:24.520 -> Ready to receive Client FTM Status values
12:49:24.645 -> Found it!
12:49:24.645 -> Ready to receive Client FTM Indoor Bike Data values
12:49:24.723 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 00 00 00 00 ]
12:49:24.723 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
12:49:25.005 -> Discovering Client CP Measurement characteristic ... Found it!
12:49:25.319 -> Discovering Client CP Feature characteristic ... Found it!
12:49:25.804 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
12:49:25.804 -> Wheel revolution data supported
12:49:25.804 -> Crank revolution data supported
12:49:25.804 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
12:49:26.224 -> Discovering Client CP Sensor Location characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
12:49:26.750 -> Found it!
12:49:26.828 -> -> Client Reads CP Location Sensor: Loc#: 0 Other
12:49:26.828 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
12:49:27.236 -> Discovering Client CSC Measurement CHR ... Found it!
12:49:27.639 -> Discovering Client CSC Feature CHR ... Found it!
12:49:27.984 -> -> Client Reads Raw CSC Feature bytes: [2] [ 00 00 ]
12:49:27.984 -> Discovering Client CSC Location CHR ... Found it!
12:49:28.312 -> -> Client Reads CSC Location Sensor: Loc#: 0 Other
12:49:28.312 -> Discovering Heart Rate Measurement (HR) Service ... Not Found! HR Service is Not Mandatory!
12:49:28.451 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
12:49:28.451 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
12:49:28.451 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]

200ms
12:53:07.652 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
12:53:07.652 -> ------------------- Version 03.0 --------------------
12:53:07.652 -> Processor: Feather nRF52840
12:53:07.652 -> Initialise the Bluefruit nRF52 module: Client (Central)
12:53:07.951 -> FTMS and Chars 'initialized'
12:53:07.951 -> CPS and Chars 'initialized'
12:53:07.951 -> CSCS and Chars 'initialized'
12:53:07.951 -> GA and Chars 'initialized'
12:53:07.951 -> DIS and Chars 'initialized'
12:53:07.951 -> HRMS and Chars 'initialized'
12:53:07.951 -> Start Scanning for CPS, CSC and FTMS!
12:53:08.088 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
12:53:08.088 -> Timestamp MAC Address Rssi Data
12:53:08.088 -> 000001361 F8:9C:FC:53:5E:49 -65 09-02-16-18-26-18-18-18-0A-18
12:53:08.383 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
12:53:08.383 -> Now checking all Client Services and Characteristics!
12:53:08.383 -> If Mandatory Services Fail --> the Client will disconnect!
12:53:08.383 -> Checking Generic Access and Device Information!
12:53:08.383 -> Start BLEDiscovery... does it help ?
12:53:08.896 -> Found Client Generic Access
12:53:09.378 -> -> Client Reads Device Name: []
12:53:09.721 -> -> Client Reads Appearance: [1152]
12:53:10.031 -> Found Client Device Information
12:53:10.389 -> -> Client Reads Manufacturer: [Zwift]
12:53:11.555 -> -> Client Reads Serial Number: [06-F89CFC535E49]
12:53:11.555 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
12:53:12.008 -> Discovering Client FTM Control Point Characteristic ... Found it!
12:53:12.502 -> Discovering Client FTM Status Characteristic ... Found it!
12:53:12.985 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
12:53:13.439 -> Discovering Client FTM Feature Characteristic ... Found it!
12:53:13.734 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
12:53:13.734 -> - Fitness Machine Features:
12:53:13.734 -> Average Speed Supported
12:53:13.734 -> Cadence Supported
12:53:13.734 -> Total Distance Supported
12:53:13.734 -> Resistance Level Supported
12:53:13.734 -> Heart Rate Measurement Supported
12:53:13.734 -> Power Measurement Supported
12:53:13.734 -> - Target Setting Features:
12:53:13.734 -> Resistance Target Setting Supported
12:53:13.734 -> Power Target Setting Supported
12:53:13.734 -> Indoor Bike Simulation Parameters Supported
12:53:13.734 -> Wheel Circumference Configuration Supported
12:53:13.734 -> Spin Down Control Supported
12:53:13.734 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
12:53:14.185 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
12:53:14.509 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 00 00 00 00 ]
12:53:14.509 -> Discovering Client FTM Supported Power Range Characteristic ... Not Found! NOT mandatory!
12:53:14.724 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
12:53:15.035 -> Discovering Client CP Measurement characteristic ... Found it!
12:53:15.548 -> Discovering Client CP Feature characteristic ... Found it!
12:53:15.968 -> -> Client Reads Raw CP Feature bytes: [4] [ 00 00 00 00 ]
12:53:15.968 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
12:53:16.421 -> Discovering Client CP Sensor Location characteristic ... Found it!
12:53:16.762 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
12:53:16.762 -> Ready to receive Client FTM Control Point Response Messages
12:53:16.762 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
12:53:16.762 -> Discovering Cycling Speed and Cadence (CSC) Service ... Ready to receive Client FTM Status values
12:53:16.858 -> Ready to receive Client FTM Indoor Bike Data values
12:53:16.952 -> Ready to receive Client CP Measurement values
12:53:17.449 -> Found it! CSCS Max Payload: 20 Data Length: 27
12:53:17.449 -> Discovering Client CSC Measurement CHR ... Found it!
12:53:18.008 -> Discovering Client CSC Feature CHR ... Found it!
12:53:18.366 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
12:53:18.366 -> Wheel rev supported
12:53:18.366 -> Crank rev supported
12:53:18.366 -> Discovering Client CSC Location CHR ... Found it!
12:53:18.789 -> -> Client Reads CSC Location Sensor: Loc#: 0 Other
12:53:18.789 -> Discovering Heart Rate Measurement (HR) Service ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
12:53:19.006 -> Not Found! HR Service is Not Mandatory!
12:53:19.006 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
12:53:19.006 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
12:53:19.006 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
12:53:19.006 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM

250ms
12:55:10.111 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
12:55:10.111 -> ------------------- Version 03.0 --------------------
12:55:10.111 -> Processor: Feather nRF52840
12:55:10.111 -> Initialise the Bluefruit nRF52 module: Client (Central)
12:55:10.111 -> FTMS and Chars 'initialized'
12:55:10.111 -> CPS and Chars 'initialized'
12:55:10.111 -> CSCS and Chars 'initialized'
12:55:10.111 -> GA and Chars 'initialized'
12:55:10.111 -> DIS and Chars 'initialized'
12:55:10.111 -> HRMS and Chars 'initialized'
12:55:10.111 -> Start Scanning for CPS, CSC and FTMS!
12:55:10.485 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
12:55:10.485 -> Timestamp MAC Address Rssi Data
12:55:10.485 -> 000002082 F8:9C:FC:53:5E:49 -63 09-02-16-18-26-18-18-18-0A-18
12:55:10.610 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
12:55:10.610 -> Now checking all Client Services and Characteristics!
12:55:10.610 -> If Mandatory Services Fail --> the Client will disconnect!
12:55:10.610 -> Checking Generic Access and Device Information!
12:55:10.610 -> Start BLEDiscovery... does it help ?
12:55:11.291 -> Found Client Generic Access
12:55:11.945 -> -> Client Reads Device Name: []
12:55:13.112 -> -> Client Reads Appearance: [0]
12:55:13.673 -> Found Client Device Information
12:55:15.402 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
12:55:15.665 -> Disconnecting since Client FTM Service is mandatory!
12:55:15.712 -> Client Disconnected, reason = 0x16
12:55:15.712 -> >>> Restart the Feather nRF52 Client for a new run! <<<
12:55:20.506 -> Stopped!

250ms
second test

12:55:56.296 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
12:55:56.296 -> ------------------- Version 03.0 --------------------
12:55:56.296 -> Processor: Feather nRF52840
12:55:56.296 -> Initialise the Bluefruit nRF52 module: Client (Central)
12:55:56.767 -> FTMS and Chars 'initialized'
12:55:56.767 -> CPS and Chars 'initialized'
12:55:56.767 -> CSCS and Chars 'initialized'
12:55:56.767 -> GA and Chars 'initialized'
12:55:56.767 -> DIS and Chars 'initialized'
12:55:56.767 -> HRMS and Chars 'initialized'
12:55:56.767 -> Start Scanning for CPS, CSC and FTMS!
12:55:56.781 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
12:55:56.781 -> Timestamp MAC Address Rssi Data
12:55:56.781 -> 000001426 F8:9C:FC:53:5E:49 -65 09-02-16-18-26-18-18-18-0A-18
12:55:56.781 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
12:55:56.781 -> Now checking all Client Services and Characteristics!
12:55:56.781 -> If Mandatory Services Fail --> the Client will disconnect!
12:55:56.781 -> Checking Generic Access and Device Information!
12:55:56.781 -> Start BLEDiscovery... does it help ?
12:55:57.132 -> Found Client Generic Access
12:55:57.754 -> -> Client Reads Device Name: [Zwift Hub]
12:55:58.440 -> -> Client Reads Appearance: [1152]
12:55:58.766 -> Found Client Device Information
12:55:59.249 -> -> Client Reads Manufacturer: [Zwift]
12:55:59.806 -> -> Client Reads Model Number: [06]
12:56:00.396 -> -> Client Reads Serial Number: [06-F89CFC535E49]
12:56:00.396 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
12:56:00.753 -> Discovering Client FTM Control Point Characteristic ... Found it!
12:56:01.203 -> Discovering Client FTM Status Characteristic ... Found it!
12:56:01.982 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
12:56:02.432 -> Discovering Client FTM Feature Characteristic ... Found it!
12:56:02.838 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
12:56:02.838 -> - Fitness Machine Features:
12:56:02.838 -> Average Speed Supported
12:56:02.838 -> Cadence Supported
12:56:02.838 -> Total Distance Supported
12:56:02.838 -> Resistance Level Supported
12:56:02.838 -> Heart Rate Measurement Supported
12:56:02.838 -> Power Measurement Supported
12:56:02.838 -> - Target Setting Features:
12:56:02.838 -> Resistance Target Setting Supported
12:56:02.838 -> Power Target Setting Supported
12:56:02.838 -> Indoor Bike Simulation Parameters Supported
12:56:02.838 -> Wheel Circumference Configuration Supported
12:56:02.838 -> Spin Down Control Supported
12:56:02.838 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
12:56:03.737 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
12:56:04.471 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
12:56:04.471 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
12:56:05.138 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
12:56:05.138 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
12:56:05.450 -> Discovering Client CP Measurement characteristic ... Found it!
12:56:06.134 -> Discovering Client CP Feature characteristic ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
12:56:06.399 -> Ready to receive Client FTM Control Point Response Messages
12:56:06.399 -> Found it!
12:56:06.477 -> Ready to receive Client FTM Status values
12:56:06.477 -> -> Client Reads Raw CP Feature bytes: [4] [ 00 00 00 00 ]
12:56:06.523 -> Discovering Client CP Control Point characteristic ... >>> Couldn't enable notify for Client FTM Indoor Bike Data Characteristic.
12:56:06.523 -> FTMS (trainer) is controlled by another Client (Training App)!
12:56:06.772 -> Not Found! NOT Mandatory!
12:56:06.772 -> Discovering Client CP Sensor Location characteristic ... NOT Found! NOT Mandatory!
12:56:07.005 -> Discovering Cycling Speed and Cadence (CSC) Service ... Not Found!
12:56:07.270 -> Disconnecting since CSC Service is mandatory!
12:56:08.518 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
12:56:08.518 -> Client Disconnected, reason = 0x22
12:56:08.518 -> >>> Restart the Feather nRF52 Client for a new run! <<<

250ms
3eme test

13:22:53.639 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
13:22:53.639 -> ------------------- Version 03.0 --------------------
13:22:53.639 -> Processor: Feather nRF52840
13:22:53.639 -> Initialise the Bluefruit nRF52 module: Client (Central)
13:22:54.037 -> FTMS and Chars 'initialized'
13:22:54.037 -> CPS and Chars 'initialized'
13:22:54.037 -> CSCS and Chars 'initialized'
13:22:54.037 -> GA and Chars 'initialized'
13:22:54.037 -> DIS and Chars 'initialized'
13:22:54.037 -> HRMS and Chars 'initialized'
13:22:54.037 -> Start Scanning for CPS, CSC and FTMS!
13:22:54.037 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
13:22:54.037 -> Timestamp MAC Address Rssi Data
13:22:54.037 -> 000001178 F8:9C:FC:53:5E:49 -68 09-02-16-18-26-18-18-18-0A-18
13:22:54.037 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
13:22:54.037 -> Now checking all Client Services and Characteristics!
13:22:54.037 -> If Mandatory Services Fail --> the Client will disconnect!
13:22:54.037 -> Checking Generic Access and Device Information!
13:22:54.037 -> Start BLEDiscovery... does it help ?
13:22:54.399 -> Found Client Generic Access
13:22:54.740 -> -> Client Reads Device Name: [Zwift Hub]
13:22:55.095 -> -> Client Reads Appearance: [1152]
13:22:55.405 -> Found Client Device Information
13:22:55.731 -> -> Client Reads Manufacturer: [Zwift]
13:22:56.058 -> -> Client Reads Model Number: [06]
13:22:56.416 -> -> Client Reads Serial Number: [06-F89CFC535E49]
13:22:56.416 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
13:22:56.696 -> Discovering Client FTM Control Point Characteristic ... Found it!
13:22:57.068 -> Discovering Client FTM Status Characteristic ... Found it!
13:22:57.443 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
13:22:57.753 -> Discovering Client FTM Feature Characteristic ... Found it!
13:22:58.113 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
13:22:58.113 -> - Fitness Machine Features:
13:22:58.113 -> Average Speed Supported
13:22:58.113 -> Cadence Supported
13:22:58.113 -> Total Distance Supported
13:22:58.113 -> Resistance Level Supported
13:22:58.113 -> Heart Rate Measurement Supported
13:22:58.113 -> Power Measurement Supported
13:22:58.113 -> - Target Setting Features:
13:22:58.113 -> Resistance Target Setting Supported
13:22:58.113 -> Power Target Setting Supported
13:22:58.113 -> Indoor Bike Simulation Parameters Supported
13:22:58.113 -> Wheel Circumference Configuration Supported
13:22:58.113 -> Spin Down Control Supported
13:22:58.113 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
13:22:58.485 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
13:22:58.793 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
13:22:58.793 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
13:22:59.169 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
13:22:59.169 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
13:22:59.450 -> Discovering Client CP Measurement characteristic ... Found it!
13:22:59.775 -> Discovering Client CP Feature characteristic ... Found it!
13:23:00.118 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
13:23:00.118 -> Wheel revolution data supported
13:23:00.118 -> Crank revolution data supported
13:23:00.118 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
13:23:00.399 -> Discovering Client CP Sensor Location characteristic ... Found it!
13:23:00.756 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
13:23:00.756 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
13:23:01.241 -> Discovering Client CSC Measurement CHR ... Found it!
13:23:01.598 -> Discovering Client CSC Feature CHR ... Found it!
13:23:01.910 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
13:23:01.910 -> Wheel rev supported
13:23:01.910 -> Crank rev supported
13:23:01.910 -> Discovering Client CSC Location CHR ... Found it!
13:23:02.223 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
13:23:02.223 -> Discovering Heart Rate Measurement (HR) Service ... Found it! HRMS Max Payload: 20 Data Length: 27
13:23:02.534 -> Discovering HR Measurement characteristic ... Found it!
13:23:02.847 -> Discovering HR Sensor Location characteristic ... Found it!
13:23:03.174 -> -> Client Reads HR Location Sensor: Loc#: 1 Chest
13:23:03.764 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
13:23:03.810 -> Ready to receive Client FTM Control Point Response Messages
13:23:03.810 -> Ready to receive Client FTM Status values
13:23:03.841 -> Ready to receive Client FTM Indoor Bike Data values
13:23:03.841 -> Ready to receive Client CP Measurement values
13:23:03.920 -> Ready to receive Client CSC Measurement values
13:23:03.920 -> Ready to receive Client HR Measurement values
13:23:04.543 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
13:23:04.543 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
13:23:04.543 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:04.543 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:05.538 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
13:23:05.538 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
13:23:05.538 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:05.538 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:05.909 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
13:23:05.941 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
13:23:06.531 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
13:23:06.531 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
13:23:06.531 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:06.531 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:07.542 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
13:23:07.542 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
13:23:07.542 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:07.542 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:07.946 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
13:23:07.992 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
13:23:08.519 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
13:23:08.519 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
13:23:08.519 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:08.519 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:09.626 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
13:23:09.626 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
13:23:09.626 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:09.626 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:10.002 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
13:23:10.220 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 07 01 ]
13:23:10.220 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 04 ]
13:23:10.870 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
13:23:10.870 -> Instant. Speed: 0 KPH Average Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:23:10.870 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:10.870 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:12.099 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]
13:23:12.133 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
13:23:12.133 -> Instant. Speed: 0 KPH Average Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:23:12.133 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:12.133 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:12.133 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:12.133 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 01 28 33 ]
13:23:12.586 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
13:23:12.586 -> Instant. Speed: 0 KPH Average Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:23:12.586 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:12.586 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:13.569 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
13:23:13.569 -> Instant. Speed: 0 KPH Average Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:23:13.569 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:13.569 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:14.126 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 00 28 33 00 ]
13:23:14.298 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:14.298 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 00 28 33 ]
13:23:14.566 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
13:23:14.566 -> Instant. Speed: 0 KPH Average Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:23:14.566 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:14.566 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:15.560 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
13:23:15.560 -> Instant. Speed: 0 KPH Average Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:23:15.560 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:15.560 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:16.248 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
13:23:16.374 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:16.374 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
13:23:16.544 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
13:23:16.544 -> Instant. Speed: 0 KPH Average Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:23:16.544 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:16.544 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:17.542 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
13:23:17.542 -> Instant. Speed: 0 KPH Average Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:23:17.542 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:17.542 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:18.333 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 14 00 28 33 00 ]
13:23:18.425 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:18.425 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 14 00 28 33 ]
13:23:18.580 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
13:23:18.627 -> Instant. Speed: 0 KPH Average Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:23:18.627 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:18.627 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:19.594 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
13:23:19.594 -> Instant. Speed: 0 KPH Average Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:23:19.594 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:19.594 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:20.403 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 00 28 33 00 ]
13:23:20.589 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:20.589 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 00 28 33 ]
13:23:20.589 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
13:23:20.589 -> Instant. Speed: 0 KPH Average Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:23:20.589 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:20.589 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:21.570 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 3C ]
13:23:21.570 -> Instant. Speed: 0 KPH Average Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 60 HBM
13:23:21.570 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 3C ]
13:23:21.570 -> Heart Beats: 60 HBM (8) Contact is NOT detected!
13:23:22.537 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 25 00 28 33 00 ]
13:23:22.675 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 0A 04 38 00 00 00 00 00 02 00 00 14 00 00 00 00 00 3C ]
13:23:22.675 -> Instant. Speed: 10 KPH Average Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 2 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 60 HBM
13:23:22.753 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 3C ]
13:23:22.753 -> Heart Beats: 60 HBM (8) Contact is NOT detected!
13:23:22.753 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:22.753 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 25 00 28 33 ]
13:23:23.574 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 E5 05 9C 00 00 00 00 00 06 00 00 14 00 89 00 09 00 00 ]
13:23:23.574 -> Instant. Speed: 15 KPH Average Speed: 1 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 6 m Resistance Level: 20 Instantaneous Power: 137 Watt Average Power: 9 Watt Heart Rate: 0 HBM
13:23:23.574 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:23.574 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:24.540 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 94 05 DA 00 00 00 00 00 09 00 00 14 00 CA 00 16 00 00 ]
13:23:24.540 -> Instant. Speed: 14 KPH Average Speed: 2 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 9 m Resistance Level: 20 Instantaneous Power: 202 Watt Average Power: 22 Watt Heart Rate: 0 HBM
13:23:24.540 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:24.540 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:24.634 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 23 00 28 33 00 ]
13:23:24.836 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:24.836 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 23 00 28 33 ]
13:23:25.538 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 18 07 3E 01 08 00 00 00 0E 00 00 14 00 7C 00 1C 00 00 ]
13:23:25.538 -> Instant. Speed: 18 KPH Average Speed: 3 KPH Instantaneous Cadence: 4 RPM Average Cadence: 0 RPM Total Distance: 14 m Resistance Level: 20 Instantaneous Power: 124 Watt Average Power: 28 Watt Heart Rate: 0 HBM
13:23:25.538 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:25.538 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:26.521 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 1D 07 96 01 3C 00 04 00 13 00 00 14 00 CF 00 27 00 00 ]
13:23:26.521 -> Instant. Speed: 18 KPH Average Speed: 4 KPH Instantaneous Cadence: 30 RPM Average Cadence: 2 RPM Total Distance: 19 m Resistance Level: 20 Instantaneous Power: 207 Watt Average Power: 39 Watt Heart Rate: 0 HBM
13:23:26.521 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:26.521 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:26.725 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 1C 00 28 33 00 ]
13:23:26.881 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:26.881 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1C 00 28 33 ]
13:23:27.612 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 56 07 E4 01 54 00 08 00 18 00 00 14 00 99 00 2D 00 00 ]
13:23:27.612 -> Instant. Speed: 18 KPH Average Speed: 4 KPH Instantaneous Cadence: 42 RPM Average Cadence: 4 RPM Total Distance: 24 m Resistance Level: 20 Instantaneous Power: 153 Watt Average Power: 45 Watt Heart Rate: 0 HBM
13:23:27.704 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:27.704 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:28.608 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 C0 07 2A 02 62 00 0D 00 1D 00 00 14 00 99 00 33 00 00 ]
13:23:28.608 -> Instant. Speed: 19 KPH Average Speed: 5 KPH Instantaneous Cadence: 49 RPM Average Cadence: 6 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 153 Watt Average Power: 51 Watt Heart Rate: 0 HBM
13:23:28.608 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:28.608 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:28.843 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 0F 00 28 33 00 ]
13:23:28.953 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:28.953 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 0F 00 28 33 ]
13:23:29.591 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 1F 08 69 02 6C 00 11 00 22 00 00 14 00 93 00 38 00 00 ]
13:23:29.591 -> Instant. Speed: 20 KPH Average Speed: 6 KPH Instantaneous Cadence: 54 RPM Average Cadence: 8 RPM Total Distance: 34 m Resistance Level: 20 Instantaneous Power: 147 Watt Average Power: 56 Watt Heart Rate: 0 HBM
13:23:29.591 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:29.591 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:30.568 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 67 08 A2 02 72 00 16 00 27 00 00 14 00 8B 00 3C 00 00 ]
13:23:30.568 -> Instant. Speed: 21 KPH Average Speed: 6 KPH Instantaneous Cadence: 57 RPM Average Cadence: 11 RPM Total Distance: 39 m Resistance Level: 20 Instantaneous Power: 139 Watt Average Power: 60 Watt Heart Rate: 0 HBM
13:23:30.568 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:30.568 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:30.942 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
13:23:31.020 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:31.020 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
13:23:31.579 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 CF 08 E6 02 78 00 1A 00 2D 00 00 14 00 78 00 3E 00 00 ]
13:23:31.579 -> Instant. Speed: 22 KPH Average Speed: 7 KPH Instantaneous Cadence: 60 RPM Average Cadence: 13 RPM Total Distance: 45 m Resistance Level: 20 Instantaneous Power: 120 Watt Average Power: 62 Watt Heart Rate: 0 HBM
13:23:31.579 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:31.579 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:32.546 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 FF 08 25 03 7C 00 1F 00 33 00 00 14 00 6C 00 40 00 00 ]
13:23:32.546 -> Instant. Speed: 23 KPH Average Speed: 8 KPH Instantaneous Cadence: 62 RPM Average Cadence: 15 RPM Total Distance: 51 m Resistance Level: 20 Instantaneous Power: 108 Watt Average Power: 64 Watt Heart Rate: 0 HBM
13:23:32.546 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:32.546 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:33.044 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 F5 FF 28 33 00 ]
13:23:33.201 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:33.201 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 F5 FF 28 33 ]
13:23:33.559 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 54 09 5E 03 80 00 23 00 39 00 00 14 00 63 00 42 00 00 ]
13:23:33.559 -> Instant. Speed: 23 KPH Average Speed: 8 KPH Instantaneous Cadence: 64 RPM Average Cadence: 17 RPM Total Distance: 57 m Resistance Level: 20 Instantaneous Power: 99 Watt Average Power: 66 Watt Heart Rate: 0 HBM
13:23:33.559 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:33.559 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:34.551 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 42 09 92 03 82 00 26 00 3F 00 00 14 00 6C 00 43 00 00 ]
13:23:34.551 -> Instant. Speed: 23 KPH Average Speed: 9 KPH Instantaneous Cadence: 65 RPM Average Cadence: 19 RPM Total Distance: 63 m Resistance Level: 20 Instantaneous Power: 108 Watt Average Power: 67 Watt Heart Rate: 0 HBM
13:23:34.551 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:34.551 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:35.143 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 E4 FF 28 33 00 ]
13:23:35.268 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:35.268 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 E4 FF 28 33 ]
13:23:35.533 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 45 09 C3 03 86 00 2A 00 45 00 00 14 00 68 00 45 00 00 ]
13:23:35.533 -> Instant. Speed: 23 KPH Average Speed: 9 KPH Instantaneous Cadence: 67 RPM Average Cadence: 21 RPM Total Distance: 69 m Resistance Level: 20 Instantaneous Power: 104 Watt Average Power: 69 Watt Heart Rate: 0 HBM
13:23:35.533 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:35.533 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:36.604 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 8F 09 F0 03 8A 00 2E 00 4B 00 00 14 00 58 00 45 00 48 ]
13:23:36.604 -> Instant. Speed: 24 KPH Average Speed: 10 KPH Instantaneous Cadence: 69 RPM Average Cadence: 23 RPM Total Distance: 75 m Resistance Level: 20 Instantaneous Power: 88 Watt Average Power: 69 Watt Heart Rate: 72 HBM
13:23:36.604 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 48 ]
13:23:36.604 -> Heart Beats: 72 HBM (8) Contact is NOT detected!
13:23:37.243 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 CF FF 28 33 00 ]
13:23:37.336 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:37.336 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 CF FF 28 33 ]
13:23:37.678 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 AB 09 1A 04 8C 00 31 00 51 00 00 14 00 69 00 47 00 48 ]
13:23:37.678 -> Instant. Speed: 24 KPH Average Speed: 10 KPH Instantaneous Cadence: 70 RPM Average Cadence: 24 RPM Total Distance: 81 m Resistance Level: 20 Instantaneous Power: 105 Watt Average Power: 71 Watt Heart Rate: 72 HBM
13:23:37.678 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 48 ]
13:23:37.678 -> Heart Beats: 72 HBM (8) Contact is NOT detected!
13:23:38.596 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 9D 09 41 04 8E 00 34 00 57 00 00 14 00 5B 00 47 00 00 ]
13:23:38.596 -> Instant. Speed: 24 KPH Average Speed: 10 KPH Instantaneous Cadence: 71 RPM Average Cadence: 26 RPM Total Distance: 87 m Resistance Level: 20 Instantaneous Power: 91 Watt Average Power: 71 Watt Heart Rate: 0 HBM
13:23:38.596 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:38.596 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:39.343 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A8 FF 28 33 00 ]
13:23:39.499 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:39.499 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A8 FF 28 33 ]
13:23:39.671 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 EE 09 71 04 8E 00 37 00 5E 00 00 14 00 57 00 48 00 00 ]
13:23:39.671 -> Instant. Speed: 25 KPH Average Speed: 11 KPH Instantaneous Cadence: 71 RPM Average Cadence: 27 RPM Total Distance: 94 m Resistance Level: 20 Instantaneous Power: 87 Watt Average Power: 72 Watt Heart Rate: 0 HBM
13:23:39.671 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:39.671 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:40.574 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 F6 09 9E 04 8E 00 3A 00 65 00 00 14 00 52 00 48 00 00 ]
13:23:40.574 -> Instant. Speed: 25 KPH Average Speed: 11 KPH Instantaneous Cadence: 71 RPM Average Cadence: 29 RPM Total Distance: 101 m Resistance Level: 20 Instantaneous Power: 82 Watt Average Power: 72 Watt Heart Rate: 0 HBM
13:23:40.574 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:40.574 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:41.430 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 84 FF 28 33 00 ]
13:23:41.570 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:41.570 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 84 FF 28 33 ]
13:23:41.570 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 1A 0A C9 04 90 00 3D 00 6C 00 00 14 00 59 00 49 00 00 ]
13:23:41.570 -> Instant. Speed: 25 KPH Average Speed: 12 KPH Instantaneous Cadence: 72 RPM Average Cadence: 30 RPM Total Distance: 108 m Resistance Level: 20 Instantaneous Power: 89 Watt Average Power: 73 Watt Heart Rate: 0 HBM
13:23:41.570 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:41.570 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:42.551 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 FD 09 F1 04 92 00 3F 00 73 00 00 14 00 40 00 48 00 00 ]
13:23:42.551 -> Instant. Speed: 25 KPH Average Speed: 12 KPH Instantaneous Cadence: 73 RPM Average Cadence: 31 RPM Total Distance: 115 m Resistance Level: 20 Instantaneous Power: 64 Watt Average Power: 72 Watt Heart Rate: 0 HBM
13:23:42.551 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:42.551 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:43.533 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 FF 28 33 00 ]
13:23:43.533 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 5F 0A 16 05 92 00 42 00 7A 00 00 14 00 3D 00 48 00 00 ]
13:23:43.533 -> Instant. Speed: 26 KPH Average Speed: 13 KPH Instantaneous Cadence: 73 RPM Average Cadence: 33 RPM Total Distance: 122 m Resistance Level: 20 Instantaneous Power: 61 Watt Average Power: 72 Watt Heart Rate: 0 HBM
13:23:43.533 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:43.533 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:43.533 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:43.533 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 FF 28 33 ]
13:23:44.541 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 6C 0A 3A 05 94 00 44 00 81 00 00 14 00 47 00 48 00 00 ]
13:23:44.541 -> Instant. Speed: 26 KPH Average Speed: 13 KPH Instantaneous Cadence: 74 RPM Average Cadence: 34 RPM Total Distance: 129 m Resistance Level: 20 Instantaneous Power: 71 Watt Average Power: 72 Watt Heart Rate: 0 HBM
13:23:44.541 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:44.541 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:45.552 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5D FF 28 33 00 ]
13:23:45.584 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 82 0A 5B 05 98 00 46 00 88 00 00 14 00 3A 00 48 00 00 ]
13:23:45.584 -> Instant. Speed: 26 KPH Average Speed: 13 KPH Instantaneous Cadence: 76 RPM Average Cadence: 35 RPM Total Distance: 136 m Resistance Level: 20 Instantaneous Power: 58 Watt Average Power: 72 Watt Heart Rate: 0 HBM
13:23:45.584 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:45.584 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:45.584 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:45.584 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5D FF 28 33 ]
13:23:46.595 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 78 0A 7B 05 9A 00 49 00 8F 00 00 14 00 34 00 47 00 00 ]
13:23:46.595 -> Instant. Speed: 26 KPH Average Speed: 14 KPH Instantaneous Cadence: 77 RPM Average Cadence: 36 RPM Total Distance: 143 m Resistance Level: 20 Instantaneous Power: 52 Watt Average Power: 71 Watt Heart Rate: 0 HBM
13:23:46.595 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:46.595 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:47.576 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 AE 0A 98 05 9A 00 4B 00 96 00 00 14 00 2C 00 46 00 00 ]
13:23:47.576 -> Instant. Speed: 27 KPH Average Speed: 14 KPH Instantaneous Cadence: 77 RPM Average Cadence: 37 RPM Total Distance: 150 m Resistance Level: 20 Instantaneous Power: 44 Watt Average Power: 70 Watt Heart Rate: 0 HBM
13:23:47.576 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:47.576 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:47.623 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5E FF 28 33 00 ]
13:23:47.873 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:47.873 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5E FF 28 33 ]
13:23:48.573 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 BE 0A B5 05 9C 00 4D 00 9D 00 00 14 00 2F 00 46 00 00 ]
13:23:48.573 -> Instant. Speed: 27 KPH Average Speed: 14 KPH Instantaneous Cadence: 78 RPM Average Cadence: 38 RPM Total Distance: 157 m Resistance Level: 20 Instantaneous Power: 47 Watt Average Power: 70 Watt Heart Rate: 0 HBM
13:23:48.573 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:48.573 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:49.580 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 EA 0A D0 05 9E 00 4F 00 A4 00 00 14 00 37 00 45 00 00 ]
13:23:49.580 -> Instant. Speed: 27 KPH Average Speed: 14 KPH Instantaneous Cadence: 79 RPM Average Cadence: 39 RPM Total Distance: 164 m Resistance Level: 20 Instantaneous Power: 55 Watt Average Power: 69 Watt Heart Rate: 0 HBM
13:23:49.580 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:49.580 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:49.706 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 6F FF 28 33 00 ]
13:23:49.848 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:49.848 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 6F FF 28 33 ]
13:23:50.548 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 40 0B EA 05 A0 00 51 00 AB 00 00 14 00 45 00 45 00 56 ]
13:23:50.548 -> Instant. Speed: 28 KPH Average Speed: 15 KPH Instantaneous Cadence: 80 RPM Average Cadence: 40 RPM Total Distance: 171 m Resistance Level: 20 Instantaneous Power: 69 Watt Average Power: 69 Watt Heart Rate: 86 HBM
13:23:50.548 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 56 ]
13:23:50.548 -> Heart Beats: 86 HBM (8) Contact is NOT detected!
13:23:51.650 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 0F 0B 02 06 A2 00 53 00 B2 00 00 14 00 38 00 45 00 56 ]
13:23:51.650 -> Instant. Speed: 28 KPH Average Speed: 15 KPH Instantaneous Cadence: 81 RPM Average Cadence: 41 RPM Total Distance: 178 m Resistance Level: 20 Instantaneous Power: 56 Watt Average Power: 69 Watt Heart Rate: 86 HBM
13:23:51.821 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 8A FF 28 33 00 ]
13:23:51.899 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 56 ]
13:23:51.899 -> Heart Beats: 86 HBM (8) Contact is NOT detected!
13:23:51.899 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:51.899 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8A FF 28 33 ]
13:23:52.555 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 FF 0A 19 06 A4 00 55 00 B9 00 00 14 00 37 00 45 00 00 ]
13:23:52.555 -> Instant. Speed: 28 KPH Average Speed: 15 KPH Instantaneous Cadence: 82 RPM Average Cadence: 42 RPM Total Distance: 185 m Resistance Level: 20 Instantaneous Power: 55 Watt Average Power: 69 Watt Heart Rate: 0 HBM
13:23:52.555 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:52.555 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:53.516 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 4A 0B 30 06 A2 00 56 00 C0 00 00 14 00 49 00 45 00 00 ]
13:23:53.516 -> Instant. Speed: 28 KPH Average Speed: 15 KPH Instantaneous Cadence: 81 RPM Average Cadence: 43 RPM Total Distance: 192 m Resistance Level: 20 Instantaneous Power: 73 Watt Average Power: 69 Watt Heart Rate: 0 HBM
13:23:53.516 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:53.516 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:53.921 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 B8 FF 28 33 00 ]
13:23:54.078 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:54.078 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 B8 FF 28 33 ]
13:23:54.622 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 0B 45 06 A4 00 58 00 C7 00 00 14 00 3A 00 45 00 00 ]
13:23:54.623 -> Instant. Speed: 28 KPH Average Speed: 16 KPH Instantaneous Cadence: 82 RPM Average Cadence: 44 RPM Total Distance: 199 m Resistance Level: 20 Instantaneous Power: 58 Watt Average Power: 69 Watt Heart Rate: 0 HBM
13:23:54.623 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:54.623 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:55.604 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 D6 0A 59 06 A6 00 5A 00 CE 00 00 14 00 33 00 44 00 00 ]
13:23:55.604 -> Instant. Speed: 27 KPH Average Speed: 16 KPH Instantaneous Cadence: 83 RPM Average Cadence: 45 RPM Total Distance: 206 m Resistance Level: 20 Instantaneous Power: 51 Watt Average Power: 68 Watt Heart Rate: 0 HBM
13:23:55.604 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:55.604 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:56.021 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
13:23:56.146 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:56.146 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
13:23:56.580 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 D3 0A 6D 06 A0 00 5B 00 D5 00 00 14 00 2C 00 44 00 00 ]
13:23:56.580 -> Instant. Speed: 27 KPH Average Speed: 16 KPH Instantaneous Cadence: 80 RPM Average Cadence: 45 RPM Total Distance: 213 m Resistance Level: 20 Instantaneous Power: 44 Watt Average Power: 68 Watt Heart Rate: 0 HBM
13:23:56.580 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:56.580 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:57.593 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 C5 0A 7F 06 A4 00 5D 00 DC 00 00 14 00 30 00 43 00 00 ]
13:23:57.593 -> Instant. Speed: 27 KPH Average Speed: 16 KPH Instantaneous Cadence: 82 RPM Average Cadence: 46 RPM Total Distance: 220 m Resistance Level: 20 Instantaneous Power: 48 Watt Average Power: 67 Watt Heart Rate: 0 HBM
13:23:57.593 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:57.593 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:58.108 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A2 00 28 33 00 ]
13:23:58.201 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:23:58.201 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A2 00 28 33 ]
13:23:58.574 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 73 0A 91 06 A0 00 5E 00 E3 00 00 14 00 3B 00 43 00 00 ]
13:23:58.574 -> Instant. Speed: 26 KPH Average Speed: 16 KPH Instantaneous Cadence: 80 RPM Average Cadence: 47 RPM Total Distance: 227 m Resistance Level: 20 Instantaneous Power: 59 Watt Average Power: 67 Watt Heart Rate: 0 HBM
13:23:58.574 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:58.574 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:23:59.649 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 5A 0A A2 06 9C 00 5F 00 EA 00 00 14 00 3E 00 43 00 00 ]
13:23:59.649 -> Instant. Speed: 26 KPH Average Speed: 16 KPH Instantaneous Cadence: 78 RPM Average Cadence: 47 RPM Total Distance: 234 m Resistance Level: 20 Instantaneous Power: 62 Watt Average Power: 67 Watt Heart Rate: 0 HBM
13:23:59.649 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:23:59.649 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:00.225 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 01 28 33 00 ]
13:24:00.474 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:00.474 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 01 28 33 ]
13:24:00.552 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 FF 09 B3 06 9A 00 60 00 F1 00 00 14 00 57 00 43 00 00 ]
13:24:00.552 -> Instant. Speed: 25 KPH Average Speed: 17 KPH Instantaneous Cadence: 77 RPM Average Cadence: 48 RPM Total Distance: 241 m Resistance Level: 20 Instantaneous Power: 87 Watt Average Power: 67 Watt Heart Rate: 0 HBM
13:24:00.552 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:00.552 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:01.641 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 0A C3 06 96 00 61 00 F8 00 00 14 00 82 00 44 00 00 ]
13:24:01.641 -> Instant. Speed: 25 KPH Average Speed: 17 KPH Instantaneous Cadence: 75 RPM Average Cadence: 48 RPM Total Distance: 248 m Resistance Level: 20 Instantaneous Power: 130 Watt Average Power: 68 Watt Heart Rate: 0 HBM
13:24:01.641 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:01.641 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:02.312 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 4F 01 28 33 00 ]
13:24:02.452 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:02.452 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 4F 01 28 33 ]
13:24:02.545 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 52 09 CB 06 94 00 62 00 FE 00 00 14 00 83 00 46 00 00 ]
13:24:02.545 -> Instant. Speed: 23 KPH Average Speed: 17 KPH Instantaneous Cadence: 74 RPM Average Cadence: 49 RPM Total Distance: 254 m Resistance Level: 20 Instantaneous Power: 131 Watt Average Power: 70 Watt Heart Rate: 0 HBM
13:24:02.545 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:02.545 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:03.713 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 D3 08 D3 06 90 00 63 00 04 01 00 14 00 91 00 47 00 00 ]
13:24:03.713 -> Instant. Speed: 22 KPH Average Speed: 17 KPH Instantaneous Cadence: 72 RPM Average Cadence: 49 RPM Total Distance: 260 m Resistance Level: 20 Instantaneous Power: 145 Watt Average Power: 71 Watt Heart Rate: 0 HBM
13:24:03.713 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:03.713 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:04.396 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 01 28 33 00 ]
13:24:04.522 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:04.522 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 01 28 33 ]
13:24:04.614 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 EF 08 DB 06 8A 00 64 00 0A 01 00 14 00 7F 00 48 00 00 ]
13:24:04.614 -> Instant. Speed: 22 KPH Average Speed: 17 KPH Instantaneous Cadence: 69 RPM Average Cadence: 50 RPM Total Distance: 266 m Resistance Level: 20 Instantaneous Power: 127 Watt Average Power: 72 Watt Heart Rate: 0 HBM
13:24:04.614 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:04.614 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:05.593 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 A8 08 E3 06 86 00 65 00 10 01 00 14 00 93 00 49 00 00 ]
13:24:05.593 -> Instant. Speed: 22 KPH Average Speed: 17 KPH Instantaneous Cadence: 67 RPM Average Cadence: 50 RPM Total Distance: 272 m Resistance Level: 20 Instantaneous Power: 147 Watt Average Power: 73 Watt Heart Rate: 0 HBM
13:24:05.593 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:05.593 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:06.512 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 57 FF 28 33 00 ]
13:24:06.590 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 81 08 E4 06 82 00 65 00 15 01 00 14 00 96 00 4B 00 00 ]
13:24:06.590 -> Instant. Speed: 21 KPH Average Speed: 17 KPH Instantaneous Cadence: 65 RPM Average Cadence: 50 RPM Total Distance: 277 m Resistance Level: 20 Instantaneous Power: 150 Watt Average Power: 75 Watt Heart Rate: 0 HBM
13:24:06.590 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:06.590 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:06.590 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:06.590 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 57 FF 28 33 ]
13:24:07.577 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 D7 08 EB 06 7E 00 65 00 1B 01 00 14 00 99 00 4C 00 00 ]
13:24:07.577 -> Instant. Speed: 22 KPH Average Speed: 17 KPH Instantaneous Cadence: 63 RPM Average Cadence: 50 RPM Total Distance: 283 m Resistance Level: 20 Instantaneous Power: 153 Watt Average Power: 76 Watt Heart Rate: 0 HBM
13:24:07.577 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:07.577 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:08.573 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 3B 09 F2 06 7C 00 66 00 21 01 00 14 00 99 00 4D 00 00 ]
13:24:08.573 -> Instant. Speed: 23 KPH Average Speed: 17 KPH Instantaneous Cadence: 62 RPM Average Cadence: 51 RPM Total Distance: 289 m Resistance Level: 20 Instantaneous Power: 153 Watt Average Power: 77 Watt Heart Rate: 0 HBM
13:24:08.573 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:08.573 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:08.573 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 08 00 00 00 00 00 00 00 ]
13:24:08.839 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 08 03 ]
13:24:09.540 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 63 09 F8 06 7E 00 66 00 27 01 00 14 00 78 00 4E 00 00 ]
13:24:09.540 -> Instant. Speed: 24 KPH Average Speed: 17 KPH Instantaneous Cadence: 63 RPM Average Cadence: 51 RPM Total Distance: 295 m Resistance Level: 20 Instantaneous Power: 120 Watt Average Power: 78 Watt Heart Rate: 0 HBM
13:24:09.540 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:09.540 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:10.688 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 01 00 00 00 00 00 00 00 ]
13:24:10.725 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 ED 09 05 07 84 00 67 00 2E 01 00 14 00 5A 00 4E 00 00 ]
13:24:10.725 -> Instant. Speed: 25 KPH Average Speed: 17 KPH Instantaneous Cadence: 66 RPM Average Cadence: 51 RPM Total Distance: 302 m Resistance Level: 20 Instantaneous Power: 90 Watt Average Power: 78 Watt Heart Rate: 0 HBM
13:24:10.725 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:10.725 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:10.725 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 01 01 ]
13:24:10.725 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 01 ]
13:24:11.535 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 E0 09 8A 00 14 00 3B 00 00 ]
13:24:11.535 -> Instant. Speed: 25 KPH Instantaneous Cadence: 69 RPM Resistance Level: 20 Instantaneous Power: 59 Watt Heart Rate: 0 HBM
13:24:11.535 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:11.535 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:12.621 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 09 0A 90 00 14 00 46 00 00 ]
13:24:12.621 -> Instant. Speed: 25 KPH Instantaneous Cadence: 72 RPM Resistance Level: 20 Instantaneous Power: 70 Watt Heart Rate: 0 HBM
13:24:12.621 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:12.621 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:12.716 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
13:24:12.874 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
13:24:13.601 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 DD 09 90 00 14 00 46 00 00 ]
13:24:13.601 -> Instant. Speed: 25 KPH Instantaneous Cadence: 72 RPM Resistance Level: 20 Instantaneous Power: 70 Watt Heart Rate: 0 HBM
13:24:13.601 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:13.601 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:14.580 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 E9 08 8C 00 14 00 1A 00 00 ]
13:24:14.580 -> Instant. Speed: 22 KPH Instantaneous Cadence: 70 RPM Resistance Level: 20 Instantaneous Power: 26 Watt Heart Rate: 0 HBM
13:24:14.580 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:14.580 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:14.829 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
13:24:14.953 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
13:24:15.591 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 47 08 00 00 14 00 00 00 51 ]
13:24:15.591 -> Instant. Speed: 21 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 81 HBM
13:24:15.591 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 51 ]
13:24:15.591 -> Heart Beats: 81 HBM (8) Contact is NOT detected!
13:24:16.555 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 AB 07 00 00 14 00 00 00 00 ]
13:24:16.555 -> Instant. Speed: 19 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
13:24:16.555 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:16.555 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:16.931 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
13:24:17.023 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 07 01 ]
13:24:17.023 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 04 ]
13:24:17.569 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 13 07 AC 05 00 00 00 00 04 00 00 14 00 00 00 00 00 00 ]
13:24:17.569 -> Instant. Speed: 18 KPH Average Speed: 14 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 4 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:17.569 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:17.569 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:18.519 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 81 06 AC 05 00 00 00 00 08 00 00 14 00 00 00 00 00 00 ]
13:24:18.519 -> Instant. Speed: 16 KPH Average Speed: 14 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 8 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:18.566 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:18.566 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:19.029 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]
13:24:19.185 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:19.185 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 01 28 33 ]
13:24:19.792 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 F1 05 AC 05 00 00 00 00 0C 00 00 14 00 00 00 00 00 00 ]
13:24:19.792 -> Instant. Speed: 15 KPH Average Speed: 14 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 12 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:19.792 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:19.792 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:20.541 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 67 05 51 05 00 00 00 00 0F 00 00 14 00 00 00 00 00 00 ]
13:24:20.541 -> Instant. Speed: 13 KPH Average Speed: 13 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 15 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:20.541 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:20.541 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:21.130 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 00 28 33 00 ]
13:24:21.534 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:21.534 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 00 28 33 ]
13:24:21.611 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 DF 04 1A 05 00 00 00 00 12 00 00 14 00 00 00 00 00 00 ]
13:24:21.611 -> Instant. Speed: 12 KPH Average Speed: 13 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 18 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:21.611 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:21.611 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:22.590 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 5E 04 F6 04 00 00 00 00 15 00 00 14 00 00 00 00 00 00 ]
13:24:22.590 -> Instant. Speed: 11 KPH Average Speed: 12 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 21 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:22.590 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:22.590 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:23.230 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
13:24:23.323 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:23.323 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
13:24:23.601 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 E0 03 A8 04 00 00 00 00 17 00 00 14 00 00 00 00 00 00 ]
13:24:23.601 -> Instant. Speed: 9 KPH Average Speed: 11 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 23 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:23.601 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:23.601 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:24.568 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 67 03 6E 04 00 00 00 00 19 00 00 14 00 00 00 00 00 00 ]
13:24:24.568 -> Instant. Speed: 8 KPH Average Speed: 11 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 25 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:24.568 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:24.568 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:25.328 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 14 00 28 33 00 ]
13:24:25.578 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:25.578 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 14 00 28 33 ]
13:24:25.578 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 F2 02 41 04 00 00 00 00 1B 00 00 14 00 00 00 00 00 00 ]
13:24:25.578 -> Instant. Speed: 7 KPH Average Speed: 10 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 27 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:25.578 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:25.578 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:26.544 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 83 02 F8 03 00 00 00 00 1C 00 00 14 00 00 00 00 00 00 ]
13:24:26.544 -> Instant. Speed: 6 KPH Average Speed: 10 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 28 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:26.544 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:26.544 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:27.395 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 00 28 33 00 ]
13:24:27.521 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:27.564 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 22 00 28 33 ]
13:24:27.564 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 19 02 BD 03 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:27.564 -> Instant. Speed: 5 KPH Average Speed: 9 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:27.564 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:27.564 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:28.531 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 6D 03 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:28.531 -> Instant. Speed: 0 KPH Average Speed: 8 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:28.531 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:28.531 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:29.530 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 25 00 28 33 00 ]
13:24:29.530 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 2A 03 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:29.530 -> Instant. Speed: 0 KPH Average Speed: 8 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:29.530 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:29.530 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:29.530 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:29.530 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 25 00 28 33 ]
13:24:30.704 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 F0 02 00 00 00 00 1D 00 00 14 00 00 00 00 00 5B ]
13:24:30.704 -> Instant. Speed: 0 KPH Average Speed: 7 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 91 HBM
13:24:30.704 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 5B ]
13:24:30.704 -> Heart Beats: 91 HBM (8) Contact is NOT detected!
13:24:31.543 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 23 00 28 33 00 ]
13:24:31.777 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 BE 02 00 00 00 00 1D 00 00 14 00 00 00 00 00 5B ]
13:24:31.777 -> Instant. Speed: 0 KPH Average Speed: 7 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 91 HBM
13:24:31.777 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 5B ]
13:24:31.777 -> Heart Beats: 91 HBM (8) Contact is NOT detected!
13:24:31.777 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:31.777 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 23 00 28 33 ]
13:24:32.600 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 92 02 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:32.600 -> Instant. Speed: 0 KPH Average Speed: 6 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:32.600 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:32.600 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:33.584 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 6B 02 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:33.584 -> Instant. Speed: 0 KPH Average Speed: 6 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:33.584 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:33.584 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:33.630 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 1C 00 28 33 00 ]
13:24:33.862 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:33.862 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 1C 00 28 33 ]
13:24:34.580 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 49 02 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:34.580 -> Instant. Speed: 0 KPH Average Speed: 5 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:34.580 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:34.580 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:35.574 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 2A 02 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:35.574 -> Instant. Speed: 0 KPH Average Speed: 5 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:35.574 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:35.574 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:35.746 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 0F 00 28 33 00 ]
13:24:35.917 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:35.917 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 0F 00 28 33 ]
13:24:36.552 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 0E 02 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:36.552 -> Instant. Speed: 0 KPH Average Speed: 5 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:36.552 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:36.552 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:37.550 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 F5 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 58 ]
13:24:37.550 -> Instant. Speed: 0 KPH Average Speed: 5 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 88 HBM
13:24:37.550 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 58 ]
13:24:37.550 -> Heart Beats: 88 HBM (8) Contact is NOT detected!
13:24:37.833 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
13:24:38.001 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:38.001 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
13:24:38.532 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 DE 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:38.532 -> Instant. Speed: 0 KPH Average Speed: 4 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:38.532 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:38.532 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:39.613 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 CA 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:39.613 -> Instant. Speed: 0 KPH Average Speed: 4 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:39.613 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:39.613 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:39.926 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 F5 FF 28 33 00 ]
13:24:40.050 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:40.050 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 F5 FF 28 33 ]
13:24:40.611 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 B7 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:40.611 -> Instant. Speed: 0 KPH Average Speed: 4 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:40.611 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:40.611 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:41.564 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 A5 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:41.564 -> Instant. Speed: 0 KPH Average Speed: 4 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:41.564 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:41.564 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:42.052 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 E4 FF 28 33 00 ]
13:24:42.317 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:42.317 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 E4 FF 28 33 ]
13:24:42.580 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 95 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:42.580 -> Instant. Speed: 0 KPH Average Speed: 4 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:42.580 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:42.580 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:43.556 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 86 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:43.556 -> Instant. Speed: 0 KPH Average Speed: 3 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:43.556 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:43.556 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:44.149 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 CF FF 28 33 00 ]
13:24:44.275 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:44.275 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 CF FF 28 33 ]
13:24:44.568 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 78 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:44.568 -> Instant. Speed: 0 KPH Average Speed: 3 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:44.568 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:44.568 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:45.537 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 6B 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:45.537 -> Instant. Speed: 0 KPH Average Speed: 3 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:45.537 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:45.537 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:46.241 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A8 FF 28 33 00 ]
13:24:46.365 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:46.365 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A8 FF 28 33 ]
13:24:46.630 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 5F 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:46.631 -> Instant. Speed: 0 KPH Average Speed: 3 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:46.631 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:46.631 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:47.515 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 53 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:47.515 -> Instant. Speed: 0 KPH Average Speed: 3 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:47.515 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:47.515 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:48.381 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 84 FF 28 33 00 ]
13:24:48.512 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:48.623 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 84 FF 28 33 ]
13:24:48.623 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 49 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:48.623 -> Instant. Speed: 0 KPH Average Speed: 3 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:48.623 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:48.623 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:49.585 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 3F 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:49.585 -> Instant. Speed: 0 KPH Average Speed: 3 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:49.585 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:49.585 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:50.447 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 FF 28 33 00 ]
13:24:50.603 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:50.603 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 FF 28 33 ]
13:24:50.603 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 36 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:50.603 -> Instant. Speed: 0 KPH Average Speed: 3 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:50.603 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:50.603 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:51.566 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 2D 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 4E ]
13:24:51.566 -> Instant. Speed: 0 KPH Average Speed: 3 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 78 HBM
13:24:51.566 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 4E ]
13:24:51.566 -> Heart Beats: 78 HBM (8) Contact is NOT detected!
13:24:52.549 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5D FF 28 33 00 ]
13:24:52.672 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 24 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 4E ]
13:24:52.672 -> Instant. Speed: 0 KPH Average Speed: 2 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 78 HBM
13:24:52.672 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 4E ]
13:24:52.672 -> Heart Beats: 78 HBM (8) Contact is NOT detected!
13:24:52.672 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:52.672 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5D FF 28 33 ]
13:24:53.573 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 1C 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:53.573 -> Instant. Speed: 0 KPH Average Speed: 2 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:53.573 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:53.573 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:54.542 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 15 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:54.542 -> Instant. Speed: 0 KPH Average Speed: 2 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:54.542 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:54.542 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:54.636 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 5E FF 28 33 00 ]
13:24:54.822 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:54.822 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 5E FF 28 33 ]
13:24:55.552 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 0E 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:55.552 -> Instant. Speed: 0 KPH Average Speed: 2 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:55.552 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:55.552 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:56.500 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 07 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:56.545 -> Instant. Speed: 0 KPH Average Speed: 2 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:56.545 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:56.545 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:56.733 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 6F FF 28 33 00 ]
13:24:56.904 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:56.904 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 6F FF 28 33 ]
13:24:57.693 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 01 01 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:57.693 -> Instant. Speed: 0 KPH Average Speed: 2 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:57.693 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:57.693 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:58.597 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 FB 00 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:58.597 -> Instant. Speed: 0 KPH Average Speed: 2 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:58.597 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:58.597 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:24:58.829 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 8A FF 28 33 00 ]
13:24:58.954 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:24:58.954 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 8A FF 28 33 ]
13:24:59.592 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 F5 00 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:24:59.592 -> Instant. Speed: 0 KPH Average Speed: 2 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:24:59.592 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:24:59.592 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:25:00.591 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 EF 00 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:25:00.591 -> Instant. Speed: 0 KPH Average Speed: 2 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:25:00.591 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:25:00.591 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:25:00.946 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 B8 FF 28 33 00 ]
13:25:01.307 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:25:01.307 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 B8 FF 28 33 ]
13:25:01.571 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 EA 00 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:25:01.571 -> Instant. Speed: 0 KPH Average Speed: 2 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:25:01.571 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:25:01.571 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:25:02.649 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 E5 00 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:25:02.649 -> Instant. Speed: 0 KPH Average Speed: 2 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:25:02.649 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:25:02.649 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:25:03.056 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]
13:25:03.261 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:25:03.261 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 00 00 28 33 ]
13:25:03.539 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 E0 00 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:25:03.539 -> Instant. Speed: 0 KPH Average Speed: 2 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:25:03.539 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:25:03.539 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:25:04.549 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 DB 00 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:25:04.549 -> Instant. Speed: 0 KPH Average Speed: 2 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:25:04.549 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:25:04.549 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:25:05.155 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 A2 00 28 33 00 ]
13:25:05.357 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:25:05.357 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 A2 00 28 33 ]
13:25:05.529 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 D7 00 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:25:05.529 -> Instant. Speed: 0 KPH Average Speed: 2 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:25:05.529 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:25:05.529 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:25:06.601 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 D2 00 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:25:06.601 -> Instant. Speed: 0 KPH Average Speed: 2 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:25:06.601 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:25:06.601 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:25:07.242 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 01 28 33 00 ]
13:25:07.429 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:25:07.429 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 09 01 28 33 ]
13:25:07.615 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 CE 00 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:25:07.615 -> Instant. Speed: 0 KPH Average Speed: 2 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:25:07.615 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:25:07.615 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:25:08.596 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 CA 00 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:25:08.596 -> Instant. Speed: 0 KPH Average Speed: 2 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:25:08.596 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:25:08.596 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:25:09.313 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 4F 01 28 33 00 ]
13:25:09.497 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:25:09.497 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 4F 01 28 33 ]
13:25:09.591 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 C7 00 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:25:09.591 -> Instant. Speed: 0 KPH Average Speed: 1 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:25:09.591 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:25:09.591 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:25:10.569 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 C3 00 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:25:10.569 -> Instant. Speed: 0 KPH Average Speed: 1 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:25:10.569 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:25:10.569 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:25:11.458 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 67 01 28 33 00 ]
13:25:11.551 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:25:11.551 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 67 01 28 33 ]
13:25:11.551 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 BF 00 00 00 00 00 1D 00 00 14 00 00 00 00 00 46 ]
13:25:11.551 -> Instant. Speed: 0 KPH Average Speed: 1 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 70 HBM
13:25:11.551 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 46 ]
13:25:11.551 -> Heart Beats: 70 HBM (8) Contact is NOT detected!
13:25:12.565 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 BC 00 00 00 00 00 1D 00 00 14 00 00 00 00 00 46 ]
13:25:12.565 -> Instant. Speed: 0 KPH Average Speed: 1 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 70 HBM
13:25:12.565 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 46 ]
13:25:12.565 -> Heart Beats: 70 HBM (8) Contact is NOT detected!
13:25:13.514 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 B9 00 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:25:13.514 -> Instant. Speed: 0 KPH Average Speed: 1 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:25:13.514 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:25:13.514 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:25:13.514 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 57 FF 28 33 00 ]
13:25:13.732 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 11 01 ]
13:25:13.732 -> -> Client Rec'd Raw FTM Machine Status Data: [7] [ 12 00 00 57 FF 28 33 ]
13:25:14.541 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 B5 00 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:25:14.541 -> Instant. Speed: 0 KPH Average Speed: 1 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:25:14.541 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:25:14.541 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:25:15.616 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 B2 00 00 00 00 00 1D 00 00 14 00 00 00 00 00 00 ]
13:25:15.616 -> Instant. Speed: 0 KPH Average Speed: 1 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 29 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
13:25:15.616 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:25:15.616 -> Heart Beats: 0 HBM (8) Contact is NOT detected!

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

" Do I see correctly: is the linear sliding system integrated, inside the actuator?"

Yes the actuator is solid and I take advantage of its particular shape so as not to need an additional rail.
20221227_135825

" Are you going to mount the electronics on the lower platform...with a time-of-flight sensor to measure distance? "

Yes I keep your electronic principle but I have great difficulty to operate the DRV8871 because I have the 12V output but it does not reverse the direction +- to -+?!

"Is the relatively fixed construction of the floor able to allocate the rocking motion of your bike (left/right)"

Currently it is fixed with 2 squares but it is not good.
I redesigned a ball joint but my printer has broken down since this morning!!!

"Again, I like what I see!"

**Thank you so much.

I'll drop here the STL and engine model later when it's perfect.**

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

image
image
image
image
image
image
image

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
Wow! That "ball jount" is a clever alternative (!) and will give the construction enough degrees of freedom to move forward and sideways. I am very curious how you will experience it once it is constructed! My Canadian friend (with the Wahoo Kickr) is using your present floor construction design for about a year now and is seeing wearing and notices that it becomes quite noisy...

It looks like the FTMS_Server is doing as expected!
Unfortunately we can't say that of the FTMS_Client tests!
Grrrrrr! Un vrai casse tête!
I have been studying the native codes of the bluefruit libraries to get some clue... but it is (of course) not obvious how to tackle this discover problem with the Zwift Hub....Only the 250ms third test works perfectly, so I am doubting if the delays are working at all!
I will keep you up to date when I have a brilliant brainwave.....
Success with your printer!
Best wishes,
Jörgen.

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
I have uploaded a new FTMS_Client version (03.1).... that has operational/default BLE settings increased....
Poll_delay is default set to zero.... Please try this version first with this setting to see what is happening...
You can set poll_delay in steps of 100 to ultimately 250.... if necessary....(fingers crossed)..
We are for now only interested in how it will pass the connection and discovery process... if you could make a copy/paste of the first part, I would be very happy.... I would be even more happy if it runs without errors...
Thanks in advance!
Best wishes,
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorghen,

All my wishes for this new year 2023.
May it bring you lots of new projects of which you can be proud of the result.

Here are the results of FTMS_Client V031

poll_delay = 0

6:18:42.470 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:18:42.470 -> Timestamp MAC Address Rssi Data
16:18:42.470 -> 000153436 F8:9C:FC:53:5E:49 -65 09-02-16-18-26-18-18-18-0A-18
16:18:42.609 -> --------- SoftDevice Config ---------
16:18:42.609 -> Max UUID128 : 10
16:18:42.609 -> ATTR Table Size : 4096
16:18:42.609 -> Service Changed : 1
16:18:42.609 -> Central Connect Setting
16:18:42.609 -> - Max MTU : 23
16:18:42.609 -> - Event Length : 6
16:18:42.609 -> - HVN Queue Size : 2
16:18:42.609 -> - WrCmd Queue Size: 1
16:18:42.609 ->
16:18:42.609 -> --------- BLE Settings ---------
16:18:42.609 -> Name : Feather nRF52840 Express
16:18:42.609 -> Max Connections : Peripheral = 0, Central = 1
16:18:42.609 -> Address : DD:CF:A6:C0:1A:11 (Static)
16:18:42.609 -> TX Power : 4 dBm
16:18:42.609 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
16:18:42.609 -> Conn Timeout : 2000 ms
16:18:42.609 -> Central Paired Devices:
16:18:42.609 ->
16:18:42.609 ->
16:18:42.609 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:18:42.609 -> Now checking all Client Services and Characteristics!
16:18:42.609 -> If Mandatory Services Fail --> the Client will disconnect!
16:18:42.609 -> Checking Generic Access and Device Information!
16:18:42.717 -> Found Client Generic Access
16:18:42.995 -> -> Client Reads Device Name: [Zwift Hub]
16:18:43.179 -> -> Client Reads Appearance: [0]
16:18:43.179 -> Not Found Client Device Information!
16:18:43.179 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
16:18:43.179 -> Disconnecting since Client FTM Service is mandatory!
16:18:43.271 -> Client Disconnected, reason = 0x16
16:18:43.271 -> >>> Restart the Feather nRF52 Client for a new run! <<<
16:18:45.489 -> Stopped!

poll_delay = 50

16:21:33.378 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
16:21:33.378 -> ------------------- Version 03.1 --------------------
16:21:33.378 -> Discover polling delay setting: [50]
16:21:33.378 -> Setting NRF52840 BLE configuration parameters!
16:21:33.378 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:21:33.813 -> Board name: [Feather nRF52840 Express]
16:21:33.813 -> FTMS and Chars 'initialized'
16:21:33.813 -> CPS and Chars 'initialized'
16:21:33.813 -> CSCS and Chars 'initialized'
16:21:33.813 -> GA and Chars 'initialized'
16:21:33.813 -> DIS and Chars 'initialized'
16:21:33.813 -> HRMS and Chars 'initialized'
16:21:33.813 -> Start Scanning for CPS, CSC and FTMS!
16:21:33.813 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:21:33.813 -> Timestamp MAC Address Rssi Data
16:21:33.813 -> 000001122 F8:9C:FC:53:5E:49 -63 09-02-16-18-26-18-18-18-0A-18
16:21:33.813 -> --------- SoftDevice Config ---------
16:21:33.813 -> Max UUID128 : 10
16:21:33.813 -> ATTR Table Size : 4096
16:21:33.813 -> Service Changed : 1
16:21:33.813 -> Central Connect Setting
16:21:33.813 -> - Max MTU : 23
16:21:33.813 -> - Event Length : 6
16:21:33.813 -> - HVN Queue Size : 2
16:21:33.813 -> - WrCmd Queue Size: 1
16:21:33.813 ->
16:21:33.813 -> --------- BLE Settings ---------
16:21:33.813 -> Name : Feather nRF52840 Express
16:21:33.813 -> Max Connections : Peripheral = 0, Central = 1
16:21:33.813 -> Address : DD:CF:A6:C0:1A:11 (Static)
16:21:33.813 -> TX Power : 4 dBm
16:21:33.813 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
16:21:33.813 -> Conn Timeout : 2000 ms
16:21:33.813 -> Central Paired Devices:
16:21:33.813 ->
16:21:33.813 ->
16:21:33.813 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:21:33.813 -> Now checking all Client Services and Characteristics!
16:21:33.813 -> If Mandatory Services Fail --> the Client will disconnect!
16:21:33.813 -> Checking Generic Access and Device Information!
16:21:33.846 -> Found Client Generic Access
16:21:34.274 -> -> Client Reads Device Name: [Zwift Hub]
16:21:34.435 -> -> Client Reads Appearance: [1152]
16:21:34.685 -> Found Client Device Information
16:21:34.966 -> -> Client Reads Manufacturer: [Zwift]
16:21:35.091 -> -> Client Reads Model Number: [06]
16:21:35.585 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:21:35.585 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
16:21:35.709 -> Discovering Client FTM Control Point Characteristic ... Found it!
16:21:36.005 -> Discovering Client FTM Status Characteristic ... Found it!
16:21:36.284 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
16:21:36.410 -> Discovering Client FTM Feature Characteristic ... Found it!
16:21:36.676 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
16:21:36.676 -> - Fitness Machine Features:
16:21:36.676 -> Average Speed Supported
16:21:36.676 -> Cadence Supported
16:21:36.676 -> Total Distance Supported
16:21:36.676 -> Resistance Level Supported
16:21:36.676 -> Heart Rate Measurement Supported
16:21:36.676 -> Power Measurement Supported
16:21:36.676 -> - Target Setting Features:
16:21:36.676 -> Resistance Target Setting Supported
16:21:36.676 -> Power Target Setting Supported
16:21:36.676 -> Indoor Bike Simulation Parameters Supported
16:21:36.676 -> Wheel Circumference Configuration Supported
16:21:36.676 -> Spin Down Control Supported
16:21:36.676 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
16:21:37.001 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
16:21:37.234 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 00 00 00 00 ]
16:21:37.234 -> Discovering Client FTM Supported Power Range Characteristic ... Not Found! NOT mandatory!
16:21:37.311 -> Discovering Client Cycling Power (CP) Service ... Not Found!
16:21:37.359 -> Disconnecting since Client Cyling Power Service is mandatory!
16:21:37.485 -> Client Disconnected, reason = 0x16
16:21:37.485 -> >>> Restart the Feather nRF52 Client for a new run! <<<
16:21:38.061 -> Stopped!

poll_delay = 100

16:24:18.120 -> Found Client Generic Access
16:24:18.398 -> -> Client Reads Device Name: [Zwift Hub]
16:24:18.430 -> -> Client Reads Appearance: [1152]
16:24:18.430 -> Found Client Device Information
16:24:18.564 -> -> Client Reads Manufacturer: [Zwift]
16:24:18.876 -> -> Client Reads Model Number: [06]
16:24:19.248 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:24:19.248 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
16:24:19.435 -> Discovering Client FTM Control Point Characteristic ... Found it!
16:24:19.965 -> Discovering Client FTM Status Characteristic ... Found it!
16:24:20.496 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
16:24:20.726 -> Discovering Client FTM Feature Characteristic ... Found it!
16:24:20.941 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
16:24:20.941 -> - Fitness Machine Features:
16:24:20.941 -> Average Speed Supported
16:24:20.941 -> Cadence Supported
16:24:20.941 -> Total Distance Supported
16:24:20.941 -> Resistance Level Supported
16:24:20.941 -> Heart Rate Measurement Supported
16:24:20.941 -> Power Measurement Supported
16:24:20.941 -> - Target Setting Features:
16:24:20.941 -> Resistance Target Setting Supported
16:24:20.941 -> Power Target Setting Supported
16:24:20.941 -> Indoor Bike Simulation Parameters Supported
16:24:20.941 -> Wheel Circumference Configuration Supported
16:24:20.941 -> Spin Down Control Supported
16:24:20.941 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
16:24:21.392 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
16:24:21.640 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
16:24:21.640 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
16:24:22.026 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
16:24:22.026 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
16:24:22.337 -> Discovering Client CP Measurement characteristic ... Found it!
16:24:22.601 -> Discovering Client CP Feature characteristic ... Found it!
16:24:22.805 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
16:24:22.805 -> Wheel revolution data supported
16:24:22.805 -> Crank revolution data supported
16:24:22.805 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
16:24:23.213 -> Discovering Client CP Sensor Location characteristic ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
16:24:23.291 -> Ready to receive Client FTM Control Point Response Messages
16:24:23.291 -> Ready to receive Client FTM Status values
16:24:23.417 -> Ready to receive Client FTM Indoor Bike Data values
16:24:23.417 -> Found it!
16:24:23.417 -> Ready to receive Client CP Measurement values
16:24:23.510 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
16:24:23.510 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
16:24:23.682 -> Discovering Client CSC Measurement CHR ... Found it!
16:24:23.945 -> Discovering Client CSC Feature CHR ... Found it!
16:24:24.504 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
16:24:24.504 -> Wheel rev supported
16:24:24.504 -> Crank rev supported
16:24:24.504 -> Discovering Client CSC Location CHR ... Found it!
16:24:24.799 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
16:24:24.799 -> Discovering Heart Rate Measurement (HR) Service ... Found it! HRMS Max Payload: 20 Data Length: 27
16:24:25.065 -> Discovering HR Measurement characteristic ... Found it!
16:24:25.345 -> Discovering HR Sensor Location characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
16:24:25.422 -> Not Found! Not Mandatory!
16:24:25.422 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
16:24:25.422 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM

poll_delay = 100 2eme teste

16:25:47.085 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
16:25:47.085 -> ------------------- Version 03.1 --------------------
16:25:47.085 -> Discover polling delay setting: [100]
16:25:47.085 -> Setting NRF52840 BLE configuration parameters!
16:25:47.085 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:25:47.085 -> Board name: [Feather nRF52840 Express]
16:25:47.085 -> FTMS and Chars 'initialized'
16:25:47.085 -> CPS and Chars 'initialized'
16:25:47.085 -> CSCS and Chars 'initialized'
16:25:47.085 -> GA and Chars 'initialized'
16:25:47.085 -> DIS and Chars 'initialized'
16:25:47.085 -> HRMS and Chars 'initialized'
16:25:47.085 -> Start Scanning for CPS, CSC and FTMS!
16:25:47.085 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:25:47.085 -> Timestamp MAC Address Rssi Data
16:25:47.085 -> 000001069 F8:9C:FC:53:5E:49 -58 09-02-16-18-26-18-18-18-0A-18
16:25:47.102 -> --------- SoftDevice Config ---------
16:25:47.102 -> Max UUID128 : 10
16:25:47.102 -> ATTR Table Size : 4096
16:25:47.102 -> Service Changed : 1
16:25:47.102 -> Central Connect Setting
16:25:47.102 -> - Max MTU : 23
16:25:47.102 -> - Event Length : 6
16:25:47.102 -> - HVN Queue Size : 2
16:25:47.102 -> - WrCmd Queue Size: 1
16:25:47.102 ->
16:25:47.102 -> --------- BLE Settings ---------
16:25:47.102 -> Name : Feather nRF52840 Express
16:25:47.102 -> Max Connections : Peripheral = 0, Central = 1
16:25:47.102 -> Address : DD:CF:A6:C0:1A:11 (Static)
16:25:47.102 -> TX Power : 4 dBm
16:25:47.102 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
16:25:47.102 -> Conn Timeout : 2000 ms
16:25:47.102 -> Central Paired Devices:
16:25:47.102 ->
16:25:47.102 ->
16:25:47.102 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:25:47.102 -> Now checking all Client Services and Characteristics!
16:25:47.102 -> If Mandatory Services Fail --> the Client will disconnect!
16:25:47.102 -> Checking Generic Access and Device Information!
16:25:47.102 -> Found Client Generic Access
16:25:47.218 -> -> Client Reads Device Name: [Zwift Hub]
16:25:47.451 -> -> Client Reads Appearance: [0]
16:25:47.636 -> Found Client Device Information
16:25:47.917 -> -> Client Reads Manufacturer: [Zwift]
16:25:48.554 -> -> Client Reads Model Number: [06]
16:25:48.819 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:25:48.819 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
16:25:49.130 -> Discovering Client FTM Control Point Characteristic ... Found it!
16:25:49.457 -> Discovering Client FTM Status Characteristic ... Found it!
16:25:49.862 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
16:25:50.032 -> Discovering Client FTM Feature Characteristic ... Found it!
16:25:50.453 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
16:25:50.453 -> - Fitness Machine Features:
16:25:50.453 -> Average Speed Supported
16:25:50.453 -> Cadence Supported
16:25:50.453 -> Total Distance Supported
16:25:50.453 -> Resistance Level Supported
16:25:50.453 -> Heart Rate Measurement Supported
16:25:50.453 -> Power Measurement Supported
16:25:50.453 -> - Target Setting Features:
16:25:50.453 -> Resistance Target Setting Supported
16:25:50.453 -> Power Target Setting Supported
16:25:50.453 -> Indoor Bike Simulation Parameters Supported
16:25:50.453 -> Wheel Circumference Configuration Supported
16:25:50.453 -> Spin Down Control Supported
16:25:50.453 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
16:25:50.735 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
16:25:51.137 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 00 00 00 00 ]
16:25:51.137 -> Discovering Client FTM Supported Power Range Characteristic ... Not Found! NOT mandatory!
16:25:51.215 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
16:25:51.370 -> Discovering Client CP Measurement characteristic ... Found it!
16:25:51.696 -> Discovering Client CP Feature characteristic ... Found it!
16:25:51.974 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
16:25:51.974 -> Wheel revolution data supported
16:25:51.974 -> Crank revolution data supported
16:25:51.974 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
16:25:52.488 -> Discovering Client CP Sensor Location characteristic ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
16:25:52.567 -> Ready to receive Client FTM Control Point Response Messages
16:25:52.567 -> Ready to receive Client FTM Status values
16:25:52.678 -> Ready to receive Client FTM Indoor Bike Data values
16:25:52.678 -> Found it!
16:25:52.678 -> Ready to receive Client CP Measurement values
16:25:52.771 -> -> Client Reads CP Location Sensor: Loc#: 0 Other
16:25:52.771 -> Discovering Cycling Speed and Cadence (CSC) Service ... Not Found!
16:25:52.850 -> Disconnecting since CSC Service is mandatory!
16:25:52.896 -> Client Disconnected, reason = 0x16
16:25:52.896 -> >>> Restart the Feather nRF52 Client for a new run! <<<

poll_delay = 150

16:28:24.789 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
16:28:24.789 -> ------------------- Version 03.1 --------------------
16:28:24.789 -> Discover polling delay setting: [150]
16:28:24.789 -> Setting NRF52840 BLE configuration parameters!
16:28:24.789 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:28:24.790 -> Board name: [Feather nRF52840 Express]
16:28:24.790 -> FTMS and Chars 'initialized'
16:28:24.790 -> CPS and Chars 'initialized'
16:28:24.790 -> CSCS and Chars 'initialized'
16:28:24.790 -> GA and Chars 'initialized'
16:28:24.790 -> DIS and Chars 'initialized'
16:28:24.790 -> HRMS and Chars 'initialized'
16:28:24.790 -> Start Scanning for CPS, CSC and FTMS!
16:28:24.790 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:28:24.790 -> Timestamp MAC Address Rssi Data
16:28:24.790 -> 000000650 F8:9C:FC:53:5E:49 -57 09-02-16-18-26-18-18-18-0A-18
16:28:25.483 -> --------- SoftDevice Config ---------
16:28:25.483 -> Max UUID128 : 10
16:28:25.483 -> ATTR Table Size : 4096
16:28:25.483 -> Service Changed : 1
16:28:25.483 -> Central Connect Setting
16:28:25.483 -> - Max MTU : 23
16:28:25.483 -> - Event Length : 6
16:28:25.483 -> - HVN Queue Size : 2
16:28:25.483 -> - WrCmd Queue Size: 1
16:28:25.483 ->
16:28:25.483 -> --------- BLE Settings ---------
16:28:25.483 -> Name : Feather nRF52840 Express
16:28:25.483 -> Max Connections : Peripheral = 0, Central = 1
16:28:25.483 -> Address : DD:CF:A6:C0:1A:11 (Static)
16:28:25.483 -> TX Power : 4 dBm
16:28:25.483 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
16:28:25.483 -> Conn Timeout : 2000 ms
16:28:25.483 -> Central Paired Devices:
16:28:25.483 ->
16:28:25.483 ->
16:28:25.483 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:28:25.483 -> Now checking all Client Services and Characteristics!
16:28:25.483 -> If Mandatory Services Fail --> the Client will disconnect!
16:28:25.483 -> Checking Generic Access and Device Information!
16:28:25.511 -> Found Client Generic Access
16:28:25.511 -> -> Client Reads Device Name: [Zwift Hub]
16:28:25.511 -> -> Client Reads Appearance: [1152]
16:28:25.854 -> Found Client Device Information
16:28:25.922 -> -> Client Reads Manufacturer: [Zwift]
16:28:26.389 -> -> Client Reads Model Number: [06]
16:28:26.747 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:28:26.747 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
16:28:26.951 -> Discovering Client FTM Control Point Characteristic ... Found it!
16:28:27.733 -> Discovering Client FTM Status Characteristic ... Found it!
16:28:28.140 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
16:28:28.419 -> Discovering Client FTM Feature Characteristic ... Found it!
16:28:28.698 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
16:28:28.698 -> - Fitness Machine Features:
16:28:28.698 -> - Target Setting Features:
16:28:28.698 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
16:28:29.119 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
16:28:29.523 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 00 00 00 00 ]
16:28:29.523 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
16:28:29.912 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
16:28:29.912 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
16:28:30.098 -> Discovering Client CP Measurement characteristic ... Found it!
16:28:30.503 -> Discovering Client CP Feature characteristic ... Found it!
16:28:30.814 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
16:28:30.815 -> Wheel revolution data supported
16:28:30.815 -> Crank revolution data supported
16:28:30.815 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
16:28:31.110 -> Discovering Client CP Sensor Location characteristic ... Found it!
16:28:31.390 -> -> Client Reads CP Location Sensor: Loc#: 0 Other
16:28:31.390 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
16:28:31.670 -> Discovering Client CSC Measurement CHR ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
16:28:31.966 -> Ready to receive Client FTM Control Point Response Messages
16:28:32.053 -> >>> Couldn't enable notify for Client FTM Status Characteristic.
16:28:32.053 -> FTMS (trainer) is controlled by another Client (Training App)!
16:28:32.091 -> Found it!
16:28:32.092 -> Discovering Client CSC Feature CHR ... Not Found!
16:28:32.249 -> Disconnecting since Client CSC Feature CHR is mandatory!
16:28:32.249 -> Client Disconnected, reason = 0x16
16:28:32.249 -> >>> Restart the Feather nRF52 Client for a new run! <<<

poll_delay = 200

16:32:42.046 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
16:32:42.046 -> ------------------- Version 03.1 --------------------
16:32:42.046 -> Discover polling delay setting: [200]
16:32:42.046 -> Setting NRF52840 BLE configuration parameters!
16:32:42.046 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:32:42.141 -> Board name: [Feather nRF52840 Express]
16:32:42.141 -> FTMS and Chars 'initialized'
16:32:42.141 -> CPS and Chars 'initialized'
16:32:42.141 -> CSCS and Chars 'initialized'
16:32:42.141 -> GA and Chars 'initialized'
16:32:42.141 -> DIS and Chars 'initialized'
16:32:42.141 -> HRMS and Chars 'initialized'
16:32:42.141 -> Start Scanning for CPS, CSC and FTMS!
16:32:42.141 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:32:42.141 -> Timestamp MAC Address Rssi Data
16:32:42.141 -> 000000634 F8:9C:FC:53:5E:49 -59 09-02-16-18-26-18-18-18-0A-18
16:32:42.141 -> --------- SoftDevice Config ---------
16:32:42.141 -> Max UUID128 : 10
16:32:42.141 -> ATTR Table Size : 4096
16:32:42.141 -> Service Changed : 1
16:32:42.141 -> Central Connect Setting
16:32:42.141 -> - Max MTU : 23
16:32:42.141 -> - Event Length : 6
16:32:42.141 -> - HVN Queue Size : 2
16:32:42.141 -> - WrCmd Queue Size: 1
16:32:42.141 ->
16:32:42.141 -> --------- BLE Settings ---------
16:32:42.141 -> Name : Feather nRF52840 Express
16:32:42.141 -> Max Connections : Peripheral = 0, Central = 1
16:32:42.141 -> Address : DD:CF:A6:C0:1A:11 (Static)
16:32:42.141 -> TX Power : 4 dBm
16:32:42.141 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
16:32:42.141 -> Conn Timeout : 2000 ms
16:32:42.141 -> Central Paired Devices:
16:32:42.141 ->
16:32:42.141 ->
16:32:42.141 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:32:42.141 -> Now checking all Client Services and Characteristics!
16:32:42.141 -> If Mandatory Services Fail --> the Client will disconnect!
16:32:42.141 -> Checking Generic Access and Device Information!
16:32:42.905 -> Found Client Generic Access
16:32:43.173 -> -> Client Reads Device Name: [Zwift Hub]
16:32:43.217 -> -> Client Reads Appearance: [1152]
16:32:43.562 -> Found Client Device Information
16:32:43.921 -> -> Client Reads Manufacturer: [Zwift]
16:32:44.371 -> -> Client Reads Model Number: [06]
16:32:44.701 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:32:44.701 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
16:32:44.997 -> Discovering Client FTM Control Point Characteristic ... Found it!
16:32:45.421 -> Discovering Client FTM Status Characteristic ... Found it!
16:32:45.966 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
16:32:46.336 -> Discovering Client FTM Feature Characteristic ... Found it!
16:32:46.739 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
16:32:46.739 -> - Fitness Machine Features:
16:32:46.739 -> Average Speed Supported
16:32:46.739 -> Cadence Supported
16:32:46.739 -> Total Distance Supported
16:32:46.739 -> Resistance Level Supported
16:32:46.739 -> Heart Rate Measurement Supported
16:32:46.739 -> Power Measurement Supported
16:32:46.739 -> - Target Setting Features:
16:32:46.739 -> Resistance Target Setting Supported
16:32:46.739 -> Power Target Setting Supported
16:32:46.739 -> Indoor Bike Simulation Parameters Supported
16:32:46.739 -> Wheel Circumference Configuration Supported
16:32:46.739 -> Spin Down Control Supported
16:32:46.739 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
16:32:47.294 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
16:32:47.682 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
16:32:47.682 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
16:32:48.041 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
16:32:48.041 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
16:32:48.384 -> Discovering Client CP Measurement characteristic ... Found it!
16:32:48.883 -> Discovering Client CP Feature characteristic ... Found it!
16:32:49.242 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
16:32:49.242 -> Wheel revolution data supported
16:32:49.242 -> Crank revolution data supported
16:32:49.242 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
16:32:49.743 -> Discovering Client CP Sensor Location characteristic ... Found it!
16:32:50.041 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
16:32:50.041 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
16:32:50.320 -> Discovering Client CSC Measurement CHR ... Found it!
16:32:50.666 -> Discovering Client CSC Feature CHR ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
16:32:50.932 -> Ready to receive Client FTM Control Point Response Messages
16:32:50.932 -> >>> Couldn't enable notify for Client FTM Status Characteristic.
16:32:50.932 -> FTMS (trainer) is controlled by another Client (Training App)!
16:32:51.056 -> Found it!
16:32:51.056 -> -> Client Reads Raw CSC Feature bytes: [2] [ 00 00 ]
16:32:51.056 -> Discovering Client CSC Location CHR ... Not Found! NOT Mandatory!
16:32:51.257 -> Discovering Heart Rate Measurement (HR) Service ... Not Found! HR Service is Not Mandatory!
16:32:51.462 -> Client Disconnected, reason = 0x16
16:32:51.462 -> >>> Restart the Feather nRF52 Client for a new run! <<<

poll_delay = 250

16:35:33.886 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
16:35:33.886 -> ------------------- Version 03.1 --------------------
16:35:33.886 -> Discover polling delay setting: [250]
16:35:33.886 -> Setting NRF52840 BLE configuration parameters!
16:35:33.886 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:35:34.334 -> Board name: [Feather nRF52840 Express]
16:35:34.334 -> FTMS and Chars 'initialized'
16:35:34.334 -> CPS and Chars 'initialized'
16:35:34.334 -> CSCS and Chars 'initialized'
16:35:34.334 -> GA and Chars 'initialized'
16:35:34.334 -> DIS and Chars 'initialized'
16:35:34.334 -> HRMS and Chars 'initialized'
16:35:34.334 -> Start Scanning for CPS, CSC and FTMS!
16:35:34.334 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:35:34.334 -> Timestamp MAC Address Rssi Data
16:35:34.334 -> 000001176 F8:9C:FC:53:5E:49 -60 09-02-16-18-26-18-18-18-0A-18
16:35:34.335 -> --------- SoftDevice Config ---------
16:35:34.335 -> Max UUID128 : 10
16:35:34.335 -> ATTR Table Size : 4096
16:35:34.335 -> Service Changed : 1
16:35:34.335 -> Central Connect Setting
16:35:34.335 -> - Max MTU : 23
16:35:34.335 -> - Event Length : 6
16:35:34.335 -> - HVN Queue Size : 2
16:35:34.335 -> - WrCmd Queue Size: 1
16:35:34.335 ->
16:35:34.335 -> --------- BLE Settings ---------
16:35:34.335 -> Name : Feather nRF52840 Express
16:35:34.335 -> Max Connections : Peripheral = 0, Central = 1
16:35:34.335 -> Address : DD:CF:A6:C0:1A:11 (Static)
16:35:34.335 -> TX Power : 4 dBm
16:35:34.335 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
16:35:34.335 -> Conn Timeout : 2000 ms
16:35:34.335 -> Central Paired Devices:
16:35:34.335 ->
16:35:34.335 ->
16:35:34.335 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:35:34.335 -> Now checking all Client Services and Characteristics!
16:35:34.335 -> If Mandatory Services Fail --> the Client will disconnect!
16:35:34.335 -> Checking Generic Access and Device Information!
16:35:34.717 -> Found Client Generic Access
16:35:35.325 -> -> Client Reads Device Name: [Zwift Hub]
16:35:36.025 -> -> Client Reads Appearance: [1152]
16:35:36.321 -> Found Client Device Information
16:35:36.788 -> -> Client Reads Manufacturer: [Zwift]
16:35:37.161 -> -> Client Reads Model Number: [06]
16:35:37.566 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:35:37.566 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
16:35:37.924 -> Discovering Client FTM Control Point Characteristic ... Found it!
16:35:38.717 -> Discovering Client FTM Status Characteristic ... Found it!
16:35:39.215 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
16:35:39.744 -> Discovering Client FTM Feature Characteristic ... Found it!
16:35:40.101 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
16:35:40.101 -> - Fitness Machine Features:
16:35:40.101 -> Average Speed Supported
16:35:40.101 -> Cadence Supported
16:35:40.101 -> Total Distance Supported
16:35:40.101 -> Resistance Level Supported
16:35:40.101 -> Heart Rate Measurement Supported
16:35:40.101 -> Power Measurement Supported
16:35:40.101 -> - Target Setting Features:
16:35:40.101 -> Resistance Target Setting Supported
16:35:40.101 -> Power Target Setting Supported
16:35:40.101 -> Indoor Bike Simulation Parameters Supported
16:35:40.101 -> Wheel Circumference Configuration Supported
16:35:40.101 -> Spin Down Control Supported
16:35:40.101 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
16:35:40.662 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
16:35:41.215 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
16:35:41.215 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
16:35:41.871 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 00 00 00 00 ]
16:35:41.871 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
16:35:42.213 -> Discovering Client CP Measurement characteristic ... Found it!
16:35:42.667 -> Discovering Client CP Feature characteristic ... Found it!
16:35:43.287 -> -> Client Reads Raw CP Feature bytes: [4] [ 00 00 00 00 ]
16:35:43.287 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
16:35:43.710 -> Discovering Client CP Sensor Location characteristic ... Found it!
16:35:44.098 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
16:35:44.098 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
16:35:44.428 -> Discovering Client CSC Measurement CHR ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics

poll_delay = 250 2eme test

16:37:47.925 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
16:37:47.925 -> ------------------- Version 03.1 --------------------
16:37:47.925 -> Discover polling delay setting: [250]
16:37:47.925 -> Setting NRF52840 BLE configuration parameters!
16:37:47.925 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:37:47.926 -> Board name: [Feather nRF52840 Express]
16:37:47.926 -> FTMS and Chars 'initialized'
16:37:47.926 -> CPS and Chars 'initialized'
16:37:47.926 -> CSCS and Chars 'initialized'
16:37:47.926 -> GA and Chars 'initialized'
16:37:47.926 -> DIS and Chars 'initialized'
16:37:47.926 -> HRMS and Chars 'initialized'
16:37:47.926 -> Start Scanning for CPS, CSC and FTMS!
16:37:47.938 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:37:47.938 -> Timestamp MAC Address Rssi Data
16:37:47.938 -> 000001094 F8:9C:FC:53:5E:49 -55 09-02-16-18-26-18-18-18-0A-18
16:37:47.938 -> --------- SoftDevice Config ---------
16:37:47.938 -> Max UUID128 : 10
16:37:47.938 -> ATTR Table Size : 4096
16:37:47.938 -> Service Changed : 1
16:37:47.938 -> Central Connect Setting
16:37:47.938 -> - Max MTU : 23
16:37:47.938 -> - Event Length : 6
16:37:47.938 -> - HVN Queue Size : 2
16:37:47.938 -> - WrCmd Queue Size: 1
16:37:47.938 ->
16:37:47.938 -> --------- BLE Settings ---------
16:37:47.938 -> Name : Feather nRF52840 Express
16:37:47.938 -> Max Connections : Peripheral = 0, Central = 1
16:37:47.938 -> Address : DD:CF:A6:C0:1A:11 (Static)
16:37:47.938 -> TX Power : 4 dBm
16:37:47.938 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
16:37:47.938 -> Conn Timeout : 2000 ms
16:37:47.938 -> Central Paired Devices:
16:37:47.938 ->
16:37:47.938 ->
16:37:47.938 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:37:47.938 -> Now checking all Client Services and Characteristics!
16:37:47.938 -> If Mandatory Services Fail --> the Client will disconnect!
16:37:47.938 -> Checking Generic Access and Device Information!
16:37:48.176 -> Found Client Generic Access
16:37:48.784 -> -> Client Reads Device Name: [Zwift Hub]
16:37:49.143 -> -> Client Reads Appearance: [1152]
16:37:49.455 -> Found Client Device Information
16:37:49.846 -> -> Client Reads Manufacturer: [Zwift]
16:37:50.263 -> -> Client Reads Model Number: [06]
16:37:50.766 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:37:50.766 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
16:37:51.077 -> Discovering Client FTM Control Point Characteristic ... Found it!
16:37:51.576 -> Discovering Client FTM Status Characteristic ... Found it!
16:37:52.246 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
16:37:52.743 -> Discovering Client FTM Feature Characteristic ... Found it!
16:37:53.057 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
16:37:53.057 -> - Fitness Machine Features:
16:37:53.057 -> Average Speed Supported
16:37:53.057 -> Cadence Supported
16:37:53.057 -> Total Distance Supported
16:37:53.057 -> Resistance Level Supported
16:37:53.057 -> Heart Rate Measurement Supported
16:37:53.057 -> Power Measurement Supported
16:37:53.057 -> - Target Setting Features:
16:37:53.057 -> Resistance Target Setting Supported
16:37:53.057 -> Power Target Setting Supported
16:37:53.057 -> Indoor Bike Simulation Parameters Supported
16:37:53.057 -> Wheel Circumference Configuration Supported
16:37:53.057 -> Spin Down Control Supported
16:37:53.057 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
16:37:53.554 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
16:37:54.099 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 00 00 00 00 ]
16:37:54.099 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
16:37:54.768 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 00 00 00 00 ]
16:37:54.768 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
16:37:55.378 -> Discovering Client CP Measurement characteristic ... Found it!
16:37:56.015 -> Discovering Client CP Feature characteristic ... Found it!
16:37:56.623 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
16:37:56.623 -> Wheel revolution data supported
16:37:56.623 -> Crank revolution data supported
16:37:56.623 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
16:37:56.981 -> Discovering Client CP Sensor Location characteristic ... Found it!
16:37:57.402 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
16:37:57.402 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
16:37:57.697 -> Discovering Client CSC Measurement CHR ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
16:37:58.040 -> Ready to receive Client FTM Control Point Response Messages
16:37:58.040 -> Ready to receive Client FTM Status values
16:37:58.087 -> Found it!
16:37:58.087 -> Discovering Client CSC Feature CHR ... Ready to receive Client FTM Indoor Bike Data values
16:37:58.181 -> >>> Couldn't enable notify for Client CP Measurement Characteristic.
16:37:58.181 -> FTMS (trainer) is controlled by another Client (Training App)!
16:37:58.323 -> Not Found!
16:37:58.323 -> Disconnecting since Client CSC Feature CHR is mandatory!
16:37:58.323 -> Client Disconnected, reason = 0x16
16:37:58.323 -> >>> Restart the Feather nRF52 Client for a new run! <<<

poll_delay = 250 3 eme test

16:40:11.341 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
16:40:11.341 -> ------------------- Version 03.1 --------------------
16:40:11.341 -> Discover polling delay setting: [250]
16:40:11.341 -> Setting NRF52840 BLE configuration parameters!
16:40:11.341 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:40:11.341 -> Board name: [Feather nRF52840 Express]
16:40:11.341 -> FTMS and Chars 'initialized'
16:40:11.341 -> CPS and Chars 'initialized'
16:40:11.341 -> CSCS and Chars 'initialized'
16:40:11.341 -> GA and Chars 'initialized'
16:40:11.341 -> DIS and Chars 'initialized'
16:40:11.341 -> HRMS and Chars 'initialized'
16:40:11.341 -> Start Scanning for CPS, CSC and FTMS!
16:40:11.341 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:40:11.341 -> Timestamp MAC Address Rssi Data
16:40:11.341 -> 000000984 F8:9C:FC:53:5E:49 -58 09-02-16-18-26-18-18-18-0A-18
16:40:11.539 -> --------- SoftDevice Config ---------
16:40:11.539 -> Max UUID128 : 10
16:40:11.539 -> ATTR Table Size : 4096
16:40:11.539 -> Service Changed : 1
16:40:11.539 -> Central Connect Setting
16:40:11.539 -> - Max MTU : 23
16:40:11.539 -> - Event Length : 6
16:40:11.539 -> - HVN Queue Size : 2
16:40:11.539 -> - WrCmd Queue Size: 1
16:40:11.539 ->
16:40:11.539 -> --------- BLE Settings ---------
16:40:11.539 -> Name : Feather nRF52840 Express
16:40:11.539 -> Max Connections : Peripheral = 0, Central = 1
16:40:11.539 -> Address : DD:CF:A6:C0:1A:11 (Static)
16:40:11.539 -> TX Power : 4 dBm
16:40:11.539 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
16:40:11.539 -> Conn Timeout : 2000 ms
16:40:11.539 -> Central Paired Devices:
16:40:11.539 ->
16:40:11.539 ->
16:40:11.539 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:40:11.539 -> Now checking all Client Services and Characteristics!
16:40:11.539 -> If Mandatory Services Fail --> the Client will disconnect!
16:40:11.539 -> Checking Generic Access and Device Information!
16:40:11.662 -> Found Client Generic Access
16:40:12.097 -> -> Client Reads Device Name: []
16:40:12.561 -> -> Client Reads Appearance: [1152]
16:40:12.983 -> Found Client Device Information
16:40:13.965 -> -> Client Reads Model Number: [06]
16:40:14.355 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:40:14.355 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
16:40:14.759 -> Discovering Client FTM Control Point Characteristic ... Found it!
16:40:15.225 -> Discovering Client FTM Status Characteristic ... Found it!
16:40:15.785 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
16:40:16.222 -> Discovering Client FTM Feature Characteristic ... Found it!
16:40:16.875 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
16:40:16.875 -> - Fitness Machine Features:
16:40:16.875 -> Average Speed Supported
16:40:16.875 -> Cadence Supported
16:40:16.875 -> Total Distance Supported
16:40:16.875 -> Resistance Level Supported
16:40:16.875 -> Heart Rate Measurement Supported
16:40:16.875 -> Power Measurement Supported
16:40:16.875 -> - Target Setting Features:
16:40:16.875 -> Resistance Target Setting Supported
16:40:16.875 -> Power Target Setting Supported
16:40:16.875 -> Indoor Bike Simulation Parameters Supported
16:40:16.875 -> Wheel Circumference Configuration Supported
16:40:16.875 -> Spin Down Control Supported
16:40:16.875 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
16:40:17.562 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
16:40:17.965 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 00 00 00 00 ]
16:40:17.965 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
16:40:18.480 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
16:40:18.480 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
16:40:18.837 -> Discovering Client CP Measurement characteristic ... Found it!
16:40:19.525 -> Discovering Client CP Feature characteristic ... Found it!
16:40:20.180 -> -> Client Reads Raw CP Feature bytes: [4] [ 00 00 00 00 ]
16:40:20.180 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
16:40:20.553 -> Discovering Client CP Sensor Location characteristic ... Found it!
16:40:21.022 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
16:40:21.022 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
16:40:21.431 -> Discovering Client CSC Measurement CHR ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
16:40:21.541 -> Ready to receive Client FTM Control Point Response Messages
16:40:21.541 -> Ready to receive Client FTM Status values
16:40:21.632 -> >>> Couldn't enable notify for Client FTM Indoor Bike Data Characteristic.
16:40:21.632 -> FTMS (trainer) is controlled by another Client (Training App)!
16:40:21.664 -> Not Found!
16:40:21.664 -> Disconnecting since Client CSC Measurement CHR is mandatory!
16:40:21.664 -> Client Disconnected, reason = 0x16
16:40:21.664 -> >>> Restart the Feather nRF52 Client for a new run! <<<

poll_delay = 300

16:42:51.954 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
16:42:51.954 -> ------------------- Version 03.1 --------------------
16:42:51.954 -> Discover polling delay setting: [300]
16:42:51.954 -> Setting NRF52840 BLE configuration parameters!
16:42:51.954 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:42:52.044 -> Board name: [Feather nRF52840 Express]
16:42:52.044 -> FTMS and Chars 'initialized'
16:42:52.044 -> CPS and Chars 'initialized'
16:42:52.044 -> CSCS and Chars 'initialized'
16:42:52.044 -> GA and Chars 'initialized'
16:42:52.044 -> DIS and Chars 'initialized'
16:42:52.044 -> HRMS and Chars 'initialized'
16:42:52.044 -> Start Scanning for CPS, CSC and FTMS!
16:42:52.044 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:42:52.044 -> Timestamp MAC Address Rssi Data
16:42:52.044 -> 000000619 F8:9C:FC:53:5E:49 -60 09-02-16-18-26-18-18-18-0A-18
16:42:52.044 -> --------- SoftDevice Config ---------
16:42:52.044 -> Max UUID128 : 10
16:42:52.044 -> ATTR Table Size : 4096
16:42:52.044 -> Service Changed : 1
16:42:52.044 -> Central Connect Setting
16:42:52.044 -> - Max MTU : 23
16:42:52.044 -> - Event Length : 6
16:42:52.044 -> - HVN Queue Size : 2
16:42:52.044 -> - WrCmd Queue Size: 1
16:42:52.044 ->
16:42:52.044 -> --------- BLE Settings ---------
16:42:52.044 -> Name : Feather nRF52840 Express
16:42:52.044 -> Max Connections : Peripheral = 0, Central = 1
16:42:52.044 -> Address : DD:CF:A6:C0:1A:11 (Static)
16:42:52.044 -> TX Power : 4 dBm
16:42:52.044 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
16:42:52.044 -> Conn Timeout : 2000 ms
16:42:52.044 -> Central Paired Devices:
16:42:52.044 ->
16:42:52.044 ->
16:42:52.044 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:42:52.044 -> Now checking all Client Services and Characteristics!
16:42:52.044 -> If Mandatory Services Fail --> the Client will disconnect!
16:42:52.044 -> Checking Generic Access and Device Information!
16:42:52.614 -> Found Client Generic Access
16:42:53.249 -> -> Client Reads Device Name: [Zwift Hub]
16:42:53.747 -> -> Client Reads Appearance: [1152]
16:42:54.217 -> Found Client Device Information
16:42:54.650 -> -> Client Reads Manufacturer: [Zwift]
16:42:55.199 -> -> Client Reads Model Number: [06]
16:42:55.680 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:42:55.680 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
16:42:56.399 -> Discovering Client FTM Control Point Characteristic ... Found it!
16:42:57.274 -> Discovering Client FTM Status Characteristic ... Found it!
16:42:57.835 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
16:42:58.301 -> Discovering Client FTM Feature Characteristic ... Found it!
16:42:58.770 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
16:42:58.770 -> - Fitness Machine Features:
16:42:58.770 -> Average Speed Supported
16:42:58.770 -> Cadence Supported
16:42:58.770 -> Total Distance Supported
16:42:58.770 -> Resistance Level Supported
16:42:58.770 -> Heart Rate Measurement Supported
16:42:58.770 -> Power Measurement Supported
16:42:58.770 -> - Target Setting Features:
16:42:58.770 -> Resistance Target Setting Supported
16:42:58.770 -> Power Target Setting Supported
16:42:58.770 -> Indoor Bike Simulation Parameters Supported
16:42:58.770 -> Wheel Circumference Configuration Supported
16:42:58.770 -> Spin Down Control Supported
16:42:58.770 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
16:42:59.330 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
16:42:59.829 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
16:42:59.829 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
16:43:00.497 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
16:43:00.497 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
16:43:00.842 -> Discovering Client CP Measurement characteristic ... Found it!
16:43:01.310 -> Discovering Client CP Feature characteristic ... Found it!
16:43:01.749 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
16:43:01.749 -> Wheel revolution data supported
16:43:01.749 -> Crank revolution data supported
16:43:01.749 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
16:43:02.387 -> Discovering Client CP Sensor Location characteristic ... Found it!
16:43:02.932 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
16:43:02.932 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
16:43:03.415 -> Discovering Client CSC Measurement CHR ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
16:43:03.851 -> Ready to receive Client FTM Control Point Response Messages
16:43:03.851 -> Ready to receive Client FTM Status values
16:43:03.898 -> Found it!
16:43:03.898 -> Discovering Client CSC Feature CHR ... Ready to receive Client FTM Indoor Bike Data values
16:43:03.945 -> Ready to receive Client CP Measurement values
16:43:03.991 -> Ready to receive Client CSC Measurement values
16:43:04.269 -> Found it!
16:43:04.347 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
16:43:04.347 -> Wheel rev supported
16:43:04.347 -> Crank rev supported
16:43:04.347 -> Discovering Client CSC Location CHR ... Found it!
16:43:04.973 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
16:43:04.973 -> Discovering Heart Rate Measurement (HR) Service ... Found it! HRMS Max Payload: 20 Data Length: 27
16:43:05.364 -> Discovering HR Measurement characteristic ... Found it!
16:43:05.785 -> Discovering HR Sensor Location characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
16:43:06.237 -> Found it!
16:43:06.237 -> -> Client Reads HR Location Sensor: Loc#: 0 Other
16:43:06.237 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]

poll_delay = 300 2eme test

16:44:33.399 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
16:44:33.399 -> ------------------- Version 03.1 --------------------
16:44:33.399 -> Discover polling delay setting: [300]
16:44:33.399 -> Setting NRF52840 BLE configuration parameters!
16:44:33.399 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:44:33.802 -> Board name: [Feather nRF52840 Express]
16:44:33.802 -> FTMS and Chars 'initialized'
16:44:33.802 -> CPS and Chars 'initialized'
16:44:33.802 -> CSCS and Chars 'initialized'
16:44:33.802 -> GA and Chars 'initialized'
16:44:33.802 -> DIS and Chars 'initialized'
16:44:33.802 -> HRMS and Chars 'initialized'
16:44:33.802 -> Start Scanning for CPS, CSC and FTMS!
16:44:33.802 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:44:33.802 -> Timestamp MAC Address Rssi Data
16:44:33.802 -> 000001239 F8:9C:FC:53:5E:49 -62 09-02-16-18-26-18-18-18-0A-18
16:44:33.803 -> --------- SoftDevice Config ---------
16:44:33.803 -> Max UUID128 : 10
16:44:33.803 -> ATTR Table Size : 4096
16:44:33.803 -> Service Changed : 1
16:44:33.803 -> Central Connect Setting
16:44:33.803 -> - Max MTU : 23
16:44:33.803 -> - Event Length : 6
16:44:33.803 -> - HVN Queue Size : 2
16:44:33.803 -> - WrCmd Queue Size: 1
16:44:33.803 ->
16:44:33.803 -> --------- BLE Settings ---------
16:44:33.803 -> Name : Feather nRF52840 Express
16:44:33.803 -> Max Connections : Peripheral = 0, Central = 1
16:44:33.803 -> Address : DD:CF:A6:C0:1A:11 (Static)
16:44:33.803 -> TX Power : 4 dBm
16:44:33.803 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
16:44:33.803 -> Conn Timeout : 2000 ms
16:44:33.803 -> Central Paired Devices:
16:44:33.803 ->
16:44:33.803 ->
16:44:33.803 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:44:33.803 -> Now checking all Client Services and Characteristics!
16:44:33.803 -> If Mandatory Services Fail --> the Client will disconnect!
16:44:33.803 -> Checking Generic Access and Device Information!
16:44:34.365 -> Found Client Generic Access
16:44:34.924 -> -> Client Reads Device Name: [Zwift Hub]
16:44:35.468 -> -> Client Reads Appearance: [1152]
16:44:35.888 -> Found Client Device Information
16:44:36.337 -> -> Client Reads Manufacturer: [Zwift]
16:44:36.866 -> -> Client Reads Model Number: [06]
16:44:37.412 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:44:37.412 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
16:44:37.772 -> Discovering Client FTM Control Point Characteristic ... Found it!
16:44:38.347 -> Discovering Client FTM Status Characteristic ... Found it!
16:44:38.982 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
16:44:39.528 -> Discovering Client FTM Feature Characteristic ... Found it!
16:44:40.169 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
16:44:40.214 -> - Fitness Machine Features:
16:44:40.214 -> Average Speed Supported
16:44:40.214 -> Cadence Supported
16:44:40.214 -> Total Distance Supported
16:44:40.214 -> Resistance Level Supported
16:44:40.214 -> Heart Rate Measurement Supported
16:44:40.214 -> Power Measurement Supported
16:44:40.214 -> - Target Setting Features:
16:44:40.214 -> Resistance Target Setting Supported
16:44:40.214 -> Power Target Setting Supported
16:44:40.214 -> Indoor Bike Simulation Parameters Supported
16:44:40.214 -> Wheel Circumference Configuration Supported
16:44:40.214 -> Spin Down Control Supported
16:44:40.214 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
16:44:40.731 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
16:44:41.185 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
16:44:41.185 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
16:44:41.775 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 00 00 01 00 ]
16:44:41.775 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
16:44:42.132 -> Discovering Client CP Measurement characteristic ... Found it!
16:44:42.848 -> Discovering Client CP Feature characteristic ... Found it!
16:44:43.408 -> -> Client Reads Raw CP Feature bytes: [4] [ 00 00 00 00 ]
16:44:43.408 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
16:44:43.953 -> Discovering Client CP Sensor Location characteristic ... Found it!
16:44:44.419 -> -> Client Reads CP Location Sensor: Loc#: 0 Other
16:44:44.419 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
16:44:44.777 -> Discovering Client CSC Measurement CHR ... Found it!
16:44:45.526 -> Discovering Client CSC Feature CHR ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
16:44:45.590 -> Ready to receive Client FTM Control Point Response Messages
16:44:45.590 -> Ready to receive Client FTM Status values
16:44:45.716 -> Ready to receive Client FTM Indoor Bike Data values
16:44:45.716 -> >>> Couldn't enable notify for Client CP Measurement Characteristic.
16:44:45.716 -> FTMS (trainer) is controlled by another Client (Training App)!
16:44:45.810 -> Not Found!
16:44:45.810 -> Disconnecting since Client CSC Feature CHR is mandatory!
16:44:45.965 -> Client Disconnected, reason = 0x16
16:44:45.965 -> >>> Restart the Feather nRF52 Client for a new run! <<<

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
First of all: my best wishes for 2023! That all your wishes may come true, in happiness and good health!

One of my wishes is to solve this persistent inability in your setup of the present Feather + (Client-)code to simply and consistently discover Services and/or Char's of a peripheral trainer..... That was never ever (!) a big deal with my setup nor with any other of the many Simcline users setups, TACX, Wahoo, Elite and others....! I have to admit that my bag of code tricks is about empty, I have played all my cards, including the joker!

I was able to reproduce the behavior that we see with the runs of the FTMS_Client in your setup! I had placed my fake FTMS Server (on a Feather nRF52840) in the next room about 4 meters away from my FTMS_Client, running on an other Feather board: it still was able to connect (RSSI = -68) but discovering Services on the peripheral/server failed sometimes and also readings delivered zero values instead of the real values that were programmatically set in the server! So I have increased the TxPower(4) in the FTMS_Client code. You will see that value in the present code version (in setup()), that you are running! So I was quite optimistic about the results... It makes sense that when the BLE signal strength is around (above or below) a critical level some of the BLE actions (Discover/Read/NotifyEnable) are successful and others are not in a random pattern! However, I can only increase the signal strength of the Client and Server, but NOT of the trainer. I see RSSI values of around -65 in the above output... Is that at a critical level? Possibly, but it depends of many other factors! It is definitely not a high value, on the contrary!

So you are invited to experiment with and around your physical setup (apply your creativity), run the FTMS_Client code after the setup has changed and look for improvement(s) in the output.... (you know by now what to look for!)
Some suggestions that I figured out:
Move the Feather closer to the trainer to start with! Get within one meter distance! I have always assumed all the components of your setup are in the same room and closely nearby......is that true? Is a potential active BLE jammer present in the room or nearby? BLE dongle, Router, .... May be passive large metal objects? High power electrical wiring? Elevator shaft nearby?
Has the USB port on your PC, that is powering the Feather, enough capacity to drive the Feather (+other components?)? After all the strength of the BLE radio signal is influenced by the supplied power capacity (Watt = Voltage*Current)! Yes it will supply 5V but also the required (milli) Amperes over the USB cable?
Use nRF Connect to scan advertising devices (Trainer, BLE Dongle, et cetera) and look for the RSSI values, move around the room and check how these change! Values above -70? Notice that you can check only the FTMS_Server and not the FTMS_Client... What is the RSSI value of the FTMS_Server, measured when you hold nRF Connect close to the trainer?
Well I sincerely hope that you can improve the results with some simple adjustments of the present setup!
Fingers crossed!
Best wishes,
Jörgen.

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

I have uploaded new versions, including a Simcline FTMS version that is up to date with the other version.
Best wishes,
Jörgen.

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
I was busy the last week with exploring the BLE libraries for another board: Adafruit ESP32 Feather V2, a.k.a. Huzzah. I was porting parts of the FTMS_Client and then I came across unsafe use of sizeof() in the original code.... So I corrected the code and uploaded the new versions! Please give it a try! You never know if this is the source of all evil!
I hope you have made progress finding an external cause for the persistent unexpected behavior and even if that is not the case I would very much appreciate if you keep me posted of your progress!
Best wishes,
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorghen,
I did a lot of testing with the version before this one.
The results were always random.
I checked everything and found nothing.
in the meantime I took over a version of the client which was the most stable with a server version and the different motor control because I work with relays because the 2 DVR cards do not work with my motor.
I'm nearing the end of assembly.
I will try this weekend the version deposited on the github.
Have a good evening.

Joel.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorghen,

Here are 3 test results with FTMS_Client_v033.

They are slightly different but still not 100%.

On the other hand, if you have this service imperative to make a lift that works, I think it works.

13:59:44.231 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
13:59:44.231 -> ------------------- Version 03.3 --------------------
13:59:44.231 -> Discover polling delay setting: [250]
13:59:44.231 -> Setting NRF52840 BLE configuration parameters!
13:59:44.231 -> Initialise the Bluefruit nRF52 module: Client (Central)
13:59:44.231 -> Board name: [Feather nRF52840 Express]
13:59:44.231 -> FTMS and Chars 'initialized'
13:59:44.231 -> CPS and Chars 'initialized'
13:59:44.231 -> CSCS and Chars 'initialized'
13:59:44.231 -> GA and Chars 'initialized'
13:59:44.231 -> DIS and Chars 'initialized'
13:59:44.231 -> HRMS and Chars 'initialized'
13:59:44.231 -> Start Scanning for CPS, CSC and FTMS!
13:59:44.231 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
13:59:44.231 -> Timestamp MAC Address Rssi Data
13:59:44.231 -> 000000658 F8:9C:FC:53:5E:49 -61 09-02-16-18-26-18-18-18-0A-18
13:59:45.468 -> --------- SoftDevice Config ---------
13:59:45.468 -> Max UUID128 : 3
13:59:45.468 -> ATTR Table Size : 4096
13:59:45.468 -> Service Changed : 1
13:59:45.468 -> Central Connect Setting
13:59:45.468 -> - Max MTU : 23
13:59:45.468 -> - Event Length : 6
13:59:45.468 -> - HVN Queue Size : 2
13:59:45.469 -> - WrCmd Queue Size: 1
13:59:45.469 ->
13:59:45.469 ->
13:59:45.469 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
13:59:45.469 -> Now checking all Client Services and Characteristics!
13:59:45.469 -> If Mandatory Services Fail --> the Client will disconnect!
13:59:45.469 -> Checking Generic Access and Device Information!
13:59:45.707 -> Found Client Generic Access
13:59:45.708 -> -> Client Reads Device Name: [Zwift Hub]
13:59:46.118 -> -> Client Reads Appearance: [1152]
13:59:46.570 -> Found Client Device Information
13:59:47.097 -> -> Client Reads Manufacturer: [Zwift]
13:59:47.515 -> -> Client Reads Model Number: [06]
13:59:47.933 -> -> Client Reads Serial Number: [06-F89CFC535E49]
13:59:47.933 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
13:59:48.684 -> Discovering Client FTM Control Point Characteristic ... Found it!
13:59:49.289 -> Discovering Client FTM Status Characteristic ... Found it!
13:59:49.784 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
13:59:50.190 -> Discovering Client FTM Feature Characteristic ... Found it!
13:59:50.594 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
13:59:50.594 -> - Fitness Machine Features:
13:59:50.594 -> Average Speed Supported
13:59:50.594 -> Cadence Supported
13:59:50.594 -> Total Distance Supported
13:59:50.594 -> Resistance Level Supported
13:59:50.594 -> Heart Rate Measurement Supported
13:59:50.594 -> Power Measurement Supported
13:59:50.594 -> - Target Setting Features:
13:59:50.594 -> Resistance Target Setting Supported
13:59:50.594 -> Power Target Setting Supported
13:59:50.594 -> Indoor Bike Simulation Parameters Supported
13:59:50.594 -> Wheel Circumference Configuration Supported
13:59:50.594 -> Spin Down Control Supported
13:59:50.594 -> Spin Down Control Supported
13:59:50.594 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
13:59:51.230 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
13:59:51.586 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
13:59:51.586 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
13:59:52.049 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 00 00 00 00 ]
13:59:52.049 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
13:59:52.418 -> Discovering Client CP Measurement characteristic ... Found it!
13:59:52.791 -> Discovering Client CP Feature characteristic ... Found it!
13:59:53.241 -> -> Client Reads Raw CP Feature bytes: [4] [ 00 00 00 00 ]
13:59:53.241 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
13:59:53.876 -> Discovering Client CP Sensor Location characteristic ... Found it!
13:59:54.280 -> -> Client Reads CP Location Sensor: Loc#: 0 Other
13:59:54.280 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
13:59:54.592 -> Discovering Client CSC Measurement CHR ... Found it!
13:59:55.153 -> Discovering Client CSC Feature CHR ... Found it!
13:59:55.512 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
13:59:55.512 -> Wheel rev supported
13:59:55.512 -> Crank rev supported
13:59:55.512 -> Discovering Client CSC Location CHR ... Found it!
13:59:55.977 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
13:59:55.977 -> Discovering Heart Rate Measurement (HR) Service ... Found it! HRMS Max Payload: 20 Data Length: 27
13:59:56.286 -> Discovering HR Measurement characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
13:59:56.675 -> Found it!
13:59:56.675 -> Discovering HR Sensor Location characteristic ... Found it!
13:59:57.268 -> -> Client Reads HR Location Sensor: Loc#: 0 Other
13:59:57.268 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
13:59:57.268 -> Ready to receive Client FTM Control Point Response Messages
13:59:57.268 -> Ready to receive Client FTM Status values
13:59:57.345 -> Ready to receive Client FTM Indoor Bike Data values
13:59:57.391 -> Ready to receive Client CP Measurement values
13:59:57.431 -> Ready to receive Client CSC Measurement values
13:59:57.471 -> Ready to receive Client HR Measurement values
13:59:57.830 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:59:57.830 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:59:57.876 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
13:59:57.876 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
13:59:58.575 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
13:59:58.651 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
13:59:58.839 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:59:58.839 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:59:58.839 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
13:59:58.839 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
13:59:59.874 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
13:59:59.874 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
13:59:59.874 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
13:59:59.874 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
14:00:00.657 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
14:00:00.733 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 07 01 ]
14:00:00.733 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 04 ]
14:00:00.811 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]

14:11:14.157 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
14:11:14.157 -> ------------------- Version 03.3 --------------------
14:11:14.157 -> Discover polling delay setting: [250]
14:11:14.157 -> Setting NRF52840 BLE configuration parameters!
14:11:14.157 -> Initialise the Bluefruit nRF52 module: Client (Central)
14:11:14.801 -> Board name: [Feather nRF52840 Express]
14:11:14.801 -> FTMS and Chars 'initialized'
14:11:14.801 -> CPS and Chars 'initialized'
14:11:14.801 -> CSCS and Chars 'initialized'
14:11:14.801 -> GA and Chars 'initialized'
14:11:14.801 -> DIS and Chars 'initialized'
14:11:14.801 -> HRMS and Chars 'initialized'
14:11:14.801 -> Start Scanning for CPS, CSC and FTMS!
14:11:14.801 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
14:11:14.801 -> Timestamp MAC Address Rssi Data
14:11:14.801 -> 000002056 F8:9C:FC:53:5E:49 -65 09-02-16-18-26-18-18-18-0A-18
14:11:14.802 -> --------- SoftDevice Config ---------
14:11:14.802 -> Max UUID128 : 3
14:11:14.802 -> ATTR Table Size : 4096
14:11:14.802 -> Service Changed : 1
14:11:14.802 -> Central Connect Setting
14:11:14.802 -> - Max MTU : 23
14:11:14.802 -> - Event Length : 6
14:11:14.802 -> - HVN Queue Size : 2
14:11:14.802 -> - WrCmd Queue Size: 1
14:11:14.802 ->
14:11:14.802 -> --------- BLE Settings ---------
14:11:14.802 -> Name : Feather nRF52840 Express
14:11:14.802 -> Max Connections : Peripheral = 0, Central = 1
14:11:14.802 -> Address : DD:CF:A6:C0:1A:11 (Static)
14:11:14.802 -> TX Power : 4 dBm
14:11:14.802 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
14:11:14.802 -> Conn Timeout : 2000 ms
14:11:14.802 -> Central Paired Devices:
14:11:14.802 ->
14:11:14.802 ->
14:11:14.802 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
14:11:14.802 -> Now checking all Client Services and Characteristics!
14:11:14.802 -> If Mandatory Services Fail --> the Client will disconnect!
14:11:14.802 -> Checking Generic Access and Device Information!
14:11:15.009 -> Found Client Generic Access
14:11:15.582 -> -> Client Reads Device Name: [Zwift Hub]
14:11:15.951 -> -> Client Reads Appearance: [1152]
14:11:16.369 -> Found Client Device Information
14:11:16.926 -> -> Client Reads Manufacturer: [Zwift]
14:11:17.284 -> -> Client Reads Model Number: [06]
14:11:17.719 -> -> Client Reads Serial Number: [06-F89CFC535E49]
14:11:17.719 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
14:11:18.106 -> Discovering Client FTM Control Point Characteristic ... Found it!
14:11:18.757 -> Discovering Client FTM Status Characteristic ... Found it!
14:11:19.270 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
14:11:19.719 -> Discovering Client FTM Feature Characteristic ... Found it!
14:11:20.279 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
14:11:20.280 -> - Fitness Machine Features:
14:11:20.280 -> - Target Setting Features:
14:11:20.280 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
14:11:20.864 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
14:11:21.222 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
14:11:21.222 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
14:11:21.813 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
14:11:21.813 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
14:11:22.229 -> Discovering Client CP Measurement characteristic ... Found it!
14:11:22.929 -> Discovering Client CP Feature characteristic ... Found it!
14:11:23.331 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
14:11:23.331 -> Wheel revolution data supported
14:11:23.331 -> Crank revolution data supported
14:11:23.331 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
14:11:23.737 -> Discovering Client CP Sensor Location characteristic ... Found it!
14:11:24.228 -> -> Client Reads CP Location Sensor: Loc#: 0 Other
14:11:24.228 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
14:11:24.554 -> Discovering Client CSC Measurement CHR ... Found it!
14:11:24.929 -> Discovering Client CSC Feature CHR ... Found it!
14:11:25.366 -> -> Client Reads Raw CSC Feature bytes: [2] [ 00 00 ]
14:11:25.366 -> Discovering Client CSC Location CHR ... Found it!
14:11:25.769 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
14:11:25.769 -> Discovering Heart Rate Measurement (HR) Service ... Found it! HRMS Max Payload: 20 Data Length: 27
14:11:26.081 -> Discovering HR Measurement characteristic ... Found it!
14:11:26.423 -> Discovering HR Sensor Location characteristic ... Found it!
14:11:26.827 -> -> Client Reads HR Location Sensor: Loc#: 0 Other
14:11:26.827 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
14:11:26.827 -> Ready to receive Client FTM Control Point Response Messages
14:11:26.827 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
14:11:26.827 -> Ready to receive Client FTM Status values
14:11:26.920 -> Ready to receive Client FTM Indoor Bike Data values
14:11:26.966 -> Ready to receive Client CP Measurement values
14:11:26.998 -> Ready to receive Client CSC Measurement values
14:11:27.043 -> Ready to receive Client HR Measurement values
14:11:27.528 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
14:11:27.528 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
14:11:27.528 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
14:11:27.528 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
14:11:28.626 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
14:11:28.626 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
14:11:28.627 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
14:11:28.627 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
14:11:28.844 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
14:11:28.922 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
14:11:29.606 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
14:11:29.606 -> Heart Beats: 0 HBM (8) Contact is NOT detected!

14:22:53.923 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
14:22:53.923 -> ------------------- Version 03.3 --------------------
14:22:53.923 -> Discover polling delay setting: [250]
14:22:53.923 -> Setting NRF52840 BLE configuration parameters!
14:22:53.923 -> Initialise the Bluefruit nRF52 module: Client (Central)
14:22:53.923 -> Board name: [Feather nRF52840 Express]
14:22:53.923 -> FTMS and Chars 'initialized'
14:22:53.923 -> CPS and Chars 'initialized'
14:22:53.923 -> CSCS and Chars 'initialized'
14:22:53.923 -> GA and Chars 'initialized'
14:22:53.923 -> DIS and Chars 'initialized'
14:22:53.923 -> HRMS and Chars 'initialized'
14:22:53.923 -> Start Scanning for CPS, CSC and FTMS!
14:22:53.923 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
14:22:53.923 -> Timestamp MAC Address Rssi Data
14:22:53.923 -> 000001375 F8:9C:FC:53:5E:49 -61 09-02-16-18-26-18-18-18-0A-18
14:22:53.924 -> --------- SoftDevice Config ---------
14:22:53.924 -> Max UUID128 : 3
14:22:53.924 -> ATTR Table Size : 4096
14:22:53.924 -> Service Changed : 1
14:22:53.924 -> Central Connect Setting
14:22:53.924 -> - Max MTU : 23
14:22:53.924 -> - Event Length : 6
14:22:53.924 -> - HVN Queue Size : 2
14:22:53.924 -> - WrCmd Queue Size: 1
14:22:53.924 ->
14:22:53.924 -> --------- BLE Settings ---------
14:22:53.924 -> Name : Feather nRF52840 Express
14:22:53.924 -> Max Connections : Peripheral = 0, Central = 1
14:22:53.924 -> Address : DD:CF:A6:C0:1A:11 (Static)
14:22:53.924 -> TX Power : 4 dBm
14:22:53.924 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
14:22:53.924 -> Conn Timeout : 2000 ms
14:22:53.924 -> Central Paired Devices:
14:22:53.924 ->
14:22:53.924 ->
14:22:53.924 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
14:22:53.924 -> Now checking all Client Services and Characteristics!
14:22:53.924 -> If Mandatory Services Fail --> the Client will disconnect!
14:22:53.924 -> Checking Generic Access and Device Information!
14:22:53.948 -> Found Client Generic Access
14:22:54.427 -> -> Client Reads Device Name: [Zwift Hub]
14:22:54.832 -> -> Client Reads Appearance: [0]
14:22:55.156 -> Found Client Device Information
14:22:55.778 -> -> Client Reads Manufacturer: [Zwift]
14:22:56.182 -> -> Client Reads Model Number: [06]
14:22:56.584 -> -> Client Reads Serial Number: [06-F89CFC535E49]
14:22:56.584 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
14:22:57.051 -> Discovering Client FTM Control Point Characteristic ... Found it!
14:22:57.750 -> Discovering Client FTM Status Characteristic ... Found it!
14:22:58.445 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
14:22:59.051 -> Discovering Client FTM Feature Characteristic ... Found it!
14:22:59.423 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
14:22:59.423 -> - Fitness Machine Features:
14:22:59.423 -> Average Speed Supported
14:22:59.423 -> Cadence Supported
14:22:59.423 -> Total Distance Supported
14:22:59.423 -> Resistance Level Supported
14:22:59.423 -> Heart Rate Measurement Supported
14:22:59.423 -> Power Measurement Supported
14:22:59.423 -> - Target Setting Features:
14:22:59.423 -> Resistance Target Setting Supported
14:22:59.423 -> Power Target Setting Supported
14:22:59.423 -> Indoor Bike Simulation Parameters Supported
14:22:59.423 -> Wheel Circumference Configuration Supported
14:22:59.423 -> Spin Down Control Supported
14:22:59.423 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
14:22:59.919 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
14:23:00.321 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 00 00 00 00 ]
14:23:00.321 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
14:23:01.006 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
14:23:01.006 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
14:23:01.522 -> Discovering Client CP Measurement characteristic ... Found it!
14:23:01.913 -> Discovering Client CP Feature characteristic ... Found it!
14:23:02.363 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
14:23:02.363 -> Wheel revolution data supported
14:23:02.363 -> Crank revolution data supported
14:23:02.363 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
14:23:02.862 -> Discovering Client CP Sensor Location characteristic ... Found it!
14:23:03.285 -> -> Client Reads CP Location Sensor: Loc#: 0 Other
14:23:03.285 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
14:23:03.661 -> Discovering Client CSC Measurement CHR ... Found it!
14:23:04.265 -> Discovering Client CSC Feature CHR ... Found it!
14:23:04.762 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
14:23:04.762 -> Wheel rev supported
14:23:04.762 -> Crank rev supported
14:23:04.762 -> Discovering Client CSC Location CHR ... Found it!
14:23:05.254 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
14:23:05.254 -> Discovering Heart Rate Measurement (HR) Service ... Found it! HRMS Max Payload: 20 Data Length: 27
14:23:05.562 -> Discovering HR Measurement characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
14:23:06.057 -> Found it!
14:23:06.057 -> Discovering HR Sensor Location characteristic ... Found it!
14:23:06.445 -> -> Client Reads HR Location Sensor: Loc#: 1 Chest
14:23:06.445 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
14:23:06.445 -> Ready to receive Client FTM Control Point Response Messages
14:23:06.445 -> Ready to receive Client FTM Status values
14:23:06.485 -> Ready to receive Client FTM Indoor Bike Data values
14:23:06.522 -> Ready to receive Client CP Measurement values
14:23:06.566 -> Ready to receive Client CSC Measurement values
14:23:06.600 -> Ready to receive Client HR Measurement values
14:23:07.217 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
14:23:07.217 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
14:23:07.217 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
14:23:07.217 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
14:23:07.664 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
14:23:07.789 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
14:23:08.253 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
14:23:08.253 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
14:23:08.253 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
14:23:08.253 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
14:23:09.220 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
14:23:09.220 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
14:23:09.220 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
14:23:09.220 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
14:23:09.778 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
14:23:09.848 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 07 01 ]
14:23:09.848 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [ 04 ]
14:23:10.274 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
14:23:10.274 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
14:23:10.274 -> -> Client Rec'd Raw FTM Indoor Bike Data: [20] [ FE 02 00 00 00 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 ]
14:23:10.274 -> Instant. Speed: 0 KPH Average Speed: 0 KPH Instantaneous Cadence: 0 RPM Average Cadence: 0 RPM Total Distance: 0 m Resistance Level: 20 Instantaneous Power: 0 Watt Average Power: 0 Watt Heart Rate: 0 HBM
14:23:11.206 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
The good news is that in the 3 runs no (more) problems occur during Service or Char detection, these discoveries all succeed!
Unfortunately sometimes a Client read action does not deliver the value that we expect...????
In the Client version 3.4 I have inserted another delay after every Char discovery directly followed by a read action. Experimentally the value is set to 50 ms being a value that I came across with ESP32 BLE libraries and stack congestion issues... Just a wild guess, since this is a nRF52 processor!
So please give it a try and set poll_delay to 250 ms, since that is working and see what happens with the second delay when it is set to 50 ms..... Fingers crossed!
Best wishes,
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorghen,

Here are the results with the FTMS Client V3.4

The best results are with 250 ms and 100 ms.

17:00:10.598 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
17:00:10.598 -> ------------------- Version 03.4 --------------------
17:00:10.598 -> Poll and fetch delay settings: [250]ms [50]ms
17:00:10.598 -> Setting NRF52840 BLE configuration parameters!
17:00:10.598 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:00:10.598 -> Board name: [Feather nRF52840 Express]
17:00:10.598 -> FTMS and Chars 'initialized'
17:00:10.598 -> CPS and Chars 'initialized'
17:00:10.598 -> CSCS and Chars 'initialized'
17:00:10.598 -> GA and Chars 'initialized'
17:00:10.598 -> DIS and Chars 'initialized'
17:00:10.598 -> HRMS and Chars 'initialized'
17:00:10.598 -> Start Scanning for CPS, CSC and FTMS!
17:00:10.598 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:00:10.598 -> Timestamp MAC Address Rssi Data
17:00:10.598 -> 000000642 F8:9C:FC:53:5E:49 -58 09-02-16-18-26-18-18-18-0A-18
17:00:10.598 -> --------- SoftDevice Config ---------
17:00:10.598 -> Max UUID128 : 3
17:00:10.598 -> ATTR Table Size : 4096
17:00:10.598 -> Service Changed : 1
17:00:10.598 -> Central Connect Setting
17:00:10.598 -> - Max MTU : 23
17:00:10.598 -> - Event Length : 6
17:00:10.598 -> - HVN Queue Size : 2
17:00:10.598 -> - WrCmd Queue Size: 1
17:00:10.598 ->
17:00:10.598 -> --------- BLE Settings ---------
17:00:10.598 -> Name : Feather nRF52840 Express
17:00:10.598 -> Max Connections : Peripheral = 0, Central = 1
17:00:10.598 -> Address : DD:CF:A6:C0:1A:11 (Static)
17:00:10.598 -> TX Power : 4 dBm
17:00:10.598 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
17:00:10.598 -> Conn Timeout : 2000 ms
17:00:10.598 -> Central Paired Devices:
17:00:10.598 ->
17:00:10.598 ->
17:00:10.598 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:00:10.598 -> Now checking all Client Services and Characteristics!
17:00:10.598 -> If Mandatory Services Fail --> the Client will disconnect!
17:00:10.598 -> Checking Generic Access and Device Information!
17:00:11.069 -> Found Client Generic Access
17:00:11.300 -> -> Client Reads Device Name: [Zwift Hub]
17:00:11.474 -> -> Client Reads Appearance: [0]
17:00:11.706 -> Not Found Client Device Information!
17:00:11.706 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:00:12.031 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:00:12.525 -> Discovering Client FTM Status Characteristic ... Found it!
17:00:13.251 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:00:13.714 -> Discovering Client FTM Feature Characteristic ... Found it!
17:00:14.132 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
17:00:14.132 -> - Fitness Machine Features:
17:00:14.132 -> - Target Setting Features:
17:00:14.132 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:00:14.409 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:00:14.829 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
17:00:14.829 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
17:00:15.371 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
17:00:15.371 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:00:15.743 -> Discovering Client CP Measurement characteristic ... Found it!
17:00:16.207 -> Discovering Client CP Feature characteristic ... Found it!
17:00:16.691 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
17:00:16.691 -> Wheel revolution data supported
17:00:16.691 -> Crank revolution data supported
17:00:16.691 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
17:00:17.081 -> Discovering Client CP Sensor Location characteristic ... Found it!
17:00:17.516 -> -> Client Reads CP Location Sensor: Loc#: 0 Other
17:00:17.516 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
17:00:17.827 -> Discovering Client CSC Measurement CHR ... Found it!
17:00:18.369 -> Discovering Client CSC Feature CHR ... Found it!
17:00:18.820 -> -> Client Reads Raw CSC Feature bytes: [2] [ 00 00 ]
17:00:18.820 -> Discovering Client CSC Location CHR ... Found it!
17:00:19.286 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
17:00:19.286 -> Discovering Heart Rate Measurement (HR) Service ... Found it! HRMS Max Payload: 20 Data Length: 27
17:00:19.610 -> Discovering HR Measurement characteristic ... Found it!
17:00:20.059 -> Discovering HR Sensor Location characteristic ... Found it!
17:00:20.509 -> -> Client Reads HR Location Sensor: Loc#: 1 Chest
17:00:20.509 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
17:00:20.509 -> Ready to receive Client FTM Control Point Response Messages
17:00:20.541 -> Ready to receive Client FTM Status values
17:00:20.586 -> Ready to receive Client FTM Indoor Bike Data values
17:00:20.633 -> Ready to receive Client CP Measurement values
17:00:20.679 -> Ready to receive Client CSC Measurement values
17:00:20.726 -> Ready to receive Client HR Measurement values
17:00:21.287 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
17:00:21.287 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
17:00:21.287 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
17:00:21.287 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
17:00:22.326 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
17:00:22.326 -> Heart Beats: 0 HBM (8) Contact is NOT detected!

17:02:08.844 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
17:02:08.844 -> ------------------- Version 03.4 --------------------
17:02:08.844 -> Poll and fetch delay settings: [300]ms [75]ms
17:02:09.202 -> Setting NRF52840 BLE configuration parameters!
17:02:09.202 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:02:09.845 -> Board name: [Feather nRF52840 Express]
17:02:09.845 -> FTMS and Chars 'initialized'
17:02:09.845 -> CPS and Chars 'initialized'
17:02:09.845 -> CSCS and Chars 'initialized'
17:02:09.845 -> GA and Chars 'initialized'
17:02:09.845 -> DIS and Chars 'initialized'
17:02:09.845 -> HRMS and Chars 'initialized'
17:02:09.845 -> Start Scanning for CPS, CSC and FTMS!
17:02:09.845 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:02:09.845 -> Timestamp MAC Address Rssi Data
17:02:09.845 -> 000000633 F8:9C:FC:53:5E:49 -60 09-02-16-18-26-18-18-18-0A-18
17:02:10.531 -> --------- SoftDevice Config ---------
17:02:10.531 -> Max UUID128 : 3
17:02:10.531 -> ATTR Table Size : 4096
17:02:10.531 -> Service Changed : 1
17:02:10.531 -> Central Connect Setting
17:02:10.531 -> - Max MTU : 23
17:02:10.531 -> - Event Length : 6
17:02:10.531 -> - HVN Queue Size : 2
17:02:10.531 -> - WrCmd Queue Size: 1
17:02:10.531 ->
17:02:10.531 -> --------- BLE Settings ---------
17:02:10.531 -> Name : Feather nRF52840 Express
17:02:10.531 -> Max Connections : Peripheral = 0, Central = 1
17:02:10.531 -> Address : DD:CF:A6:C0:1A:11 (Static)
17:02:10.531 -> TX Power : 4 dBm
17:02:10.531 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
17:02:10.531 -> Conn Timeout : 2000 ms
17:02:10.531 -> Central Paired Devices:
17:02:10.531 ->
17:02:10.531 ->
17:02:10.531 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:02:10.531 -> Now checking all Client Services and Characteristics!
17:02:10.531 -> If Mandatory Services Fail --> the Client will disconnect!
17:02:10.531 -> Checking Generic Access and Device Information!
17:02:10.550 -> Found Client Generic Access
17:02:10.550 -> -> Client Reads Device Name: [Zwift Hub]
17:02:11.084 -> -> Client Reads Appearance: [1152]
17:02:11.690 -> Found Client Device Information
17:02:12.231 -> -> Client Reads Manufacturer: [Zwift]
17:02:12.726 -> -> Client Reads Model Number: [06]
17:02:13.326 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:02:13.327 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:02:13.761 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:02:14.301 -> Discovering Client FTM Status Characteristic ... Found it!
17:02:15.232 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:02:15.831 -> Discovering Client FTM Feature Characteristic ... Found it!
17:02:16.388 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
17:02:16.388 -> - Fitness Machine Features:
17:02:16.388 -> Average Speed Supported
17:02:16.388 -> Cadence Supported
17:02:16.388 -> Total Distance Supported
17:02:16.388 -> Resistance Level Supported
17:02:16.388 -> Heart Rate Measurement Supported
17:02:16.388 -> Power Measurement Supported
17:02:16.388 -> Spin Down Control Supported
17:02:16.388 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:02:17.103 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:02:17.630 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 00 00 00 00 ]
17:02:17.630 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
17:02:18.269 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
17:02:18.269 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:02:18.615 -> Discovering Client CP Measurement characteristic ... Found it!
17:02:19.220 -> Discovering Client CP Feature characteristic ... Found it!
17:02:19.887 -> -> Client Reads Raw CP Feature bytes: [4] [ 00 00 00 00 ]
17:02:19.887 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
17:02:20.352 -> Discovering Client CP Sensor Location characteristic ... Found it!
17:02:21.079 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
17:02:21.079 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
17:02:21.437 -> Discovering Client CSC Measurement CHR ... Found it!
17:02:21.902 -> Discovering Client CSC Feature CHR ... Found it!
17:02:22.446 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
17:02:22.446 -> Wheel rev supported
17:02:22.446 -> Crank rev supported
17:02:22.446 -> Discovering Client CSC Location CHR ... Found it!
17:02:22.959 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
17:02:22.959 -> Discovering Heart Rate Measurement (HR) Service ... Found it! HRMS Max Payload: 20 Data Length: 27
17:02:23.622 -> Discovering HR Measurement characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:02:24.371 -> Found it!
17:02:24.371 -> Discovering HR Sensor Location characteristic ... Found it!
17:02:24.987 -> -> Client Reads HR Location Sensor: Loc#: 1 Chest
17:02:24.987 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
17:02:24.987 -> Ready to receive Client FTM Control Point Response Messages
17:02:25.022 -> Ready to receive Client FTM Status values
17:02:25.054 -> Ready to receive Client FTM Indoor Bike Data values
17:02:25.100 -> Ready to receive Client CP Measurement values
17:02:25.146 -> Ready to receive Client CSC Measurement values
17:02:25.192 -> Ready to receive Client HR Measurement values
17:02:25.504 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
17:02:25.504 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
17:02:25.504 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
17:02:25.504 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
17:02:26.067 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:02:26.159 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
17:02:26.285 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
17:02:26.285 -> Heart Beats: 0 HBM (8) Contact is NOT detected!

17:08:12.160 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
17:08:12.160 -> ------------------- Version 03.4 --------------------
17:08:12.160 -> Poll and fetch delay settings: [300]ms [75]ms
17:08:12.160 -> Setting NRF52840 BLE configuration parameters!
17:08:12.160 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:08:12.160 -> Board name: [Feather nRF52840 Express]
17:08:12.160 -> FTMS and Chars 'initialized'
17:08:12.160 -> CPS and Chars 'initialized'
17:08:12.160 -> CSCS and Chars 'initialized'
17:08:12.160 -> GA and Chars 'initialized'
17:08:12.160 -> DIS and Chars 'initialized'
17:08:12.160 -> HRMS and Chars 'initialized'
17:08:12.160 -> Start Scanning for CPS, CSC and FTMS!
17:08:12.160 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:08:12.160 -> Timestamp MAC Address Rssi Data
17:08:12.160 -> 000000652 F8:9C:FC:53:5E:49 -54 09-02-16-18-26-18-18-18-0A-18
17:08:12.636 -> --------- SoftDevice Config ---------
17:08:12.636 -> Max UUID128 : 3
17:08:12.636 -> ATTR Table Size : 4096
17:08:12.636 -> Service Changed : 1
17:08:12.636 -> Central Connect Setting
17:08:12.636 -> - Max MTU : 23
17:08:12.636 -> - Event Length : 6
17:08:12.636 -> - HVN Queue Size : 2
17:08:12.636 -> - WrCmd Queue Size: 1
17:08:12.636 ->
17:08:12.636 -> --------- BLE Settings ---------
17:08:12.636 -> Name : Feather nRF52840 Express
17:08:12.636 -> Max Connections : Peripheral = 0, Central = 1
17:08:12.636 -> Address : DD:CF:A6:C0:1A:11 (Static)
17:08:12.636 -> TX Power : 4 dBm
17:08:12.636 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
17:08:12.636 -> Conn Timeout : 2000 ms
17:08:12.636 -> Central Paired Devices:
17:08:12.636 ->
17:08:12.636 ->
17:08:12.636 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:08:12.636 -> Now checking all Client Services and Characteristics!
17:08:12.636 -> If Mandatory Services Fail --> the Client will disconnect!
17:08:12.636 -> Checking Generic Access and Device Information!
17:08:12.904 -> Found Client Generic Access
17:08:13.027 -> -> Client Reads Device Name: [Zwift Hub]
17:08:13.449 -> -> Client Reads Appearance: [0]
17:08:13.913 -> Found Client Device Information
17:08:14.395 -> -> Client Reads Manufacturer: [Zwift]
17:08:14.937 -> -> Client Reads Model Number: [06]
17:08:15.678 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:08:15.678 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:08:16.079 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:08:16.684 -> Discovering Client FTM Status Characteristic ... Found it!
17:08:17.271 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:08:17.719 -> Discovering Client FTM Feature Characteristic ... Found it!
17:08:18.216 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
17:08:18.216 -> - Fitness Machine Features:
17:08:18.216 -> Average Speed Supported
17:08:18.216 -> Cadence Supported
17:08:18.216 -> Total Distance Supported
17:08:18.216 -> Resistance Level Supported
17:08:18.216 -> Heart Rate Measurement Supported
17:08:18.216 -> Power Measurement Supported
17:08:18.216 -> - Target Setting Features:
17:08:18.216 -> Resistance Target Setting Supported
17:08:18.216 -> Power Target Setting Supported
17:08:18.216 -> Indoor Bike Simulation Parameters Supported
17:08:18.216 -> Wheel Circumference Configuration Supported
17:08:18.216 -> Spin Down Control Supported
17:08:18.216 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:08:18.776 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:08:19.385 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 00 00 00 00 ]
17:08:19.385 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
17:08:20.005 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 00 00 00 00 ]
17:08:20.005 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:08:20.347 -> Discovering Client CP Measurement characteristic ... Found it!
17:08:20.858 -> Discovering Client CP Feature characteristic ... Found it!
17:08:21.573 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
17:08:21.573 -> Wheel revolution data supported
17:08:21.573 -> Crank revolution data supported
17:08:21.573 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
17:08:22.209 -> Discovering Client CP Sensor Location characteristic ... Found it!
17:08:22.890 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
17:08:22.890 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
17:08:23.356 -> Discovering Client CSC Measurement CHR ... Found it!
17:08:24.175 -> Discovering Client CSC Feature CHR ... Found it!
17:08:24.765 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
17:08:24.765 -> Wheel rev supported
17:08:24.765 -> Crank rev supported
17:08:24.765 -> Discovering Client CSC Location CHR ... Found it!
17:08:25.233 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
17:08:25.233 -> Discovering Heart Rate Measurement (HR) Service ... Found it! HRMS Max Payload: 20 Data Length: 27
17:08:25.639 -> Discovering HR Measurement characteristic ... Found it!
17:08:26.107 -> Discovering HR Sensor Location characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:08:26.754 -> Found it!
17:08:26.754 -> -> Client Reads HR Location Sensor: Loc#: 1 Chest
17:08:26.754 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
17:08:26.754 -> Ready to receive Client FTM Control Point Response Messages
17:08:26.791 -> Ready to receive Client FTM Status values
17:08:26.837 -> Ready to receive Client FTM Indoor Bike Data values
17:08:26.874 -> Ready to receive Client CP Measurement values
17:08:26.919 -> Ready to receive Client CSC Measurement values
17:08:26.962 -> Ready to receive Client HR Measurement values
17:08:27.338 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
17:08:27.338 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
17:08:27.338 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
17:08:27.338 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM

17:14:18.436 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
17:14:18.436 -> ------------------- Version 03.4 --------------------
17:14:18.436 -> Poll and fetch delay settings: [250]ms [100]ms
17:14:18.436 -> Setting NRF52840 BLE configuration parameters!
17:14:18.436 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:14:19.491 -> Board name: [Feather nRF52840 Express]
17:14:19.491 -> FTMS and Chars 'initialized'
17:14:19.491 -> CPS and Chars 'initialized'
17:14:19.491 -> CSCS and Chars 'initialized'
17:14:19.491 -> GA and Chars 'initialized'
17:14:19.491 -> DIS and Chars 'initialized'
17:14:19.491 -> HRMS and Chars 'initialized'
17:14:19.491 -> Start Scanning for CPS, CSC and FTMS!
17:14:19.491 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:14:19.491 -> Timestamp MAC Address Rssi Data
17:14:19.491 -> 000001312 F8:9C:FC:53:5E:49 -57 09-02-16-18-26-18-18-18-0A-18
17:14:19.491 -> --------- SoftDevice Config ---------
17:14:19.491 -> Max UUID128 : 3
17:14:19.491 -> ATTR Table Size : 4096
17:14:19.491 -> Service Changed : 1
17:14:19.491 -> Central Connect Setting
17:14:19.491 -> - Max MTU : 23
17:14:19.491 -> - Event Length : 6
17:14:19.491 -> - HVN Queue Size : 2
17:14:19.491 -> - WrCmd Queue Size: 1
17:14:19.491 ->
17:14:19.491 -> --------- BLE Settings ---------
17:14:19.491 -> Name : Feather nRF52840 Express
17:14:19.491 -> Max Connections : Peripheral = 0, Central = 1
17:14:19.491 -> Address : DD:CF:A6:C0:1A:11 (Static)
17:14:19.491 -> TX Power : 4 dBm
17:14:19.491 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
17:14:19.491 -> Conn Timeout : 2000 ms
17:14:19.491 -> Central Paired Devices:
17:14:19.491 ->
17:14:19.491 ->
17:14:19.491 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:14:19.491 -> Now checking all Client Services and Characteristics!
17:14:19.491 -> If Mandatory Services Fail --> the Client will disconnect!
17:14:19.491 -> Checking Generic Access and Device Information!
17:14:19.491 -> Found Client Generic Access
17:14:20.006 -> -> Client Reads Device Name: [Zwift Hub]
17:14:20.731 -> -> Client Reads Appearance: [1152]
17:14:21.148 -> Found Client Device Information
17:14:21.517 -> -> Client Reads Manufacturer: [Zwift]
17:14:22.103 -> -> Client Reads Model Number: [06]
17:14:22.707 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:14:22.707 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:14:23.308 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:14:23.976 -> Discovering Client FTM Status Characteristic ... Found it!
17:14:24.534 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:14:24.889 -> Discovering Client FTM Feature Characteristic ... Found it!
17:14:25.479 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
17:14:25.479 -> - Fitness Machine Features:
17:14:25.479 -> Average Speed Supported
17:14:25.479 -> Cadence Supported
17:14:25.479 -> Total Distance Supported
17:14:25.479 -> Resistance Level Supported
17:14:25.479 -> Heart Rate Measurement Supported
17:14:25.479 -> Power Measurement Supported
17:14:25.479 -> - Target Setting Features:
17:14:25.479 -> Resistance Target Setting Supported
17:14:25.479 -> Power Target Setting Supported
17:14:25.479 -> Indoor Bike Simulation Parameters Supported
17:14:25.479 -> Wheel Circumference Configuration Supported
17:14:25.479 -> Spin Down Control Supported
17:14:25.479 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:14:26.058 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:14:26.553 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
17:14:26.553 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
17:14:27.188 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 00 00 00 00 ]
17:14:27.188 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:14:27.544 -> Discovering Client CP Measurement characteristic ... Found it!
17:14:27.946 -> Discovering Client CP Feature characteristic ... Found it!
17:14:28.504 -> -> Client Reads Raw CP Feature bytes: [4] [ 00 00 00 00 ]
17:14:28.504 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
17:14:29.093 -> Discovering Client CP Sensor Location characteristic ... Found it!
17:14:29.590 -> -> Client Reads CP Location Sensor: Loc#: 0 Other
17:14:29.590 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
17:14:29.869 -> Discovering Client CSC Measurement CHR ... Found it!
17:14:30.426 -> Discovering Client CSC Feature CHR ... Found it!
17:14:30.936 -> -> Client Reads Raw CSC Feature bytes: [2] [ 00 00 ]
17:14:30.936 -> Discovering Client CSC Location CHR ... Found it!
17:14:31.434 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
17:14:31.434 -> Discovering Heart Rate Measurement (HR) Service ... Found it! HRMS Max Payload: 20 Data Length: 27
17:14:31.792 -> Discovering HR Measurement characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:14:32.443 -> Found it!
17:14:32.443 -> Discovering HR Sensor Location characteristic ... Found it!
17:14:32.990 -> -> Client Reads HR Location Sensor: Loc#: 1 Chest
17:14:32.990 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
17:14:32.990 -> Ready to receive Client FTM Control Point Response Messages
17:14:33.025 -> Ready to receive Client FTM Status values
17:14:33.103 -> Ready to receive Client FTM Indoor Bike Data values
17:14:33.149 -> Ready to receive Client CP Measurement values
17:14:33.190 -> Ready to receive Client CSC Measurement values
17:14:33.228 -> Ready to receive Client HR Measurement values
17:14:33.275 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
17:14:33.275 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
17:14:34.270 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]

17:24:20.895 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
17:24:20.895 -> ------------------- Version 03.4 --------------------
17:24:20.895 -> Poll and fetch delay settings: [250]ms [100]ms
17:24:20.895 -> Setting NRF52840 BLE configuration parameters!
17:24:20.895 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:24:20.895 -> Board name: [Feather nRF52840 Express]
17:24:20.895 -> FTMS and Chars 'initialized'
17:24:20.895 -> CPS and Chars 'initialized'
17:24:20.895 -> CSCS and Chars 'initialized'
17:24:20.895 -> GA and Chars 'initialized'
17:24:20.895 -> DIS and Chars 'initialized'
17:24:20.895 -> HRMS and Chars 'initialized'
17:24:20.895 -> Start Scanning for CPS, CSC and FTMS!
17:24:20.895 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:24:20.895 -> Timestamp MAC Address Rssi Data
17:24:20.895 -> 000000731 F8:9C:FC:53:5E:49 -56 09-02-16-18-26-18-18-18-0A-18
17:24:21.398 -> --------- SoftDevice Config ---------
17:24:21.398 -> Max UUID128 : 3
17:24:21.398 -> ATTR Table Size : 4096
17:24:21.398 -> Service Changed : 1
17:24:21.398 -> Central Connect Setting
17:24:21.398 -> - Max MTU : 23
17:24:21.398 -> - Event Length : 6
17:24:21.398 -> - HVN Queue Size : 2
17:24:21.399 -> - WrCmd Queue Size: 1
17:24:21.399 ->
17:24:21.399 -> --------- BLE Settings ---------
17:24:21.399 -> Name : Feather nRF52840 Express
17:24:21.399 -> Max Connections : Peripheral = 0, Central = 1
17:24:21.399 -> Address : DD:CF:A6:C0:1A:11 (Static)
17:24:21.399 -> TX Power : 4 dBm
17:24:21.399 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
17:24:21.399 -> Conn Timeout : 2000 ms
17:24:21.399 -> Central Paired Devices:
17:24:21.399 ->
17:24:21.399 ->
17:24:21.399 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:24:21.399 -> Now checking all Client Services and Characteristics!
17:24:21.399 -> If Mandatory Services Fail --> the Client will disconnect!
17:24:21.399 -> Checking Generic Access and Device Information!
17:24:21.846 -> Found Client Generic Access
17:24:22.068 -> -> Client Reads Device Name: [Zwift Hub]
17:24:22.693 -> -> Client Reads Appearance: [1152]
17:24:23.003 -> Found Client Device Information
17:24:23.438 -> -> Client Reads Manufacturer: [Zwift]
17:24:23.935 -> -> Client Reads Model Number: [06]
17:24:24.494 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:24:24.494 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:24:24.822 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:24:25.411 -> Discovering Client FTM Status Characteristic ... Found it!
17:24:26.019 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:24:26.470 -> Discovering Client FTM Feature Characteristic ... Found it!
17:24:27.178 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
17:24:27.178 -> - Fitness Machine Features:
17:24:27.178 -> - Target Setting Features:
17:24:27.178 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:24:27.878 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:24:28.655 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
17:24:28.655 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
17:24:29.355 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
17:24:29.355 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:24:29.680 -> Discovering Client CP Measurement characteristic ... Found it!
17:24:30.036 -> Discovering Client CP Feature characteristic ... Found it!
17:24:30.626 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
17:24:30.626 -> Wheel revolution data supported
17:24:30.626 -> Crank revolution data supported
17:24:30.626 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
17:24:31.076 -> Discovering Client CP Sensor Location characteristic ... Found it!
17:24:31.729 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
17:24:31.729 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
17:24:32.055 -> Discovering Client CSC Measurement CHR ... Found it!
17:24:32.473 -> Discovering Client CSC Feature CHR ... Found it!
17:24:33.109 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
17:24:33.109 -> Wheel rev supported
17:24:33.109 -> Crank rev supported
17:24:33.109 -> Discovering Client CSC Location CHR ... Found it!
17:24:33.775 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
17:24:33.775 -> Discovering Heart Rate Measurement (HR) Service ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:24:34.441 -> Found it! HRMS Max Payload: 20 Data Length: 27
17:24:34.441 -> Discovering HR Measurement characteristic ... Found it!
17:24:35.123 -> Discovering HR Sensor Location characteristic ... Found it!
17:24:35.633 -> -> Client Reads HR Location Sensor: Loc#: 0 Other
17:24:35.633 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
17:24:35.633 -> Ready to receive Client FTM Control Point Response Messages
17:24:35.676 -> Ready to receive Client FTM Status values
17:24:35.712 -> Ready to receive Client FTM Indoor Bike Data values
17:24:35.756 -> Ready to receive Client CP Measurement values
17:24:35.789 -> Ready to receive Client CSC Measurement values
17:24:35.835 -> Ready to receive Client HR Measurement values
17:24:36.272 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:24:36.304 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
17:24:36.304 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
17:24:36.304 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
17:24:36.304 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
17:24:36.304 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]
17:24:37.639 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]

17:31:11.499 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
17:31:11.499 -> ------------------- Version 03.4 --------------------
17:31:11.499 -> Poll and fetch delay settings: [250]ms [100]ms
17:31:11.499 -> Setting NRF52840 BLE configuration parameters!
17:31:11.499 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:31:11.499 -> Board name: [Feather nRF52840 Express]
17:31:11.499 -> FTMS and Chars 'initialized'
17:31:11.499 -> CPS and Chars 'initialized'
17:31:11.499 -> CSCS and Chars 'initialized'
17:31:11.499 -> GA and Chars 'initialized'
17:31:11.499 -> DIS and Chars 'initialized'
17:31:11.499 -> HRMS and Chars 'initialized'
17:31:11.499 -> Start Scanning for CPS, CSC and FTMS!
17:31:12.636 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:31:12.636 -> Timestamp MAC Address Rssi Data
17:31:12.636 -> 000003058 F8:9C:FC:53:5E:49 -54 09-02-16-18-26-18-18-18-0A-18
17:31:12.854 -> --------- SoftDevice Config ---------
17:31:12.854 -> Max UUID128 : 3
17:31:12.854 -> ATTR Table Size : 4096
17:31:12.854 -> Service Changed : 1
17:31:12.854 -> Central Connect Setting
17:31:12.854 -> - Max MTU : 23
17:31:12.854 -> - Event Length : 6
17:31:12.854 -> - HVN Queue Size : 2
17:31:12.854 -> - WrCmd Queue Size: 1
17:31:12.854 ->
17:31:12.854 -> --------- BLE Settings ---------
17:31:12.854 -> Name : Feather nRF52840 Express
17:31:12.854 -> Max Connections : Peripheral = 0, Central = 1
17:31:12.854 -> Address : DD:CF:A6:C0:1A:11 (Static)
17:31:12.854 -> TX Power : 4 dBm
17:31:12.854 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
17:31:12.854 -> Conn Timeout : 2000 ms
17:31:12.854 -> Central Paired Devices:
17:31:12.854 ->
17:31:12.854 ->
17:31:12.854 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:31:12.854 -> Now checking all Client Services and Characteristics!
17:31:12.854 -> If Mandatory Services Fail --> the Client will disconnect!
17:31:12.854 -> Checking Generic Access and Device Information!
17:31:13.411 -> Found Client Generic Access
17:31:13.907 -> -> Client Reads Device Name: [Zwift Hub]
17:31:14.389 -> -> Client Reads Appearance: [1152]
17:31:14.761 -> Found Client Device Information
17:31:15.164 -> -> Client Reads Manufacturer: [Zwift]
17:31:16.252 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:31:16.252 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:31:16.577 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:31:17.305 -> Discovering Client FTM Status Characteristic ... Found it!
17:31:17.985 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:31:18.543 -> Discovering Client FTM Feature Characteristic ... Found it!
17:31:19.006 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
17:31:19.006 -> - Fitness Machine Features:
17:31:19.006 -> Average Speed Supported
17:31:19.006 -> Cadence Supported
17:31:19.006 -> Total Distance Supported
17:31:19.006 -> Resistance Level Supported
17:31:19.006 -> Heart Rate Measurement Supported
17:31:19.006 -> Power Measurement Supported
17:31:19.006 -> - Target Setting Features:
17:31:19.006 -> Resistance Target Setting Supported
17:31:19.006 -> Power Target Setting Supported
17:31:19.006 -> Indoor Bike Simulation Parameters Supported
17:31:19.006 -> Wheel Circumference Configuration Supported
17:31:19.006 -> Spin Down Control Supported
17:31:19.006 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:31:19.504 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:31:20.143 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
17:31:20.143 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
17:31:20.824 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
17:31:20.824 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:31:21.196 -> Discovering Client CP Measurement characteristic ... Found it!
17:31:21.833 -> Discovering Client CP Feature characteristic ... Found it!
17:31:22.315 -> -> Client Reads Raw CP Feature bytes: [4] [ 00 00 00 00 ]
17:31:22.315 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
17:31:22.797 -> Discovering Client CP Sensor Location characteristic ... Found it!
17:31:23.462 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
17:31:23.462 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
17:31:23.774 -> Discovering Client CSC Measurement CHR ... Found it!
17:31:24.194 -> Discovering Client CSC Feature CHR ... Found it!
17:31:24.648 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
17:31:24.648 -> Wheel rev supported
17:31:24.648 -> Crank rev supported
17:31:24.648 -> Discovering Client CSC Location CHR ... Found it!
17:31:25.270 -> -> Client Reads CSC Location Sensor: Loc#: 0 Other
17:31:25.270 -> Discovering Heart Rate Measurement (HR) Service ... Found it! HRMS Max Payload: 20 Data Length: 27
17:31:25.548 -> Discovering HR Measurement characteristic ... Found it!
17:31:25.952 -> Discovering HR Sensor Location characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:31:26.480 -> Found it!
17:31:26.480 -> -> Client Reads HR Location Sensor: Loc#: 1 Chest
17:31:26.480 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
17:31:26.480 -> Ready to receive Client FTM Control Point Response Messages
17:31:26.511 -> Ready to receive Client FTM Status values
17:31:26.630 -> Ready to receive Client FTM Indoor Bike Data values
17:31:26.668 -> Ready to receive Client CP Measurement values
17:31:26.700 -> Ready to receive Client CSC Measurement values
17:31:26.746 -> Ready to receive Client HR Measurement values
17:31:27.288 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
17:31:27.288 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
17:31:27.288 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
17:31:27.288 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
17:31:28.296 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]

17:35:29.097 -> Poll and fetch delay settings: [250]ms [100]ms
17:35:29.097 -> Setting NRF52840 BLE configuration parameters!
17:35:29.097 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:35:29.097 -> Board name: [Feather nRF52840 Express]
17:35:29.097 -> FTMS and Chars 'initialized'
17:35:29.097 -> CPS and Chars 'initialized'
17:35:29.097 -> CSCS and Chars 'initialized'
17:35:29.097 -> GA and Chars 'initialized'
17:35:29.097 -> DIS and Chars 'initialized'
17:35:29.097 -> HRMS and Chars 'initialized'
17:35:29.097 -> Start Scanning for CPS, CSC and FTMS!
17:35:29.123 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:35:29.123 -> Timestamp MAC Address Rssi Data
17:35:29.123 -> 000001693 F8:9C:FC:53:5E:49 -55 09-02-16-18-26-18-18-18-0A-18
17:35:29.213 -> --------- SoftDevice Config ---------
17:35:29.213 -> Max UUID128 : 3
17:35:29.213 -> ATTR Table Size : 4096
17:35:29.213 -> Service Changed : 1
17:35:29.213 -> Central Connect Setting
17:35:29.213 -> - Max MTU : 23
17:35:29.213 -> - Event Length : 6
17:35:29.213 -> - HVN Queue Size : 2
17:35:29.213 -> - WrCmd Queue Size: 1
17:35:29.213 ->
17:35:29.213 -> --------- BLE Settings ---------
17:35:29.213 -> Name : Feather nRF52840 Express
17:35:29.213 -> Max Connections : Peripheral = 0, Central = 1
17:35:29.213 -> Address : DD:CF:A6:C0:1A:11 (Static)
17:35:29.213 -> TX Power : 4 dBm
17:35:29.213 -> Conn Intervals : min = 20.00 ms, max = 30.00 ms
17:35:29.213 -> Conn Timeout : 2000 ms
17:35:29.213 -> Central Paired Devices:
17:35:29.213 ->
17:35:29.213 ->
17:35:29.213 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:35:29.213 -> Now checking all Client Services and Characteristics!
17:35:29.213 -> If Mandatory Services Fail --> the Client will disconnect!
17:35:29.213 -> Checking Generic Access and Device Information!
17:35:29.846 -> Found Client Generic Access
17:35:30.620 -> -> Client Reads Device Name: [Zwift Hub]
17:35:31.116 -> -> Client Reads Appearance: [1152]
17:35:31.396 -> Found Client Device Information
17:35:31.875 -> -> Client Reads Manufacturer: [Zwift]
17:35:32.431 -> -> Client Reads Model Number: [06]
17:35:33.039 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:35:33.647 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:35:34.362 -> Discovering Client FTM Status Characteristic ... Found it!
17:35:35.002 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:35:35.467 -> Discovering Client FTM Feature Characteristic ... Found it!
17:35:35.905 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
17:35:35.905 -> - Fitness Machine Features:
17:35:35.905 -> Average Speed Supported
17:35:35.905 -> Cadence Supported
17:35:35.905 -> Total Distance Supported
17:35:35.905 -> Resistance Level Supported
17:35:35.905 -> Heart Rate Measurement Supported
17:35:35.905 -> Power Measurement Supported
17:35:35.905 -> - Target Setting Features:
17:35:35.905 -> Resistance Target Setting Supported
17:35:35.905 -> Power Target Setting Supported
17:35:35.905 -> Indoor Bike Simulation Parameters Supported
17:35:35.905 -> Wheel Circumference Configuration Supported
17:35:35.905 -> Spin Down Control Supported
17:35:35.905 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:35:36.540 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:35:37.159 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
17:35:37.159 -> Discovering Client FTM Supported Power Range Characteristic ... Found it!
17:35:37.798 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 00 00 00 00 ]
17:35:37.799 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:35:38.096 -> Discovering Client CP Measurement characteristic ... Found it!
17:35:38.528 -> Discovering Client CP Feature characteristic ... Found it!
17:35:39.072 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
17:35:39.072 -> Wheel revolution data supported
17:35:39.072 -> Crank revolution data supported
17:35:39.072 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
17:35:39.432 -> Discovering Client CP Sensor Location characteristic ... Found it!
17:35:39.863 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
17:35:39.863 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
17:35:40.390 -> Discovering Client CSC Measurement CHR ... Found it!
17:35:41.013 -> Discovering Client CSC Feature CHR ... Found it!
17:35:41.557 -> -> Client Reads Raw CSC Feature bytes: [2] [ 00 00 ]
17:35:41.557 -> Discovering Client CSC Location CHR ... Found it!
17:35:42.128 -> -> Client Reads CSC Location Sensor: Loc#: 0 Other
17:35:42.128 -> Discovering Heart Rate Measurement (HR) Service ... Found it! HRMS Max Payload: 20 Data Length: 27
17:35:42.500 -> Discovering HR Measurement characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:35:43.060 -> Found it!
17:35:43.060 -> Discovering HR Sensor Location characteristic ... Found it!
17:35:43.555 -> -> Client Reads HR Location Sensor: Loc#: 0 Other
17:35:43.555 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
17:35:43.555 -> Ready to receive Client FTM Control Point Response Messages
17:35:43.587 -> Ready to receive Client FTM Status values
17:35:43.633 -> Ready to receive Client FTM Indoor Bike Data values
17:35:43.665 -> Ready to receive Client CP Measurement values
17:35:43.743 -> Ready to receive Client CSC Measurement values
17:35:43.775 -> Ready to receive Client HR Measurement values
17:35:44.472 -> -> Client Rec'd Raw Heart Rate Measurement Data: [2] [ 04 00 ]
17:35:44.472 -> Heart Beats: 0 HBM (8) Contact is NOT detected!
17:35:44.472 -> -> Client Rec'd Raw FTM Indoor Bike Data: [11] [ 64 02 00 00 00 00 14 00 00 00 00 ]
17:35:44.472 -> Instant. Speed: 0 KPH Instantaneous Cadence: 0 RPM Resistance Level: 20 Instantaneous Power: 0 Watt Heart Rate: 0 HBM
17:35:44.832 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:35:44.954 -> -> Client Rec'd Raw FTM Control Point Response Data: [ 80 00 01 ]

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
How are you doing? And what is the status of your present setup?
Best wishes,
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorgen,

I'm still working on the project but more slowly because I have a lot of work at the moment.

The version of Simcline V2.0 is stable as far as the connection is concerned (8/10).
On the other hand I encounter a parasite problem with the linear motor when the direction changes.
I'll make a sketch for you later.

Here is a picture of the project being finished.

Sincerely Joel

20230215_171847

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorgen,

Glad to let you know it works.

In fact, for the connection between the Simcline to work well, I must put the Bluetooth receiver closer to the Adafruit.

I didn't know how to do it before because I was looking at the data via RS232 and therefore the USB extension was busy.

In short when I connect 9/10 it's ok sometimes 1/10 the connection between Zwift and Zwifthub is done live.

20230217_175227
20230217_175334
20230217_175421

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
I am really happy for you that the setup is working now! I see that you have added an Alu profile and linear glider finally. My compliments for how you have faced the challenges that you met during the building process! You were not afraid to change plans when things did not work as expected! Chapeau pour votre persévérance! I hope you will spent many hours with it during your indoor Zwift rides. Now it is time to climb the Alpe d'Huez!
During my recent work on porting the Simcline nRF52 code to ESP32 I became aware of the importance of correct BLE connection parameters. I have always thought that the Client and Server negotiated that in the background at connect time without any intervention... However I have learned now that possibly the unexpected behavior during Service discovery that you met with the Zwift Hub in combination with the nRF52 (client-side) code can be (possibly) blamed to improper connection parameter settings....
My assumption is now that Zwift Hub expects slightly different connection parameter settings than what is default set in the nRF52 (library) code that I applied for Client, Server and MITM programs. The last days I have put that to the test and, indeed, I can exactly reproduce the unexpected discovery behavior that we saw with your Zwift Hub by manipulating connection parameters... However I do not have a real Zwift Hub, I can only simulate one...and the proof of the pudding is in the eating. So the question is are you willing to run specific suggested code changes in the Client code on one of your nRF52 Feathers. The Feather that runs the test does not have to be connected to anything else other than the PC, by USB! The Feather Itsy-Bitsy will probably do the work as well as the Feather Express. All we are interested in is have the service discovery process to run smoothly 10 out 10 times !
Best wishes,
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorgen,

I agree to spend time doing various tests for myself and all other users.
I still have 2 nrf52840 Feather available.
And I could buy an ESP32 to also test it will not be lost!
I still have modifications that will ask for your help because I believe that the % are not well respected.
I know it's half if Zwift settings are at 50% but....

With pleasure,

Joel

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Great, You will hear soon!

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
You are invited to insert some extra lines of code in your FTMS_Client program and run it repeatedly against your Zwift Hub trainer.

  1. Please change the const nature of poll_delay to a variable at the beginning of the program and set to zero:
// - Zwift Hub will NOT pass 100%-error-free with a value of poll_delay lower than 250 ms !!
unsigned long poll_delay = 0;   // Unit is milliseconds
//---------------------------------------------------------------------------------------------------
  1. Just insert the indicated new lines of code in the function client_connect_callback() just before it will start to discover the presence of SVC's and CHR's of your Zwift Hub
void client_connect_callback(uint16_t conn_handle)
.
.
start insert
  // Client sets NEW connection parameters: Connection Interval, Latency and Supervision Timeout ---------------------------------
  uint8_t ConnInterval = 24; // in units of 1.25 ms ---> Vary between 24 (30 ms) and 48 (60 ms)
  // Connection Interval in units of 1.25ms = ## (vary!), Latency = 0 (keep!), Supervision Timeout in units of 10ms = 400 (keep!)
  if( connection->requestConnectionParameter(ConnInterval, 0, 400) ) {
    ConnInterval *= 1.25; // convert to ms
    DEBUG_PRINTF(">>> Request NEW Connection Parameters! Interval: %d ms Latency: 0 Supervision Timeout: 4000 ms\n", ConnInterval);
    poll_delay = ConnInterval; // Synchronize SVC/CHR Discovery calls with Connection Interval
  }
  // ------------------------------------------------------------------------------------------------------------------------------
end insert
  DEBUG_PRINTLN("Now checking all Client Services and Characteristics!");
  DEBUG_PRINTLN("If Mandatory Services Fail --> the Client will disconnect!");
  // --------------
  // Wait some extra time for client to fully settle after connection!
  delay(poll_delay);
  // --------------

  if( !client_GA_connect_callback(conn_handle) ) {
    Bluefruit.disconnect(conn_handle);
    return;    
  }
.
.
  1. Run the new FTMS_Client and see if and how it will pass the discovery process completely until the trainer and Client are exchanging information... that is the moment to stop the test by disconnecting the Feather.
  2. Repeat the same run and see if the results are reproducible.... If discovery fails time after time somewhere in the process then increase in small steps the value of uint8_t ConnInterval --> compile, upload and repeat the procedure

If my assumption is correct you should find a value of ConnInterval at which the whole discovery process will pass without any unexpected behavior...
Fingers crossed!
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorgen,

The change in value for the tests this fact?

uint8_t ConnInterval = XX;

And I leave the value at 0 here

unsigned long poll_delay = 0;

Sincerely,

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorgen,

Here are the results, it's always pretty much the same thing.

Tell me what you would like as a test value and procedure ;)

17:04:57.864 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
17:04:57.864 -> ------------------- Version 03.0 --------------------
17:04:57.864 -> Processor: Feather nRF52840
17:04:57.864 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:04:57.864 -> FTMS and Chars 'initialized'
17:04:57.864 -> CPS and Chars 'initialized'
17:04:57.864 -> CSCS and Chars 'initialized'
17:04:57.864 -> GA and Chars 'initialized'
17:04:57.864 -> DIS and Chars 'initialized'
17:04:57.864 -> HRMS and Chars 'initialized'
17:04:57.864 -> Start Scanning for CPS, CSC and FTMS!
17:04:57.864 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:04:57.864 -> Timestamp MAC Address Rssi Data
17:04:57.864 -> 000000645 F8:9C:FC:53:5E:49 -60 09-02-16-18-26-18-18-18-0A-18
17:04:57.864 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:04:57.864 -> >>> Request NEW Connection Parameters! Interval: 30 ms Latency: 0 Supervision Timeout: 4000 ms
17:04:57.864 -> Now checking all Client Services and Characteristics!
17:04:57.864 -> If Mandatory Services Fail --> the Client will disconnect!
17:04:57.864 -> Checking Generic Access and Device Information!
17:04:57.864 -> Start BLEDiscovery... does it help ?
17:04:58.215 -> Found Client Generic Access
17:04:58.215 -> -> Client Reads Device Name: [Zwift Hub]
17:04:58.396 -> -> Client Reads Appearance: [0]
17:04:58.396 -> Not Found Client Device Information!
17:04:58.396 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
17:04:58.397 -> Disconnecting since Client FTM Service is mandatory!
17:04:58.397 -> Client Disconnected, reason = 0x16
17:04:58.397 -> >>> Restart the Feather nRF52 Client for a new run! <<<
17:04:59.805 -> Stopped!

17:06:28.955 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
17:06:28.955 -> ------------------- Version 03.0 --------------------
17:06:28.955 -> Processor: Feather nRF52840
17:06:28.955 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:06:29.128 -> FTMS and Chars 'initialized'
17:06:29.128 -> CPS and Chars 'initialized'
17:06:29.128 -> CSCS and Chars 'initialized'
17:06:29.128 -> GA and Chars 'initialized'
17:06:29.128 -> DIS and Chars 'initialized'
17:06:29.128 -> HRMS and Chars 'initialized'
17:06:29.128 -> Start Scanning for CPS, CSC and FTMS!
17:06:29.129 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:06:29.129 -> Timestamp MAC Address Rssi Data
17:06:29.129 -> 000000655 F8:9C:FC:53:5E:49 -60 09-02-16-18-26-18-18-18-0A-18
17:06:29.129 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:06:29.129 -> >>> Request NEW Connection Parameters! Interval: 45 ms Latency: 0 Supervision Timeout: 4000 ms
17:06:29.129 -> Now checking all Client Services and Characteristics!
17:06:29.129 -> If Mandatory Services Fail --> the Client will disconnect!
17:06:29.129 -> Checking Generic Access and Device Information!
17:06:29.129 -> Start BLEDiscovery... does it help ?
17:06:29.284 -> Found Client Generic Access
17:06:29.894 -> -> Client Reads Device Name: [Zwift Hub]
17:06:30.008 -> -> Client Reads Appearance: [0]
17:06:30.471 -> Found Client Device Information
17:06:30.781 -> -> Client Reads Manufacturer: [Zwift]
17:06:31.092 -> -> Client Reads Model Number: [06]
17:06:31.232 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
17:06:31.371 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:06:31.371 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:06:31.678 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:06:32.172 -> Discovering Client FTM Status Characteristic ... Found it!
17:06:32.711 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:06:32.974 -> Discovering Client FTM Feature Characteristic ... Found it!
17:06:33.252 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:06:33.252 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
17:06:33.252 -> - Fitness Machine Features:
17:06:33.252 -> - Target Setting Features:
17:06:33.252 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:06:33.939 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:06:34.109 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 00 00 00 00 ]
17:06:34.109 -> Discovering Client FTM Supported Power Range Characteristic ... Not Found! NOT mandatory!
17:06:34.155 -> Discovering Client Cycling Power (CP) Service ... Not Found!
17:06:34.201 -> Disconnecting since Client Cyling Power Service is mandatory!
17:06:34.326 -> Client Disconnected, reason = 0x16
17:06:34.326 -> >>> Restart the Feather nRF52 Client for a new run! <<<

17:02:49.635 -> CSCS and Chars 'initialized'
17:02:49.635 -> GA and Chars 'initialized'
17:02:49.635 -> DIS and Chars 'initialized'
17:02:49.635 -> HRMS and Chars 'initialized'
17:02:49.635 -> Start Scanning for CPS, CSC and FTMS!
17:02:49.635 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:02:49.635 -> Timestamp MAC Address Rssi Data
17:02:49.635 -> 000002657 F8:9C:FC:53:5E:49 -60 09-02-16-18-26-18-18-18-0A-18
17:02:49.804 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:02:49.804 -> >>> Request NEW Connection Parameters! Interval: 30 ms Latency: 0 Supervision Timeout: 4000 ms
17:02:49.804 -> Now checking all Client Services and Characteristics!
17:02:49.804 -> If Mandatory Services Fail --> the Client will disconnect!
17:02:49.804 -> Checking Generic Access and Device Information!
17:02:49.804 -> Start BLEDiscovery... does it help ?
17:02:49.899 -> Found Client Generic Access
17:02:50.452 -> -> Client Reads Device Name: [Zwift Hub]
17:02:50.456 -> -> Client Reads Appearance: [0]
17:02:50.456 -> Found Client Device Information
17:02:50.677 -> -> Client Reads Manufacturer: [Zwift]
17:02:50.910 -> -> Client Reads Model Number: [06]
17:02:51.251 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:02:51.251 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:02:51.390 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:02:51.825 -> Discovering Client FTM Status Characteristic ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
17:02:51.950 -> Ready to receive Client FTM Control Point Response Messages
17:02:52.120 -> Found it!
17:02:52.120 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:02:52.430 -> Discovering Client FTM Feature Characteristic ... Found it!
17:02:52.649 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
17:02:52.649 -> - Fitness Machine Features:
17:02:52.649 -> Average Speed Supported
17:02:52.649 -> Cadence Supported
17:02:52.649 -> Total Distance Supported
17:02:52.649 -> Resistance Level Supported
17:02:52.649 -> Heart Rate Measurement Supported
17:02:52.649 -> Power Measurement Supported
17:02:52.649 -> - Target Setting Features:
17:02:52.649 -> Resistance Target Setting Supported
17:02:52.649 -> Power Target Setting Supported
17:02:52.649 -> Indoor Bike Simulation Parameters Supported
17:02:52.649 -> Wheel Circumference Configuration Supported
17:02:52.649 -> Spin Down Control Supported
17:02:52.649 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:02:53.174 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:02:53.468 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 00 00 00 00 ]
17:02:53.468 -> Discovering Client FTM Supported Power Range Characteristic ... Not Found! NOT mandatory!
17:02:53.501 -> Discovering Client Cycling Power (CP) Service ... Found it! CPS Max Payload: 20 Data Length: 27
17:02:53.641 -> Discovering Client CP Measurement characteristic ... Found it!
17:02:53.941 -> Discovering Client CP Feature characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:02:54.065 -> Found it!
17:02:54.141 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
17:02:54.141 -> Wheel revolution data supported
17:02:54.141 -> Crank revolution data supported
17:02:54.141 -> Discovering Client CP Control Point characteristic ... Not Found! NOT Mandatory!
17:02:54.483 -> Discovering Client CP Sensor Location characteristic ... Found it!
17:02:54.703 -> -> Client Reads CP Location Sensor: Loc#: 0 Other
17:02:54.703 -> Discovering Cycling Speed and Cadence (CSC) Service ... Found it! CSCS Max Payload: 20 Data Length: 27
17:02:54.872 -> Discovering Client CSC Measurement CHR ... Found it!
17:02:55.540 -> Discovering Client CSC Feature CHR ... Found it!
17:02:55.805 -> -> Client Reads Raw CSC Feature bytes: [2] [ 00 00 ]
17:02:55.805 -> Discovering Client CSC Location CHR ... Not Found! NOT Mandatory!
17:02:55.837 -> Discovering Heart Rate Measurement (HR) Service ... Not Found! HR Service is Not Mandatory!
17:02:55.977 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:02:57.982 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]

16:55:24.280 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
16:55:24.280 -> ------------------- Version 03.0 --------------------
16:55:24.280 -> Processor: Feather nRF52840
16:55:24.280 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:55:24.404 -> FTMS and Chars 'initialized'
16:55:24.404 -> CPS and Chars 'initialized'
16:55:24.404 -> CSCS and Chars 'initialized'
16:55:24.404 -> GA and Chars 'initialized'
16:55:24.404 -> DIS and Chars 'initialized'
16:55:24.404 -> HRMS and Chars 'initialized'
16:55:24.404 -> Start Scanning for CPS, CSC and FTMS!
16:55:24.404 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:55:24.404 -> Timestamp MAC Address Rssi Data
16:55:24.404 -> 000008926 F8:9C:FC:53:5E:49 -59 09-02-16-18-26-18-18-18-0A-18
16:55:24.530 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:55:24.531 -> >>> Request NEW Connection Parameters! Interval: 86 ms Latency: 0 Supervision Timeout: 4000 ms
16:55:24.531 -> Now checking all Client Services and Characteristics!
16:55:24.531 -> If Mandatory Services Fail --> the Client will disconnect!
16:55:24.531 -> Checking Generic Access and Device Information!
16:55:24.531 -> Start BLEDiscovery... does it help ?
16:55:24.953 -> Found Client Generic Access
16:55:25.496 -> -> Client Reads Device Name: [Zwift Hub]
16:55:26.348 -> -> Client Reads Appearance: [0]
16:55:26.440 -> Not Found Client Device Information!
16:55:26.440 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
16:55:26.532 -> Disconnecting since Client FTM Service is mandatory!
16:55:27.003 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
16:55:27.046 -> Client Disconnected, reason = 0x16
16:55:27.046 -> >>> Restart the Feather nRF52 Client for a new run! <<<

16:58:06.967 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
16:58:06.967 -> ------------------- Version 03.0 --------------------
16:58:06.967 -> Processor: Feather nRF52840
16:58:06.967 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:58:06.986 -> FTMS and Chars 'initialized'
16:58:06.986 -> CPS and Chars 'initialized'
16:58:06.986 -> CSCS and Chars 'initialized'
16:58:06.986 -> GA and Chars 'initialized'
16:58:06.986 -> DIS and Chars 'initialized'
16:58:06.986 -> HRMS and Chars 'initialized'
16:58:06.986 -> Start Scanning for CPS, CSC and FTMS!
16:58:06.986 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:58:06.986 -> Timestamp MAC Address Rssi Data
16:58:06.986 -> 000000639 F8:9C:FC:53:5E:49 -59 09-02-16-18-26-18-18-18-0A-18
16:58:06.989 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:58:06.989 -> >>> Request NEW Connection Parameters! Interval: 93 ms Latency: 0 Supervision Timeout: 4000 ms
16:58:06.989 -> Now checking all Client Services and Characteristics!
16:58:06.989 -> If Mandatory Services Fail --> the Client will disconnect!
16:58:06.989 -> Checking Generic Access and Device Information!
16:58:06.989 -> Start BLEDiscovery... does it help ?
16:58:06.989 -> Found Client Generic Access
16:58:07.756 -> -> Client Reads Device Name: []
16:58:07.930 -> Found Client Device Information
16:58:08.991 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
16:58:09.116 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
16:58:09.242 -> Disconnecting since Client FTM Service is mandatory!
16:58:09.415 -> Client Disconnected, reason = 0x16
16:58:09.415 -> >>> Restart the Feather nRF52 Client for a new run! <<<

16:58:58.676 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
16:58:58.676 -> ------------------- Version 03.0 --------------------
16:58:58.676 -> Processor: Feather nRF52840
16:58:58.676 -> Initialise the Bluefruit nRF52 module: Client (Central)
16:58:58.677 -> FTMS and Chars 'initialized'
16:58:58.677 -> CPS and Chars 'initialized'
16:58:58.677 -> CSCS and Chars 'initialized'
16:58:58.677 -> GA and Chars 'initialized'
16:58:58.677 -> DIS and Chars 'initialized'
16:58:58.677 -> HRMS and Chars 'initialized'
16:58:58.677 -> Start Scanning for CPS, CSC and FTMS!
16:58:58.677 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
16:58:58.677 -> Timestamp MAC Address Rssi Data
16:58:58.677 -> 000000635 F8:9C:FC:53:5E:49 -59 09-02-16-18-26-18-18-18-0A-18
16:58:58.678 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
16:58:58.678 -> >>> Request NEW Connection Parameters! Interval: 87 ms Latency: 0 Supervision Timeout: 4000 ms
16:58:58.678 -> Now checking all Client Services and Characteristics!
16:58:58.678 -> If Mandatory Services Fail --> the Client will disconnect!
16:58:58.678 -> Checking Generic Access and Device Information!
16:58:58.678 -> Start BLEDiscovery... does it help ?
16:58:59.460 -> Found Client Generic Access
16:58:59.732 -> -> Client Reads Device Name: [Zwift Hub]
16:58:59.791 -> -> Client Reads Appearance: [0]
16:59:00.205 -> Found Client Device Information
16:59:00.657 -> -> Client Reads Manufacturer: [Zwift]
16:59:00.657 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
16:59:01.814 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
16:59:01.907 -> Disconnecting since Client FTM Service is mandatory!
16:59:02.047 -> Client Disconnected, reason = 0x16
16:59:02.047 -> >>> Restart the Feather nRF52 Client for a new run! <<<

17:07:57.516 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
17:07:57.516 -> ------------------- Version 03.0 --------------------
17:07:57.516 -> Processor: Feather nRF52840
17:07:57.516 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:07:57.517 -> FTMS and Chars 'initialized'
17:07:57.517 -> CPS and Chars 'initialized'
17:07:57.517 -> CSCS and Chars 'initialized'
17:07:57.517 -> GA and Chars 'initialized'
17:07:57.517 -> DIS and Chars 'initialized'
17:07:57.517 -> HRMS and Chars 'initialized'
17:07:57.517 -> Start Scanning for CPS, CSC and FTMS!
17:07:57.517 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:07:57.517 -> Timestamp MAC Address Rssi Data
17:07:57.517 -> 000000621 F8:9C:FC:53:5E:49 -61 09-02-16-18-26-18-18-18-0A-18
17:07:57.517 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:07:57.517 -> >>> Request NEW Connection Parameters! Interval: 47 ms Latency: 0 Supervision Timeout: 4000 ms
17:07:57.517 -> Now checking all Client Services and Characteristics!
17:07:57.517 -> If Mandatory Services Fail --> the Client will disconnect!
17:07:57.517 -> Checking Generic Access and Device Information!
17:07:57.517 -> Start BLEDiscovery... does it help ?
17:07:57.970 -> Found Client Generic Access
17:07:57.970 -> -> Client Reads Device Name: [Zwift Hub]
17:07:58.239 -> -> Client Reads Appearance: [1152]
17:07:58.266 -> Found Client Device Information
17:07:58.421 -> -> Client Reads Manufacturer: [Zwift]
17:07:58.966 -> -> Client Reads Model Number: [06]
17:07:59.324 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
17:07:59.416 -> -> Client Reads Serial Number: [06-F89CFC535E49]
17:07:59.416 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:07:59.631 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:08:00.110 -> Discovering Client FTM Status Characteristic ... Found it!
17:08:00.744 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:08:01.284 -> Discovering Client FTM Feature Characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:08:01.331 -> Disconnecting since Client FTM Feature Characteristic is mandatory!
17:08:01.409 -> Client Disconnected, reason = 0x16
17:08:01.409 -> >>> Restart the Feather nRF52 Client for a new run! <<<

17:01:51.122 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
17:01:51.122 -> ------------------- Version 03.0 --------------------
17:01:51.122 -> Processor: Feather nRF52840
17:01:51.122 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:01:51.305 -> FTMS and Chars 'initialized'
17:01:51.305 -> CPS and Chars 'initialized'
17:01:51.305 -> CSCS and Chars 'initialized'
17:01:51.305 -> GA and Chars 'initialized'
17:01:51.305 -> DIS and Chars 'initialized'
17:01:51.305 -> HRMS and Chars 'initialized'
17:01:51.305 -> Start Scanning for CPS, CSC and FTMS!
17:01:51.305 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:01:51.305 -> Timestamp MAC Address Rssi Data
17:01:51.305 -> 000000632 F8:9C:FC:53:5E:49 -60 09-02-16-18-26-18-18-18-0A-18
17:01:51.306 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:01:51.306 -> >>> Request NEW Connection Parameters! Interval: 85 ms Latency: 0 Supervision Timeout: 4000 ms
17:01:51.306 -> Now checking all Client Services and Characteristics!
17:01:51.306 -> If Mandatory Services Fail --> the Client will disconnect!
17:01:51.306 -> Checking Generic Access and Device Information!
17:01:51.306 -> Start BLEDiscovery... does it help ?
17:01:51.849 -> Found Client Generic Access
17:01:52.014 -> -> Client Reads Device Name: []
17:01:52.339 -> -> Client Reads Appearance: [0]
17:01:52.586 -> Found Client Device Information
17:01:53.006 -> -> Client Reads Manufacturer: [Zwift]
17:01:53.424 -> Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
17:01:53.702 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Not Found!
17:01:53.795 -> Disconnecting since Client FTM Service is mandatory!
17:01:53.950 -> Client Disconnected, reason = 0x16
17:01:53.950 -> >>> Restart the Feather nRF52 Client for a new run! <<<

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hi Jorghën,

Is that what you want?

image

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorgen,

Despite many tests with different values, the best is +- 115 mms but not at all stable.

A lot of : 17:40:18.954 -> Client Disconnected, reason = 0x16

17:20:34.084 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
17:20:34.084 -> ------------------- Version 03.0 --------------------
17:20:34.084 -> Processor: Feather nRF52840
17:20:34.084 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:20:34.688 -> FTMS and Chars 'initialized'
17:20:34.688 -> CPS and Chars 'initialized'
17:20:34.688 -> CSCS and Chars 'initialized'
17:20:34.688 -> GA and Chars 'initialized'
17:20:34.689 -> DIS and Chars 'initialized'
17:20:34.689 -> HRMS and Chars 'initialized'
17:20:34.689 -> Start Scanning for CPS, CSC and FTMS!
17:20:34.689 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:20:34.689 -> Timestamp MAC Address Rssi Data
17:20:34.689 -> 000000615 F8:9C:FC:53:5E:49 -45 09-02-16-18-26-18-18-18-0A-18
17:20:34.690 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:20:34.690 -> >>> Request NEW Connection Parameters! Interval: 115 ms Latency: 0 Supervision Timeout: 4000 ms
17:20:34.690 -> Now checking all Client Services and Characteristics!
17:20:34.690 -> If Mandatory Services Fail --> the Client will disconnect!
17:20:34.690 -> Checking Generic Access and Device Information!
17:20:34.690 -> Start BLEDiscovery... does it help ?
17:20:34.894 -> Found Client Generic Access
17:20:35.476 -> -> Client Reads Device Name: []
17:20:35.848 -> -> Client Reads Appearance: [0]
17:20:35.943 -> Not Found Client Device Information!
17:20:35.943 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
17:20:36.435 -> Found it! FTMS Max Payload: 20 Data Length: 27
17:20:36.436 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:20:37.225 -> Discovering Client FTM Status Characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:20:38.740 -> Found it!
17:20:38.740 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:20:39.417 -> Discovering Client FTM Feature Characteristic ... Found it!
17:20:40.095 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
17:20:40.095 -> - Fitness Machine Features:
17:20:40.095 -> - Target Setting Features:
17:20:40.095 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:20:40.218 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Not Found! NOT mandatory!
17:20:40.297 -> Discovering Client FTM Supported Power Range Characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:20:40.421 -> Not Found! NOT mandatory!
17:20:40.421 -> Discovering Client Cycling Power (CP) Service ... Not Found!
17:20:40.560 -> Disconnecting since Client Cyling Power Service is mandatory!
17:20:42.504 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
17:20:44.616 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]
17:20:46.726 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 00 28 33 00 ]
17:20:48.820 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 00 00 28 33 00 ]

17:24:50.978 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
17:24:50.978 -> ------------------- Version 03.0 --------------------
17:24:50.978 -> Processor: Feather nRF52840
17:24:50.978 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:24:51.630 -> FTMS and Chars 'initialized'
17:24:51.630 -> CPS and Chars 'initialized'
17:24:51.630 -> CSCS and Chars 'initialized'
17:24:51.630 -> GA and Chars 'initialized'
17:24:51.630 -> DIS and Chars 'initialized'
17:24:51.630 -> HRMS and Chars 'initialized'
17:24:51.630 -> Start Scanning for CPS, CSC and FTMS!
17:24:51.631 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:24:51.631 -> Timestamp MAC Address Rssi Data
17:24:51.631 -> 000000654 F8:9C:FC:53:5E:49 -45 09-02-16-18-26-18-18-18-0A-18
17:24:51.631 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:24:51.631 -> >>> Request NEW Connection Parameters! Interval: 118 ms Latency: 0 Supervision Timeout: 4000 ms
17:24:51.631 -> Now checking all Client Services and Characteristics!
17:24:51.631 -> If Mandatory Services Fail --> the Client will disconnect!
17:24:51.631 -> Checking Generic Access and Device Information!
17:24:51.631 -> Start BLEDiscovery... does it help ?
17:24:52.440 -> Found Client Generic Access
17:24:52.458 -> -> Client Reads Device Name: []
17:24:52.977 -> -> Client Reads Appearance: [0]
17:24:53.103 -> Not Found Client Device Information!
17:24:53.103 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:24:53.366 -> Discovering Client FTM Control Point Characteristic ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
17:24:54.698 -> Found it!
17:24:54.698 -> Discovering Client FTM Status Characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:24:55.504 -> Found it!
17:24:55.504 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:24:56.107 -> Discovering Client FTM Feature Characteristic ... Found it!
17:24:56.571 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
17:24:56.571 -> - Fitness Machine Features:
17:24:56.571 -> - Target Setting Features:
17:24:56.571 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:24:56.695 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Found it!
17:24:57.281 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 00 00 00 00 ]
17:24:57.281 -> Discovering Client FTM Supported Power Range Characteristic ... Not Found! NOT mandatory!
17:24:57.404 -> Discovering Client Cycling Power (CP) Service ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:24:57.563 -> Not Found!
17:24:57.563 -> Disconnecting since Client Cyling Power Service is mandatory!
17:24:59.403 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
17:25:01.511 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]
17:25:03.615 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 00 28 33 00 ]

17:37:01.110 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
17:37:01.110 -> ------------------- Version 03.0 --------------------
17:37:01.110 -> Processor: Feather nRF52840
17:37:01.110 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:37:01.735 -> FTMS and Chars 'initialized'
17:37:01.735 -> CPS and Chars 'initialized'
17:37:01.735 -> CSCS and Chars 'initialized'
17:37:01.735 -> GA and Chars 'initialized'
17:37:01.735 -> DIS and Chars 'initialized'
17:37:01.735 -> HRMS and Chars 'initialized'
17:37:01.735 -> Start Scanning for CPS, CSC and FTMS!
17:37:01.735 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:37:01.735 -> Timestamp MAC Address Rssi Data
17:37:01.735 -> 000000620 F8:9C:FC:53:5E:49 -45 09-02-16-18-26-18-18-18-0A-18
17:37:02.454 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:37:02.454 -> >>> Request NEW Connection Parameters! Interval: 118 ms Latency: 0 Supervision Timeout: 4000 ms
17:37:02.454 -> Now checking all Client Services and Characteristics!
17:37:02.454 -> If Mandatory Services Fail --> the Client will disconnect!
17:37:02.454 -> Checking Generic Access and Device Information!
17:37:02.454 -> Start BLEDiscovery... does it help ?
17:37:02.483 -> Found Client Generic Access
17:37:02.483 -> -> Client Reads Device Name: []
17:37:02.781 -> -> Client Reads Appearance: [0]
17:37:02.921 -> Not Found Client Device Information!
17:37:02.921 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Found it! FTMS Max Payload: 20 Data Length: 27
17:37:03.417 -> Discovering Client FTM Control Point Characteristic ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
17:37:04.715 -> Found it!
17:37:04.715 -> Discovering Client FTM Status Characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:37:05.671 -> Found it!
17:37:05.671 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:37:06.740 -> Discovering Client FTM Feature Characteristic ... Found it!
17:37:07.158 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
17:37:07.158 -> - Fitness Machine Features:
17:37:07.158 -> - Target Setting Features:
17:37:07.158 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:37:07.295 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Not Found! NOT mandatory!
17:37:07.435 -> Discovering Client FTM Supported Power Range Characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:37:07.933 -> Found it!
17:37:08.027 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 00 00 00 00 ]
17:37:08.027 -> Discovering Client Cycling Power (CP) Service ... Not Found!
17:37:08.150 -> Disconnecting since Client Cyling Power Service is mandatory!
17:37:09.620 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
17:37:11.721 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]

17:38:03.799 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
17:38:03.799 -> ------------------- Version 03.0 --------------------
17:38:03.799 -> Processor: Feather nRF52840
17:38:03.799 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:38:04.313 -> FTMS and Chars 'initialized'
17:38:04.313 -> CPS and Chars 'initialized'
17:38:04.313 -> CSCS and Chars 'initialized'
17:38:04.313 -> GA and Chars 'initialized'
17:38:04.313 -> DIS and Chars 'initialized'
17:38:04.313 -> HRMS and Chars 'initialized'
17:38:04.313 -> Start Scanning for CPS, CSC and FTMS!
17:38:04.313 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:38:04.313 -> Timestamp MAC Address Rssi Data
17:38:04.313 -> 000001318 F8:9C:FC:53:5E:49 -45 09-02-16-18-26-18-18-18-0A-18
17:38:04.313 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:38:04.313 -> >>> Request NEW Connection Parameters! Interval: 118 ms Latency: 0 Supervision Timeout: 4000 ms
17:38:04.313 -> Now checking all Client Services and Characteristics!
17:38:04.313 -> If Mandatory Services Fail --> the Client will disconnect!
17:38:04.313 -> Checking Generic Access and Device Information!
17:38:04.313 -> Start BLEDiscovery... does it help ?
17:38:04.631 -> Found Client Generic Access
17:38:05.417 -> -> Client Reads Device Name: []
17:38:06.283 -> -> Client Reads Appearance: [0]
17:38:06.361 -> Not Found Client Device Information!
17:38:06.361 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
17:38:06.638 -> Found it! FTMS Max Payload: 20 Data Length: 27
17:38:06.638 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:38:07.599 -> Discovering Client FTM Status Characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:38:08.656 -> Found it!
17:38:08.656 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:38:09.257 -> Discovering Client FTM Feature Characteristic ... Found it!
17:38:09.708 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
17:38:09.709 -> - Fitness Machine Features:
17:38:09.709 -> - Target Setting Features:
17:38:09.709 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:38:09.847 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Not Found! NOT mandatory!
17:38:09.939 -> Discovering Client FTM Supported Power Range Characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:38:10.574 -> Found it!
17:38:10.667 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 00 00 00 00 ]
17:38:10.667 -> Discovering Client Cycling Power (CP) Service ... Not Found!
17:38:10.792 -> Disconnecting since Client Cyling Power Service is mandatory!
17:38:12.486 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
17:38:14.609 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]
17:38:16.705 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 00 28 33 00 ]

17:41:48.576 -> Feather nRF52 Client/Central: CPS, CSC, HBM and FTMS
17:41:48.576 -> ------------------- Version 03.0 --------------------
17:41:48.576 -> Processor: Feather nRF52840
17:41:48.576 -> Initialise the Bluefruit nRF52 module: Client (Central)
17:41:49.072 -> FTMS and Chars 'initialized'
17:41:49.072 -> CPS and Chars 'initialized'
17:41:49.072 -> CSCS and Chars 'initialized'
17:41:49.072 -> GA and Chars 'initialized'
17:41:49.072 -> DIS and Chars 'initialized'
17:41:49.072 -> HRMS and Chars 'initialized'
17:41:49.072 -> Start Scanning for CPS, CSC and FTMS!
17:41:49.072 -> Found advertising Peripheral with FTMS service!, see the Raw Data packet:
17:41:49.072 -> Timestamp MAC Address Rssi Data
17:41:49.072 -> 000001397 F8:9C:FC:53:5E:49 -46 09-02-16-18-26-18-18-18-0A-18
17:41:49.103 -> Feather nRF52 (Central) connected to Trainer (Peripheral) device: [Zwift Hub] MAC Address: F8:9C:FC:53:5E:49
17:41:49.103 -> >>> Request NEW Connection Parameters! Interval: 118 ms Latency: 0 Supervision Timeout: 4000 ms
17:41:49.103 -> Now checking all Client Services and Characteristics!
17:41:49.103 -> If Mandatory Services Fail --> the Client will disconnect!
17:41:49.103 -> Checking Generic Access and Device Information!
17:41:49.103 -> Start BLEDiscovery... does it help ?
17:41:49.890 -> Found Client Generic Access
17:41:50.800 -> -> Client Reads Device Name: []
17:41:51.172 -> -> Client Reads Appearance: [0]
17:41:51.296 -> Not Found Client Device Information!
17:41:51.296 -> Discovering Mandatory Client Fitness Machine (FTM) Service ... Enable Notify/Indicate of relevant Peripheral (Trainer) Characteristics
17:41:51.884 -> Found it! FTMS Max Payload: 20 Data Length: 27
17:41:51.884 -> Discovering Client FTM Control Point Characteristic ... Found it!
17:41:52.719 -> Discovering Client FTM Status Characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:41:53.926 -> Found it!
17:41:53.926 -> Discovering Client FTM Indoor Bike Data Characteristic ... Found it!
17:41:54.515 -> Discovering Client FTM Feature Characteristic ... Found it!
17:41:55.337 -> -> Client Reads Raw FTM Feature bytes: [8] [ 00 00 00 00 00 00 00 00 ]
17:41:55.337 -> - Fitness Machine Features:
17:41:55.337 -> - Target Setting Features:
17:41:55.337 -> Discovering Client FTM Training Status Characteristic ... Not Found! Not Mandatory
17:41:55.431 -> Discovering Client FTM Supported Resistance Level Range Characteristic ... Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 00 00 00 00 00 00 00 00 ]
17:41:55.554 -> Not Found! NOT mandatory!
17:41:55.554 -> Discovering Client FTM Supported Power Range Characteristic ... Not Found! NOT mandatory!
17:41:55.678 -> Discovering Client Cycling Power (CP) Service ... Not Found!
17:41:55.802 -> Disconnecting since Client Cyling Power Service is mandatory!
17:41:57.652 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 07 00 00 00 00 00 00 00 ]
17:41:59.756 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 22 01 28 33 00 ]
17:42:01.855 -> Client sends Indoor Bike Simulation Parameters to Trainer's FTM Control Point: [ 11 00 00 09 00 28 33 00 ]

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
That is NOT really the jackpot... 👎
If you still have the courage let's try just some small alterations...

    poll_delay = ConnInterval; // Synchronize SVC/CHR Discovery calls with Connection Interval

Modify --> Comment out the line

    //poll_delay = ConnInterval; // Synchronize SVC/CHR Discovery calls with Connection Interval

Try this with the connInterval value that was "most" successful around (92) 115 ms. If this new situation is improving the success rate, vary the connInterval value (from 72 and up) within the Zwift Hub Preferred Connection interval parameters

// - Zwift Hub will NOT pass 100%-error-free with a value of poll_delay lower than 250 ms !!
unsigned long poll_delay = 0;   // Unit is milliseconds
//---------------------------------------------------------------------------------------------------

You could give poll_delay in the above code line an arbitrary value of 50 ms....

Best wishes,
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorgen,

I think you made Jackpot with the ESP32!!!!!

I had no connection failure.

Here is the result :

12:04:50.863 -> ets Jun 8 2016 00:22:57
12:04:50.863 ->
12:04:50.863 -> rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
12:04:50.863 -> configsip: 0, SPIWP:0xee
12:04:50.863 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
12:04:50.863 -> mode:DIO, clock div:1
12:04:50.863 -> load:0x3fff0030,len:1344
12:04:50.863 -> load:0x40078000,len:13864
12:04:50.863 -> load:0x40080400,len:3608
12:04:50.863 -> entry 0x400805f0
12:04:51.096 -> ESP32 NimBLE MITM supporting: CPS, CSC, HBM and FTMS
12:04:51.096 -> ------------------ Version 01.0 --------------------
12:04:51.345 -> Configuring the default Generic Access Service
12:04:51.345 -> Successfully Set Generic Access Appearance Chr value to: [1152] Generic Cycling
12:04:51.345 -> Successfully Set Generic Access Device Name Chr value to: [Sim ESP32]
12:04:51.345 -> Configuring the Server Nordic Uart Service
12:04:51.345 -> Configuring the Server Device Information Service
12:04:51.377 -> Configuring the Server Cycle Power Service
12:04:51.377 -> Configuring the Server Cadence and Speed Service
12:04:51.377 -> Configuring the Server Fitness Machine Service
12:04:51.377 -> Configuring the Server Heart Rate Service
12:04:51.377 -> Setting up the Server advertising payload(s)
12:04:51.377 -> Setting Appearance in Advertised data to [1152]
12:04:51.377 -> Server is advertising: CPS, CSC and FTMS
12:04:51.377 -> Client Starts Scanning for Server Device with CPS, CSC and FTMS!
12:04:53.065 -> Found advertising Peripheral with FTMS enabled! See data:
12:04:53.101 -> Name: Zwift Hub, Address: f8:9c:fc:53:5e:49, appearance: 1152, manufacturer data: 4a09065e49, serviceUUID: 0x1816
12:04:53.101 -> Service Data:
12:04:53.101 -> UUID: 0x1826, Data: �
12:04:53.141 -> Client Connection Parameters -> Interval: [40] Latency: [0] Supervision Timeout: [256]
12:04:53.141 -> ESP32 Client connected to Server device with Name: [Zwift Hub] MAC Address: [F8:9C:FC:53:5E:49] Handle: [0] MTU: [244]
12:04:53.141 -> Now checking all Client Services and Characteristics!
12:04:53.141 -> If Mandatory Services Fail --> the Client will disconnect!
12:04:53.544 -> Client Generic Access: Found!
12:04:53.824 -> -> Client Reads Device Name: [Zwift Hub]
12:04:54.193 -> -> Client Reads Appearance: [1152]
12:04:54.271 -> Client Device Information Service: Found!
12:04:54.641 -> -> Client Reads Manufacturer Name: [Zwift]
12:04:55.000 -> -> Client Reads Model Number: [06]
12:04:55.373 -> -> Client Reads Serial Number: [06-F89CFC535E49]
12:04:55.636 -> Client_CyclingPower_Service: Found!
12:04:55.822 -> Client_CP_Measurement_Chr: Found!
12:04:56.377 -> Client_CP_Feature_Chr: Found!
12:04:56.456 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
12:04:56.456 -> Wheel revolution data supported
12:04:56.501 -> Crank revolution data supported
12:04:56.779 -> Client_CP_Location_Chr: Found!
12:04:56.857 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
12:04:57.088 -> Client_CyclingSpeedCadence_Service: Found!
12:04:57.336 -> Client_CSC_Measurement_Chr: Found!
12:04:57.893 -> Client_CSC_Feature_Chr: Found!
12:04:57.986 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
12:04:57.986 -> Wheel rev supported
12:04:57.986 -> Crank rev supported
12:04:58.232 -> Client_CSC_Location_Chr: Found!
12:04:58.421 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
12:04:58.823 -> Client_FitnessMachine_Service: Found!
12:04:59.135 -> Client_FTM_Feature_Chr: Found!
12:04:59.281 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
12:04:59.281 -> - Fitness Machine Features:
12:04:59.281 -> Average Speed Supported
12:04:59.281 -> Cadence Supported
12:04:59.281 -> Total Distance Supported
12:04:59.281 -> Resistance Level Supported
12:04:59.281 -> Heart Rate Measurement Supported
12:04:59.281 -> Power Measurement Supported
12:04:59.281 -> - Target Setting Features:
12:04:59.281 -> Resistance Target Setting Supported
12:04:59.281 -> Power Target Setting Supported
12:04:59.281 -> Indoor Bike Simulation Parameters Supported
12:04:59.320 -> Wheel Circumference Configuration Supported
12:04:59.320 -> Spin Down Control Supported
12:04:59.584 -> Client_FTM_IndoorBikeData_Chr: Found!
12:05:00.519 -> Client_FTM_TrainingStatus_Chr: Not Found!
12:05:00.831 -> Client_FTM_SupportedResistanceLevelRange_Chr: Found!
12:05:00.924 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
12:05:01.285 -> Client_FTM_SupportedPowerRange_Chr: Found!
12:05:01.373 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
12:05:01.637 -> Client_FTM_ControlPoint_Chr: Found!
12:05:02.432 -> Client_FTM_Status_Chr: Found!
12:05:03.135 -> Client_HeartRate_Service: Found!
12:05:03.384 -> Client_HR_Measurement_Chr: Found!
12:05:04.038 -> Client_HR_Location_Chr: Found!
12:05:04.132 -> -> Client Reads HR Location Sensor: Loc#: 1 Chest
12:06:01.821 -> Server Connection Parameters -> Interval: [48] Latency: [0] Supervision Timeout: [960]
12:06:01.821 -> ESP32 Server connected to Client device with MAC Address: [58:11:22:53:52:18] Conn Handle: [1]
12:06:01.821 -> Central (MyLaptop/Zwift) has to set CP/CSC/FTMS CCCD Notify/Indicate (enable) and start....
12:06:02.277 -> MTU updated: 255 for connection ID: 1
12:06:02.542 -> All Client (Trainer) Characteristics are Notify/Indicate Enabled!
12:06:06.951 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a63]
12:06:08.054 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a5b]
12:06:09.257 -> Central Updated CCCD --> Notify Enabled for Char: [0x2ad2]
12:06:09.885 -> Central Updated CCCD --> Indicate Enabled for Char: [0x2ad9]
12:06:10.432 -> Central Updated CCCD --> Notify Enabled for Char: [0x2ada]
12:06:11.276 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a37]
12:08:24.282 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
12:08:24.282 -> Request Control of Machine!
12:08:24.513 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 00 01 ]
12:08:24.652 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 01] [Values: 00 ]
12:08:24.652 -> Reset Machine!
12:08:24.715 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 01 01 ]
12:08:24.761 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [1] [ 01 ]
12:08:24.761 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
12:08:24.761 -> Request Control of Machine!
12:08:24.993 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 00 01 ]
12:08:25.071 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 07] [Values: 00 ]
12:08:25.071 -> Start or Resume Machine!
12:08:25.195 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 07 01 ]
12:08:25.242 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [1] [ 04 ]
12:08:26.114 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 E6 00 28 33 00 ]
12:08:26.160 -> Set Indoor Bike Simulation Parameters!
12:08:26.160 -> Wind speed (1000): 0.00 | Grade (100): 2.30 | Crr (10000): 0.00 | Cw (100): 0.51
12:08:26.283 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:08:26.283 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 E6 00 28 33 ]
12:10:02.871 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 CC 00 28 33 00 ]
12:10:02.871 -> Set Indoor Bike Simulation Parameters!
12:10:02.871 -> Wind speed (1000): 0.00 | Grade (100): 2.04 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:03.026 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:03.026 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 CC 00 28 33 ]
12:10:03.853 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 9A 00 28 33 00 ]
12:10:03.899 -> Set Indoor Bike Simulation Parameters!
12:10:03.899 -> Wind speed (1000): 0.00 | Grade (100): 1.54 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:04.223 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:04.223 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 9A 00 28 33 ]
12:10:05.269 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 90 00 28 33 00 ]
12:10:05.269 -> Set Indoor Bike Simulation Parameters!
12:10:05.269 -> Wind speed (1000): 0.00 | Grade (100): 1.44 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:05.392 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:05.438 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 90 00 28 33 ]
12:10:05.957 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 80 00 28 33 00 ]
12:10:06.001 -> Set Indoor Bike Simulation Parameters!
12:10:06.001 -> Wind speed (1000): 0.00 | Grade (100): 1.28 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:06.140 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:06.140 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 80 00 28 33 ]
12:10:07.012 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 75 00 28 33 00 ]
12:10:07.012 -> Set Indoor Bike Simulation Parameters!
12:10:07.012 -> Wind speed (1000): 0.00 | Grade (100): 1.17 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:07.230 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:07.230 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 75 00 28 33 ]
12:10:07.995 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 6D 00 28 33 00 ]
12:10:08.041 -> Set Indoor Bike Simulation Parameters!
12:10:08.041 -> Wind speed (1000): 0.00 | Grade (100): 1.09 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:08.304 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:08.304 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 6D 00 28 33 ]
12:10:09.162 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 64 00 28 33 00 ]
12:10:09.162 -> Set Indoor Bike Simulation Parameters!
12:10:09.162 -> Wind speed (1000): 0.00 | Grade (100): 1.00 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:09.396 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:09.396 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 64 00 28 33 ]
12:10:10.281 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 5B 00 28 33 00 ]
12:10:10.281 -> Set Indoor Bike Simulation Parameters!
12:10:10.281 -> Wind speed (1000): 0.00 | Grade (100): 0.91 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:10.468 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:10.468 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 5B 00 28 33 ]
12:10:11.264 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 55 00 28 33 00 ]
12:10:11.264 -> Set Indoor Bike Simulation Parameters!
12:10:11.264 -> Wind speed (1000): 0.00 | Grade (100): 0.85 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:11.435 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:11.435 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 55 00 28 33 ]
12:10:12.294 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 50 00 28 33 00 ]
12:10:12.294 -> Set Indoor Bike Simulation Parameters!
12:10:12.294 -> Wind speed (1000): 0.00 | Grade (100): 0.80 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:12.510 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:12.510 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 50 00 28 33 ]
12:10:13.588 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 4B 00 28 33 00 ]
12:10:13.588 -> Set Indoor Bike Simulation Parameters!
12:10:13.588 -> Wind speed (1000): 0.00 | Grade (100): 0.75 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:13.710 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:13.710 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 4B 00 28 33 ]
12:10:14.568 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 49 00 28 33 00 ]
12:10:14.568 -> Set Indoor Bike Simulation Parameters!
12:10:14.568 -> Wind speed (1000): 0.00 | Grade (100): 0.73 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:14.757 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:14.803 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 49 00 28 33 ]
12:10:15.642 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 46 00 28 33 00 ]
12:10:15.642 -> Set Indoor Bike Simulation Parameters!
12:10:15.642 -> Wind speed (1000): 0.00 | Grade (100): 0.70 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:15.722 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:15.722 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 46 00 28 33 ]
12:10:18.167 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 48 00 28 33 00 ]
12:10:18.167 -> Set Indoor Bike Simulation Parameters!
12:10:18.167 -> Wind speed (1000): 0.00 | Grade (100): 0.72 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:18.356 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:18.401 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 48 00 28 33 ]
12:10:19.216 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 4B 00 28 33 00 ]
12:10:19.262 -> Set Indoor Bike Simulation Parameters!
12:10:19.262 -> Wind speed (1000): 0.00 | Grade (100): 0.75 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:19.586 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:19.586 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 4B 00 28 33 ]
12:10:20.394 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 51 00 28 33 00 ]
12:10:20.394 -> Set Indoor Bike Simulation Parameters!
12:10:20.394 -> Wind speed (1000): 0.00 | Grade (100): 0.81 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:20.519 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:20.519 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 51 00 28 33 ]
12:10:21.468 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 58 00 28 33 00 ]
12:10:21.468 -> Set Indoor Bike Simulation Parameters!
12:10:21.468 -> Wind speed (1000): 0.00 | Grade (100): 0.88 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:21.593 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:21.640 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 58 00 28 33 ]
12:10:22.541 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 61 00 28 33 00 ]
12:10:22.541 -> Set Indoor Bike Simulation Parameters!
12:10:22.541 -> Wind speed (1000): 0.00 | Grade (100): 0.97 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:22.712 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:22.712 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 61 00 28 33 ]
12:10:23.505 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 6B 00 28 33 00 ]
12:10:23.505 -> Set Indoor Bike Simulation Parameters!
12:10:23.505 -> Wind speed (1000): 0.00 | Grade (100): 1.07 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:23.677 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:23.677 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 6B 00 28 33 ]
12:10:24.489 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 74 00 28 33 00 ]
12:10:24.535 -> Set Indoor Bike Simulation Parameters!
12:10:24.535 -> Wind speed (1000): 0.00 | Grade (100): 1.16 | Crr (10000): 0.00 | Cw (100): 0.51
12:10:24.752 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 11 01 ]
12:10:24.752 -> -> Client Rec'd Raw FTM Machine Status Data: [1] [7] [ 12 00 00 74 00 28 33 ]
12:10:25.579 -> --> Raw FTM Control Point Data [len: 7] [OpCode: 11] [Values: 00 00 7A 00 28 33 00 ]
12:10:25.579 -> Set Indoor Bike Simulation Parameters!
12:05:01.373 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]

image

image

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Jorgen,

I'm trying to compile the: esp32_FTMS_Simcline_v010

at line 513 I must correct like this #include "Lifter.h"

I will make the electronic connections to test everything actively.

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
I am very glad that the ESP32 code is working so well with your Zwift Hub... I assume that ESP32_Client is doing as well as FTMS_Zwift_Bridge...??

Lifter is a class that should reside in Arduino/libraries/, if that is the case is should be addressed as #include <Lifter.h> . In other cases when it resides in the same directory as the Arduino.ino file is should be addressed as #include "Lifter.h".

Have a nice weekend,
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Yes the ESP32_Client work perfectly !

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorgen,

I can't manage to properly adjust the values ​​for the inclination of the bike.

My bike is 96cm between the 2 wheels.

The axle of the rear wheel is 42 cm from the ground.

For the front wheel to be at the same height, the value of the VL6180X must be at 27 cm, i.e.:

Lifter.cpp
_TargetPosition = 270; // Choose the safe value of a flat road

But I don't think this is taken into account!!!!

The maximum high and Min low stroke

#define MINPOSITION 170 // VL6180X highest value top microswitch activated to mechanically stop operation
#define MAXPOSITION 370 // VL6180X lowest value bottom microswitch activated to mechanically stop operation

Despite the values ​​that I changed in the program after the start of the system and the self-test the wheel stood at 35cm from the ground.

Can you help me to adjust the values?

PS: Do you believe that with the dual core ESP32 it would be possible to add the fan speed ??? lol

Friendship ,
Joel.

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Positions

Does this help you?

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
Did you use the test programs in the Arduino directory?
These were added (among other things) to help one solve finding correct Top/Bottom positioning values.....
I have added an updated version derived from the Test_Manual..etcetera and Test_Auto..etcetera.... All in one and taking into account the development board for correct pin allocation. These are the tools you can do it with!
Please notice that the VL6180X is NOT calibrated (!) and NOT measuring in millimeters, at first glance it looks like but it is NOT! However, the Simcline code does take care as long as you enter the correct Min and Max, Top and Bottom values.
Best wishes,
Jörgen.

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

For the front wheel to be at the same height, the value of the VL6180X must be at 27 cm, i.e.:

Lifter.cpp
_TargetPosition = 270; // Choose the safe value of a flat road

But I don't think this is taken into account!!!!

The private class variables are defined in Lifter Class and set to an initial value

// Private variables for position control
  _IsBrakeOn = true;
  _IsMovingUp = false;
  _IsMovingDown = false;
  _TargetPosition = 400; // Choose the safe value of a flat road

Class methods are defined that allow setting new values, like:

void Lifter::SetTargetPosition(int16_t Tpos)
{
  _TargetPosition = Tpos;
}

It is safer to start with the Brakes on (true) and Moving-Up and -Down being false !!!
The value of 400 is arbitrary (but safer than 0 or 32000) and chosen in case the casual class user is not using the method lift.setTargetPosition(###) before Up/DownControl is activated... 400 would then mean: lift to something close to flat road position... That is a lot safer than lift until you reached the value of zero... If you study carefully the Simcline code you would see that ALWAYS first lift.SetTargetPosition(###) is called before UpDownMovement is called!
So to make a long story short: the initial value of 400 has really NOTHING to do with your specific horizontal wheel position and changing it will have no effect!

The settings in the Simcline code have an one on one relationship with the Simcline construction and how the wheel axle position is measured, between the top of the Aluminium Extruded Profile and the gliding Axle Cylinder mount. The photos, that you have sent me, suggest (but I am not sure) that with your setup you are having the same alignment. In that case, setting values for MINPOSITION and MAXPOSITION should bring you close to a working setup...
Did you check carefully that the VL6180X is measuring correct values over the whole range of axle movement? Alignment of the laser (with respect to its target) is very critical... I did not see a shiny reflection plate (target mirror) on your axle mount, do you have good response when you reach the maximal distance value of 30 cm?
Keep trying!
Jörgen.

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorgen,

I followed your instructions and tested with "esp32-nRF52_Simcline_Diagnostics_Test.ino"
After some mechanical adjustment everything is perfect !!! ;)

With the ESP 32 dual core don't you think it's possible to add the fans?.

Last thing the "Simcline_v2_4_4.apk" does not work on my Samsung android A71 I have this message :

image

Joel

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

from simcline.

le-joebar avatar le-joebar commented on July 23, 2024

Hello Jorgen,
I haven't spent the last few days adjusting the wheel height and now it's perfect.
I had done the editing with an ES 32 WROOM that I had in stock and I had a lot of untimely reboots!

Then its this calm and sometimes works without problem!

I thought it was because of the card.
So I ordered the Adafruit ESP32 FEATHER V2 but it's exactly the same.

I'll send you copies of the results.

On the Adafruit I did not put the Oled there the VL but it does not affect the result.

There is also this I don't know if it has to do? with adafruit and Wroom

16:27:00.700 -> ./components/esp_littlefs/src/littlefs/lfs.c:1229:error: Corrupted dir pair at {0x1, 0x0}
16:27:00.700 -> E (15) esp_littlefs: mount failed, (-84)
16:27:00.744 -> E (19) esp_littlefs: Failed to initialize LittleFS

ESP32-WROOM

16:27:00.441 -> ets Jun 8 2016 00:22:57
16:27:00.441 ->
16:27:00.441 -> rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
16:27:00.441 -> configsip: 0, SPIWP:0xee
16:27:00.441 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
16:27:00.483 -> mode:DIO, clock div:1
16:27:00.483 -> load:0x3fff0030,len:1344
16:27:00.483 -> load:0x40078000,len:13864
16:27:00.483 -> load:0x40080400,len:3608
16:27:00.483 -> entry 0x400805f0
16:27:00.700 -> ESP32 NimBLE SIMCLINE supporting: CPS, CSC, HBM and FTMS
16:27:00.700 -> -------------------- Version 01.1 ----------------------
16:27:00.700 -> ./components/esp_littlefs/src/littlefs/lfs.c:1229:error: Corrupted dir pair at {0x1, 0x0}
16:27:00.700 -> E (15) esp_littlefs: mount failed, (-84)
16:27:00.744 -> E (19) esp_littlefs: Failed to initialize LittleFS
16:27:00.744 -> SSD1306 OLED display is running...
16:27:10.284 -> otor Control Task Created and Active!
16:27:10.284 -> Simcline Basic Motor Funtions are working!!
16:27:10.550 -> Configuring the default Generic Access Service
16:27:10.550 -> Successfully Set Generic Access Appearance Chr value to: [1152] Generic Cycling
16:27:10.550 -> Successfully Set Generic Access Device Name Chr value to: [Sim ESP32]
16:27:10.582 -> Configuring the Server Nordic Uart Service
16:27:10.582 -> Configuring the Server Device Information Service
16:27:10.582 -> Configuring the Server Cycle Power Service
16:27:10.582 -> Configuring the Server Cadence and Speed Service
16:27:10.582 -> Configuring the Server Fitness Machine Service
16:27:10.582 -> Configuring the Server Heart Rate Service
16:27:10.582 -> Setting up the Server advertising payload(s)
16:27:10.627 -> Setting Appearance in Advertised data to [1152]
16:27:10.627 -> Server is advertising: CPS, CSC and FTMS
16:27:10.627 -> Client Starts Scanning for Server Device with CPS, CSC and FTMS!
16:27:10.706 -> Found advertising Peripheral with FTMS enabled! See data:
16:27:10.706 -> Name: Zwift Hub, Address: f8:9c:fc:53:5e:49, appearance: 1152, manufacturer data: 4a09065e49, serviceUUID: 0x1816
16:27:10.752 -> Service Data:
16:27:10.752 -> UUID: 0x1826, Data: �
16:27:10.784 -> Client Connection Parameters -> Interval: [40] Latency: [0] Supervision Timeout: [256]
16:27:10.784 -> ESP32 Client connected to Server device with Name: [Zwift Hub] MAC Address: [F8:9C:FC:53:5E:49] Handle: [0] MTU: [244]
16:27:10.830 -> Now checking all Client Services and Characteristics!
16:27:10.830 -> If Mandatory Services Fail --> the Client will disconnect!
16:27:11.158 -> Client Generic Access: Found!
16:27:11.611 -> -> Client Reads Device Name: [Zwift Hub]
16:27:12.191 -> -> Client Reads Appearance: [1152]
16:27:12.284 -> Client Device Information Service: Found!
16:27:12.886 -> -> Client Reads Manufacturer Name: [Zwift]
16:27:13.365 -> -> Client Reads Model Number: [06]
16:27:13.902 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:27:14.409 -> Client_CyclingPower_Service: Found!
16:27:14.688 -> Client_CP_Measurement_Chr: Found!
16:27:15.655 -> Client_CP_Feature_Chr: Found!
16:27:15.902 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
16:27:15.902 -> Wheel revolution data supported
16:27:15.902 -> Crank revolution data supported
16:27:16.303 -> Client_CP_Location_Chr: Found!
16:27:16.442 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
16:27:16.736 -> Client_CyclingSpeedCadence_Service: Found!
16:27:17.045 -> Client_CSC_Measurement_Chr: Found!
16:27:17.906 -> Client_CSC_Feature_Chr: Found!
16:27:18.047 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
16:27:18.047 -> Wheel rev supported
16:27:18.047 -> Crank rev supported
16:27:18.356 -> Client_CSC_Location_Chr: Found!
16:27:18.587 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
16:27:18.847 -> Client_FitnessMachine_Service: Found!
16:27:19.065 -> Client_FTM_Feature_Chr: Found!
16:27:19.235 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
16:27:19.235 -> - Fitness Machine Features:
16:27:19.235 -> Average Speed Supported
16:27:19.235 -> Cadence Supported
16:27:19.235 -> Total Distance Supported
16:27:19.235 -> Resistance Level Supported
16:27:19.235 -> Heart Rate Measurement Supported
16:27:19.235 -> Power Measurement Supported
16:27:19.281 -> - Target Setting Features:
16:27:19.281 -> Resistance Target Setting Supported
16:27:19.281 -> Power Target Setting Supported
16:27:19.281 -> Indoor Bike Simulation Parameters Supported
16:27:19.281 -> Wheel Circumference Configuration Supported
16:27:19.281 -> Spin Down Control Supported
16:27:19.560 -> Client_FTM_IndoorBikeData_Chr: Found!
16:27:20.908 -> Client_FTM_TrainingStatus_Chr: Not Found!
16:27:21.138 -> Client_FTM_SupportedResistanceLevelRange_Chr: Found!
16:27:21.217 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
16:27:21.600 -> Client_FTM_SupportedPowerRange_Chr: Found!
16:27:21.787 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
16:27:22.202 -> Client_FTM_ControlPoint_Chr: Found!
16:27:22.892 -> Client_FTM_Status_Chr: Found!
16:27:23.753 -> Client_HeartRate_Service: Found!
16:27:23.985 -> Client_HR_Measurement_Chr: Found!
16:27:24.907 -> Client_HR_Location_Chr: Found!
16:27:25.138 -> -> Client Reads HR Location Sensor: Loc#: 1 Chest
16:32:36.029 -> erver Connection Parameters -> Interval: [48] Latency: [0] Supervision Timeout: [960]
16:32:36.029 -> ESP32 Server connected to Client device with MAC Address: [58:11:22:53:52:18] Conn Handle: [1]
16:32:36.029 -> Central (MyLaptop/Zwift) has to set CP/CSC/FTMS CCCD Notify/Indicate (enable) and start....
16:32:36.587 -> Central (MyLaptop/Zwift) updated MTU to: [255] for connection ID: 1
16:32:37.243 -> All Client (Trainer) Characteristics are Notify/Indicate Enabled!
16:32:41.215 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a63]
16:32:42.355 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a5b]
16:32:43.381 -> Central Updated CCCD --> Notify Enabled for Char: [0x2ad2]
16:32:44.102 -> Central Updated CCCD --> Indicate Enabled for Char: [0x2ad9]
16:32:44.631 -> Central Updated CCCD --> Notify Enabled for Char: [0x2ada]
16:32:45.503 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a37]
16:33:13.496 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
16:33:13.496 -> Request Control of Machine!
16:33:14.381 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 00 01 ]
16:33:14.521 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 01] [Values: 00 ]
16:33:14.521 -> Reset Machine!
16:33:14.646 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
16:33:14.646 -> Request Control of Machine!
16:33:14.851 -> Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). Exception was unhandled.
16:33:14.851 -> Memory dump at 0x400d2808: 3f6508a8 00f01dc2 81004136
16:33:14.851 -> Core 1 register dump:
16:33:14.851 -> PC : 0x400d280d PS : 0x00060030 A0 : 0x00000000 A1 : 0x3ffd20c0
16:33:14.851 -> A2 : 0x00000000 A3 : 0x00000000 A4 : 0x00000000 A5 : 0x00000000
16:33:14.851 -> A6 : 0x00000000 A7 : 0x00000000 A8 : 0x800d280d A9 : 0x3ffd20a0
16:33:14.883 -> A10 : 0x3ffd2ad4 A11 : 0x00000001 A12 : 0x0000000b A13 : 0x3ffd215c
16:33:14.883 -> A14 : 0x00000000 A15 : 0x3ffc3fbc SAR : 0x00000009 EXCCAUSE: 0x00000000
16:33:14.883 -> EXCVADDR: 0x00000000 LBEG : 0x4009044c LEND : 0x40090462 LCOUNT : 0x00000000
16:33:14.883 ->
16:33:14.883 ->
16:33:14.883 -> Backtrace:0x400d280a:0x3ffd20c0
16:33:14.915 ->
16:33:14.915 ->
16:33:14.915 ->
16:33:14.915 ->
16:33:14.915 -> ELF file SHA256: 0000000000000000
16:33:14.915 ->
16:33:14.915 -> Rebooting...
16:33:14.915 -> ets Jun 8 2016 00:22:57
16:33:14.915 ->
16:33:14.915 -> rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
16:33:14.915 -> configsip: 0, SPIWP:0xee
16:33:14.915 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
16:33:14.915 -> mode:DIO, clock div:1
16:33:14.915 -> load:0x3fff0030,len:1344
16:33:14.915 -> load:0x40078000,len:13864
16:33:14.915 -> load:0x40080400,len:3608
16:33:14.915 -> entry 0x400805f0
16:33:15.164 -> ESP32 NimBLE SIMCLINE supporting: CPS, CSC, HBM and FTMS
16:33:15.164 -> -------------------- Version 01.1 ----------------------
16:33:15.164 -> ./components/esp_littlefs/src/littlefs/lfs.c:1229:error: Corrupted dir pair at {0x1, 0x0}
16:33:15.164 -> E (15) esp_littlefs: mount failed, (-84)
16:33:15.210 -> E (19) esp_littlefs: Failed to initialize LittleFS
16:33:15.210 -> SSD1306 OLED display is running...
16:33:24.709 -> Motor Control Task Created and Active!
16:33:24.709 -> Simcline Basic Motor Funtions are working!!
16:33:25.019 -> Configuring the default Generic Access Service
16:33:25.019 -> Successfully Set Generic Access Appearance Chr value to: [1152] Generic Cycling
16:33:25.019 -> Successfully Set Generic Access Device Name Chr value to: [Sim ESP32]
16:33:25.019 -> Configuring the Server Nordic Uart Service
16:33:25.019 -> Configuring the Server Device Information Service
16:33:25.051 -> Configuring the Server Cycle Power Service
16:33:25.051 -> Configuring the Server Cadence and Speed Service
16:33:25.051 -> Configuring the Server Fitness Machine Service
16:33:25.051 -> Configuring the Server Heart Rate Service
16:33:25.051 -> Setting up the Server advertising payload(s)
16:33:25.051 -> Setting Appearance in Advertised data to [1152]
16:33:25.051 -> Server is advertising: CPS, CSC and FTMS
16:33:25.089 -> Client Starts Scanning for Server Device with CPS, CSC and FTMS!
16:33:25.126 -> Found advertising Peripheral with FTMS enabled! See data:
16:33:25.126 -> Name: Zwift Hub, Address: f8:9c:fc:53:5e:49, appearance: 1152, manufacturer data: 4a09065e49, serviceUUID: 0x1816
16:33:25.126 -> Service Data:
16:33:25.126 -> UUID: 0x1826, Data: �
16:33:25.191 -> Client Connection Parameters -> Interval: [40] Latency: [0] Supervision Timeout: [256]
16:33:25.191 -> ESP32 Client connected to Server device with Name: [Zwift Hub] MAC Address: [F8:9C:FC:53:5E:49] Handle: [0] MTU: [244]
16:33:25.237 -> Now checking all Client Services and Characteristics!
16:33:25.237 -> If Mandatory Services Fail --> the Client will disconnect!
16:33:25.595 -> Client Generic Access: Found!
16:33:26.067 -> -> Client Reads Device Name: [Zwift Hub]
16:33:26.476 -> -> Client Reads Appearance: [1152]
16:33:26.662 -> Client Device Information Service: Found!
16:33:27.207 -> -> Client Reads Manufacturer Name: [Zwift]
16:33:27.766 -> -> Client Reads Model Number: [06]
16:33:28.126 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:33:28.377 -> Client_CyclingPower_Service: Found!
16:33:28.894 -> Client_CP_Measurement_Chr: Found!
16:33:29.033 -> Server Connection Parameters -> Interval: [48] Latency: [0] Supervision Timeout: [960]
16:33:29.033 -> ESP32 Server connected to Client device with MAC Address: [58:11:22:53:52:18] Conn Handle: [1]
16:33:29.033 -> Central (MyLaptop/Zwift) has to set CP/CSC/FTMS CCCD Notify/Indicate (enable) and start....
16:33:29.171 -> Central (MyLaptop/Zwift) updated MTU to: [255] for connection ID: 1
16:33:29.843 -> Client_CP_Feature_Chr: Found!
16:33:30.060 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
16:33:30.060 -> Wheel revolution data supported
16:33:30.060 -> Crank revolution data supported
16:33:30.324 -> Client_CP_Location_Chr: Found!
16:33:30.513 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
16:33:30.794 -> Client_CyclingSpeedCadence_Service: Found!
16:33:31.107 -> Client_CSC_Measurement_Chr: Found!
16:33:31.964 -> Client_CSC_Feature_Chr: Found!
16:33:32.104 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
16:33:32.104 -> Wheel rev supported
16:33:32.104 -> Crank rev supported
16:33:32.402 -> Client_CSC_Location_Chr: Found!
16:33:32.528 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
16:33:33.164 -> Client_FitnessMachine_Service: Found!
16:33:33.413 -> Client_FTM_Feature_Chr: Found!
16:33:33.633 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
16:33:33.633 -> - Fitness Machine Features:
16:33:33.665 -> Average Speed Supported
16:33:33.665 -> Cadence Supported
16:33:33.665 -> Total Distance Supported
16:33:33.665 -> Resistance Level Supported
16:33:33.665 -> Heart Rate Measurement Supported
16:33:33.665 -> Power Measurement Supported
16:33:33.665 -> - Target Setting Features:
16:33:33.665 -> Resistance Target Setting Supported
16:33:33.665 -> Power Target Setting Supported
16:33:33.665 -> Indoor Bike Simulation Parameters Supported
16:33:33.665 -> Wheel Circumference Configuration Supported
16:33:33.665 -> Spin Down Control Supported
16:33:33.787 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a63]
16:33:33.959 -> Client_FTM_IndoorBikeData_Chr: Found!
16:33:34.910 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a5b]
16:33:35.563 -> Client_FTM_TrainingStatus_Chr: Not Found!
16:33:35.909 -> Central Updated CCCD --> Notify Enabled for Char: [0x2ad2]
16:33:36.003 -> Client_FTM_SupportedResistanceLevelRange_Chr: Found!
16:33:36.130 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
16:33:36.471 -> Central Updated CCCD --> Indicate Enabled for Char: [0x2ad9]
16:33:36.517 -> Client_FTM_SupportedPowerRange_Chr: Found!
16:33:36.686 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
16:33:36.966 -> Central Updated CCCD --> Notify Enabled for Char: [0x2ada]
16:33:37.012 -> Client_FTM_ControlPoint_Chr: Found!
16:33:37.888 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a37]
16:33:38.013 -> Client_FTM_Status_Chr: Found!
16:33:38.903 -> Client_HeartRate_Service: Found!
16:33:39.417 -> Client_HR_Measurement_Chr: Found!
16:33:40.195 -> Client_HR_Location_Chr: Found!
16:33:40.412 -> -> Client Reads HR Location Sensor: Loc#: 1 Chest
16:33:40.833 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
16:33:40.833 -> Request Control of Machine!
16:33:41.999 -> All Client (Trainer) Characteristics are Notify/Indicate Enabled!
16:33:43.060 -> All Client (Trainer) Characteristics are Notify/Indicate Enabled!
16:33:45.858 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
16:33:45.858 -> Request Control of Machine!
16:33:45.984 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 00 01 ]
16:33:46.153 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 01] [Values: 00 ]
16:33:46.153 -> Reset Machine!
16:33:46.278 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
16:33:46.278 -> Request Control of Machine!
16:33:46.403 -> Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). Exception was unhandled.
16:33:46.403 -> Memory dump at 0x400d2808: 3f6508a8 00f01dc2 81004136
16:33:46.403 -> Core 1 register dump:
16:33:46.403 -> PC : 0x400d280d PS : 0x00060830 A0 : 0x00000000 A1 : 0x3ffd2060
16:33:46.403 -> A2 : 0x00000000 A3 : 0x00000000 A4 : 0x00000000 A5 : 0x00000000
16:33:46.435 -> A6 : 0x00000000 A7 : 0x00000000 A8 : 0x800d280d A9 : 0x3ffd2040
16:33:46.435 -> A10 : 0x3ffd2a78 A11 : 0x00000001 A12 : 0x0000000b A13 : 0x3ffd2100
16:33:46.435 -> A14 : 0x00000000 A15 : 0x3ffc3fbc SAR : 0x00000009 EXCCAUSE: 0x00000000
16:33:46.435 -> EXCVADDR: 0x00000000 LBEG : 0x4009044c LEND : 0x40090462 LCOUNT : 0x00000000
16:33:46.467 ->
16:33:46.467 ->
16:33:46.467 -> Backtrace:0x400d280a:0x3ffd2060
16:33:46.467 ->
16:33:46.467 ->
16:33:46.467 ->
16:33:46.467 ->
16:33:46.467 -> ELF file SHA256: 0000000000000000
16:33:46.467 ->
16:33:46.467 -> Rebooting...
16:33:46.467 -> ets Jun 8 2016 00:22:57
16:33:46.467 ->
16:33:46.467 -> rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
16:33:46.467 -> configsip: 0, SPIWP:0xee
16:33:46.467 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
16:33:46.467 -> mode:DIO, clock div:1
16:33:46.467 -> load:0x3fff0030,len:1344
16:33:46.467 -> load:0x40078000,len:13864
16:33:46.509 -> load:0x40080400,len:3608
16:33:46.509 -> entry 0x400805f0
16:33:46.729 -> ESP32 NimBLE SIMCLINE supporting: CPS, CSC, HBM and FTMS
16:33:46.729 -> -------------------- Version 01.1 ----------------------
16:33:46.729 -> ./components/esp_littlefs/src/littlefs/lfs.c:1229:error: Corrupted dir pair at {0x1, 0x0}
16:33:46.729 -> E (15) esp_littlefs: mount failed, (-84)
16:33:46.729 -> E (19) esp_littlefs: Failed to initialize LittleFS
16:33:46.729 -> SSD1306 OLED display is running...
16:33:56.266 -> Motor Control Task Created and Active!
16:33:56.312 -> Simcline Basic Motor Funtions are working!!
16:33:56.577 -> Configuring the default Generic Access Service
16:33:56.577 -> Successfully Set Generic Access Appearance Chr value to: [1152] Generic Cycling
16:33:56.609 -> Successfully Set Generic Access Device Name Chr value to: [Sim ESP32]
16:33:56.609 -> Configuring the Server Nordic Uart Service
16:33:56.609 -> Configuring the Server Device Information Service
16:33:56.609 -> Configuring the Server Cycle Power Service
16:33:56.609 -> Configuring the Server Cadence and Speed Service
16:33:56.609 -> Configuring the Server Fitness Machine Service
16:33:56.609 -> Configuring the Server Heart Rate Service
16:33:56.642 -> Setting up the Server advertising payload(s)
16:33:56.642 -> Setting Appearance in Advertised data to [1152]
16:33:56.642 -> Server is advertising: CPS, CSC and FTMS
16:33:56.642 -> Client Starts Scanning for Server Device with CPS, CSC and FTMS!
16:33:56.684 -> Found advertising Peripheral with FTMS enabled! See data:
16:33:56.684 -> Name: Zwift Hub, Address: f8:9c:fc:53:5e:49, appearance: 1152, manufacturer data: 4a09065e49, serviceUUID: 0x1816
16:33:56.684 -> Service Data:
16:33:56.684 -> UUID: 0x1826, Data: �
16:33:56.761 -> Client Connection Parameters -> Interval: [40] Latency: [0] Supervision Timeout: [256]
16:33:56.761 -> ESP32 Client connected to Server device with Name: [Zwift Hub] MAC Address: [F8:9C:FC:53:5E:49] Handle: [0] MTU: [244]
16:33:56.808 -> Now checking all Client Services and Characteristics!
16:33:56.808 -> If Mandatory Services Fail --> the Client will disconnect!
16:33:57.231 -> Client Generic Access: Found!
16:33:57.885 -> -> Client Reads Device Name: [Zwift Hub]
16:33:58.275 -> -> Client Reads Appearance: [1152]
16:33:58.400 -> Server Connection Parameters -> Interval: [48] Latency: [0] Supervision Timeout: [960]
16:33:58.400 -> ESP32 Server connected to Client device with MAC Address: [58:11:22:53:52:18] Conn Handle: [1]
16:33:58.400 -> Central (MyLaptop/Zwift) has to set CP/CSC/FTMS CCCD Notify/Indicate (enable) and start....
16:33:58.400 -> Client Device Information Service: Found!
16:33:58.446 -> Central (MyLaptop/Zwift) updated MTU to: [255] for connection ID: 1
16:33:58.834 -> -> Client Reads Manufacturer Name: [Zwift]
16:33:59.285 -> -> Client Reads Model Number: [06]
16:33:59.831 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:34:00.141 -> Client_CyclingPower_Service: Found!
16:34:00.499 -> Client_CP_Measurement_Chr: Found!
16:34:01.293 -> Client_CP_Feature_Chr: Found!
16:34:01.386 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
16:34:01.386 -> Wheel revolution data supported
16:34:01.386 -> Crank revolution data supported
16:34:01.667 -> Client_CP_Location_Chr: Found!
16:34:01.839 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
16:34:02.073 -> Client_CyclingSpeedCadence_Service: Found!
16:34:02.338 -> Client_CSC_Measurement_Chr: Found!
16:34:02.902 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a63]
16:34:03.134 -> Client_CSC_Feature_Chr: Found!
16:34:03.353 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
16:34:03.353 -> Wheel rev supported
16:34:03.399 -> Crank rev supported
16:34:03.648 -> Client_CSC_Location_Chr: Found!
16:34:03.788 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
16:34:04.021 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a5b]
16:34:04.099 -> Client_FitnessMachine_Service: Found!
16:34:04.380 -> Client_FTM_Feature_Chr: Found!
16:34:04.503 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
16:34:04.534 -> - Fitness Machine Features:
16:34:04.534 -> Average Speed Supported
16:34:04.534 -> Cadence Supported
16:34:04.534 -> Total Distance Supported
16:34:04.534 -> Resistance Level Supported
16:34:04.534 -> Heart Rate Measurement Supported
16:34:04.534 -> Power Measurement Supported
16:34:04.534 -> - Target Setting Features:
16:34:04.534 -> Resistance Target Setting Supported
16:34:04.534 -> Power Target Setting Supported
16:34:04.534 -> Indoor Bike Simulation Parameters Supported
16:34:04.534 -> Wheel Circumference Configuration Supported
16:34:04.579 -> Spin Down Control Supported
16:34:04.843 -> Client_FTM_IndoorBikeData_Chr: Found!
16:34:04.969 -> Central Updated CCCD --> Notify Enabled for Char: [0x2ad2]
16:34:05.576 -> Central Updated CCCD --> Indicate Enabled for Char: [0x2ad9]
16:34:06.079 -> Client_FTM_TrainingStatus_Chr: Not Found!
16:34:06.122 -> Central Updated CCCD --> Notify Enabled for Char: [0x2ada]
16:34:06.482 -> Client_FTM_SupportedResistanceLevelRange_Chr: Found!
16:34:06.621 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
16:34:06.839 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
16:34:06.839 -> Request Control of Machine!
16:34:06.934 -> Client_FTM_SupportedPowerRange_Chr: Found!
16:34:07.122 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a37]
16:34:07.170 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
16:34:07.529 -> Client_FTM_ControlPoint_Chr: Found!
16:34:08.277 -> Client_FTM_Status_Chr: Found!
16:34:09.022 -> Client_HeartRate_Service: Found!
16:34:09.492 -> Client_HR_Measurement_Chr: Found!
16:34:10.130 -> Client_HR_Location_Chr: Found!
16:34:10.256 -> -> Client Reads HR Location Sensor: Loc#: 1 Chest
16:34:11.221 -> All Client (Trainer) Characteristics are Notify/Indicate Enabled!
16:34:11.689 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
16:34:11.689 -> Request Control of Machine!
16:34:11.782 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 00 01 ]
16:34:11.876 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 01] [Values: 00 ]
16:34:11.876 -> Reset Machine!
16:34:11.955 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 01 01 ]
16:34:12.001 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
16:34:12.001 -> Request Control of Machine!
16:34:12.032 -> Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). Exception was unhandled.
16:34:12.032 -> Memory dump at 0x400d2808: 3f6508a8 00f01dc2 81004136
16:34:12.032 -> Core 1 register dump:
16:34:12.032 -> PC : 0x400d280d PS : 0x00060b30 A0 : 0x00000000 A1 : 0x3ffd2060
16:34:12.032 -> A2 : 0x00000000 A3 : 0x00000000 A4 : 0x00000000 A5 : 0x00000000
16:34:12.065 -> A6 : 0x00000000 A7 : 0x00000000 A8 : 0x800d280d A9 : 0x3ffd2040
16:34:12.065 -> A10 : 0x3ffd2a78 A11 : 0x00000001 A12 : 0x0000000b A13 : 0x3ffd2100
16:34:12.065 -> A14 : 0x00000000 A15 : 0x3ffc3fbc SAR : 0x00000009 EXCCAUSE: 0x00000000
16:34:12.065 -> EXCVADDR: 0x00000000 LBEG : 0x4009044c LEND : 0x40090462 LCOUNT : 0x00000000
16:34:12.065 ->
16:34:12.065 ->
16:34:12.065 -> Backtrace:0x400d280a:0x3ffd2060
16:34:12.096 ->
16:34:12.096 ->
16:34:12.096 ->
16:34:12.096 ->
16:34:12.096 -> ELF file SHA256: 0000000000000000
16:34:12.096 ->
16:34:12.096 -> Rebooting...
16:34:12.096 -> ets Jun 8 2016 00:22:57
16:34:12.096 ->
16:34:12.096 -> rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
16:34:12.096 -> configsip: 0, SPIWP:0xee
16:34:12.096 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
16:34:12.096 -> mode:DIO, clock div:1
16:34:12.096 -> load:0x3fff0030,len:1344
16:34:12.096 -> load:0x40078000,len:13864
16:34:12.096 -> load:0x40080400,len:3608
16:34:12.141 -> entry 0x400805f0
16:34:12.359 -> ESP32 NimBLE SIMCLINE supporting: CPS, CSC, HBM and FTMS
16:34:12.359 -> -------------------- Version 01.1 ----------------------
16:34:12.359 -> ./components/esp_littlefs/src/littlefs/lfs.c:1229:error: Corrupted dir pair at {0x1, 0x0}
16:34:12.359 -> E (15) esp_littlefs: mount failed, (-84)
16:34:12.359 -> E (19) esp_littlefs: Failed to initialize LittleFS
16:34:12.359 -> SSD1306 OLED display is running...
16:34:22.350 -> otor Control Task Created and Active!
16:34:22.395 -> Simcline Basic Motor Funtions are working!!
16:34:22.658 -> Configuring the default Generic Access Service
16:34:22.658 -> Successfully Set Generic Access Appearance Chr value to: [1152] Generic Cycling
16:34:22.690 -> Successfully Set Generic Access Device Name Chr value to: [Sim ESP32]
16:34:22.690 -> Configuring the Server Nordic Uart Service
16:34:22.690 -> Configuring the Server Device Information Service
16:34:22.690 -> Configuring the Server Cycle Power Service
16:34:22.690 -> Configuring the Server Cadence and Speed Service
16:34:22.690 -> Configuring the Server Fitness Machine Service
16:34:22.690 -> Configuring the Server Heart Rate Service
16:34:22.724 -> Setting up the Server advertising payload(s)
16:34:22.724 -> Setting Appearance in Advertised data to [1152]
16:34:22.724 -> Server is advertising: CPS, CSC and FTMS
16:34:22.724 -> Client Starts Scanning for Server Device with CPS, CSC and FTMS!
16:34:22.724 -> Found advertising Peripheral with FTMS enabled! See data:
16:34:22.765 -> Name: Zwift Hub, Address: f8:9c:fc:53:5e:49, appearance: 1152, manufacturer data: 4a09065e49, serviceUUID: 0x1816
16:34:22.765 -> Service Data:
16:34:22.765 -> UUID: 0x1826, Data: �
16:34:22.843 -> Client Connection Parameters -> Interval: [40] Latency: [0] Supervision Timeout: [256]
16:34:22.843 -> ESP32 Client connected to Server device with Name: [Zwift Hub] MAC Address: [F8:9C:FC:53:5E:49] Handle: [0] MTU: [244]
16:34:22.889 -> Now checking all Client Services and Characteristics!
16:34:22.889 -> If Mandatory Services Fail --> the Client will disconnect!

ADAFRUIT ESP32 Feather V2

16:39:39.343 -> ets Jul 29 2019 12:21:46
16:39:39.343 ->
16:39:39.343 -> rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
16:39:39.385 -> configsip: 271414342, SPIWP:0xee
16:39:39.385 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
16:39:39.385 -> mode:DIO, clock div:1
16:39:39.385 -> load:0x3fff0030,len:1184
16:39:39.385 -> load:0x40078000,len:13160
16:39:39.385 -> load:0x40080400,len:3036
16:39:39.385 -> entry 0x400805e4
16:39:39.882 -> ESP32 NimBLE SIMCLINE supporting: CPS, CSC, HBM and FTMS
16:39:39.882 -> -------------------- Version 01.1 ----------------------
16:39:39.882 -> ./components/esp_littlefs/src/littlefs/lfs.c:1229:error: Corrupted dir pair at {0x0, 0x1}
16:39:39.882 -> E (253) esp_littlefs: mount failed, (-84)
16:39:39.882 -> E (257) esp_littlefs: Failed to initialize LittleFS
16:39:39.925 -> SSD1306 OLED display is running...
16:40:10.516 -> Simcline >> ERROR << Basic Motor Funtions are NOT working!!
16:40:10.820 -> Configuring the default Generic Access Service
16:40:10.820 -> Successfully Set Generic Access Appearance Chr value to: [1152] Generic Cycling
16:40:10.820 -> Successfully Set Generic Access Device Name Chr value to: [Sim ESP32]
16:40:10.820 -> Configuring the Server Nordic Uart Service
16:40:10.820 -> Configuring the Server Device Information Service
16:40:10.820 -> Configuring the Server Cycle Power Service
16:40:10.856 -> Configuring the Server Cadence and Speed Service
16:40:10.856 -> Configuring the Server Fitness Machine Service
16:40:10.856 -> Configuring the Server Heart Rate Service
16:40:10.856 -> Setting up the Server advertising payload(s)
16:40:10.856 -> Setting Appearance in Advertised data to [1152]
16:40:10.856 -> Server is advertising: CPS, CSC and FTMS
16:40:10.856 -> Client Starts Scanning for Server Device with CPS, CSC and FTMS!
16:40:11.164 -> Found advertising Peripheral with FTMS enabled! See data:
16:40:11.164 -> Name: Zwift Hub, Address: f8:9c:fc:53:5e:49, appearance: 1152, manufacturer data: 4a09065e49, serviceUUID: 0x1816
16:40:11.164 -> Service Data:
16:40:11.164 -> UUID: 0x1826, Data: �
16:40:11.211 -> Client Connection Parameters -> Interval: [40] Latency: [0] Supervision Timeout: [256]
16:40:11.211 -> ESP32 Client connected to Server device with Name: [Zwift Hub] MAC Address: [F8:9C:FC:53:5E:49] Handle: [0] MTU: [244]
16:40:11.211 -> Now checking all Client Services and Characteristics!
16:40:11.211 -> If Mandatory Services Fail --> the Client will disconnect!
16:40:11.658 -> Client Generic Access: Found!
16:40:12.185 -> -> Client Reads Device Name: [Zwift Hub]
16:40:12.694 -> -> Client Reads Appearance: [1152]
16:40:12.868 -> Client Device Information Service: Found!
16:40:13.358 -> -> Client Reads Manufacturer Name: [Zwift]
16:40:13.849 -> -> Client Reads Model Number: [06]
16:40:14.388 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:40:14.711 -> Client_CyclingPower_Service: Found!
16:40:14.896 -> Client_CP_Measurement_Chr: Found!
16:40:15.637 -> Client_CP_Feature_Chr: Found!
16:40:15.807 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
16:40:15.807 -> Wheel revolution data supported
16:40:15.808 -> Crank revolution data supported
16:40:16.040 -> Client_CP_Location_Chr: Found!
16:40:16.163 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
16:40:16.502 -> Client_CyclingSpeedCadence_Service: Found!
16:40:16.949 -> Client_CSC_Measurement_Chr: Found!
16:40:17.641 -> Client_CSC_Feature_Chr: Found!
16:40:17.766 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
16:40:17.811 -> Wheel rev supported
16:40:17.812 -> Crank rev supported
16:40:18.091 -> Client_CSC_Location_Chr: Found!
16:40:18.261 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
16:40:18.444 -> Client_FitnessMachine_Service: Found!
16:40:18.709 -> Client_FTM_Feature_Chr: Found!
16:40:18.837 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
16:40:18.837 -> - Fitness Machine Features:
16:40:18.837 -> Average Speed Supported
16:40:18.837 -> Cadence Supported
16:40:18.837 -> Total Distance Supported
16:40:18.837 -> Resistance Level Supported
16:40:18.880 -> Heart Rate Measurement Supported
16:40:18.880 -> Power Measurement Supported
16:40:18.880 -> - Target Setting Features:
16:40:18.880 -> Resistance Target Setting Supported
16:40:18.880 -> Power Target Setting Supported
16:40:18.880 -> Indoor Bike Simulation Parameters Supported
16:40:18.880 -> Wheel Circumference Configuration Supported
16:40:18.880 -> Spin Down Control Supported
16:40:19.142 -> Client_FTM_IndoorBikeData_Chr: Found!
16:40:20.050 -> Client_FTM_TrainingStatus_Chr: Not Found!
16:40:20.405 -> Client_FTM_SupportedResistanceLevelRange_Chr: Found!
16:40:20.498 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
16:40:20.808 -> Client_FTM_SupportedPowerRange_Chr: Found!
16:40:20.900 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
16:40:21.118 -> Client_FTM_ControlPoint_Chr: Found!
16:40:21.991 -> Client_FTM_Status_Chr: Found!
16:40:22.593 -> Client_HeartRate_Service: Found!
16:40:22.963 -> Client_HR_Measurement_Chr: Found!
16:40:23.549 -> Client_HR_Location_Chr: Found!
16:40:23.735 -> -> Client Reads HR Location Sensor: Loc#: 1 Chest
16:41:28.693 -> Server Connection Parameters -> Interval: [48] Latency: [0] Supervision Timeout: [960]
16:41:28.693 -> ESP32 Server connected to Client device with MAC Address: [58:11:22:53:52:18] Conn Handle: [1]
16:41:28.693 -> Central (MyLaptop/Zwift) has to set CP/CSC/FTMS CCCD Notify/Indicate (enable) and start....
16:41:29.209 -> Central (MyLaptop/Zwift) updated MTU to: [255] for connection ID: 1
16:41:29.958 -> All Client (Trainer) Characteristics are Notify/Indicate Enabled!
16:41:33.806 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a63]
16:41:35.004 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a5b]
16:41:35.959 -> Central Updated CCCD --> Notify Enabled for Char: [0x2ad2]
16:41:36.644 -> Central Updated CCCD --> Indicate Enabled for Char: [0x2ad9]
16:41:37.086 -> Central Updated CCCD --> Notify Enabled for Char: [0x2ada]
16:41:37.959 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a37]
16:42:04.405 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
16:42:04.405 -> Request Control of Machine!
16:42:04.965 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 00 01 ]
16:42:05.090 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 01] [Values: 00 ]
16:42:05.090 -> Reset Machine!
16:42:05.169 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
16:42:05.213 -> Request Control of Machine!
16:42:05.329 -> Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). Exception was unhandled.
16:42:05.329 -> Memory dump at 0x400d2944: 7fa508a8 00f01dc3 81004136
16:42:05.329 -> Core 1 register dump:
16:42:05.329 -> PC : 0x400d2949 PS : 0x00060430 A0 : 0x00000000 A1 : 0x3ffd1010
16:42:05.329 -> A2 : 0x00000000 A3 : 0x00000000 A4 : 0x00000000 A5 : 0x00000000
16:42:05.362 -> A6 : 0x00000000 A7 : 0x00000000 A8 : 0x800d2949 A9 : 0x3ffd0ff0
16:42:05.362 -> A10 : 0x3ffd1a24 A11 : 0x00000001 A12 : 0x0000000a A13 : 0x3ffd10ac
16:42:05.362 -> A14 : 0x00000000 A15 : 0x3ffc3ffc SAR : 0x00000005 EXCCAUSE: 0x00000000
16:42:05.362 -> EXCVADDR: 0x00000000 LBEG : 0x400917e4 LEND : 0x40091800 LCOUNT : 0x00000000
16:42:05.399 ->
16:42:05.399 ->
16:42:05.399 -> Backtrace:0x400d2946:0x3ffd1010
16:42:05.399 ->
16:42:05.399 ->
16:42:05.399 ->
16:42:05.399 ->
16:42:05.399 -> ELF file SHA256: 0000000000000000
16:42:05.399 ->
16:42:05.399 -> Rebooting...
16:42:05.399 -> ets Jul 29 2019 12:21:46
16:42:05.399 ->
16:42:05.399 -> rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
16:42:05.399 -> configsip: 271414342, SPIWP:0xee
16:42:05.399 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
16:42:05.399 -> mode:DIO, clock div:1
16:42:05.399 -> load:0x3fff0030,len:1184
16:42:05.399 -> load:0x40078000,len:13160
16:42:05.399 -> load:0x40080400,len:3036
16:42:05.399 -> entry 0x400805e4
16:42:05.904 -> ESP32 NimBLE SIMCLINE supporting: CPS, CSC, HBM and FTMS
16:42:05.904 -> -------------------- Version 01.1 ----------------------
16:42:05.904 -> ./components/esp_littlefs/src/littlefs/lfs.c:1229:error: Corrupted dir pair at {0x0, 0x1}
16:42:05.946 -> E (253) esp_littlefs: mount failed, (-84)
16:42:05.946 -> E (257) esp_littlefs: Failed to initialize LittleFS
16:42:05.946 -> SSD1306 OLED display is running...
16:42:36.583 -> Simcline >> ERROR << Basic Motor Funtions are NOT working!!
16:42:36.845 -> Configuring the default Generic Access Service
16:42:36.845 -> Successfully Set Generic Access Appearance Chr value to: [1152] Generic Cycling
16:42:36.845 -> Successfully Set Generic Access Device Name Chr value to: [Sim ESP32]
16:42:36.845 -> Configuring the Server Nordic Uart Service
16:42:36.845 -> Configuring the Server Device Information Service
16:42:36.845 -> Configuring the Server Cycle Power Service
16:42:36.891 -> Configuring the Server Cadence and Speed Service
16:42:36.891 -> Configuring the Server Fitness Machine Service
16:42:36.891 -> Configuring the Server Heart Rate Service
16:42:36.891 -> Setting up the Server advertising payload(s)
16:42:36.891 -> Setting Appearance in Advertised data to [1152]
16:42:36.891 -> Server is advertising: CPS, CSC and FTMS
16:42:36.891 -> Client Starts Scanning for Server Device with CPS, CSC and FTMS!
16:42:36.937 -> Found advertising Peripheral with FTMS enabled! See data:
16:42:36.937 -> Name: Zwift Hub, Address: f8:9c:fc:53:5e:49, appearance: 1152, manufacturer data: 4a09065e49, serviceUUID: 0x1816
16:42:36.937 -> Service Data:
16:42:36.937 -> UUID: 0x1826, Data: �
16:42:37.019 -> Client Connection Parameters -> Interval: [40] Latency: [0] Supervision Timeout: [256]
16:42:37.019 -> ESP32 Client connected to Server device with Name: [Zwift Hub] MAC Address: [F8:9C:FC:53:5E:49] Handle: [0] MTU: [244]
16:42:37.019 -> Now checking all Client Services and Characteristics!
16:42:37.061 -> If Mandatory Services Fail --> the Client will disconnect!
16:42:37.421 -> Client Generic Access: Found!
16:42:37.926 -> -> Client Reads Device Name: [Zwift Hub]
16:42:38.460 -> -> Client Reads Appearance: [1152]
16:42:38.584 -> Client Device Information Service: Found!
16:42:38.662 -> Server Connection Parameters -> Interval: [48] Latency: [0] Supervision Timeout: [960]
16:42:38.662 -> ESP32 Server connected to Client device with MAC Address: [58:11:22:53:52:18] Conn Handle: [1]
16:42:38.662 -> Central (MyLaptop/Zwift) has to set CP/CSC/FTMS CCCD Notify/Indicate (enable) and start....
16:42:38.662 -> Central (MyLaptop/Zwift) updated MTU to: [255] for connection ID: 1
16:42:39.019 -> -> Client Reads Manufacturer Name: [Zwift]
16:42:39.428 -> -> Client Reads Model Number: [06]
16:42:39.989 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:42:40.535 -> Client_CyclingPower_Service: Found!
16:42:40.800 -> Client_CP_Measurement_Chr: Found!
16:42:41.733 -> Client_CP_Feature_Chr: Found!
16:42:41.810 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
16:42:41.810 -> Wheel revolution data supported
16:42:41.810 -> Crank revolution data supported
16:42:42.107 -> Client_CP_Location_Chr: Found!
16:42:42.263 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
16:42:42.635 -> Client_CyclingSpeedCadence_Service: Found!
16:42:42.918 -> Client_CSC_Measurement_Chr: Found!
16:42:43.247 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a63]
16:42:44.120 -> Client_CSC_Feature_Chr: Found!
16:42:44.213 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
16:42:44.213 -> Wheel rev supported
16:42:44.213 -> Crank rev supported
16:42:44.339 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a5b]
16:42:44.683 -> Client_CSC_Location_Chr: Found!
16:42:44.871 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
16:42:45.280 -> Central Updated CCCD --> Notify Enabled for Char: [0x2ad2]
16:42:45.373 -> Client_FitnessMachine_Service: Found!
16:42:45.683 -> Client_FTM_Feature_Chr: Found!
16:42:45.906 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
16:42:45.906 -> - Fitness Machine Features:
16:42:45.906 -> Average Speed Supported
16:42:45.906 -> Cadence Supported
16:42:45.948 -> Total Distance Supported
16:42:45.948 -> Resistance Level Supported
16:42:45.948 -> Heart Rate Measurement Supported
16:42:45.948 -> Power Measurement Supported
16:42:45.948 -> - Target Setting Features:
16:42:45.948 -> Resistance Target Setting Supported
16:42:45.948 -> Power Target Setting Supported
16:42:45.948 -> Indoor Bike Simulation Parameters Supported
16:42:45.948 -> Wheel Circumference Configuration Supported
16:42:45.948 -> Spin Down Control Supported
16:42:45.948 -> Central Updated CCCD --> Indicate Enabled for Char: [0x2ad9]
16:42:46.294 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
16:42:46.294 -> Request Control of Machine!
16:42:46.294 -> Client_FTM_IndoorBikeData_Chr: Found!
16:42:46.556 -> Central Updated CCCD --> Notify Enabled for Char: [0x2ada]
16:42:47.384 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a37]
16:42:47.664 -> Client_FTM_TrainingStatus_Chr: Not Found!
16:42:48.085 -> Client_FTM_SupportedResistanceLevelRange_Chr: Found!
16:42:48.179 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
16:42:48.630 -> Client_FTM_SupportedPowerRange_Chr: Found!
16:42:48.723 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
16:42:49.146 -> Client_FTM_ControlPoint_Chr: Found!
16:42:49.868 -> Client_FTM_Status_Chr: Found!
16:42:50.884 -> Client_HeartRate_Service: Found!
16:42:51.165 -> Client_HR_Measurement_Chr: Found!
16:42:51.338 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
16:42:51.338 -> Request Control of Machine!
16:42:52.228 -> Client_HR_Location_Chr: Found!
16:42:52.307 -> -> Client Reads HR Location Sensor: Loc#: 1 Chest
16:42:53.464 -> All Client (Trainer) Characteristics are Notify/Indicate Enabled!
16:42:54.732 -> All Client (Trainer) Characteristics are Notify/Indicate Enabled!
16:42:56.378 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
16:42:56.378 -> Request Control of Machine!
16:42:56.534 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 00 01 ]
16:42:56.675 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 01] [Values: 00 ]
16:42:56.675 -> Reset Machine!
16:42:56.802 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
16:42:56.802 -> Request Control of Machine!
16:42:56.802 -> Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). Exception was unhandled.
16:42:56.835 -> Memory dump at 0x400d2944: 7fa508a8 00f01dc3 81004136
16:42:56.835 -> Core 1 register dump:
16:42:56.835 -> PC : 0x400d2949 PS : 0x00060230 A0 : 0x00000000 A1 : 0x3ffd0db0
16:42:56.835 -> A2 : 0x00000000 A3 : 0x00000000 A4 : 0x00000000 A5 : 0x00000000
16:42:56.835 -> A6 : 0x00000000 A7 : 0x00000000 A8 : 0x800d2949 A9 : 0x3ffd0d90
16:42:56.835 -> A10 : 0x3ffd17c4 A11 : 0x00000001 A12 : 0x0000000a A13 : 0x3ffd0e4c
16:42:56.867 -> A14 : 0x00000000 A15 : 0x3ffc3ffc SAR : 0x00000004 EXCCAUSE: 0x00000000
16:42:56.867 -> EXCVADDR: 0x00000000 LBEG : 0x400917e4 LEND : 0x40091800 LCOUNT : 0x00000000
16:42:56.867 ->
16:42:56.867 ->
16:42:56.867 -> Backtrace:0x400d2946:0x3ffd0db0
16:42:56.867 ->
16:42:56.867 ->
16:42:56.867 ->
16:42:56.867 ->
16:42:56.867 -> ELF file SHA256: 0000000000000000
16:42:56.867 ->
16:42:56.867 -> Rebooting...
16:42:56.906 -> ets Jul 29 2019 12:21:46
16:42:56.906 ->
16:42:56.906 -> rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
16:42:56.906 -> configsip: 271414342, SPIWP:0xee
16:42:56.906 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
16:42:56.906 -> mode:DIO, clock div:1
16:42:56.906 -> load:0x3fff0030,len:1184
16:42:56.906 -> load:0x40078000,len:13160
16:42:56.906 -> load:0x40080400,len:3036
16:42:56.906 -> entry 0x400805e4
16:42:57.425 -> ESP32 NimBLE SIMCLINE supporting: CPS, CSC, HBM and FTMS
16:42:57.425 -> -------------------- Version 01.1 ----------------------
16:42:57.425 -> ./components/esp_littlefs/src/littlefs/lfs.c:1229:error: Corrupted dir pair at {0x0, 0x1}
16:42:57.425 -> E (253) esp_littlefs: mount failed, (-84)
16:42:57.425 -> E (257) esp_littlefs: Failed to initialize LittleFS
16:42:57.425 -> SSD1306 OLED display is running...
16:43:28.075 -> Simcline >> ERROR << Basic Motor Funtions are NOT working!!
16:43:28.329 -> Configuring the default Generic Access Service
16:43:28.329 -> Successfully Set Generic Access Appearance Chr value to: [1152] Generic Cycling
16:43:28.329 -> Successfully Set Generic Access Device Name Chr value to: [Sim ESP32]
16:43:28.329 -> Configuring the Server Nordic Uart Service
16:43:28.329 -> Configuring the Server Device Information Service
16:43:28.362 -> Configuring the Server Cycle Power Service
16:43:28.362 -> Configuring the Server Cadence and Speed Service
16:43:28.362 -> Configuring the Server Fitness Machine Service
16:43:28.362 -> Configuring the Server Heart Rate Service
16:43:28.362 -> Setting up the Server advertising payload(s)
16:43:28.362 -> Setting Appearance in Advertised data to [1152]
16:43:28.362 -> Server is advertising: CPS, CSC and FTMS
16:43:28.362 -> Client Starts Scanning for Server Device with CPS, CSC and FTMS!
16:43:28.394 -> Found advertising Peripheral with FTMS enabled! See data:
16:43:28.394 -> Name: Zwift Hub, Address: f8:9c:fc:53:5e:49, appearance: 1152, manufacturer data: 4a09065e49, serviceUUID: 0x1816
16:43:28.394 -> Service Data:
16:43:28.394 -> UUID: 0x1826, Data: �
16:43:28.464 -> Client Connection Parameters -> Interval: [40] Latency: [0] Supervision Timeout: [256]
16:43:28.464 -> ESP32 Client connected to Server device with Name: [Zwift Hub] MAC Address: [F8:9C:FC:53:5E:49] Handle: [0] MTU: [244]
16:43:28.464 -> Now checking all Client Services and Characteristics!
16:43:28.464 -> If Mandatory Services Fail --> the Client will disconnect!
16:43:29.010 -> Client Generic Access: Found!
16:43:29.602 -> -> Client Reads Device Name: [Zwift Hub]
16:43:29.634 -> Server Connection Parameters -> Interval: [48] Latency: [0] Supervision Timeout: [960]
16:43:29.634 -> ESP32 Server connected to Client device with MAC Address: [58:11:22:53:52:18] Conn Handle: [1]
16:43:29.680 -> Central (MyLaptop/Zwift) has to set CP/CSC/FTMS CCCD Notify/Indicate (enable) and start....
16:43:29.680 -> Central (MyLaptop/Zwift) updated MTU to: [255] for connection ID: 1
16:43:30.168 -> -> Client Reads Appearance: [1152]
16:43:30.262 -> Client Device Information Service: Found!
16:43:30.761 -> -> Client Reads Manufacturer Name: [Zwift]
16:43:31.448 -> -> Client Reads Model Number: [06]
16:43:32.055 -> -> Client Reads Serial Number: [06-F89CFC535E49]
16:43:32.351 -> Client_CyclingPower_Service: Found!
16:43:32.760 -> Client_CP_Measurement_Chr: Found!
16:43:33.599 -> Client_CP_Feature_Chr: Found!
16:43:33.790 -> -> Client Reads Raw CP Feature bytes: [4] [ 0C 00 00 00 ]
16:43:33.790 -> Wheel revolution data supported
16:43:33.835 -> Crank revolution data supported
16:43:34.164 -> Client_CP_Location_Chr: Found!
16:43:34.304 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a63]
16:43:34.350 -> -> Client Reads CP Location Sensor: Loc#: 12 Rear wheel
16:43:34.722 -> Client_CyclingSpeedCadence_Service: Found!
16:43:35.114 -> Client_CSC_Measurement_Chr: Found!
16:43:35.519 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a5b]
16:43:36.161 -> Client_CSC_Feature_Chr: Found!
16:43:36.380 -> -> Client Reads Raw CSC Feature bytes: [2] [ 03 00 ]
16:43:36.380 -> Wheel rev supported
16:43:36.380 -> Crank rev supported
16:43:36.536 -> Central Updated CCCD --> Notify Enabled for Char: [0x2ad2]
16:43:36.773 -> Client_CSC_Location_Chr: Found!
16:43:36.866 -> -> Client Reads CSC Location Sensor: Loc#: 12 Rear wheel
16:43:37.148 -> Central Updated CCCD --> Indicate Enabled for Char: [0x2ad9]
16:43:37.272 -> Client_FitnessMachine_Service: Found!
16:43:37.639 -> Client_FTM_Feature_Chr: Found!
16:43:37.680 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
16:43:37.680 -> Request Control of Machine!
16:43:37.796 -> Central Updated CCCD --> Notify Enabled for Char: [0x2ada]
16:43:37.796 -> -> Client Reads Raw FTM Feature bytes: [8] [ 87 44 00 00 0C E0 00 00 ]
16:43:37.796 -> - Fitness Machine Features:
16:43:37.796 -> Average Speed Supported
16:43:37.796 -> Cadence Supported
16:43:37.836 -> Total Distance Supported
16:43:37.836 -> Resistance Level Supported
16:43:37.836 -> Heart Rate Measurement Supported
16:43:37.836 -> Power Measurement Supported
16:43:37.836 -> - Target Setting Features:
16:43:37.836 -> Resistance Target Setting Supported
16:43:37.836 -> Power Target Setting Supported
16:43:37.836 -> Indoor Bike Simulation Parameters Supported
16:43:37.836 -> Wheel Circumference Configuration Supported
16:43:37.836 -> Spin Down Control Supported
16:43:38.273 -> Client_FTM_IndoorBikeData_Chr: Found!
16:43:38.694 -> Central Updated CCCD --> Notify Enabled for Char: [0x2a37]
16:43:39.847 -> Client_FTM_TrainingStatus_Chr: Not Found!
16:43:40.223 -> Client_FTM_SupportedResistanceLevelRange_Chr: Found!
16:43:40.362 -> -> Client Reads Raw FTM Supported Resistance Level Range bytes: [6] [ 00 00 64 00 01 00 ]
16:43:40.816 -> Client_FTM_SupportedPowerRange_Chr: Found!
16:43:40.989 -> -> Client Reads Raw FTM Supported Power Range bytes: [6] [ 00 00 E8 03 01 00 ]
16:43:41.414 -> Client_FTM_ControlPoint_Chr: Found!
16:43:42.271 -> Client_FTM_Status_Chr: Found!
16:43:42.696 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
16:43:42.696 -> Request Control of Machine!
16:43:43.213 -> Client_HeartRate_Service: Found!
16:43:43.523 -> Client_HR_Measurement_Chr: Found!
16:43:44.872 -> Client_HR_Location_Chr: Found!
16:43:44.998 -> -> Client Reads HR Location Sensor: Loc#: 1 Chest
16:43:46.153 -> All Client (Trainer) Characteristics are Notify/Indicate Enabled!
16:43:47.415 -> All Client (Trainer) Characteristics are Notify/Indicate Enabled!
16:43:47.744 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
16:43:47.744 -> Request Control of Machine!
16:43:47.916 -> -> Client Rec'd Raw FTM Control Point Response Data: [0] [3] [ 80 00 01 ]
16:43:47.994 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 01] [Values: 00 ]
16:43:47.994 -> Reset Machine!
16:43:48.118 -> --> Raw FTM Control Point Data [len: 1] [OpCode: 00] [Values: 00 ]
16:43:48.118 -> Request Control of Machine!
16:43:48.151 -> Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). Exception was unhandled.
16:43:48.151 -> Memory dump at 0x400d2944: 7fa508a8 00f01dc3 81004136
16:43:48.151 -> Core 1 register dump:
16:43:48.151 -> PC : 0x400d2949 PS : 0x00060030 A0 : 0x00000000 A1 : 0x3ffd0dc0
16:43:48.185 -> A2 : 0x00000000 A3 : 0x00000000 A4 : 0x00000000 A5 : 0x00000000
16:43:48.185 -> A6 : 0x00000000 A7 : 0x00000000 A8 : 0x800d2949 A9 : 0x3ffd0da0
16:43:48.185 -> A10 : 0x3ffd17cc A11 : 0x00000001 A12 : 0x0000000a A13 : 0x3ffd0e54
16:43:48.185 -> A14 : 0x00000000 A15 : 0x3ffc3ffc SAR : 0x00000004 EXCCAUSE: 0x00000000
16:43:48.222 -> EXCVADDR: 0x00000000 LBEG : 0x400917e4 LEND : 0x40091800 LCOUNT : 0x00000000
16:43:48.222 ->
16:43:48.222 ->
16:43:48.222 -> Backtrace:0x400d2946:0x3ffd0dc0
16:43:48.222 ->
16:43:48.222 ->
16:43:48.222 ->
16:43:48.222 ->
16:43:48.222 -> ELF file SHA256: 0000000000000000
16:43:48.222 ->
16:43:48.222 -> Rebooting...
16:43:48.222 -> ets Jul 29 2019 12:21:46
16:43:48.222 ->
16:43:48.222 -> rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
16:43:48.222 -> configsip: 271414342, SPIWP:0xee
16:43:48.222 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
16:43:48.222 -> mode:DIO, clock div:1
16:43:48.258 -> load:0x3fff0030,len:1184
16:43:48.258 -> load:0x40078000,len:13160
16:43:48.258 -> load:0x40080400,len:3036
16:43:48.258 -> entry 0x400805e4
16:43:48.759 -> ESP32 NimBLE SIMCLINE supporting: CPS, CSC, HBM and FTMS
16:43:48.759 -> -------------------- Version 01.1 ----------------------
16:43:48.759 -> ./components/esp_littlefs/src/littlefs/lfs.c:1229:error: Corrupted dir pair at {0x0, 0x1}
16:43:48.759 -> E (253) esp_littlefs: mount failed, (-84)
16:43:48.759 -> E (257) esp_littlefs: Failed to initialize LittleFS
16:43:48.759 -> SSD1306 OLED display is running...
16:44:19.401 -> Simcline >> ERROR << Basic Motor Funtions are NOT working!!
16:44:19.666 -> Configuring the default Generic Access Service
16:44:19.666 -> Successfully Set Generic Access Appearance Chr value to: [1152] Generic Cycling
16:44:19.666 -> Successfully Set Generic Access Device Name Chr value to: [Sim ESP32]
16:44:19.701 -> Configuring the Server Nordic Uart Service

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Dear Joel,
Let's handle the error message of LittleFS (Little File System) first! Have a close look at this part in the code:

  DEBUG_PRINTLN("ESP32 NimBLE SIMCLINE supporting: CPS, CSC, HBM and FTMS");
  DEBUG_PRINTLN("-------------------- Version 01.1 ----------------------");
  // LittleFS start the Littlefilesystem lib and see if we have persistent data ----
  // This opens LittleFS with a root subdirectory /littlefs/
  LittleFS.begin();
  // WARNING --------- Uncomment only when strictly necessary!!! ---------
  // Uncomment only the very first time the Simcline code is executed!!!
  /* This creates LittleFS with a root subdirectory /littlefs/
  LittleFS.format();
  DEBUG_PRINTLN("Wipe out all persistent data, including any file(s)....");
  */
  // Get or set (first time only) the values of relevant and crucial variables
  // to persistence, with the Companion App the user can set these on the fly!
  // Get or set the values of aRGVmax, aRGVmin, GradeChangeFactor in PRSdata.
  if (!getPRSdata()) {
    setPRSdata();
  }
  // LittleFS------------------------------------------------------------------------

The LittleFS error messages make it quite clear that you did NOT allow LittleFS (the first time you run the code) to create (LittleFS.format) a virtual FS-partition on the ESP32 development board that you run the Simcline code on...
(when you change boards you have to repeat this!) Every time, after startup, the Simcline code tries to open the FS-partition, read a file (getPRSdata) with persistent variable values.... and it will fail consequently! ---> You can solve this yourself!

By the way is the Companion App working after you have allowed Bluetooth to access your location?
Notice that you can test the working of Phone-ESP32 with esp32_FTMS_Server_v010 by connecting your phone when the server is running! (NO FS-PARTION IS CREATED RUNNING THE SERVER CODE!)
Best wishes,
Jörgen.

from simcline.

Berg0162 avatar Berg0162 commented on July 23, 2024

Welcome to the world of ESP32:

Guru Meditation Error: Core 1 panic'ed (Illegal Instruction). Exception was unhandled.

This message covers a plethora of potential causes.....

Then its this calm and sometimes works without problem!

Although you have sent 5 times the same (finally) fatal output, as I understand it: --> it will run sometimes without any problem!
Question: Correct?

This points to a critical timing problem, one of the processes on Core #1 is timed out and I guess it has to do with handling of server_FTM_ControlPoint_Chr , looking at the debug output, the callback handling is active most probably when the error occurs.
Question: You never had this error when running esp32_FTMS_Zwift_Bridge_v010 with DEBUG activated?

You have DEBUG activated with the following parts defined:

#ifdef DEBUG
//  Restrict activating one or more of the following DEBUG directives --> process intensive 
//  The overhead can lead to spurious side effects and a loss of quality of service handling!!
//#define DEBUG_HBM               // If defined allows for parsing and decoding the Heart Beat Data
//#define DEBUG_CP_MEASUREMENT    // If defined allows for parsing and decoding the Cycling Power Data
//#define DEBUG_CSC_MEASUREMENT   // If defined allows for parsing and decoding the Cycling Speed and Cadence Data
//#define DEBUG_FTM_INDOORBIKEDATA// If defined allows for parsing the Indoor Bike Data
#ifdef DEBUG_FTM_INDOORBIKEDATA
//#define DEBUG_DECODE_IBD        // If defined allows for decoding the Indoor Bike Data
#endif
//#define DEBUG_FTM_TRAININGSTATUS// If defined allows for parsing the Training Status Data
//#define DEBUG_FTM_STATUS        // If defined allows for parsing the Machine Status Data
#define DEBUG_FTM_CONTROLPOINT_RESPONSE     // If defined allows for parsing the Data
#define DEBUG_FTM_CONTROLPOINT_OPCODE_DATA  // If defined allows for parsing and decoding Data
#endif

With my experimental setup that is never causing problems but I have Arduino IDE Serial Monitor running at 115200 baud... So printing to serial monitor is fast....so less prone to timing errors!
Question: What is your baud rate setting of Arduino IDE Serial Monitor?

My suggestion is to try the following steps first:

  1. Comment out
//#define DEBUG_FTM_CONTROLPOINT_RESPONSE     // If defined allows for parsing the Data
//#define DEBUG_FTM_CONTROLPOINT_OPCODE_DATA  // If defined allows for parsing and decoding Data
  1. Switch Arduino IDE: Tools -> Core Debug Level: "Error"
  2. Compile, Upload and Run again, with Serial Monitor active for output

from simcline.

Related Issues (9)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.