summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRALOVICH, Kristof <tade60@freemail.hu>2015-06-10 23:34:17 +0200
committerRALOVICH, Kristof <tade60@freemail.hu>2015-06-10 23:34:17 +0200
commit1766eec458668f29324b13aac38f3166aa5dc15b (patch)
treec030a91e84c3b10a1a81972b8ce361cfcf2052ce
parentc5ceec2da9eead01c10108a91144cec47fd340b7 (diff)
parent604eca43e559bbfcd103a46f6ba03f99571a85eb (diff)
Merge branch 'master' of github.com:ralovich/antpm
# Please enter a commit message to explain why this merge is necessary, # especially if it merges an updated upstream into a topic branch. # # Lines starting with '#' will be ignored, and an empty message aborts # the commit.
-rw-r--r--README.rst4
-rw-r--r--src/FIT.cpp104
-rw-r--r--src/FIT.hpp6
3 files changed, 108 insertions, 6 deletions
diff --git a/README.rst b/README.rst
index da2f517..885537f 100644
--- a/README.rst
+++ b/README.rst
@@ -8,8 +8,8 @@ the Forerunner 310XT (or any other ANT/ANT+/ANT-FS capable device)
watch in order to retrieve sports tracks.
The C++ implementation is currently available under both Linux and
-win. Communication with watches other than the 310XT might (610XT and
-910XT are likely) work, but are untested. This project currently does
+win. Communication with watches other than the 310XT might (610XT, 910XT
+and Swim are likely) work, but are untested. This project currently does
not yet support Forerunner 405, but work is underway for 405
support. Please report your experience to help improving the software.
diff --git a/src/FIT.cpp b/src/FIT.cpp
index e366960..048b3c1 100644
--- a/src/FIT.cpp
+++ b/src/FIT.cpp
@@ -201,7 +201,7 @@ FIT::FIT()
messageFieldTypeMap[18][8] = MessageFieldTypeTime;
messageFieldNameMap[18][9] = "Total Distance";
messageFieldTypeMap[18][9] = MessageFieldTypeOdometr;
- messageFieldNameMap[19][10] = "Total Cycles";
+ messageFieldNameMap[18][10] = "Total Cycles";
messageFieldNameMap[18][11] = "Total Calories";
messageFieldNameMap[18][13] = "Total Fat Calories";
messageFieldNameMap[18][14] = "Average Speed";
@@ -229,6 +229,11 @@ FIT::FIT()
messageFieldTypeMap[18][31] = MessageFieldTypeCoord;
messageFieldNameMap[18][32] = "SWC Longitude";
messageFieldTypeMap[18][32] = MessageFieldTypeCoord;
+ messageFieldNameMap[18][43] = "Swimming Stroke";
+ messageFieldTypeMap[18][43] = MessageFieldTypeSwimStroke;
+ messageFieldNameMap[18][44] = "Pool Length";
+ messageFieldNameMap[18][46] = "Pool Length Unit";
+ messageFieldTypeMap[18][46] = MessageFieldTypePoolLengthUnit;
messageTypeMap[19] = "Lap";
messageFieldNameMap[19][254] = "Index";
@@ -489,6 +494,29 @@ FIT::FIT()
messageFieldTypeMap[79][3] = MessageFieldTypeWeight;
messageTypeMap[101] = "Length";
+ messageFieldNameMap[101][254] = "Index";
+ messageFieldNameMap[101][253] = "Timestamp";
+ messageFieldTypeMap[101][253] = MessageFieldTypeTimestamp;
+ messageFieldNameMap[101][0] = "Event";
+ messageFieldTypeMap[101][0] = MessageFieldTypeEvent;
+ messageFieldNameMap[101][1] = "Event Type";
+ messageFieldTypeMap[101][0] = MessageFieldTypeEventType;
+ messageFieldNameMap[101][2] = "Start Time";
+ messageFieldTypeMap[101][2] = MessageFieldTypeTimestamp;
+ messageFieldNameMap[101][3] = "Total Elapsed Time";
+ messageFieldTypeMap[101][3] = MessageFieldTypeTime;
+ messageFieldNameMap[101][4] = "Total Timer Time";
+ messageFieldTypeMap[101][4] = MessageFieldTypeTime;
+ messageFieldNameMap[101][5] = "Total Strokes";
+ messageFieldNameMap[101][6] = "Average Speed"; // unit: m/s * 1000
+ messageFieldNameMap[101][7] = "Swimming Stroke";
+ messageFieldTypeMap[101][7] = MessageFieldTypeSwimStroke;
+ messageFieldNameMap[101][9] = "Average Swimming Cadence";
+ messageFieldNameMap[101][12] = "Length Type";
+ messageFieldTypeMap[101][12] = MessageFieldTypeLengthType;
+ messageFieldNameMap[101][13] = "";
+
+
messageTypeMap[103] = "Monitoring Info";
messageTypeMap[105] = "PAD";
@@ -607,6 +635,19 @@ FIT::FIT()
enumMap[MessageFieldTypeEventType][8] = "Stop Disable";
enumMap[MessageFieldTypeEventType][9] = "Stop Disable All";
+ enumMap[MessageFieldTypeSwimStroke][0] = "Freestyle";
+ enumMap[MessageFieldTypeSwimStroke][1] = "Backstroke";
+ enumMap[MessageFieldTypeSwimStroke][2] = "Breaststroke";
+ enumMap[MessageFieldTypeSwimStroke][3] = "Butterlfy";
+ enumMap[MessageFieldTypeSwimStroke][4] = "Drill";
+ enumMap[MessageFieldTypeSwimStroke][5] = "Mixed";
+
+ enumMap[MessageFieldTypeLengthType][0] = "Resting";
+ enumMap[MessageFieldTypeLengthType][1] = "Active";
+
+ enumMap[MessageFieldTypePoolLengthUnit][0] = "meters";
+ enumMap[MessageFieldTypePoolLengthUnit][1] = "yards";
+
manufacturerMap[ManufacturerGarmin] = "Garmin";
manufacturerMap[ManufacturerGarminFR405ANTFS] = "Garmin (FR405 ANTFS)";
manufacturerMap[ManufacturerZephyr] = "Zephyr";
@@ -650,6 +691,7 @@ FIT::FIT()
productMap[ManufacturerGarmin][GarminFR310XT4T] = "Forerunner 310XT 4T";
productMap[ManufacturerGarmin][GarminTraningCenter] = "Traning Center";
productMap[ManufacturerGarmin][GarminConnect] = "Connect";
+ productMap[ManufacturerGarmin][GarminSwim] = "Swim";
manufacturer = 0;
@@ -865,6 +907,8 @@ string FIT::getDataString(uint8_t *ptr, uint8_t size, uint8_t baseType, uint8_t
bool FIT::parse(vector<uint8_t> &fitData, GPX &gpx)
{
+ ostringstream strstrm;
+
LOG(LOG_DBG2) << "Parsing FIT file\n";
FITHeader fitHeader;
@@ -975,8 +1019,8 @@ bool FIT::parse(vector<uint8_t> &fitData, GPX &gpx)
//BaseType bt;
//bt.byte = rf.baseType;
- //logger() << rd.rfx.globalNum << "." << (unsigned)rf.definitionNum << ": " << messageFieldNameMap[rd.rfx.globalNum][rf.definitionNum] <<
- // " (" << dataTypeMap[bt.bits.baseTypeNum] << ") " << getDataString(ptr, rf.size, bt.bits.baseTypeNum, rd.rfx.globalNum, rf.definitionNum) << "\n";
+// LOG(LOG_DBG2) << rd.rfx.globalNum << "." << (unsigned)rf.definitionNum << ": " << messageFieldNameMap[rd.rfx.globalNum][rf.definitionNum] << "\n";
+// " (" << dataTypeMap[bt.bits.baseTypeNum] << ") " << getDataString(ptr, rf.size, bt.bits.baseTypeNum, rd.rfx.globalNum, rf.definitionNum) << "\n";
switch(rd.rfx.globalNum)
{
@@ -1112,6 +1156,60 @@ bool FIT::parse(vector<uint8_t> &fitData, GPX &gpx)
}
break;
}
+ case 101: // Length
+ {
+ strstrm.clear();
+ strstrm << rd.rfx.globalNum << "." << (unsigned)rf.definitionNum << ": " << messageFieldNameMap[rd.rfx.globalNum][rf.definitionNum] << " (";
+ switch (rf.definitionNum)
+ {
+ case 2 : // Start Time
+ {
+ strstrm << getDataString(ptr, 0, BT_UInt32, rd.rfx.globalNum, rf.definitionNum);
+ break;
+ }
+ case 3 : // Total Elapsed Time
+ {
+ strstrm << getDataString(ptr, 0, BT_UInt32, rd.rfx.globalNum, rf.definitionNum);
+ break;
+ }
+ case 4 : // Total Timer Time
+ {
+ strstrm << getDataString(ptr, 0, BT_UInt32, rd.rfx.globalNum, rf.definitionNum);
+ break;
+ }
+ case 5: // Total Strokes
+ {
+ strstrm << *(uint16_t*)ptr;
+ break;
+ }
+ case 6: // Average Speed
+ {
+ // unit: m/s * 1000
+ double speed = (double)(*(uint16_t*)ptr) / 1000;
+ strstrm << speed;
+
+ break;
+ }
+ case 7: // Swimming stroke
+ {
+ strstrm << getDataString(ptr, 0, BT_Enum, rd.rfx.globalNum, rf.definitionNum);
+ break;
+ }
+ case 9: // Average Swimming Cadence
+ {
+ strstrm << (int) *(uint8_t*)ptr;
+ break;
+ }
+ case 12: // Length Type
+ {
+ strstrm << getDataString(ptr, 0, BT_Enum, rd.rfx.globalNum, rf.definitionNum);
+ break;
+ }
+ }
+ strstrm << ")\n";
+ LOG(LOG_DBG2) << strstrm.str();
+ break;
+ }
}
ptr += rf.size;
diff --git a/src/FIT.hpp b/src/FIT.hpp
index d12261d..f848cec 100644
--- a/src/FIT.hpp
+++ b/src/FIT.hpp
@@ -185,7 +185,10 @@ enum MessageFieldTypes
MessageFieldTypeLanguage,
MessageFieldTypeSport,
MessageFieldTypeEvent,
- MessageFieldTypeEventType
+ MessageFieldTypeEventType,
+ MessageFieldTypeSwimStroke,
+ MessageFieldTypeLengthType,
+ MessageFieldTypePoolLengthUnit
};
enum Manufacturers
@@ -267,6 +270,7 @@ enum GarminProducts
GarminFR70 = 1436,
GarminFR310XT4T = 1446,
GarminAMX = 1461,
+ GarminSwim = 1499,
GarminSDM4 = 10007,
GarminTraningCenter = 20119,
GarminConnect = 65534