[Pkg-running-devel] [antpm] 27/31: antpm: fix indexing bug, reindent

Kristof Ralovich ralovich-guest at moszumanska.debian.org
Fri Mar 24 23:19:38 UTC 2017


This is an automated email from the git hooks/post-receive script.

ralovich-guest pushed a commit to branch master
in repository antpm.

commit efd181a5db534e6148c106954f5455c7bfc41135
Author: RALOVICH, Kristof <tade60 at freemail.hu>
Date:   Fri Mar 24 18:46:17 2017 +0100

    antpm: fix indexing bug, reindent
---
 src/FIT.cpp | 2377 ++++++++++++++++++++++++++++++-----------------------------
 1 file changed, 1194 insertions(+), 1183 deletions(-)

diff --git a/src/FIT.cpp b/src/FIT.cpp
index 99c9fed..b21b65c 100644
--- a/src/FIT.cpp
+++ b/src/FIT.cpp
@@ -68,662 +68,673 @@ ZeroFileContent::getFitFileTime(const uint16_t idx)
 
 void ZeroFileContent::cullFitFiles(const std::multimap<uint16_t, std::pair<string, size_t> >& files)
 {
-    for(auto it : files)
-    {
-        cullFitFile(it.first, it.second.second);
-    }
+  LOG_VAR(files.size());
+  for(auto it : files)
+  {
+    cullFitFile(it.first, it.second.second);
+  }
 }
 
 void ZeroFileContent::cullFitFile(const uint16_t idx, const size_t file_size_bytes)
 {
-    auto remover = [this,idx,file_size_bytes](uint16_t file_idx)
+  //logger() << "0x" << toString<ushort>(idx,4,'0') << " " << file_size_bytes << " bytes\n";
+  auto remover = [this,idx,file_size_bytes](uint16_t file_idx)
     {
-        ZeroFileRecord& zfRecord(zfRecords[file_idx]);
-        if(idx == file_idx && file_size_bytes == zfRecord.fileSize) {
-            return true;
-        }
-        return false;
+      ZeroFileRecord& zfRecord(zfRecords[file_idx]);
+
+      uint16_t index = zfRecord.index;
+      
+      // if(index == idx)
+      // {
+      //   logger() << "0x" << toString<uint16_t>(idx,4,'0') << " 0x" << toString<uint16_t>(index,4,'0')
+      //            << " " << zfRecord.fileSize << " " << file_size_bytes << " bytes"  << "\n";
+      // }
+      if(index == idx && file_size_bytes == zfRecord.fileSize) {
+        return true;
+      }
+      return false;
     };
-    waypointsFiles.erase(std::remove_if(waypointsFiles.begin(), waypointsFiles.end(),
-                                        remover), waypointsFiles.end());
-    activityFiles.erase(std::remove_if(activityFiles.begin(), activityFiles.end(),
-                                       remover), activityFiles.end());
-    courseFiles.erase(std::remove_if(courseFiles.begin(), courseFiles.end(),
-                                      remover), courseFiles.end());
+  
+  waypointsFiles.erase(std::remove_if(waypointsFiles.begin(), waypointsFiles.end(),
+                                      remover), waypointsFiles.end());
+  activityFiles.erase(std::remove_if(activityFiles.begin(), activityFiles.end(),
+                                     remover), activityFiles.end());
+  courseFiles.erase(std::remove_if(courseFiles.begin(), courseFiles.end(),
+                                   remover), courseFiles.end());
 }
 
 
 FIT::FIT()
 {
-    messageTypeMap[0] = "File Id";
-    messageFieldNameMap[0][0] = "Type";
-    messageFieldTypeMap[0][0] = MessageFieldTypeFileType;
-    messageFieldNameMap[0][1] = "Manufacturer";
-    messageFieldTypeMap[0][1] = MessageFieldTypeManufacturer;
-    messageFieldNameMap[0][2] = "Product";
-    messageFieldTypeMap[0][2] = MessageFieldTypeProduct;
-    messageFieldNameMap[0][3] = "Serial Number";
-    messageFieldNameMap[0][4] = "Creation Time";
-    messageFieldTypeMap[0][4] = MessageFieldTypeTimestamp;
-    messageFieldNameMap[0][5] = "Number";
-
-    messageTypeMap[1] = "Capabilities";
-    messageFieldNameMap[1][21] = "Workout Supported";
-
-    messageTypeMap[2] = "Device Settings";
-    messageFieldNameMap[2][1] = "UTC Offset";
-
-    messageTypeMap[3] = "User Profile";
-    messageFieldNameMap[3][254] = "Index";
-    messageFieldNameMap[3][0] = "Name";
-    messageFieldNameMap[3][1] = "Gender";
-    messageFieldTypeMap[3][1] = MessageFieldTypeGender;
-    messageFieldNameMap[3][2] = "Age";
-    messageFieldNameMap[3][3] = "Height";
-    messageFieldNameMap[3][4] = "Weight";
-    messageFieldTypeMap[3][4] = MessageFieldTypeWeight;
-    messageFieldNameMap[3][5] = "Language";
-    messageFieldTypeMap[3][5] = MessageFieldTypeLanguage;
-    messageFieldNameMap[3][6] = "Elevation Units";
-    messageFieldNameMap[3][7] = "Weight Units";
-    messageFieldNameMap[3][8] = "HR Resting";
-    messageFieldNameMap[3][9] = "HR Running Max";
-    messageFieldNameMap[3][10] = "HR Biking Max";
-    messageFieldNameMap[3][11] = "HR Max";
-    messageFieldNameMap[3][12] = "HR Setting";
-    messageFieldNameMap[3][13] = "Speed Setting";
-    messageFieldNameMap[3][14] = "Dist Setting";
-    messageFieldNameMap[3][16] = "Power Setting";
-    messageFieldNameMap[3][17] = "Activity Class";
-    messageFieldNameMap[3][18] = "Position Setting";
-
-    messageTypeMap[4] = "HRM Profile";
-    messageFieldNameMap[4][254] = "Index";
-    messageFieldNameMap[4][0] = "Enabled";
-    messageFieldNameMap[4][1] = "HRM ANT Id";
-
-    messageTypeMap[5] = "SDM Profile";
-
-    messageTypeMap[6] = "Bike Profile";
-    messageFieldNameMap[6][254] = "Index";
-    messageFieldNameMap[6][0] = "Name";
-    messageFieldNameMap[6][1] = "Sport";
-    messageFieldNameMap[6][2] = "SubSport";
-    messageFieldNameMap[6][3] = "Odometer";
-    messageFieldTypeMap[6][3] = MessageFieldTypeOdometr;
-    messageFieldNameMap[6][4] = "Bike Spd ANT Id";
-    messageFieldNameMap[6][5] = "Bike Cad ANT Id";
-    messageFieldNameMap[6][6] = "Bike Spd/Cad ANT Id";
-    messageFieldNameMap[6][7] = "Bike Power ANT Id";
-    messageFieldNameMap[6][8] = "Custom Wheel Size";
-    messageFieldNameMap[6][9] = "Auto Wheel Size";
-    messageFieldNameMap[6][10] = "Bike Weight";
-    messageFieldTypeMap[6][10] = MessageFieldTypeWeight;
-    messageFieldNameMap[6][11] = "Power Calibration Factor";
-    messageFieldNameMap[6][12] = "Auto Wheel Calibration";
-    messageFieldNameMap[6][13] = "Auto Power Zero";
-    messageFieldNameMap[6][14] = "Id";
-    messageFieldNameMap[6][15] = "Spd Enabled";
-    messageFieldNameMap[6][16] = "Cad Enabled";
-    messageFieldNameMap[6][17] = "Spd/Cad Enabled";
-    messageFieldNameMap[6][18] = "Power Enabled";
-    messageFieldNameMap[6][19] = "Crank Length";
-    messageFieldNameMap[6][20] = "Enabled";
-    messageFieldNameMap[6][21] = "Bike Spd ANT Id Trans Type";
-    messageFieldNameMap[6][22] = "Bike Cad ANT Id Trans Type";
-    messageFieldNameMap[6][23] = "Bike Spd/Cad ANT Id Trans Type";
-    messageFieldNameMap[6][24] = "Bike Power ANT Id Trans Type";
-
-    messageTypeMap[7] = "Zones Target";
-    messageFieldNameMap[7][1] = "Max Heart Rate";
-    messageFieldNameMap[7][2] = "Threshold Heart Rate";
-    messageFieldNameMap[7][3] = "Functional Threshold Power";
-    messageFieldNameMap[7][5] = "HR Calc Type";
-    messageFieldNameMap[7][6] = "PWR Calc Type";
+  messageTypeMap[0] = "File Id";
+  messageFieldNameMap[0][0] = "Type";
+  messageFieldTypeMap[0][0] = MessageFieldTypeFileType;
+  messageFieldNameMap[0][1] = "Manufacturer";
+  messageFieldTypeMap[0][1] = MessageFieldTypeManufacturer;
+  messageFieldNameMap[0][2] = "Product";
+  messageFieldTypeMap[0][2] = MessageFieldTypeProduct;
+  messageFieldNameMap[0][3] = "Serial Number";
+  messageFieldNameMap[0][4] = "Creation Time";
+  messageFieldTypeMap[0][4] = MessageFieldTypeTimestamp;
+  messageFieldNameMap[0][5] = "Number";
+
+  messageTypeMap[1] = "Capabilities";
+  messageFieldNameMap[1][21] = "Workout Supported";
+
+  messageTypeMap[2] = "Device Settings";
+  messageFieldNameMap[2][1] = "UTC Offset";
+
+  messageTypeMap[3] = "User Profile";
+  messageFieldNameMap[3][254] = "Index";
+  messageFieldNameMap[3][0] = "Name";
+  messageFieldNameMap[3][1] = "Gender";
+  messageFieldTypeMap[3][1] = MessageFieldTypeGender;
+  messageFieldNameMap[3][2] = "Age";
+  messageFieldNameMap[3][3] = "Height";
+  messageFieldNameMap[3][4] = "Weight";
+  messageFieldTypeMap[3][4] = MessageFieldTypeWeight;
+  messageFieldNameMap[3][5] = "Language";
+  messageFieldTypeMap[3][5] = MessageFieldTypeLanguage;
+  messageFieldNameMap[3][6] = "Elevation Units";
+  messageFieldNameMap[3][7] = "Weight Units";
+  messageFieldNameMap[3][8] = "HR Resting";
+  messageFieldNameMap[3][9] = "HR Running Max";
+  messageFieldNameMap[3][10] = "HR Biking Max";
+  messageFieldNameMap[3][11] = "HR Max";
+  messageFieldNameMap[3][12] = "HR Setting";
+  messageFieldNameMap[3][13] = "Speed Setting";
+  messageFieldNameMap[3][14] = "Dist Setting";
+  messageFieldNameMap[3][16] = "Power Setting";
+  messageFieldNameMap[3][17] = "Activity Class";
+  messageFieldNameMap[3][18] = "Position Setting";
+
+  messageTypeMap[4] = "HRM Profile";
+  messageFieldNameMap[4][254] = "Index";
+  messageFieldNameMap[4][0] = "Enabled";
+  messageFieldNameMap[4][1] = "HRM ANT Id";
+
+  messageTypeMap[5] = "SDM Profile";
+
+  messageTypeMap[6] = "Bike Profile";
+  messageFieldNameMap[6][254] = "Index";
+  messageFieldNameMap[6][0] = "Name";
+  messageFieldNameMap[6][1] = "Sport";
+  messageFieldNameMap[6][2] = "SubSport";
+  messageFieldNameMap[6][3] = "Odometer";
+  messageFieldTypeMap[6][3] = MessageFieldTypeOdometr;
+  messageFieldNameMap[6][4] = "Bike Spd ANT Id";
+  messageFieldNameMap[6][5] = "Bike Cad ANT Id";
+  messageFieldNameMap[6][6] = "Bike Spd/Cad ANT Id";
+  messageFieldNameMap[6][7] = "Bike Power ANT Id";
+  messageFieldNameMap[6][8] = "Custom Wheel Size";
+  messageFieldNameMap[6][9] = "Auto Wheel Size";
+  messageFieldNameMap[6][10] = "Bike Weight";
+  messageFieldTypeMap[6][10] = MessageFieldTypeWeight;
+  messageFieldNameMap[6][11] = "Power Calibration Factor";
+  messageFieldNameMap[6][12] = "Auto Wheel Calibration";
+  messageFieldNameMap[6][13] = "Auto Power Zero";
+  messageFieldNameMap[6][14] = "Id";
+  messageFieldNameMap[6][15] = "Spd Enabled";
+  messageFieldNameMap[6][16] = "Cad Enabled";
+  messageFieldNameMap[6][17] = "Spd/Cad Enabled";
+  messageFieldNameMap[6][18] = "Power Enabled";
+  messageFieldNameMap[6][19] = "Crank Length";
+  messageFieldNameMap[6][20] = "Enabled";
+  messageFieldNameMap[6][21] = "Bike Spd ANT Id Trans Type";
+  messageFieldNameMap[6][22] = "Bike Cad ANT Id Trans Type";
+  messageFieldNameMap[6][23] = "Bike Spd/Cad ANT Id Trans Type";
+  messageFieldNameMap[6][24] = "Bike Power ANT Id Trans Type";
+
+  messageTypeMap[7] = "Zones Target";
+  messageFieldNameMap[7][1] = "Max Heart Rate";
+  messageFieldNameMap[7][2] = "Threshold Heart Rate";
+  messageFieldNameMap[7][3] = "Functional Threshold Power";
+  messageFieldNameMap[7][5] = "HR Calc Type";
+  messageFieldNameMap[7][6] = "PWR Calc Type";
     
-    messageTypeMap[8] = "Heart Rate Zone";
-    messageFieldNameMap[8][254] = "Index";
-    messageFieldNameMap[8][1] = "High BPM";
-    messageFieldNameMap[8][2] = "Name";
-
-    messageTypeMap[9] = "Power Zone";
-    messageFieldNameMap[9][254] = "Index";
-    messageFieldNameMap[9][1] = "High Value";
-    messageFieldNameMap[9][2] = "Name";
-
-    messageTypeMap[10] = "Met Zone";
-    messageFieldNameMap[10][254] = "Index";
-    messageFieldNameMap[10][1] = "High BPM";
-    messageFieldNameMap[10][2] = "Calories";
-    messageFieldNameMap[10][3] = "Fat Calories";
-
-    messageTypeMap[12] = "Sport";
-    messageFieldNameMap[12][0] = "Sport";
-    messageFieldTypeMap[12][0] = MessageFieldTypeSport;
-    messageFieldNameMap[12][1] = "SubSport";
-    messageFieldNameMap[12][2] = "Name";
-
-    messageTypeMap[15] = "Traning Goals";
-
-    messageTypeMap[18] = "Session";
-    messageFieldNameMap[18][254] = "Index";
-    messageFieldNameMap[18][253] = "Timestamp";
-    messageFieldNameMap[18][0] = "Event";
-    messageFieldTypeMap[18][0] = MessageFieldTypeEvent;
-    messageFieldNameMap[18][1] = "Event Type";
-    messageFieldTypeMap[18][1] = MessageFieldTypeEventType;
-    messageFieldNameMap[18][2] = "Start Time";
-    messageFieldTypeMap[18][2] = MessageFieldTypeTimestamp;
-    messageFieldNameMap[18][3] = "Start Position Latitude";
-    messageFieldTypeMap[18][3] = MessageFieldTypeCoord;
-    messageFieldNameMap[18][4] = "Start Position Longitude";
-    messageFieldTypeMap[18][4] = MessageFieldTypeCoord;
-    messageFieldNameMap[18][5] = "Sport";
-    messageFieldTypeMap[18][5] = MessageFieldTypeSport;
-    messageFieldNameMap[18][6] = "SubSport";
-    messageFieldNameMap[18][7] = "Total Elapsed Time";
-    messageFieldTypeMap[18][7] = MessageFieldTypeTime;
-    messageFieldNameMap[18][8] = "Total Timer Time";
-    messageFieldTypeMap[18][8] = MessageFieldTypeTime;
-    messageFieldNameMap[18][9] = "Total Distance";
-    messageFieldTypeMap[18][9] = MessageFieldTypeOdometr;
-    messageFieldNameMap[18][10] = "Total Cycles";
-    messageFieldNameMap[18][11] = "Total Calories";
-    messageFieldNameMap[18][13] = "Total Fat Calories";
-    messageFieldNameMap[18][14] = "Average Speed";
-    messageFieldTypeMap[18][14] = MessageFieldTypeSpeed;
-    messageFieldNameMap[18][15] = "Max Speed";
-    messageFieldTypeMap[18][15] = MessageFieldTypeSpeed;
-    messageFieldNameMap[18][16] = "Average Heart Rate";
-    messageFieldNameMap[18][17] = "Max Heart Rate";
-    messageFieldNameMap[18][18] = "Average Cadence";
-    messageFieldNameMap[18][19] = "Max Cadence";
-    messageFieldNameMap[18][20] = "Average Power";
-    messageFieldNameMap[18][21] = "Max Power";
-    messageFieldNameMap[18][22] = "Total Ascent";
-    messageFieldNameMap[18][23] = "Total Descent";
-    messageFieldNameMap[18][24] = "Total Traning Effect";
-    messageFieldNameMap[18][25] = "First Lap Index";
-    messageFieldNameMap[18][26] = "Num Laps";
-    messageFieldNameMap[18][27] = "Event Group";
-    messageFieldNameMap[18][28] = "Trigger";
-    messageFieldNameMap[18][29] = "NEC Latitude";
-    messageFieldTypeMap[18][29] = MessageFieldTypeCoord;
-    messageFieldNameMap[18][30] = "NEC Longitude";
-    messageFieldTypeMap[18][30] = MessageFieldTypeCoord;
-    messageFieldNameMap[18][31] = "SWC Latitude";
-    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";
-    messageFieldNameMap[19][253] = "Timestamp";
-    messageFieldNameMap[19][0] = "Event";
-    messageFieldTypeMap[19][0] = MessageFieldTypeEvent;
-    messageFieldNameMap[19][1] = "Event Type";
-    messageFieldTypeMap[19][1] = MessageFieldTypeEventType;
-    messageFieldNameMap[19][2] = "Start Time";
-    messageFieldTypeMap[19][2] = MessageFieldTypeTimestamp;
-    messageFieldNameMap[19][3] = "Start Position Latitude";
-    messageFieldTypeMap[19][3] = MessageFieldTypeCoord;
-    messageFieldNameMap[19][4] = "Start Position Longitude";
-    messageFieldTypeMap[19][4] = MessageFieldTypeCoord;
-    messageFieldNameMap[19][5] = "End Position Latitude";
-    messageFieldTypeMap[19][5] = MessageFieldTypeCoord;
-    messageFieldNameMap[19][6] = "End Position Longitude";
-    messageFieldTypeMap[19][6] = MessageFieldTypeCoord;
-    messageFieldNameMap[19][7] = "Total Elapsed Time";
-    messageFieldTypeMap[19][7] = MessageFieldTypeTime;
-    messageFieldNameMap[19][8] = "Total Timer Time";
-    messageFieldTypeMap[19][8] = MessageFieldTypeTime;
-    messageFieldNameMap[19][9] = "Total Distance";
-    messageFieldTypeMap[19][9] = MessageFieldTypeOdometr;
-    messageFieldNameMap[19][10] = "Total Cycles";
-    messageFieldNameMap[19][11] = "Total Calories";
-    messageFieldNameMap[19][12] = "Total Fat Calories";
-    messageFieldNameMap[19][13] = "Average Speed";
-    messageFieldTypeMap[19][13] = MessageFieldTypeSpeed;
-    messageFieldNameMap[19][14] = "Max Speed";
-    messageFieldTypeMap[19][14] = MessageFieldTypeSpeed;
-    messageFieldNameMap[19][15] = "Average Heart Rate";
-    messageFieldNameMap[19][16] = "Max Heart Rate";
-    messageFieldNameMap[19][17] = "Average Cadence";
-    messageFieldNameMap[19][18] = "Max Cadence";
-    messageFieldNameMap[19][19] = "Average Power";
-    messageFieldNameMap[19][20] = "Max Power";
-    messageFieldNameMap[19][21] = "Total Ascent";
-    messageFieldNameMap[19][22] = "Total Descent";
-    messageFieldNameMap[19][23] = "Intensity";
-    messageFieldNameMap[19][24] = "Lap Trigger";
-    messageFieldNameMap[19][25] = "Sport";
-    messageFieldTypeMap[19][25] = MessageFieldTypeSport;
-    messageFieldNameMap[19][26] = "Event Group";
-    messageFieldNameMap[19][27] = "Nec Latitude";
-    messageFieldTypeMap[19][27] = MessageFieldTypeCoord;
-    messageFieldNameMap[19][28] = "Nec Longitude";
-    messageFieldTypeMap[19][28] = MessageFieldTypeCoord;
-    messageFieldNameMap[19][29] = "Swc Latitude";
-    messageFieldTypeMap[19][29] = MessageFieldTypeCoord;
-    messageFieldNameMap[19][30] = "Swc Longitude";
-    messageFieldTypeMap[19][30] = MessageFieldTypeCoord;
-
-    messageTypeMap[20] = "Record";
-    messageFieldNameMap[20][253] = "Timestamp";
-    messageFieldNameMap[20][0] = "Latitude";
-    messageFieldTypeMap[20][0] = MessageFieldTypeCoord;
-    messageFieldNameMap[20][1] = "Longitude";
-    messageFieldTypeMap[20][1] = MessageFieldTypeCoord;
-    messageFieldNameMap[20][2] = "Altitude";
-    messageFieldTypeMap[20][2] = MessageFieldTypeAltitude;
-    messageFieldNameMap[20][3] = "Heart Rate";
-    messageFieldNameMap[20][4] = "Cadence";
-    messageFieldNameMap[20][5] = "Distance";
-    messageFieldTypeMap[20][5] = MessageFieldTypeOdometr;
-    messageFieldNameMap[20][6] = "Speed";
-    messageFieldTypeMap[20][6] = MessageFieldTypeSpeed;
-    messageFieldNameMap[20][7] = "Power";
-    messageFieldNameMap[20][8] = "Compressed Speed & Distance";
-    messageFieldNameMap[20][9] = "Grade";
-    messageFieldNameMap[20][10] = "Registance";
-    messageFieldNameMap[20][11] = "Time from Course";
-    messageFieldTypeMap[20][11] = MessageFieldTypeTime;
-    messageFieldNameMap[20][12] = "Cycle Length";
-    messageFieldNameMap[20][13] = "Temperature";
-    messageFieldNameMap[20][14] = "Speed 1s";
-    messageFieldNameMap[20][15] = "Cycles";
-    messageFieldNameMap[20][16] = "Total Cycles";
-    messageFieldNameMap[20][17] = "Compressed Accumulated Power";
-    messageFieldNameMap[20][18] = "Accumulated Power";
-    messageFieldNameMap[20][19] = "Left-Right Balance";
-
-    messageTypeMap[21] = "Event";
-    messageFieldNameMap[21][253] = "Timestamp";
-    messageFieldNameMap[21][0] = "Event";
-    messageFieldTypeMap[21][0] = MessageFieldTypeEvent;
-    messageFieldNameMap[21][1] = "Event Type";
-    messageFieldTypeMap[21][1] = MessageFieldTypeEventType;
-    messageFieldNameMap[21][2] = "Data1";
-    messageFieldNameMap[21][3] = "Data2";
-    messageFieldNameMap[21][4] = "Event Group";
-
-    messageTypeMap[23] = "Device Info";
-    messageFieldNameMap[23][253] = "Timestamp";
-    messageFieldNameMap[23][0] = "Device Index";
-    messageFieldNameMap[23][1] = "Device Type";
-    messageFieldNameMap[23][2] = "Manufacturer";
-    messageFieldTypeMap[23][2] = MessageFieldTypeManufacturer;
-    messageFieldNameMap[23][3] = "Serial Number";
-    messageFieldNameMap[23][4] = "Product";
-    messageFieldTypeMap[23][4] = MessageFieldTypeProduct;
-    messageFieldNameMap[23][5] = "Software Version";
-    messageFieldNameMap[23][6] = "Hardware Version";
-    messageFieldNameMap[23][10] = "Battery Voltage";
-    messageFieldNameMap[23][11] = "Battery Status";
-
-    messageTypeMap[26] = "Workout";
-    messageFieldNameMap[26][4] = "Sport";
-    messageFieldTypeMap[26][4] = MessageFieldTypeSport;
-    messageFieldNameMap[26][5] = "Capabilities";
-    messageFieldNameMap[26][6] = "Valid Steps";
-    messageFieldNameMap[26][7] = "Protection";
-    messageFieldNameMap[26][8] = "Name";
-
-    messageTypeMap[27] = "Workout Step";
-    messageFieldNameMap[27][254] = "Index";
-    messageFieldNameMap[27][0] = "Step Name";
-    messageFieldNameMap[27][1] = "Duration Type";
-    messageFieldNameMap[27][2] = "Duration Value";
-    messageFieldNameMap[27][3] = "Target Type";
-    messageFieldNameMap[27][4] = "Target Value";
-    messageFieldNameMap[27][5] = "Custom Target Value Low";
-    messageFieldNameMap[27][6] = "Custom Target Value High";
-    messageFieldNameMap[27][7] = "Intensity";
-
-    messageTypeMap[28] = "Schedule";
-    messageFieldNameMap[28][0] = "Manufacturer";
-    messageFieldTypeMap[28][0] = MessageFieldTypeManufacturer;
-    messageFieldNameMap[28][1] = "Product";
-    messageFieldTypeMap[28][1] = MessageFieldTypeProduct;
-    messageFieldNameMap[28][2] = "Serial Number";
-    messageFieldNameMap[28][3] = "Creation Time";
-    messageFieldTypeMap[28][3] = MessageFieldTypeTimestamp;
-    messageFieldNameMap[28][4] = "Completed";
-    messageFieldNameMap[28][5] = "Type";
-    messageFieldNameMap[28][6] = "Schedule Time";
-    messageFieldTypeMap[28][6] = MessageFieldTypeTime;
-
-    messageTypeMap[29] = "Way Point";
-    messageFieldNameMap[29][253] = "Timestamp";
-    messageFieldNameMap[29][254] = "Index";
-    messageFieldNameMap[29][0] = "Name";
-    messageFieldNameMap[29][1] = "Latitude";
-    messageFieldTypeMap[29][1] = MessageFieldTypeCoord;
-    messageFieldNameMap[29][2] = "Longitude";
-    messageFieldTypeMap[29][2] = MessageFieldTypeCoord;
-    messageFieldNameMap[29][3] = "Symbol?";
-    messageFieldNameMap[29][4] = "Altitude";
-    messageFieldTypeMap[29][4] = MessageFieldTypeAltitude;
-    messageFieldNameMap[29][5] = "???";
-    messageFieldNameMap[29][6] = "Date";
-
-    messageTypeMap[30] = "Weight Scale";
-    messageFieldNameMap[30][253] = "Timestamp";
-    messageFieldNameMap[30][0] = "Weight";
-    messageFieldNameMap[30][1] = "Fat percent";
-    messageFieldNameMap[30][2] = "Hydration percent";
-    messageFieldNameMap[30][3] = "Visceral Fat Mass";
-    messageFieldNameMap[30][4] = "Bone Mass";
-    messageFieldNameMap[30][5] = "Muscle Mass";
-    messageFieldNameMap[30][7] = "Basal Met";
-    messageFieldNameMap[30][8] = "Physique Rating";
-    messageFieldNameMap[30][9] = "Active Met";
-    messageFieldNameMap[30][10] = "Metabolic Age";
-    messageFieldNameMap[30][11] = "Visceral Fat Rating";
-
-    messageTypeMap[31] = "Course";
-    messageFieldNameMap[31][4] = "Sport";
-    messageFieldTypeMap[31][4] = MessageFieldTypeSport;
-    messageFieldNameMap[31][5] = "Name";
-    messageFieldNameMap[31][6] = "Capabilities";
-
-    messageTypeMap[32] = "Course Point";
-    messageFieldNameMap[32][254] = "Index";
-    messageFieldNameMap[32][1] = "Time";
-    messageFieldTypeMap[32][1] = MessageFieldTypeTimestamp;
-    messageFieldNameMap[32][2] = "Latitude";
-    messageFieldTypeMap[32][2] = MessageFieldTypeCoord;
-    messageFieldNameMap[32][3] = "Longitude";
-    messageFieldTypeMap[32][3] = MessageFieldTypeCoord;
-    messageFieldNameMap[32][4] = "Distance";
-    messageFieldTypeMap[32][4] = MessageFieldTypeOdometr;
-    messageFieldNameMap[32][5] = "Type";
-    messageFieldNameMap[32][6] = "Name";
-
-    messageTypeMap[33] = "Totals";
-    messageFieldNameMap[33][254] = "Index";
-    messageFieldNameMap[33][253] = "Timestamp";
-    messageFieldNameMap[33][0] = "Timer Time";
-    messageFieldTypeMap[33][0] = MessageFieldTypeTime;
-    messageFieldNameMap[33][1] = "Distance";
-    messageFieldTypeMap[33][1] = MessageFieldTypeOdometr;
-    messageFieldNameMap[33][2] = "Calories";
-    messageFieldNameMap[33][3] = "Sport";
-    messageFieldTypeMap[33][3] = MessageFieldTypeSport;
-
-    messageTypeMap[34] = "Activity";
-    messageFieldNameMap[34][253] = "Timestamp";
-    messageFieldNameMap[34][0] = "Total Timer Time";
-    messageFieldTypeMap[34][0] = MessageFieldTypeTime;
-    messageFieldNameMap[34][1] = "Number of Sessions";
-    messageFieldNameMap[34][2] = "Type";
-    messageFieldNameMap[34][3] = "Event";
-    messageFieldTypeMap[34][3] = MessageFieldTypeEvent;
-    messageFieldNameMap[34][4] = "Event Type";
-    messageFieldTypeMap[34][4] = MessageFieldTypeEventType;
-    messageFieldNameMap[34][5] = "Local Timestamp";
-    messageFieldTypeMap[34][5] = MessageFieldTypeTimestamp;
-    messageFieldNameMap[34][6] = "Event Group";
-
-    messageTypeMap[35] = "Software";
-    messageFieldNameMap[35][254] = "Index";
-    messageFieldNameMap[35][3] = "Version";
-    messageFieldNameMap[35][5] = "Part No";
-
-    messageTypeMap[37] = "File Capabilities";
-    messageFieldNameMap[37][254] = "Index";
-    messageFieldNameMap[37][0] = "Type";
-    messageFieldNameMap[37][1] = "Flags";
-    messageFieldNameMap[37][2] = "Directory";
-    messageFieldNameMap[37][3] = "Max Count";
-    messageFieldNameMap[37][4] = "Max Size";
-
-    messageTypeMap[38] = "Message Capabilities";
-    messageFieldNameMap[38][254] = "Index";
-    messageFieldNameMap[38][0] = "File";
-    messageFieldNameMap[38][1] = "Message Num";
-    messageFieldNameMap[38][2] = "Count Type";
-    messageFieldNameMap[38][3] = "Count";
-
-    messageTypeMap[39] = "Field Capabilities";
-    messageFieldNameMap[39][254] = "Index";
-    messageFieldNameMap[39][0] = "File";
-    messageFieldNameMap[39][1] = "Message Num";
-    messageFieldNameMap[39][2] = "Field Num";
-    messageFieldNameMap[39][3] = "Count";
-
-    messageTypeMap[49] = "File Creator";
-    messageFieldNameMap[49][0] = "Software Version";
-    messageFieldNameMap[49][1] = "Hardware Version";
-
-    messageTypeMap[51] = "Blood Pressure";
-
-    messageTypeMap[53] = "Speed Zone";
-    messageFieldNameMap[53][254] = "Index";
-    messageFieldNameMap[53][1] = "High Value";
-    messageFieldNameMap[53][2] = "Name";
-
-    messageTypeMap[55] = "Monitoring";
-    messageTypeMap[78] = "HRV";
+  messageTypeMap[8] = "Heart Rate Zone";
+  messageFieldNameMap[8][254] = "Index";
+  messageFieldNameMap[8][1] = "High BPM";
+  messageFieldNameMap[8][2] = "Name";
+
+  messageTypeMap[9] = "Power Zone";
+  messageFieldNameMap[9][254] = "Index";
+  messageFieldNameMap[9][1] = "High Value";
+  messageFieldNameMap[9][2] = "Name";
+
+  messageTypeMap[10] = "Met Zone";
+  messageFieldNameMap[10][254] = "Index";
+  messageFieldNameMap[10][1] = "High BPM";
+  messageFieldNameMap[10][2] = "Calories";
+  messageFieldNameMap[10][3] = "Fat Calories";
+
+  messageTypeMap[12] = "Sport";
+  messageFieldNameMap[12][0] = "Sport";
+  messageFieldTypeMap[12][0] = MessageFieldTypeSport;
+  messageFieldNameMap[12][1] = "SubSport";
+  messageFieldNameMap[12][2] = "Name";
+
+  messageTypeMap[15] = "Traning Goals";
+
+  messageTypeMap[18] = "Session";
+  messageFieldNameMap[18][254] = "Index";
+  messageFieldNameMap[18][253] = "Timestamp";
+  messageFieldNameMap[18][0] = "Event";
+  messageFieldTypeMap[18][0] = MessageFieldTypeEvent;
+  messageFieldNameMap[18][1] = "Event Type";
+  messageFieldTypeMap[18][1] = MessageFieldTypeEventType;
+  messageFieldNameMap[18][2] = "Start Time";
+  messageFieldTypeMap[18][2] = MessageFieldTypeTimestamp;
+  messageFieldNameMap[18][3] = "Start Position Latitude";
+  messageFieldTypeMap[18][3] = MessageFieldTypeCoord;
+  messageFieldNameMap[18][4] = "Start Position Longitude";
+  messageFieldTypeMap[18][4] = MessageFieldTypeCoord;
+  messageFieldNameMap[18][5] = "Sport";
+  messageFieldTypeMap[18][5] = MessageFieldTypeSport;
+  messageFieldNameMap[18][6] = "SubSport";
+  messageFieldNameMap[18][7] = "Total Elapsed Time";
+  messageFieldTypeMap[18][7] = MessageFieldTypeTime;
+  messageFieldNameMap[18][8] = "Total Timer Time";
+  messageFieldTypeMap[18][8] = MessageFieldTypeTime;
+  messageFieldNameMap[18][9] = "Total Distance";
+  messageFieldTypeMap[18][9] = MessageFieldTypeOdometr;
+  messageFieldNameMap[18][10] = "Total Cycles";
+  messageFieldNameMap[18][11] = "Total Calories";
+  messageFieldNameMap[18][13] = "Total Fat Calories";
+  messageFieldNameMap[18][14] = "Average Speed";
+  messageFieldTypeMap[18][14] = MessageFieldTypeSpeed;
+  messageFieldNameMap[18][15] = "Max Speed";
+  messageFieldTypeMap[18][15] = MessageFieldTypeSpeed;
+  messageFieldNameMap[18][16] = "Average Heart Rate";
+  messageFieldNameMap[18][17] = "Max Heart Rate";
+  messageFieldNameMap[18][18] = "Average Cadence";
+  messageFieldNameMap[18][19] = "Max Cadence";
+  messageFieldNameMap[18][20] = "Average Power";
+  messageFieldNameMap[18][21] = "Max Power";
+  messageFieldNameMap[18][22] = "Total Ascent";
+  messageFieldNameMap[18][23] = "Total Descent";
+  messageFieldNameMap[18][24] = "Total Traning Effect";
+  messageFieldNameMap[18][25] = "First Lap Index";
+  messageFieldNameMap[18][26] = "Num Laps";
+  messageFieldNameMap[18][27] = "Event Group";
+  messageFieldNameMap[18][28] = "Trigger";
+  messageFieldNameMap[18][29] = "NEC Latitude";
+  messageFieldTypeMap[18][29] = MessageFieldTypeCoord;
+  messageFieldNameMap[18][30] = "NEC Longitude";
+  messageFieldTypeMap[18][30] = MessageFieldTypeCoord;
+  messageFieldNameMap[18][31] = "SWC Latitude";
+  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";
+  messageFieldNameMap[19][253] = "Timestamp";
+  messageFieldNameMap[19][0] = "Event";
+  messageFieldTypeMap[19][0] = MessageFieldTypeEvent;
+  messageFieldNameMap[19][1] = "Event Type";
+  messageFieldTypeMap[19][1] = MessageFieldTypeEventType;
+  messageFieldNameMap[19][2] = "Start Time";
+  messageFieldTypeMap[19][2] = MessageFieldTypeTimestamp;
+  messageFieldNameMap[19][3] = "Start Position Latitude";
+  messageFieldTypeMap[19][3] = MessageFieldTypeCoord;
+  messageFieldNameMap[19][4] = "Start Position Longitude";
+  messageFieldTypeMap[19][4] = MessageFieldTypeCoord;
+  messageFieldNameMap[19][5] = "End Position Latitude";
+  messageFieldTypeMap[19][5] = MessageFieldTypeCoord;
+  messageFieldNameMap[19][6] = "End Position Longitude";
+  messageFieldTypeMap[19][6] = MessageFieldTypeCoord;
+  messageFieldNameMap[19][7] = "Total Elapsed Time";
+  messageFieldTypeMap[19][7] = MessageFieldTypeTime;
+  messageFieldNameMap[19][8] = "Total Timer Time";
+  messageFieldTypeMap[19][8] = MessageFieldTypeTime;
+  messageFieldNameMap[19][9] = "Total Distance";
+  messageFieldTypeMap[19][9] = MessageFieldTypeOdometr;
+  messageFieldNameMap[19][10] = "Total Cycles";
+  messageFieldNameMap[19][11] = "Total Calories";
+  messageFieldNameMap[19][12] = "Total Fat Calories";
+  messageFieldNameMap[19][13] = "Average Speed";
+  messageFieldTypeMap[19][13] = MessageFieldTypeSpeed;
+  messageFieldNameMap[19][14] = "Max Speed";
+  messageFieldTypeMap[19][14] = MessageFieldTypeSpeed;
+  messageFieldNameMap[19][15] = "Average Heart Rate";
+  messageFieldNameMap[19][16] = "Max Heart Rate";
+  messageFieldNameMap[19][17] = "Average Cadence";
+  messageFieldNameMap[19][18] = "Max Cadence";
+  messageFieldNameMap[19][19] = "Average Power";
+  messageFieldNameMap[19][20] = "Max Power";
+  messageFieldNameMap[19][21] = "Total Ascent";
+  messageFieldNameMap[19][22] = "Total Descent";
+  messageFieldNameMap[19][23] = "Intensity";
+  messageFieldNameMap[19][24] = "Lap Trigger";
+  messageFieldNameMap[19][25] = "Sport";
+  messageFieldTypeMap[19][25] = MessageFieldTypeSport;
+  messageFieldNameMap[19][26] = "Event Group";
+  messageFieldNameMap[19][27] = "Nec Latitude";
+  messageFieldTypeMap[19][27] = MessageFieldTypeCoord;
+  messageFieldNameMap[19][28] = "Nec Longitude";
+  messageFieldTypeMap[19][28] = MessageFieldTypeCoord;
+  messageFieldNameMap[19][29] = "Swc Latitude";
+  messageFieldTypeMap[19][29] = MessageFieldTypeCoord;
+  messageFieldNameMap[19][30] = "Swc Longitude";
+  messageFieldTypeMap[19][30] = MessageFieldTypeCoord;
+
+  messageTypeMap[20] = "Record";
+  messageFieldNameMap[20][253] = "Timestamp";
+  messageFieldNameMap[20][0] = "Latitude";
+  messageFieldTypeMap[20][0] = MessageFieldTypeCoord;
+  messageFieldNameMap[20][1] = "Longitude";
+  messageFieldTypeMap[20][1] = MessageFieldTypeCoord;
+  messageFieldNameMap[20][2] = "Altitude";
+  messageFieldTypeMap[20][2] = MessageFieldTypeAltitude;
+  messageFieldNameMap[20][3] = "Heart Rate";
+  messageFieldNameMap[20][4] = "Cadence";
+  messageFieldNameMap[20][5] = "Distance";
+  messageFieldTypeMap[20][5] = MessageFieldTypeOdometr;
+  messageFieldNameMap[20][6] = "Speed";
+  messageFieldTypeMap[20][6] = MessageFieldTypeSpeed;
+  messageFieldNameMap[20][7] = "Power";
+  messageFieldNameMap[20][8] = "Compressed Speed & Distance";
+  messageFieldNameMap[20][9] = "Grade";
+  messageFieldNameMap[20][10] = "Registance";
+  messageFieldNameMap[20][11] = "Time from Course";
+  messageFieldTypeMap[20][11] = MessageFieldTypeTime;
+  messageFieldNameMap[20][12] = "Cycle Length";
+  messageFieldNameMap[20][13] = "Temperature";
+  messageFieldNameMap[20][14] = "Speed 1s";
+  messageFieldNameMap[20][15] = "Cycles";
+  messageFieldNameMap[20][16] = "Total Cycles";
+  messageFieldNameMap[20][17] = "Compressed Accumulated Power";
+  messageFieldNameMap[20][18] = "Accumulated Power";
+  messageFieldNameMap[20][19] = "Left-Right Balance";
+
+  messageTypeMap[21] = "Event";
+  messageFieldNameMap[21][253] = "Timestamp";
+  messageFieldNameMap[21][0] = "Event";
+  messageFieldTypeMap[21][0] = MessageFieldTypeEvent;
+  messageFieldNameMap[21][1] = "Event Type";
+  messageFieldTypeMap[21][1] = MessageFieldTypeEventType;
+  messageFieldNameMap[21][2] = "Data1";
+  messageFieldNameMap[21][3] = "Data2";
+  messageFieldNameMap[21][4] = "Event Group";
+
+  messageTypeMap[23] = "Device Info";
+  messageFieldNameMap[23][253] = "Timestamp";
+  messageFieldNameMap[23][0] = "Device Index";
+  messageFieldNameMap[23][1] = "Device Type";
+  messageFieldNameMap[23][2] = "Manufacturer";
+  messageFieldTypeMap[23][2] = MessageFieldTypeManufacturer;
+  messageFieldNameMap[23][3] = "Serial Number";
+  messageFieldNameMap[23][4] = "Product";
+  messageFieldTypeMap[23][4] = MessageFieldTypeProduct;
+  messageFieldNameMap[23][5] = "Software Version";
+  messageFieldNameMap[23][6] = "Hardware Version";
+  messageFieldNameMap[23][10] = "Battery Voltage";
+  messageFieldNameMap[23][11] = "Battery Status";
+
+  messageTypeMap[26] = "Workout";
+  messageFieldNameMap[26][4] = "Sport";
+  messageFieldTypeMap[26][4] = MessageFieldTypeSport;
+  messageFieldNameMap[26][5] = "Capabilities";
+  messageFieldNameMap[26][6] = "Valid Steps";
+  messageFieldNameMap[26][7] = "Protection";
+  messageFieldNameMap[26][8] = "Name";
+
+  messageTypeMap[27] = "Workout Step";
+  messageFieldNameMap[27][254] = "Index";
+  messageFieldNameMap[27][0] = "Step Name";
+  messageFieldNameMap[27][1] = "Duration Type";
+  messageFieldNameMap[27][2] = "Duration Value";
+  messageFieldNameMap[27][3] = "Target Type";
+  messageFieldNameMap[27][4] = "Target Value";
+  messageFieldNameMap[27][5] = "Custom Target Value Low";
+  messageFieldNameMap[27][6] = "Custom Target Value High";
+  messageFieldNameMap[27][7] = "Intensity";
+
+  messageTypeMap[28] = "Schedule";
+  messageFieldNameMap[28][0] = "Manufacturer";
+  messageFieldTypeMap[28][0] = MessageFieldTypeManufacturer;
+  messageFieldNameMap[28][1] = "Product";
+  messageFieldTypeMap[28][1] = MessageFieldTypeProduct;
+  messageFieldNameMap[28][2] = "Serial Number";
+  messageFieldNameMap[28][3] = "Creation Time";
+  messageFieldTypeMap[28][3] = MessageFieldTypeTimestamp;
+  messageFieldNameMap[28][4] = "Completed";
+  messageFieldNameMap[28][5] = "Type";
+  messageFieldNameMap[28][6] = "Schedule Time";
+  messageFieldTypeMap[28][6] = MessageFieldTypeTime;
+
+  messageTypeMap[29] = "Way Point";
+  messageFieldNameMap[29][253] = "Timestamp";
+  messageFieldNameMap[29][254] = "Index";
+  messageFieldNameMap[29][0] = "Name";
+  messageFieldNameMap[29][1] = "Latitude";
+  messageFieldTypeMap[29][1] = MessageFieldTypeCoord;
+  messageFieldNameMap[29][2] = "Longitude";
+  messageFieldTypeMap[29][2] = MessageFieldTypeCoord;
+  messageFieldNameMap[29][3] = "Symbol?";
+  messageFieldNameMap[29][4] = "Altitude";
+  messageFieldTypeMap[29][4] = MessageFieldTypeAltitude;
+  messageFieldNameMap[29][5] = "???";
+  messageFieldNameMap[29][6] = "Date";
+
+  messageTypeMap[30] = "Weight Scale";
+  messageFieldNameMap[30][253] = "Timestamp";
+  messageFieldNameMap[30][0] = "Weight";
+  messageFieldNameMap[30][1] = "Fat percent";
+  messageFieldNameMap[30][2] = "Hydration percent";
+  messageFieldNameMap[30][3] = "Visceral Fat Mass";
+  messageFieldNameMap[30][4] = "Bone Mass";
+  messageFieldNameMap[30][5] = "Muscle Mass";
+  messageFieldNameMap[30][7] = "Basal Met";
+  messageFieldNameMap[30][8] = "Physique Rating";
+  messageFieldNameMap[30][9] = "Active Met";
+  messageFieldNameMap[30][10] = "Metabolic Age";
+  messageFieldNameMap[30][11] = "Visceral Fat Rating";
+
+  messageTypeMap[31] = "Course";
+  messageFieldNameMap[31][4] = "Sport";
+  messageFieldTypeMap[31][4] = MessageFieldTypeSport;
+  messageFieldNameMap[31][5] = "Name";
+  messageFieldNameMap[31][6] = "Capabilities";
+
+  messageTypeMap[32] = "Course Point";
+  messageFieldNameMap[32][254] = "Index";
+  messageFieldNameMap[32][1] = "Time";
+  messageFieldTypeMap[32][1] = MessageFieldTypeTimestamp;
+  messageFieldNameMap[32][2] = "Latitude";
+  messageFieldTypeMap[32][2] = MessageFieldTypeCoord;
+  messageFieldNameMap[32][3] = "Longitude";
+  messageFieldTypeMap[32][3] = MessageFieldTypeCoord;
+  messageFieldNameMap[32][4] = "Distance";
+  messageFieldTypeMap[32][4] = MessageFieldTypeOdometr;
+  messageFieldNameMap[32][5] = "Type";
+  messageFieldNameMap[32][6] = "Name";
+
+  messageTypeMap[33] = "Totals";
+  messageFieldNameMap[33][254] = "Index";
+  messageFieldNameMap[33][253] = "Timestamp";
+  messageFieldNameMap[33][0] = "Timer Time";
+  messageFieldTypeMap[33][0] = MessageFieldTypeTime;
+  messageFieldNameMap[33][1] = "Distance";
+  messageFieldTypeMap[33][1] = MessageFieldTypeOdometr;
+  messageFieldNameMap[33][2] = "Calories";
+  messageFieldNameMap[33][3] = "Sport";
+  messageFieldTypeMap[33][3] = MessageFieldTypeSport;
+
+  messageTypeMap[34] = "Activity";
+  messageFieldNameMap[34][253] = "Timestamp";
+  messageFieldNameMap[34][0] = "Total Timer Time";
+  messageFieldTypeMap[34][0] = MessageFieldTypeTime;
+  messageFieldNameMap[34][1] = "Number of Sessions";
+  messageFieldNameMap[34][2] = "Type";
+  messageFieldNameMap[34][3] = "Event";
+  messageFieldTypeMap[34][3] = MessageFieldTypeEvent;
+  messageFieldNameMap[34][4] = "Event Type";
+  messageFieldTypeMap[34][4] = MessageFieldTypeEventType;
+  messageFieldNameMap[34][5] = "Local Timestamp";
+  messageFieldTypeMap[34][5] = MessageFieldTypeTimestamp;
+  messageFieldNameMap[34][6] = "Event Group";
+
+  messageTypeMap[35] = "Software";
+  messageFieldNameMap[35][254] = "Index";
+  messageFieldNameMap[35][3] = "Version";
+  messageFieldNameMap[35][5] = "Part No";
+
+  messageTypeMap[37] = "File Capabilities";
+  messageFieldNameMap[37][254] = "Index";
+  messageFieldNameMap[37][0] = "Type";
+  messageFieldNameMap[37][1] = "Flags";
+  messageFieldNameMap[37][2] = "Directory";
+  messageFieldNameMap[37][3] = "Max Count";
+  messageFieldNameMap[37][4] = "Max Size";
+
+  messageTypeMap[38] = "Message Capabilities";
+  messageFieldNameMap[38][254] = "Index";
+  messageFieldNameMap[38][0] = "File";
+  messageFieldNameMap[38][1] = "Message Num";
+  messageFieldNameMap[38][2] = "Count Type";
+  messageFieldNameMap[38][3] = "Count";
+
+  messageTypeMap[39] = "Field Capabilities";
+  messageFieldNameMap[39][254] = "Index";
+  messageFieldNameMap[39][0] = "File";
+  messageFieldNameMap[39][1] = "Message Num";
+  messageFieldNameMap[39][2] = "Field Num";
+  messageFieldNameMap[39][3] = "Count";
+
+  messageTypeMap[49] = "File Creator";
+  messageFieldNameMap[49][0] = "Software Version";
+  messageFieldNameMap[49][1] = "Hardware Version";
+
+  messageTypeMap[51] = "Blood Pressure";
+
+  messageTypeMap[53] = "Speed Zone";
+  messageFieldNameMap[53][254] = "Index";
+  messageFieldNameMap[53][1] = "High Value";
+  messageFieldNameMap[53][2] = "Name";
+
+  messageTypeMap[55] = "Monitoring";
+  messageTypeMap[78] = "HRV";
     
-    messageTypeMap[79] = "User Profile ?";
-    messageFieldNameMap[79][254] = "Index";
-    messageFieldNameMap[79][253] = "Timestamp";
-    messageFieldNameMap[79][1] = "Age";
-    messageFieldNameMap[79][2] = "Height";
-    messageFieldNameMap[79][3] = "Weight";
-    messageFieldTypeMap[79][3] = MessageFieldTypeWeight;
+  messageTypeMap[79] = "User Profile ?";
+  messageFieldNameMap[79][254] = "Index";
+  messageFieldNameMap[79][253] = "Timestamp";
+  messageFieldNameMap[79][1] = "Age";
+  messageFieldNameMap[79][2] = "Height";
+  messageFieldNameMap[79][3] = "Weight";
+  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[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";
+  messageTypeMap[103] = "Monitoring Info";
+  messageTypeMap[105] = "PAD";
 
     
-    dataTypeMap[BT_Enum] = "enum";
-    dataTypeMap[BT_Int8] = "int8";
-    dataTypeMap[BT_UInt8] = "uint8";
-    dataTypeMap[BT_Int16] = "int16";
-    dataTypeMap[BT_Uint16] = "uint16";
-    dataTypeMap[BT_Int32] = "int32";
-    dataTypeMap[BT_UInt32] = "uint32";
-    dataTypeMap[BT_String] = "string";
-    dataTypeMap[BT_Float32] = "float32";
-    dataTypeMap[BT_Float64] = "float64";
-    dataTypeMap[BT_Uint8z] = "uint8z";
-    dataTypeMap[BT_Uint16z] = "uint16z";
-    dataTypeMap[BT_Uint32z] = "uint32z";
-    dataTypeMap[BT_ByteArray] = "bytes";
-
-    enumMap[MessageFieldTypeFileType][1] = "Device";
-    enumMap[MessageFieldTypeFileType][2] = "Setting";
-    enumMap[MessageFieldTypeFileType][3] = "Sport";
-    enumMap[MessageFieldTypeFileType][4] = "Activity";
-    enumMap[MessageFieldTypeFileType][5] = "Workout";
-    enumMap[MessageFieldTypeFileType][6] = "Course";
-    enumMap[MessageFieldTypeFileType][7] = "Schedules";
-    enumMap[MessageFieldTypeFileType][8] = "Waypoints";
-    enumMap[MessageFieldTypeFileType][9] = "Weight";
-    enumMap[MessageFieldTypeFileType][10] = "Totals";
-    enumMap[MessageFieldTypeFileType][11] = "Goals";
-    enumMap[MessageFieldTypeFileType][14] = "Blood Pressure";
-    enumMap[MessageFieldTypeFileType][15] = "Monitoring";
-    enumMap[MessageFieldTypeFileType][20] = "Activity Summary";
-    enumMap[MessageFieldTypeFileType][28] = "Monitoring Daily";
-    enumMap[MessageFieldTypeFileType][32] = "Memory";
-
-    enumMap[MessageFieldTypeGender][0] = "Female";
-    enumMap[MessageFieldTypeGender][1] = "Male";
-
-    enumMap[MessageFieldTypeLanguage][0] = "English";
-    enumMap[MessageFieldTypeLanguage][1] = "French";
-    enumMap[MessageFieldTypeLanguage][2] = "Italian";
-    enumMap[MessageFieldTypeLanguage][3] = "German";
-    enumMap[MessageFieldTypeLanguage][4] = "Spanish";
-    enumMap[MessageFieldTypeLanguage][5] = "Croatian";
-    enumMap[MessageFieldTypeLanguage][6] = "Czech";
-    enumMap[MessageFieldTypeLanguage][7] = "Danish";
-    enumMap[MessageFieldTypeLanguage][8] = "Dutch";
-    enumMap[MessageFieldTypeLanguage][9] = "Finnish";
-    enumMap[MessageFieldTypeLanguage][10] = "Greek";
-    enumMap[MessageFieldTypeLanguage][11] = "Hungarian";
-    enumMap[MessageFieldTypeLanguage][12] = "Norwegian";
-    enumMap[MessageFieldTypeLanguage][13] = "Polish";
-    enumMap[MessageFieldTypeLanguage][14] = "Portuguese";
-    enumMap[MessageFieldTypeLanguage][15] = "Slovakian";
-    enumMap[MessageFieldTypeLanguage][16] = "Slovenian";
-    enumMap[MessageFieldTypeLanguage][17] = "Swedish";
-    enumMap[MessageFieldTypeLanguage][18] = "Russian";
-    enumMap[MessageFieldTypeLanguage][19] = "Turkish";
-    enumMap[MessageFieldTypeLanguage][20] = "Latvian";
-    enumMap[MessageFieldTypeLanguage][21] = "Ukrainian";
-    enumMap[MessageFieldTypeLanguage][22] = "Arabic";
-    enumMap[MessageFieldTypeLanguage][23] = "Farsi";
-    enumMap[MessageFieldTypeLanguage][24] = "Bulgarian";
-    enumMap[MessageFieldTypeLanguage][25] = "Romanian";
-    enumMap[MessageFieldTypeLanguage][254] = "Custom";
-
-    enumMap[MessageFieldTypeSport][0] = "Generic";
-    enumMap[MessageFieldTypeSport][1] = "Running";
-    enumMap[MessageFieldTypeSport][2] = "Cycling";
-    enumMap[MessageFieldTypeSport][3] = "Transition";
-    enumMap[MessageFieldTypeSport][4] = "Fitness Equipment";
-    enumMap[MessageFieldTypeSport][5] = "Swimming";
-    enumMap[MessageFieldTypeSport][6] = "Basketball";
-    enumMap[MessageFieldTypeSport][7] = "Soccer";
-    enumMap[MessageFieldTypeSport][8] = "Tennis";
-    enumMap[MessageFieldTypeSport][9] = "American football";
-    enumMap[MessageFieldTypeSport][10] = "Training";
-    enumMap[MessageFieldTypeSport][254] = "All";
-
-    enumMap[MessageFieldTypeEvent][0] = "Timer";
-    enumMap[MessageFieldTypeEvent][3] = "Workout";
-    enumMap[MessageFieldTypeEvent][4] = "Workout Step";
-    enumMap[MessageFieldTypeEvent][5] = "Power Down";
-    enumMap[MessageFieldTypeEvent][6] = "Power Up";
-    enumMap[MessageFieldTypeEvent][7] = "Off Course";
-    enumMap[MessageFieldTypeEvent][8] = "Session";
-    enumMap[MessageFieldTypeEvent][9] = "Lap";
-    enumMap[MessageFieldTypeEvent][10] = "Course Point";
-    enumMap[MessageFieldTypeEvent][11] = "Battery";
-    enumMap[MessageFieldTypeEvent][12] = "Virtual Partner Pace";
-    enumMap[MessageFieldTypeEvent][13] = "HR High Alert";
-    enumMap[MessageFieldTypeEvent][14] = "HR Low Alert";
-    enumMap[MessageFieldTypeEvent][15] = "Speed High Alert";
-    enumMap[MessageFieldTypeEvent][16] = "Speed Low Alert";
-    enumMap[MessageFieldTypeEvent][17] = "Cadence High Alert";
-    enumMap[MessageFieldTypeEvent][18] = "Cadence Low Alert";
-    enumMap[MessageFieldTypeEvent][19] = "Power High Alert";
-    enumMap[MessageFieldTypeEvent][20] = "Power Low Alert";
-    enumMap[MessageFieldTypeEvent][21] = "Recovery HR";
-    enumMap[MessageFieldTypeEvent][22] = "Battery Low";
-    enumMap[MessageFieldTypeEvent][23] = "Time Duration Alert";
-    enumMap[MessageFieldTypeEvent][24] = "Distance Duration Alert";
-    enumMap[MessageFieldTypeEvent][25] = "Calorie Duration Alert";
-    enumMap[MessageFieldTypeEvent][26] = "Activity";
-    enumMap[MessageFieldTypeEvent][27] = "Fitness Equipment";
-
-    enumMap[MessageFieldTypeEventType][0] = "Start";
-    enumMap[MessageFieldTypeEventType][1] = "Stop";
-    enumMap[MessageFieldTypeEventType][2] = "Consecutive Depreciated";
-    enumMap[MessageFieldTypeEventType][3] = "Marker";
-    enumMap[MessageFieldTypeEventType][4] = "Stop All";
-    enumMap[MessageFieldTypeEventType][5] = "Begin Depreciated";
-    enumMap[MessageFieldTypeEventType][6] = "End Depreciated";
-    enumMap[MessageFieldTypeEventType][7] = "End All Depreciated";
-    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";
+  dataTypeMap[BT_Enum] = "enum";
+  dataTypeMap[BT_Int8] = "int8";
+  dataTypeMap[BT_UInt8] = "uint8";
+  dataTypeMap[BT_Int16] = "int16";
+  dataTypeMap[BT_Uint16] = "uint16";
+  dataTypeMap[BT_Int32] = "int32";
+  dataTypeMap[BT_UInt32] = "uint32";
+  dataTypeMap[BT_String] = "string";
+  dataTypeMap[BT_Float32] = "float32";
+  dataTypeMap[BT_Float64] = "float64";
+  dataTypeMap[BT_Uint8z] = "uint8z";
+  dataTypeMap[BT_Uint16z] = "uint16z";
+  dataTypeMap[BT_Uint32z] = "uint32z";
+  dataTypeMap[BT_ByteArray] = "bytes";
+
+  enumMap[MessageFieldTypeFileType][1] = "Device";
+  enumMap[MessageFieldTypeFileType][2] = "Setting";
+  enumMap[MessageFieldTypeFileType][3] = "Sport";
+  enumMap[MessageFieldTypeFileType][4] = "Activity";
+  enumMap[MessageFieldTypeFileType][5] = "Workout";
+  enumMap[MessageFieldTypeFileType][6] = "Course";
+  enumMap[MessageFieldTypeFileType][7] = "Schedules";
+  enumMap[MessageFieldTypeFileType][8] = "Waypoints";
+  enumMap[MessageFieldTypeFileType][9] = "Weight";
+  enumMap[MessageFieldTypeFileType][10] = "Totals";
+  enumMap[MessageFieldTypeFileType][11] = "Goals";
+  enumMap[MessageFieldTypeFileType][14] = "Blood Pressure";
+  enumMap[MessageFieldTypeFileType][15] = "Monitoring";
+  enumMap[MessageFieldTypeFileType][20] = "Activity Summary";
+  enumMap[MessageFieldTypeFileType][28] = "Monitoring Daily";
+  enumMap[MessageFieldTypeFileType][32] = "Memory";
+
+  enumMap[MessageFieldTypeGender][0] = "Female";
+  enumMap[MessageFieldTypeGender][1] = "Male";
+
+  enumMap[MessageFieldTypeLanguage][0] = "English";
+  enumMap[MessageFieldTypeLanguage][1] = "French";
+  enumMap[MessageFieldTypeLanguage][2] = "Italian";
+  enumMap[MessageFieldTypeLanguage][3] = "German";
+  enumMap[MessageFieldTypeLanguage][4] = "Spanish";
+  enumMap[MessageFieldTypeLanguage][5] = "Croatian";
+  enumMap[MessageFieldTypeLanguage][6] = "Czech";
+  enumMap[MessageFieldTypeLanguage][7] = "Danish";
+  enumMap[MessageFieldTypeLanguage][8] = "Dutch";
+  enumMap[MessageFieldTypeLanguage][9] = "Finnish";
+  enumMap[MessageFieldTypeLanguage][10] = "Greek";
+  enumMap[MessageFieldTypeLanguage][11] = "Hungarian";
+  enumMap[MessageFieldTypeLanguage][12] = "Norwegian";
+  enumMap[MessageFieldTypeLanguage][13] = "Polish";
+  enumMap[MessageFieldTypeLanguage][14] = "Portuguese";
+  enumMap[MessageFieldTypeLanguage][15] = "Slovakian";
+  enumMap[MessageFieldTypeLanguage][16] = "Slovenian";
+  enumMap[MessageFieldTypeLanguage][17] = "Swedish";
+  enumMap[MessageFieldTypeLanguage][18] = "Russian";
+  enumMap[MessageFieldTypeLanguage][19] = "Turkish";
+  enumMap[MessageFieldTypeLanguage][20] = "Latvian";
+  enumMap[MessageFieldTypeLanguage][21] = "Ukrainian";
+  enumMap[MessageFieldTypeLanguage][22] = "Arabic";
+  enumMap[MessageFieldTypeLanguage][23] = "Farsi";
+  enumMap[MessageFieldTypeLanguage][24] = "Bulgarian";
+  enumMap[MessageFieldTypeLanguage][25] = "Romanian";
+  enumMap[MessageFieldTypeLanguage][254] = "Custom";
+
+  enumMap[MessageFieldTypeSport][0] = "Generic";
+  enumMap[MessageFieldTypeSport][1] = "Running";
+  enumMap[MessageFieldTypeSport][2] = "Cycling";
+  enumMap[MessageFieldTypeSport][3] = "Transition";
+  enumMap[MessageFieldTypeSport][4] = "Fitness Equipment";
+  enumMap[MessageFieldTypeSport][5] = "Swimming";
+  enumMap[MessageFieldTypeSport][6] = "Basketball";
+  enumMap[MessageFieldTypeSport][7] = "Soccer";
+  enumMap[MessageFieldTypeSport][8] = "Tennis";
+  enumMap[MessageFieldTypeSport][9] = "American football";
+  enumMap[MessageFieldTypeSport][10] = "Training";
+  enumMap[MessageFieldTypeSport][254] = "All";
+
+  enumMap[MessageFieldTypeEvent][0] = "Timer";
+  enumMap[MessageFieldTypeEvent][3] = "Workout";
+  enumMap[MessageFieldTypeEvent][4] = "Workout Step";
+  enumMap[MessageFieldTypeEvent][5] = "Power Down";
+  enumMap[MessageFieldTypeEvent][6] = "Power Up";
+  enumMap[MessageFieldTypeEvent][7] = "Off Course";
+  enumMap[MessageFieldTypeEvent][8] = "Session";
+  enumMap[MessageFieldTypeEvent][9] = "Lap";
+  enumMap[MessageFieldTypeEvent][10] = "Course Point";
+  enumMap[MessageFieldTypeEvent][11] = "Battery";
+  enumMap[MessageFieldTypeEvent][12] = "Virtual Partner Pace";
+  enumMap[MessageFieldTypeEvent][13] = "HR High Alert";
+  enumMap[MessageFieldTypeEvent][14] = "HR Low Alert";
+  enumMap[MessageFieldTypeEvent][15] = "Speed High Alert";
+  enumMap[MessageFieldTypeEvent][16] = "Speed Low Alert";
+  enumMap[MessageFieldTypeEvent][17] = "Cadence High Alert";
+  enumMap[MessageFieldTypeEvent][18] = "Cadence Low Alert";
+  enumMap[MessageFieldTypeEvent][19] = "Power High Alert";
+  enumMap[MessageFieldTypeEvent][20] = "Power Low Alert";
+  enumMap[MessageFieldTypeEvent][21] = "Recovery HR";
+  enumMap[MessageFieldTypeEvent][22] = "Battery Low";
+  enumMap[MessageFieldTypeEvent][23] = "Time Duration Alert";
+  enumMap[MessageFieldTypeEvent][24] = "Distance Duration Alert";
+  enumMap[MessageFieldTypeEvent][25] = "Calorie Duration Alert";
+  enumMap[MessageFieldTypeEvent][26] = "Activity";
+  enumMap[MessageFieldTypeEvent][27] = "Fitness Equipment";
+
+  enumMap[MessageFieldTypeEventType][0] = "Start";
+  enumMap[MessageFieldTypeEventType][1] = "Stop";
+  enumMap[MessageFieldTypeEventType][2] = "Consecutive Depreciated";
+  enumMap[MessageFieldTypeEventType][3] = "Marker";
+  enumMap[MessageFieldTypeEventType][4] = "Stop All";
+  enumMap[MessageFieldTypeEventType][5] = "Begin Depreciated";
+  enumMap[MessageFieldTypeEventType][6] = "End Depreciated";
+  enumMap[MessageFieldTypeEventType][7] = "End All Depreciated";
+  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[MessageFieldTypeLengthType][0] = "Resting";
+  enumMap[MessageFieldTypeLengthType][1] = "Active";
     
-    enumMap[MessageFieldTypePoolLengthUnit][0] = "meters";
-    enumMap[MessageFieldTypePoolLengthUnit][1] = "yards";
+  enumMap[MessageFieldTypePoolLengthUnit][0] = "meters";
+  enumMap[MessageFieldTypePoolLengthUnit][1] = "yards";
         
-    manufacturerMap[ManufacturerGarmin] = "Garmin";
-    manufacturerMap[ManufacturerGarminFR405ANTFS] = "Garmin (FR405 ANTFS)";
-    manufacturerMap[ManufacturerZephyr] = "Zephyr";
-    manufacturerMap[ManufacturerDayton] = "Dayton";
-    manufacturerMap[ManufacturerIDT] = "IDT";
-    manufacturerMap[ManufacturerSRM] = "SRM";
-    manufacturerMap[ManufacturerQuarq] = "Quarq";
-    manufacturerMap[ManufacturerIBike] = "iBike";
-    manufacturerMap[ManufacturerSaris] = "Saris";
-    manufacturerMap[ManufacturerSparkHK] = "Spark HK";
-    manufacturerMap[ManufacturerTanita] = "Tanita";
-    manufacturerMap[ManufacturerEchowell] = "Echowell";
-    manufacturerMap[ManufacturerDynastreamOEM] = "Dynastream OEM";
-    manufacturerMap[ManufacturerNautilus] = "Nautilus";
-    manufacturerMap[ManufacturerDynastream] = "Dynastream";
-    manufacturerMap[ManufacturerTimex] = "Timex";
-    manufacturerMap[ManufacturerMetriGear] = "MetriGear";
-    manufacturerMap[ManufacturerXelic] = "Xelic";
-    manufacturerMap[ManufacturerBeurer] = "Beurer";
-    manufacturerMap[ManufacturerCardioSport] = "CardioSport";
-    manufacturerMap[ManufacturerAandD] = "A&D";
-    manufacturerMap[ManufacturerHMM] = "HMM";
-
-    productMap[ManufacturerGarmin][GarminHRM1] = "Heart Rate Monitor"; 
-    productMap[ManufacturerGarmin][GarminAXH01] = "AXH01 HRM Chipset";
-    productMap[ManufacturerGarmin][GarminAXB01] = "AXB01 Chipset";
-    productMap[ManufacturerGarmin][GarminAXB02] = "AXB02 Chipset";
-    productMap[ManufacturerGarmin][GarminHRM2SS] = "HRM2SS";
-    productMap[ManufacturerGarmin][GarminDsiAlf02] = "DSI ALF 02";
-    productMap[ManufacturerGarmin][GarminFR405] = "Forerunner 405";
-    productMap[ManufacturerGarmin][GarminFR50] = "Forerunner 50";
-    productMap[ManufacturerGarmin][GarminFR60] = "Forerunner 60";
-    productMap[ManufacturerGarmin][GarminFR310XT] = "Forerunner 310XT";
-    productMap[ManufacturerGarmin][GarminEDGE500] = "EDGE 500";
-    productMap[ManufacturerGarmin][GarminFR110] = "Forerunner 110";
-    productMap[ManufacturerGarmin][GarminEDGE800] = "EDGE 800";
-    productMap[ManufacturerGarmin][GarminEDGE200] = "EDGE 200";
-    productMap[ManufacturerGarmin][GarminFR910XT] = "Forerunner 910XT";
-    productMap[ManufacturerGarmin][GarminFR610] = "Forerunner 610";
-    productMap[ManufacturerGarmin][GarminFR70] = "Forerunner 70";
-    productMap[ManufacturerGarmin][GarminFR310XT4T] = "Forerunner 310XT 4T";
-    productMap[ManufacturerGarmin][GarminTraningCenter] = "Traning Center";
-    productMap[ManufacturerGarmin][GarminConnect] = "Connect";
-    productMap[ManufacturerGarmin][GarminSwim] = "Swim";
-
-    manufacturer = 0;
-
-    mCreationTimestamp = 0;
-    mFirstTimestamp    = 0;
-    mLastTimestamp     = 0;
+  manufacturerMap[ManufacturerGarmin] = "Garmin";
+  manufacturerMap[ManufacturerGarminFR405ANTFS] = "Garmin (FR405 ANTFS)";
+  manufacturerMap[ManufacturerZephyr] = "Zephyr";
+  manufacturerMap[ManufacturerDayton] = "Dayton";
+  manufacturerMap[ManufacturerIDT] = "IDT";
+  manufacturerMap[ManufacturerSRM] = "SRM";
+  manufacturerMap[ManufacturerQuarq] = "Quarq";
+  manufacturerMap[ManufacturerIBike] = "iBike";
+  manufacturerMap[ManufacturerSaris] = "Saris";
+  manufacturerMap[ManufacturerSparkHK] = "Spark HK";
+  manufacturerMap[ManufacturerTanita] = "Tanita";
+  manufacturerMap[ManufacturerEchowell] = "Echowell";
+  manufacturerMap[ManufacturerDynastreamOEM] = "Dynastream OEM";
+  manufacturerMap[ManufacturerNautilus] = "Nautilus";
+  manufacturerMap[ManufacturerDynastream] = "Dynastream";
+  manufacturerMap[ManufacturerTimex] = "Timex";
+  manufacturerMap[ManufacturerMetriGear] = "MetriGear";
+  manufacturerMap[ManufacturerXelic] = "Xelic";
+  manufacturerMap[ManufacturerBeurer] = "Beurer";
+  manufacturerMap[ManufacturerCardioSport] = "CardioSport";
+  manufacturerMap[ManufacturerAandD] = "A&D";
+  manufacturerMap[ManufacturerHMM] = "HMM";
+
+  productMap[ManufacturerGarmin][GarminHRM1] = "Heart Rate Monitor"; 
+  productMap[ManufacturerGarmin][GarminAXH01] = "AXH01 HRM Chipset";
+  productMap[ManufacturerGarmin][GarminAXB01] = "AXB01 Chipset";
+  productMap[ManufacturerGarmin][GarminAXB02] = "AXB02 Chipset";
+  productMap[ManufacturerGarmin][GarminHRM2SS] = "HRM2SS";
+  productMap[ManufacturerGarmin][GarminDsiAlf02] = "DSI ALF 02";
+  productMap[ManufacturerGarmin][GarminFR405] = "Forerunner 405";
+  productMap[ManufacturerGarmin][GarminFR50] = "Forerunner 50";
+  productMap[ManufacturerGarmin][GarminFR60] = "Forerunner 60";
+  productMap[ManufacturerGarmin][GarminFR310XT] = "Forerunner 310XT";
+  productMap[ManufacturerGarmin][GarminEDGE500] = "EDGE 500";
+  productMap[ManufacturerGarmin][GarminFR110] = "Forerunner 110";
+  productMap[ManufacturerGarmin][GarminEDGE800] = "EDGE 800";
+  productMap[ManufacturerGarmin][GarminEDGE200] = "EDGE 200";
+  productMap[ManufacturerGarmin][GarminFR910XT] = "Forerunner 910XT";
+  productMap[ManufacturerGarmin][GarminFR610] = "Forerunner 610";
+  productMap[ManufacturerGarmin][GarminFR70] = "Forerunner 70";
+  productMap[ManufacturerGarmin][GarminFR310XT4T] = "Forerunner 310XT 4T";
+  productMap[ManufacturerGarmin][GarminTraningCenter] = "Traning Center";
+  productMap[ManufacturerGarmin][GarminConnect] = "Connect";
+  productMap[ManufacturerGarmin][GarminSwim] = "Swim";
+
+  manufacturer = 0;
+
+  mCreationTimestamp = 0;
+  mFirstTimestamp    = 0;
+  mLastTimestamp     = 0;
 }
 
 FIT::~FIT()
@@ -732,568 +743,568 @@ FIT::~FIT()
 
 uint16_t FIT::CRC_byte(uint16_t crc, uint8_t byte)
 {
-    static const uint16_t crc_table[16] =
+  static const uint16_t crc_table[16] =
     {
-        0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401,
-        0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400
+      0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401,
+      0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400
     };
 
-    uint16_t tmp = crc_table[crc & 0xF];
-    crc = (crc >> 4) & 0x0FFF;
-    crc = crc ^ tmp ^ crc_table[byte & 0xF];
+  uint16_t tmp = crc_table[crc & 0xF];
+  crc = (crc >> 4) & 0x0FFF;
+  crc = crc ^ tmp ^ crc_table[byte & 0xF];
 
-    tmp = crc_table[crc & 0xF];
-    crc = (crc >> 4) & 0x0FFF;
-    crc = crc ^ tmp ^ crc_table[(byte >> 4) & 0xF];
+  tmp = crc_table[crc & 0xF];
+  crc = (crc >> 4) & 0x0FFF;
+  crc = crc ^ tmp ^ crc_table[(byte >> 4) & 0xF];
 
-    return crc;
+  return crc;
 }
 
 string FIT::getDataString(uint8_t *ptr, uint8_t size, uint8_t baseType, uint8_t messageType, uint8_t fieldNum)
 {
-    ostringstream strstrm;
-    strstrm.setf(ios::fixed,ios::floatfield);
+  ostringstream strstrm;
+  strstrm.setf(ios::fixed,ios::floatfield);
 
-    BaseType bt;
-    bt.byte = baseType;
+  BaseType bt;
+  bt.byte = baseType;
 
-    int baseTypeNum = bt.bits.baseTypeNum;
-    switch(baseTypeNum)
+  int baseTypeNum = bt.bits.baseTypeNum;
+  switch(baseTypeNum)
+  {
+    case BT_Enum:
     {
-        case BT_Enum:
-        {
-            int val = *(int8_t *)ptr;
-            uint8_t type = messageFieldTypeMap[messageType][fieldNum];
-            string strVal(enumMap[type][val]);
+      int val = *(int8_t *)ptr;
+      uint8_t type = messageFieldTypeMap[messageType][fieldNum];
+      string strVal(enumMap[type][val]);
 
-            if (!strVal.empty())
-            {
-                strstrm << strVal;
-            }
-            else
-            {
-                strstrm << "[" << dec << val << "]";
-            }
-            break;
-        }
-        case BT_Int8:
+      if (!strVal.empty())
+      {
+        strstrm << strVal;
+      }
+      else
+      {
+        strstrm << "[" << dec << val << "]";
+      }
+      break;
+    }
+    case BT_Int8:
+    {
+      int val = *(int8_t *)ptr;
+      strstrm << dec << val;
+      break;
+    }
+    case BT_UInt8:
+    case BT_Uint8z:
+    {
+      unsigned val = *(uint8_t *)ptr;
+      if (val == 0xFF)
+      {
+        strstrm << "undefined";
+      }
+      else
+      {
+        strstrm << dec << val;
+      }
+      break;
+    }
+    case BT_Int16:
+    {
+      int16_t val = *(int16_t *)ptr;
+      if (val == 0x7FFF)
+      {
+        strstrm << "undefined";
+      }
+      else
+      {
+        strstrm << dec << val;
+      }
+      break;
+    }
+    case BT_Uint16:
+    case BT_Uint16z:
+    {
+      uint16_t val = *(uint16_t *)ptr;
+      if (val == 0xFFFF)
+      {
+        strstrm << "undefined";
+      }
+      else
+      {
+        switch (messageFieldTypeMap[messageType][fieldNum])
         {
-            int val = *(int8_t *)ptr;
-            strstrm << dec << val;
+          case MessageFieldTypeAltitude:
+          {
+            strstrm << setprecision(1) << GarminConvert::altitude(val);
             break;
-        }
-        case BT_UInt8:
-        case BT_Uint8z:
-        {
-            unsigned val = *(uint8_t *)ptr;
-            if (val == 0xFF)
-            {
-                strstrm << "undefined";
-            }
-            else
-            {
-                strstrm << dec << val;
-            }
+          }
+          case MessageFieldTypeWeight:
+          {
+            strstrm << setprecision(1) << GarminConvert::weight(val);
+            break;
+          }
+          case MessageFieldTypeSpeed:
+          {
+            strstrm << setprecision(1) << GarminConvert::speed(val);
             break;
+          }
+          case MessageFieldTypeManufacturer:
+          {
+            manufacturer = val;
+            strstrm << manufacturerMap[static_cast<uint8_t>(manufacturer)];
+            break;
+          }
+          case MessageFieldTypeProduct:
+          {
+            strstrm << productMap[static_cast<uint8_t>(manufacturer)][val];
+            break;
+          }
+          default:
+          {
+            strstrm << dec << val;
+          }
         }
-        case BT_Int16:
+      }
+      break;
+    }
+    case BT_Int32:
+    {
+      int32_t val = *(int32_t *)ptr;
+      if (val == 0x7FFFFFFF)
+      {
+        strstrm << "undefined";
+      }
+      else
+      {
+        switch(messageFieldTypeMap[messageType][fieldNum])
         {
-            int16_t val = *(int16_t *)ptr;
-            if (val == 0x7FFF)
-            {
-                strstrm << "undefined";
-            }
-            else
-            {
-                strstrm << dec << val;
-            }
+          case MessageFieldTypeCoord:
+          {
+            strstrm << setprecision(5) << GarminConvert::coord(val);
             break;
+          }
+          default:
+          {
+            strstrm << dec << val;
+          }
         }
-        case BT_Uint16:
-        case BT_Uint16z:
+      }
+      break;
+    }
+    case BT_UInt32:
+    case BT_Uint32z:
+    {
+      uint32_t val = *(uint32_t *)ptr;
+      if (val == 0xFFFFFFFF)
+      {
+        strstrm << "undefined";
+      }
+      else
+      {
+        if (fieldNum == 253)
         {
-            uint16_t val = *(uint16_t *)ptr;
-            if (val == 0xFFFF)
-            {
-                strstrm << "undefined";
-            }
-            else
-            {
-                switch (messageFieldTypeMap[messageType][fieldNum])
-                {
-                    case MessageFieldTypeAltitude:
-                    {
-                        strstrm << setprecision(1) << GarminConvert::altitude(val);
-                        break;
-                    }
-                    case MessageFieldTypeWeight:
-                    {
-                        strstrm << setprecision(1) << GarminConvert::weight(val);
-                        break;
-                    }
-                    case MessageFieldTypeSpeed:
-                    {
-                        strstrm << setprecision(1) << GarminConvert::speed(val);
-                        break;
-                    }
-                    case MessageFieldTypeManufacturer:
-                    {
-                        manufacturer = val;
-                        strstrm << manufacturerMap[static_cast<uint8_t>(manufacturer)];
-                        break;
-                    }
-                    case MessageFieldTypeProduct:
-                    {
-                        strstrm << productMap[static_cast<uint8_t>(manufacturer)][val];
-                        break;
-                    }
-                    default:
-                    {
-                        strstrm << dec << val;
-                    }
-                }
-            }
-            break;
+          strstrm << GarminConvert::localTime(val);
         }
-        case BT_Int32:
+        else
         {
-            int32_t val = *(int32_t *)ptr;
-            if (val == 0x7FFFFFFF)
+          switch (messageFieldTypeMap[messageType][fieldNum])
+          {
+            case MessageFieldTypeTimestamp:
             {
-                strstrm << "undefined";
+              strstrm << GarminConvert::localTime(val);
+              break;
             }
-            else
+            case MessageFieldTypeTime:
             {
-                switch(messageFieldTypeMap[messageType][fieldNum])
-                {
-                    case MessageFieldTypeCoord:
-                    {
-                        strstrm << setprecision(5) << GarminConvert::coord(val);
-                        break;
-                    }
-                    default:
-                    {
-                        strstrm << dec << val;
-                    }
-                }
+              strstrm << GarminConvert::gTime(val);
+              break;
             }
-            break;
-        }
-        case BT_UInt32:
-        case BT_Uint32z:
-        {
-            uint32_t val = *(uint32_t *)ptr;
-            if (val == 0xFFFFFFFF)
+            case MessageFieldTypeOdometr:
             {
-                strstrm << "undefined";
+              strstrm << setprecision(2) << GarminConvert::length(val);
+              break;
             }
-            else
+            default:
             {
-                if (fieldNum == 253)
-                {
-                    strstrm << GarminConvert::localTime(val);
-                }
-                else
-                {
-                    switch (messageFieldTypeMap[messageType][fieldNum])
-                    {
-                        case MessageFieldTypeTimestamp:
-                        {
-                            strstrm << GarminConvert::localTime(val);
-                            break;
-                        }
-                        case MessageFieldTypeTime:
-                        {
-                            strstrm << GarminConvert::gTime(val);
-                            break;
-                        }
-                        case MessageFieldTypeOdometr:
-                        {
-                            strstrm << setprecision(2) << GarminConvert::length(val);
-                            break;
-                        }
-                        default:
-                        {
-                            strstrm << dec << val;
-                        }
-                    }
-                }
+              strstrm << dec << val;
             }
-            break;
-        }
-        case BT_String:
-        {
-            strstrm << "\"" << GarminConvert::gString(ptr, size) << "\"";
-            break;
+          }
         }
+      }
+      break;
     }
+    case BT_String:
+    {
+      strstrm << "\"" << GarminConvert::gString(ptr, size) << "\"";
+      break;
+    }
+  }
 
-    return strstrm.str();
+  return strstrm.str();
 }
 
 bool FIT::parse(vector<uint8_t> &fitData, GPX &gpx)
 {
-    ostringstream strstrm;
+  ostringstream strstrm;
     
-    LOG(LOG_DBG2) << "Parsing FIT file\n";
+  LOG(LOG_DBG2) << "Parsing FIT file\n";
 
-    FITHeader fitHeader;
-    if(fitData.size()<sizeof(fitHeader))
-      return false;
+  FITHeader fitHeader;
+  if(fitData.size()<sizeof(fitHeader))
+    return false;
 
-    uint8_t *ptr = &fitData.front();
-    memcpy(&fitHeader, ptr, sizeof(fitHeader));
+  uint8_t *ptr = &fitData.front();
+  memcpy(&fitHeader, ptr, sizeof(fitHeader));
 
-    // FIT header CRC
-    uint16_t crc = 0;
-    for (int i = 0; i < fitHeader.headerSize; i++)
-    {
-        crc = CRC_byte(crc, *(ptr+i));
-    }
+  // FIT header CRC
+  uint16_t crc = 0;
+  for (int i = 0; i < fitHeader.headerSize; i++)
+  {
+    crc = CRC_byte(crc, *(ptr+i));
+  }
 
-    ptr += fitHeader.headerSize;
+  ptr += fitHeader.headerSize;
 
-    // FIT data CRC
-    for (uint32_t i = 0; i < fitHeader.dataSize; i++)
-    {
-        crc = CRC_byte(crc, *(ptr+i));
-    }
+  // FIT data CRC
+  for (uint32_t i = 0; i < fitHeader.dataSize; i++)
+  {
+    crc = CRC_byte(crc, *(ptr+i));
+  }
 
-    if (memcmp(fitHeader.signature, ".FIT", sizeof(fitHeader.signature)))
-    {
-        LOG(LOG_DBG) << "FIT signature not found\n";
-        return false;
-    }
+  if (memcmp(fitHeader.signature, ".FIT", sizeof(fitHeader.signature)))
+  {
+    LOG(LOG_DBG) << "FIT signature not found\n";
+    return false;
+  }
 
-    uint16_t fitCRC = *(uint16_t *)(ptr+fitHeader.dataSize);
-    if (crc != fitCRC /*&& fitCRC != 0*/)
-    {
-        LOG(LOG_WARN) << hex << uppercase << setw(4) << setfill('0') << "Invalid FIT CRC (" << crc << "!=" << fitCRC << ")\n";
-        return false;
-    }
+  uint16_t fitCRC = *(uint16_t *)(ptr+fitHeader.dataSize);
+  if (crc != fitCRC /*&& fitCRC != 0*/)
+  {
+    LOG(LOG_WARN) << hex << uppercase << setw(4) << setfill('0') << "Invalid FIT CRC (" << crc << "!=" << fitCRC << ")\n";
+    return false;
+  }
 
-    LOG(LOG_DBG2) << "FIT Protocol Version " << dec << (unsigned)fitHeader.protocolVersion << "\n";
+  LOG(LOG_DBG2) << "FIT Protocol Version " << dec << (unsigned)fitHeader.protocolVersion << "\n";
 
-    LOG(LOG_DBG2) << "FIT Profile Version " << fitHeader.profileVersion << "\n";
+  LOG(LOG_DBG2) << "FIT Profile Version " << fitHeader.profileVersion << "\n";
 
-    LOG(LOG_DBG2) << "FIT Data size " << fitHeader.dataSize << " bytes\n";
+  LOG(LOG_DBG2) << "FIT Data size " << fitHeader.dataSize << " bytes\n";
    
-    map<uint8_t, RecordDef> recDefMap;
-    vector<uint32_t>        tstamps;
+  map<uint8_t, RecordDef> recDefMap;
+  vector<uint32_t>        tstamps;
 
-    for (int bytes = fitHeader.dataSize; bytes > 0;)
-    {
-        RecordHeader rh;
-        memcpy(&rh, ptr, sizeof(rh));
-        ptr += sizeof(rh);
-        bytes -= sizeof(rh);
+  for (int bytes = fitHeader.dataSize; bytes > 0;)
+  {
+    RecordHeader rh;
+    memcpy(&rh, ptr, sizeof(rh));
+    ptr += sizeof(rh);
+    bytes -= sizeof(rh);
 
-        if (!rh.normalHeader.headerType)
-        {
-            // Normal Header
-            if (rh.normalHeader.messageType)
-            {
-                // Definition Message
-                RecordDef rd;
+    if (!rh.normalHeader.headerType)
+    {
+      // Normal Header
+      if (rh.normalHeader.messageType)
+      {
+        // Definition Message
+        RecordDef rd;
 
-                RecordFixed rfx;
-                memcpy(&rfx, ptr, sizeof(rfx));
-                ptr += sizeof(rfx);
-                bytes -= sizeof(rfx);
+        RecordFixed rfx;
+        memcpy(&rfx, ptr, sizeof(rfx));
+        ptr += sizeof(rfx);
+        bytes -= sizeof(rfx);
 
-                rd.rfx = rfx;
+        rd.rfx = rfx;
 
-                for (int i=0; i<rfx.fieldsNum; i++)
-                {
-                    RecordField rf;
-                    memcpy(&rf, ptr, sizeof(rf));
-                    ptr += sizeof(rf);
-                    bytes -= sizeof(rf);
+        for (int i=0; i<rfx.fieldsNum; i++)
+        {
+          RecordField rf;
+          memcpy(&rf, ptr, sizeof(rf));
+          ptr += sizeof(rf);
+          bytes -= sizeof(rf);
 
-                    rd.rf.push_back(rf);
-                }
+          rd.rf.push_back(rf);
+        }
 
-                recDefMap[rh.normalHeader.localMessageType] = rd;
-            }
-            else
-            {
-                // Data Message
-                map<uint8_t, RecordDef>::iterator it=recDefMap.find(rh.normalHeader.localMessageType);
-                if (it != recDefMap.end())
-                {
-                    RecordDef rd = recDefMap[rh.normalHeader.localMessageType];
-                    //logger() << "Local Message \"" << messageTypeMap[rd.rfx.globalNum] << "\"(" << rd.rfx.globalNum << "):\n";
+        recDefMap[rh.normalHeader.localMessageType] = rd;
+      }
+      else
+      {
+        // Data Message
+        map<uint8_t, RecordDef>::iterator it=recDefMap.find(rh.normalHeader.localMessageType);
+        if (it != recDefMap.end())
+        {
+          RecordDef rd = recDefMap[rh.normalHeader.localMessageType];
+          //logger() << "Local Message \"" << messageTypeMap[rd.rfx.globalNum] << "\"(" << rd.rfx.globalNum << "):\n";
                     
-                    switch(rd.rfx.globalNum)
-                    {
-                        case 29: // WayPoint
-                        {
-                            gpx.newWayPoint();
-                            break;
-                        }
-                    }
+          switch(rd.rfx.globalNum)
+          {
+            case 29: // WayPoint
+            {
+              gpx.newWayPoint();
+              break;
+            }
+          }
 
-                    uint32_t fileCreationTime=0;
-                    int8_t fileType=INT8_MAX;
+          uint32_t fileCreationTime=0;
+          int8_t fileType=INT8_MAX;
 
-                    uint32_t time;
+          uint32_t time;
 
-                    for (int i=0; i<rd.rfx.fieldsNum; i++)
-                    {
-                        RecordField &rf = rd.rf[i];
+          for (int i=0; i<rd.rfx.fieldsNum; i++)
+          {
+            RecordField &rf = rd.rf[i];
 
-                        //BaseType bt;
-                        //bt.byte = rf.baseType;
+            //BaseType bt;
+            //bt.byte = rf.baseType;
 
 //                          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)
-                        {
-                            case 0: // File Id
-                            {
-                                switch(rf.definitionNum)
-                                {
-                                    case 0: // Type
-                                    {
-                                        fileType = *(int8_t *)ptr;
-                                        break;
-                                    }
-                                    case 4: // Creation Time
-                                    {
-                                        fileCreationTime = *(uint32_t*)ptr;
-                                        mCreationTimestamp = fileCreationTime;
-                                        break;
-                                    }
-                                }
-                                break;
-                            }
-                            case 19: // Lap
-                            {
-                              switch(rf.definitionNum)
-                              {
-                                case 253: // Timestamp
-                                {
-                                  time = *(uint32_t*)ptr;
-                                  // TODO: add to gpx?
-                                  tstamps.push_back(time);
-                                  break;
-                                }
-                              }
-                              break;
-                            }
-                            case 20: // Record
-                            {
-                                switch(rf.definitionNum)
-                                {
-                                    case 253: // Timestamp
-                                    {
-                                        time = *(uint32_t*)ptr;
-                                        gpx.tracks.back().trackSegs.back().trackPoints[time].time = time;
-                                        tstamps.push_back(time);
-                                        break;
-                                    }
-                                    case 0: // Latitude
-                                    {
-                                        int32_t latitude = *(int32_t*)ptr;
-                                        gpx.tracks.back().trackSegs.back().trackPoints[time].latitude = latitude;
-                                        break;
-                                    }
-                                    case 1: // Longitude
-                                    {
-                                        uint32_t longitude = *(int32_t*)ptr;
-                                        gpx.tracks.back().trackSegs.back().trackPoints[time].longitude = longitude;
-                                        break;
-                                    }
-                                    case 2: // Altitude
-                                    {
-                                        uint16_t altitude = *(uint16_t*)ptr;
-                                        gpx.tracks.back().trackSegs.back().trackPoints[time].altitude = altitude;
-                                        break;
-                                    }
-                                    case 3: // Heart Rate
-                                    {
-                                        uint8_t heartRate = *(uint8_t*)ptr;
-                                        gpx.tracks.back().trackSegs.back().trackPoints[time].heartRate = heartRate;
-                                        break;
-                                    }
-                                    case 4: // Cadence
-                                    {
-                                        uint8_t cadence = *(uint8_t*)ptr;
-                                        gpx.tracks.back().trackSegs.back().trackPoints[time].cadence = cadence;
-                                        break;
-                                    }
-                                }
-                                break;
-                            }
-                            case 29: // WayPoint
-                            {
-                                switch(rf.definitionNum)
-                                {
-                                    case 253: // Timestamp
-                                    {
-                                        time = *(uint32_t*)ptr;
-                                        gpx.wayPoints.back().time = time;
-                                        tstamps.push_back(time);
-                                        break;
-                                    }
-                                    case 0: // Name
-                                    {
-                                        string name = GarminConvert::gString(ptr, 16);
-                                        gpx.wayPoints.back().name = name;
-                                        break;
-                                    }
-                                    case 1: // Latitude
-                                    {
-                                        int32_t latitude = *(int32_t*)ptr;
-                                        gpx.wayPoints.back().latitude = latitude;
-                                        break;
-                                    }
-                                    case 2: // Longitude
-                                    {
-                                        int32_t longitude = *(int32_t*)ptr;
-                                        gpx.wayPoints.back().longitude = longitude;
-                                        break;
-                                    }
-                                    case 3: // Symbol
-                                    {
-                                        break;
-                                    }
-                                    case 4: // Altitude
-                                    {
-                                        uint16_t altitude = *(uint16_t*)ptr;
-                                        gpx.wayPoints.back().altitude = altitude;
-                                        break;
-                                    }
-                                }
-                                break;
-                            }
-                            case 31: // Course
-                            {
-                                switch(rf.definitionNum)
-                                {
-                                    case 5: // Name
-                                    {
-                                        string name("Course_");
-                                        name += GarminConvert::gString(ptr, 16);
-                                        gpx.tracks.back().name = name;
-                                        break;
-                                    }
-                                }
-                                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;
+            switch(rd.rfx.globalNum)
+            {
+              case 0: // File Id
+              {
+                switch(rf.definitionNum)
+                {
+                  case 0: // Type
+                  {
+                    fileType = *(int8_t *)ptr;
+                    break;
+                  }
+                  case 4: // Creation Time
+                  {
+                    fileCreationTime = *(uint32_t*)ptr;
+                    mCreationTimestamp = fileCreationTime;
+                    break;
+                  }
+                }
+                break;
+              }
+              case 19: // Lap
+              {
+                switch(rf.definitionNum)
+                {
+                  case 253: // Timestamp
+                  {
+                    time = *(uint32_t*)ptr;
+                    // TODO: add to gpx?
+                    tstamps.push_back(time);
+                    break;
+                  }
+                }
+                break;
+              }
+              case 20: // Record
+              {
+                switch(rf.definitionNum)
+                {
+                  case 253: // Timestamp
+                  {
+                    time = *(uint32_t*)ptr;
+                    gpx.tracks.back().trackSegs.back().trackPoints[time].time = time;
+                    tstamps.push_back(time);
+                    break;
+                  }
+                  case 0: // Latitude
+                  {
+                    int32_t latitude = *(int32_t*)ptr;
+                    gpx.tracks.back().trackSegs.back().trackPoints[time].latitude = latitude;
+                    break;
+                  }
+                  case 1: // Longitude
+                  {
+                    uint32_t longitude = *(int32_t*)ptr;
+                    gpx.tracks.back().trackSegs.back().trackPoints[time].longitude = longitude;
+                    break;
+                  }
+                  case 2: // Altitude
+                  {
+                    uint16_t altitude = *(uint16_t*)ptr;
+                    gpx.tracks.back().trackSegs.back().trackPoints[time].altitude = altitude;
+                    break;
+                  }
+                  case 3: // Heart Rate
+                  {
+                    uint8_t heartRate = *(uint8_t*)ptr;
+                    gpx.tracks.back().trackSegs.back().trackPoints[time].heartRate = heartRate;
+                    break;
+                  }
+                  case 4: // Cadence
+                  {
+                    uint8_t cadence = *(uint8_t*)ptr;
+                    gpx.tracks.back().trackSegs.back().trackPoints[time].cadence = cadence;
+                    break;
+                  }
+                }
+                break;
+              }
+              case 29: // WayPoint
+              {
+                switch(rf.definitionNum)
+                {
+                  case 253: // Timestamp
+                  {
+                    time = *(uint32_t*)ptr;
+                    gpx.wayPoints.back().time = time;
+                    tstamps.push_back(time);
+                    break;
+                  }
+                  case 0: // Name
+                  {
+                    string name = GarminConvert::gString(ptr, 16);
+                    gpx.wayPoints.back().name = name;
+                    break;
+                  }
+                  case 1: // Latitude
+                  {
+                    int32_t latitude = *(int32_t*)ptr;
+                    gpx.wayPoints.back().latitude = latitude;
+                    break;
+                  }
+                  case 2: // Longitude
+                  {
+                    int32_t longitude = *(int32_t*)ptr;
+                    gpx.wayPoints.back().longitude = longitude;
+                    break;
+                  }
+                  case 3: // Symbol
+                  {
+                    break;
+                  }
+                  case 4: // Altitude
+                  {
+                    uint16_t altitude = *(uint16_t*)ptr;
+                    gpx.wayPoints.back().altitude = altitude;
+                    break;
+                  }
+                }
+                break;
+              }
+              case 31: // Course
+              {
+                switch(rf.definitionNum)
+                {
+                  case 5: // Name
+                  {
+                    string name("Course_");
+                    name += GarminConvert::gString(ptr, 16);
+                    gpx.tracks.back().name = name;
+                    break;
+                  }
+                }
+                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;
-                        bytes -= rf.size;
-                    }
-
-                    switch(rd.rfx.globalNum)
-                    {
-                        case 0: // File Id
-                        {
-                            switch (fileType)
-                            {
-                                case 4: // Activity
-                                {
-                                    gpx.newTrack(string("Track_") + GarminConvert::localTime(fileCreationTime));
-                                    break;
-                                }
-                                case 6: // Course
-                                {
-                                    gpx.newTrack(string("Course_") + GarminConvert::localTime(fileCreationTime));
-                                    break;
-                                }
-                            }
-                            break;
-                        }
-                        case 19: // Lap
-                        {
-                            gpx.newTrackSeg();
-                            break;
-                        }
-                    }
+                    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;
+            bytes -= rf.size;
+          }
+
+          switch(rd.rfx.globalNum)
+          {
+            case 0: // File Id
+            {
+              switch (fileType)
+              {
+                case 4: // Activity
+                {
+                  gpx.newTrack(string("Track_") + GarminConvert::localTime(fileCreationTime));
+                  break;
                 }
-                else
+                case 6: // Course
                 {
-                  logger() << "Undefined Local Message Type: " << (unsigned)rh.normalHeader.localMessageType << "\n";
-                  return false;
+                  gpx.newTrack(string("Course_") + GarminConvert::localTime(fileCreationTime));
+                  break;
                 }
+              }
+              break;
+            }
+            case 19: // Lap
+            {
+              gpx.newTrackSeg();
+              break;
             }
+          }
         }
         else
         {
-            // Compressed Timestamp Header
-            logger() << "Compressed Timestamp Header:" << endl;
-            logger() << "  Local Message Type " << (unsigned)rh.ctsHeader.localMessageType << endl;
-            logger() << "  Time Offset " << (unsigned)rh.ctsHeader.timeOffset << "\n";
+          logger() << "Undefined Local Message Type: " << (unsigned)rh.normalHeader.localMessageType << "\n";
+          return false;
         }
+      }
+    }
+    else
+    {
+      // Compressed Timestamp Header
+      logger() << "Compressed Timestamp Header:" << endl;
+      logger() << "  Local Message Type " << (unsigned)rh.ctsHeader.localMessageType << endl;
+      logger() << "  Time Offset " << (unsigned)rh.ctsHeader.timeOffset << "\n";
     }
+  }
 
-        std::remove_if(tstamps.begin(), tstamps.end(), isZero);
-        std::sort(tstamps.begin(), tstamps.end());
+  std::remove_if(tstamps.begin(), tstamps.end(), isZero);
+  std::sort(tstamps.begin(), tstamps.end());
 //        for(size_t i = 0; i < tstamps.size(); i++)
 //        {
 //          LOG_VAR2(i, tstamps[i]);
 //        }
-        mFirstTimestamp = tstamps.front();
-        mLastTimestamp = tstamps.back();
+  mFirstTimestamp = tstamps.front();
+  mLastTimestamp = tstamps.back();
 
-    return true;
+  return true;
 }
 
 struct DateSorter
@@ -1305,89 +1316,89 @@ struct DateSorter
 
 bool FIT::parseZeroFile(vector<uint8_t> &data, ZeroFileContent &zeroFileContent)
 {
-    logger() << "Parsing zero file...\n";
+  logger() << "Parsing zero file...\n";
     
-    DirectoryHeader directoryHeader;
-    if (data.size() < sizeof(directoryHeader))
-    {
-        LOG(LOG_WARN) << "Zero file data is too short to get header\n";
-        return false;
-    }
+  DirectoryHeader directoryHeader;
+  if (data.size() < sizeof(directoryHeader))
+  {
+    LOG(LOG_WARN) << "Zero file data is too short to get header\n";
+    return false;
+  }
 
-    memcpy(&directoryHeader, &data.front(), sizeof(directoryHeader));
-    data.erase(data.begin(), data.begin()+sizeof(directoryHeader));
+  memcpy(&directoryHeader, &data.front(), sizeof(directoryHeader));
+  data.erase(data.begin(), data.begin()+sizeof(directoryHeader));
     
-    logger() << "Directory version: " << hex << setw(2) << (unsigned)directoryHeader.version << "\n";
-    logger() << "Structure length: " << dec << (unsigned)directoryHeader.structureLength << "\n";
-    logger() << "Time format: " << dec << (unsigned)directoryHeader.timeFormat << "\n";
-    logger() << "Current system time: " << GarminConvert::localTime(directoryHeader.currentSystemTime) << "\n";
-    logger() << "Directory modified time: " << GarminConvert::localTime(directoryHeader.directoryModifiedTime) << "\n";
+  logger() << "Directory version: " << hex << setw(2) << (unsigned)directoryHeader.version << "\n";
+  logger() << "Structure length: " << dec << (unsigned)directoryHeader.structureLength << "\n";
+  logger() << "Time format: " << dec << (unsigned)directoryHeader.timeFormat << "\n";
+  logger() << "Current system time: " << GarminConvert::localTime(directoryHeader.currentSystemTime) << "\n";
+  logger() << "Directory modified time: " << GarminConvert::localTime(directoryHeader.directoryModifiedTime) << "\n";
 
-    int records = static_cast<int>(data.size()) / directoryHeader.structureLength;
+  int records = static_cast<int>(data.size()) / directoryHeader.structureLength;
 
-    if(data.empty() || data.size() < (sizeof(ZeroFileRecord)*records))
-    {
-      logger() << "Zero file data is truncated to read...\n";
+  if(data.empty() || data.size() < (sizeof(ZeroFileRecord)*records))
+  {
+    logger() << "Zero file data is truncated to read...\n";
 
-      return false;
-    }
+    return false;
+  }
 
-    //logger() << uppercase;
+  //logger() << uppercase;
 
-    logger() << "_idx" << "|d" << "ata" << "type|" << "recordType|" << "_rt_" << "++ID++" << "__fileSize|" << "+++++++++++++++++++|" << "flags" << "\n";
-    uint8_t *ptr = &data.front();
-    for (int i=0; i<records; i++)
-    {
-      ZeroFileRecord zfRecord;
-        memcpy(&zfRecord, ptr, sizeof(zfRecord));
-        ptr += sizeof(zfRecord);
-
-        logger() << hex << setw(4) << setfill('0') << (unsigned)zfRecord.index << ": " <<
-            ((zfRecord.fileDataType == 0x80)?"FIT":"   ") <<
-            "(" << setw(2) << setfill('0') << (unsigned)zfRecord.fileDataType << ") " <<
-            setw(10) << setfill(' ') << enumMap[MessageFieldTypeFileType][zfRecord.recordType] << " " <<
-            "(" << setw(2) << setfill('0') << (unsigned)zfRecord.recordType << ")" <<
-            "(" << setw(4) << setfill('0') << (unsigned)zfRecord.identifier << ")" <<
-            dec << setw(10) << setfill(' ') << (unsigned)zfRecord.fileSize << " " <<
-            GarminConvert::localTime(zfRecord.timeStamp) << " ";
-        if (zfRecord.generalFileFlags.read)    { LOG(antpm::LOG_RAW) << "[R]"; }
-        if (zfRecord.generalFileFlags.write)   { LOG(antpm::LOG_RAW) << "[W]"; }
-        if (zfRecord.generalFileFlags.erase)   { LOG(antpm::LOG_RAW) << "[E]"; }
-        if (zfRecord.generalFileFlags.append)  { LOG(antpm::LOG_RAW) << "[Ap]"; }
-        if (zfRecord.generalFileFlags.archive) { LOG(antpm::LOG_RAW) << "[Ar]"; }
-        if (zfRecord.generalFileFlags.crypto)  { LOG(antpm::LOG_RAW) << "[C]"; }
-        LOG(antpm::LOG_RAW) << "\n";
-      zeroFileContent.zfRecords.push_back(zfRecord);
-    }
+  logger() << "_idx" << "|d" << "ata" << "type|" << "recordType|" << "_rt_" << "++ID++" << "__fileSize|" << "+++++++++++++++++++|" << "flags" << "\n";
+  uint8_t *ptr = &data.front();
+  for (int i=0; i<records; i++)
+  {
+    ZeroFileRecord zfRecord;
+    memcpy(&zfRecord, ptr, sizeof(zfRecord));
+    ptr += sizeof(zfRecord);
+
+    logger() << hex << setw(4) << setfill('0') << (unsigned)zfRecord.index << ": " <<
+      ((zfRecord.fileDataType == 0x80)?"FIT":"   ") <<
+      "(" << setw(2) << setfill('0') << (unsigned)zfRecord.fileDataType << ") " <<
+      setw(10) << setfill(' ') << enumMap[MessageFieldTypeFileType][zfRecord.recordType] << " " <<
+      "(" << setw(2) << setfill('0') << (unsigned)zfRecord.recordType << ")" <<
+      "(" << setw(4) << setfill('0') << (unsigned)zfRecord.identifier << ")" <<
+      dec << setw(10) << setfill(' ') << (unsigned)zfRecord.fileSize << " " <<
+      GarminConvert::localTime(zfRecord.timeStamp) << " ";
+    if (zfRecord.generalFileFlags.read)    { LOG(antpm::LOG_RAW) << "[R]"; }
+    if (zfRecord.generalFileFlags.write)   { LOG(antpm::LOG_RAW) << "[W]"; }
+    if (zfRecord.generalFileFlags.erase)   { LOG(antpm::LOG_RAW) << "[E]"; }
+    if (zfRecord.generalFileFlags.append)  { LOG(antpm::LOG_RAW) << "[Ap]"; }
+    if (zfRecord.generalFileFlags.archive) { LOG(antpm::LOG_RAW) << "[Ar]"; }
+    if (zfRecord.generalFileFlags.crypto)  { LOG(antpm::LOG_RAW) << "[C]"; }
+    LOG(antpm::LOG_RAW) << "\n";
+    zeroFileContent.zfRecords.push_back(zfRecord);
+  }
 
-    std::sort(zeroFileContent.zfRecords.begin(), zeroFileContent.zfRecords.end(), dateSorter);
+  std::sort(zeroFileContent.zfRecords.begin(), zeroFileContent.zfRecords.end(), dateSorter);
 
-    for(size_t i = 0; i < zeroFileContent.zfRecords.size(); i++)
+  for(size_t i = 0; i < zeroFileContent.zfRecords.size(); i++)
+  {
+    ZeroFileRecord& zfRecord(zeroFileContent.zfRecords[i]);
+    LOG(LOG_DBG2) << hex << setw(4) << setfill('0') << (unsigned)zfRecord.index << ": " <<
+      GarminConvert::localTime(zfRecord.timeStamp) << "\n";
+    switch(zfRecord.recordType)
     {
-      ZeroFileRecord& zfRecord(zeroFileContent.zfRecords[i]);
-      LOG(LOG_DBG2) << hex << setw(4) << setfill('0') << (unsigned)zfRecord.index << ": " <<
-                  GarminConvert::localTime(zfRecord.timeStamp) << "\n";
-      switch(zfRecord.recordType)
+      case 4: // Activity
       {
-        case 4: // Activity
-        {
-          zeroFileContent.activityFiles.push_back(zfRecord.index);
-          break;
-        }
-        case 6: // Course
-        {
-          zeroFileContent.courseFiles.push_back(zfRecord.index);
-          break;
-        }
-        case 8: // Waypoints
-        {
-          zeroFileContent.waypointsFiles.push_back(zfRecord.index);
-          break;
-        }
+        zeroFileContent.activityFiles.push_back(zfRecord.index);
+        break;
+      }
+      case 6: // Course
+      {
+        zeroFileContent.courseFiles.push_back(zfRecord.index);
+        break;
+      }
+      case 8: // Waypoints
+      {
+        zeroFileContent.waypointsFiles.push_back(zfRecord.index);
+        break;
       }
     }
+  }
 
-    return true;
+  return true;
 }
 
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-running/antpm.git



More information about the Pkg-running-devel mailing list