Suunto PC Pod
Review - Programming
Questions? email: info@iomule.com

Downloads

Update - I've completed the first version 0.5 of my own heart rate monitor software for the Suunto PC Pod.

Download Source - ioMule_PC_Pod_Monitor_v0.5.rar
Download Exe - ioMule_PC_Pod_Monitor_v0.5.exe
(You will need .net framework 1.1 to run the .exe)




Introduction

I ordered the Suunto Home Training Pack, a few days later the package arrived containing, Heart Rate Chest Belt, Usb PC Pod, manuals and a software CD. The software CD will probably be out of date, so visit the Suunto website to download the latest software.

Suunto PC Pod

Quick Review

The hardware is great, built on the ANT technology it's rock solid and later on when you analyze the protocol you'll see the 2.4GHz RF signal is very stable.

The software is terrible, it works, but only has the bare minimum features, it's difficult to understand why they would build this great training tool and then in the last stages skimp on the software development. I understand not "Gold Plating" during development but as is noted in the Suunto forums the software is really a let down.

Since the software was so poor I was forced to decode the protocol so that I could write my own software.


Programming

Here are the steps I took to write my own vb.net program using data from the Suunto PC Pod...

Step 1 - Install the Suunto software

From the Suunto website I downloaded and installed

Training Manager 2.1.2 With Monitor 1.1.1

After installation I ran the Suunto Monitor to ensure the Heart Rate belt was working

Suunto Monitor 1.1.1

Step 2 - Check the log file

Based on my install location I found the file "Monitor_Errors.txt" in folder "C:\Program Files\Suunto Monitor\"



The file showed, what I suspect is for maximum operating system compatibility, the USB (Universal "Serial" Bus) was being setup as a meat and potatoes COM port, in my case port COM4.



Step 3 - Find the COM port / Modem settings in the registry

Searching through the registry using the search term "Suunto" I found this handy entry.

InitialBaudRate: 115200
InitialLineControl: 8N1



Step 4 - Write a program to intercept the packets

For quick investigation I used vb.net, Microsoft convienietly has a serial port access example available for download "UsingtheCOMPortinVB.NET.exe". But any code used for a modem with a serial port will do.

If you're using the example

m_CommPort.Open(4, 115200, 8, Rs232.DataParity.Parity_None, Rs232.DataStopBit.StopBit_1, 4096)

will open the port.

I then wrote a little function to split up the packets into a useful format.



Here are the results, I've added a color coded index guessing at what most of the bytes represent

byte 1 = A4 = marks the start of the packet
byte 2 = 0D = is the length of the containing data in the packet, 13
byte 3 = 4E = Broadcast Data ANT Command
byte 4 = 00 = ANT Channel Number
byte 5 to byte 6 = belt ID number, look on the back of your Heart Rate belt
byte 7 to byte 8 = ??? guessing it might be version number
byte 1 = heart rate
byte 1 = packet sequence
byte 1 to byte 6 = here's the explanation Robert emailed (thanks)

"I suspect the numbers, which you are the new number (little endian) and the previous two, are a time stamp in milliseconds of the beat. If you subtract the numbers in sequence and divide 60000 (60 seconds in milliseconds) by the difference of the two numbers, you get a quotient very close to the heart beat. I think variations in this number are used by FirstBeat to guess where breathing occurs."

Numbers changed to big endian, color shows flow through the set.
HR Seq #1 #2 #3 #1 Dec #1 diff 60*1000/diff HR
39 93 B914 B513 B0KA 47380
39 94 BD2A B914 B513 48426 1046 57.36 57
38 95 C15E BD2A B914 49502 1076 55.76 57
38 96 C579 C15E BD2A 50553 1051 57.08 56
38 97 C99B C579 C15E 51611 1058 56.71 56
etc... 52682 1072 55.97 56
53573 891 67.34 56
54789 1216 49.34 56
55842 1053 56.98 56
56871 1029 58.31 56
I suspect that the three numbers are used to average the time between heart beats and then the data is smoothed.
byte 1 = xor checksum to ensure correct data was received in packet




Waking up the belt with a handshake

Here are the commands (I show them as hex string equivalents, you will send them as bytes) I send to the open serial port to wake up the Heart Rate belt via the ANT protocol.

"A4024D0054BF" 'capabilities
"A40342000001E4" 'Host AssignChannel
"A405510000000002F2" 'Host Channel Id
"A40244000CEE" 'Host ChannelSearchTimeout
"A402450041A2" 'Host ChannelRFFreq
"A4015500F0" 'Begin Transmission

You can learn more about the ANT protocol by reading http://www.thisisant.com/?section=78 see the document "ANT Message Protocol and Usage - ver 2.9"

Summary

1) initialize the com port by running the Monitor software

2) write you program to intercept serial port traffic with settings 115200 8N1

3) packets are received in 16 bytes blocks

4) byte 9 is your heart rate data

Getting Started with JBoss 4.0JBoss Tutorial Files