diff --git a/src/Core/GcUpgrade.cpp b/src/Core/GcUpgrade.cpp index 27f80d509..3a5cbb2be 100644 --- a/src/Core/GcUpgrade.cpp +++ b/src/Core/GcUpgrade.cpp @@ -406,6 +406,17 @@ GcUpgrade::upgrade(const QDir &home) //---------------------------------------------------------------------- + //---------------------------------------------------------------------- + // Current development release processing + //---------------------------------------------------------------------- + if (last < VERSION37_BUILD) { + // remove FITmetadata.json since it now has message number metadata + // any previously cached version would ordinarily override the internal + // version, and if there is no internet it will never get refreshed + // so we delete the cache to ensure the built-in (current latest) is used + QString filename = home.canonicalPath()+"/../FITmetadata.json"; + QFile::remove(filename); + } //---------------------------------------------------------------------- // All Version dependent Upgrade Steps are done ... diff --git a/src/Core/GcUpgrade.h b/src/Core/GcUpgrade.h index ba5081565..71db77ff9 100644 --- a/src/Core/GcUpgrade.h +++ b/src/Core/GcUpgrade.h @@ -106,7 +106,8 @@ // 4011 - V3.6 DEVELOPMENT 2208 (AUG 2022) (Pre-release RC2) // 4012 - V3.6 DEVELOPMENT 2210 (OCT 2022) (Pre-release RC3) // 4013 - V3.6 DEVELOPMENT 2303 (MAR 2023) (Pre-release RC4) -// 5000 - V3.6 RELEASE (August 2023) - latest snapshot 4/11 +// 5000 - V3.6 RELEASE (August 2023) - latest snapshot 24/9 +// 5001 - V3.7 DEVELOPMENT (NOV 2023) #define VERSION3_BUILD 3010 // released #define VERSION3_SP1 3030 // released @@ -118,6 +119,7 @@ #define VERSION34_BUILD 3955 // released #define VERSION35_BUILD 3990 // released #define VERSION36_BUILD 5000 // released 5/8/23 +#define VERSION37_BUILD 5001 // released 5/8/23 // will keep changing during testing and before final release #define VERSION31_BUILD VERSION31_UPG diff --git a/src/FileIO/FitRideFile.cpp b/src/FileIO/FitRideFile.cpp index 9db1ab774..cdea1a93b 100644 --- a/src/FileIO/FitRideFile.cpp +++ b/src/FileIO/FitRideFile.cpp @@ -1,6 +1,7 @@ /* * Copyright (c) 2007-2008 Sean C. Rhea (srhea@srhea.net) * Copyright (c) 2016-2017 Damien Grauser (Damien.Grauser@pev-geneve.ch) + * Copyright (c) 2023 Mark Liversedge (liversedge@gmail.com) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free @@ -38,31 +39,61 @@ #include #include -#define FIT_DEBUG false // debug traces -#define FIT_DEBUG_LEVEL 4 // debug level : 1 message, 2 definition, 3 data without record, 4 data +#define FIT_DEBUG false // debug traces true/false- can generate many MB of logs + // + // NOTE: fit records are the top level container for data + // they contain messages of many types but the most numerous + // are message type "record" which contain sample recording + // its confusing terminology but we refer to "fit records" + // and "record messages" in the comments to distinguish between + // the two different data objects + // +#define FIT_DEBUG_LEVEL 2 // debug level : 1 fit record processing (incl. local message definitions & developer definitions) + // 2 message processing but not record messages + // 3 message processing incl. record messages + // 4 field level processing + // 5 general information -#ifndef MATHCONST_PI -#define MATHCONST_PI 3.141592653589793238462643383279502884L /* pi */ -#endif +static int fitFileReaderRegistered = + RideFileFactory::instance().registerReader( + "fit", "Garmin FIT", new FitFileReader()); -#define DEFINITION_MSG_HEADER 64 -#define FILE_ID_MSG_NUM 0 -#define SESSION_MSG_NUM 18 -#define LAP_MSG_NUM 19 -#define RECORD_MSG_NUM 20 -#define EVENT_MSG_NUM 21 -#define ACTIVITY_MSG_NUM 34 -#define FILE_CREATOR_MSG_NUM 49 -#define HRV_MSG_NUM 78 -#define SEGMENT_MSG_NUM 142 +// 1989-12-31 00:00:00 UTC +static const QDateTime qbase_time(QDate(1989, 12, 31), QTime(0, 0, 0), Qt::UTC); -// Fit types metadata -struct FITproduct { int manu, prod; QString name; }; -struct FITmanufacturer { int manu; QString name; }; -// arrays of manu and prod +// +// SOURCE FILE CONTENTS +// +// This is a large source file that probably needs to be refactored. +// +// It has been organised into 4 sections, Section 1 is the majority +// of the file. +// +// Section 0 - loading and managing metadata +// Section 1 - FIT Parser associated methods and code +// Section 2 - RideFile entry point +// Section 3 - Write RideFile code +// + +// +// Section 0 - Loading and managing metadata +// +// All metadata is recored in FITmetadata.json, which is maintained via +// the GoldenCheetah.org website and generated from the FIT sdk headers +// +// Currently the metadata is mainly used to generate XDATA tabs for the +// numerous message types in a FIT file (laps, sessions etc) +// + +// metadata read from FITmetadata.json +QStringList FITbasetypes; QList FITproducts; QList FITmanufacturers; +QList FITmessages; +QList FITstandardfields; + +QStringList GenericDecodeList; // load the FITmetadata file, called the first time a FIT file // is parsed, so may not ever be called by the user @@ -73,6 +104,15 @@ static void loadMetadata() if (loaded) return; loaded=true; + // the metadata uses names for types not the value, these map to the values in fit.h + // the index into the list is the type, so enum=0, sint8=1, uint8=2 and so on + FITbasetypes << "enum" << "sint8" << "uint8" << "sint16" << "uint16" << "sint32" << "uint32" << "string" << "float32" + << "float64" << "uint8z" << "uint16z" << "uint32z" << "byte" << "sint64" << "uint64" << "uint64z"; + + // data is extracted generically using metadata and placed into XDATA, this is not performed + // for all message types- we control the ones we want with this list: + GenericDecodeList << "totals" << "session" << "lap"; + // lets try and download from the goldencheetah website- it makes // sense to do this here since we only get called when trying to // import a FIT file- which is only going to be post-activity not @@ -115,7 +155,7 @@ static void loadMetadata() file.write(content.toUtf8().constData()); file.close(); } - //fprintf(stderr, "FITmetadata.json updated from online version\n"); fflush(stderr); + if (FIT_DEBUG) { fprintf(stderr, "FITmetadata.json updated from online version\n"); fflush(stderr); } } } @@ -134,14 +174,16 @@ static void loadMetadata() // parse the content QJsonDocument metajson = QJsonDocument::fromJson(content.toUtf8()); - if (metajson.isEmpty() || metajson.isNull()) goto badconfig; - else { + if (metajson.isEmpty() || metajson.isNull()) { + fprintf(stderr, "Bad or missing FITmetadata.json\n"); fflush(stderr); + goto badconfig; + + } else { // lets setup the structures QJsonObject root = metajson.object(); if (!root.contains("PRODUCTS")) goto badconfig; - QJsonObject products = root["PRODUCTS"].toObject(); QJsonArray PRODUCTS = root["PRODUCTS"].toArray(); foreach(const QJsonValue val, PRODUCTS) { @@ -155,11 +197,10 @@ static void loadMetadata() add.manu = obj["manu"].toInt(); FITproducts << add; - //fprintf(stderr, "FITprod: %d:%d %s\n", add.manu, add.prod, add.name.toStdString().c_str()); fflush(stderr); + if (FIT_DEBUG && FIT_DEBUG_LEVEL > 4) { fprintf(stderr, "FITprod: %d:%d %s\n", add.manu, add.prod, add.name.toStdString().c_str()); fflush(stderr); } } if (!root.contains("MANUFACTURERS")) goto badconfig; - QJsonObject manufacturers = root["MANUFACTURERS"].toObject(); QJsonArray MANUFACTURERS = root["MANUFACTURERS"].toArray(); foreach(const QJsonValue val, MANUFACTURERS) { @@ -172,85 +213,219 @@ static void loadMetadata() add.manu = obj["manu"].toInt(); FITmanufacturers << add; - //fprintf(stderr, "FITmanu: %d %s\n", add.manu, add.name.toStdString().c_str()); fflush(stderr); + if (FIT_DEBUG && FIT_DEBUG_LEVEL > 4) { fprintf(stderr, "FITmanu: %d %s\n", add.manu, add.name.toStdString().c_str()); fflush(stderr); } } + if (!root.contains("FIELDS")) goto badconfig; + QJsonArray FIELDS = root["FIELDS"].toArray(); + foreach(const QJsonValue val, FIELDS) { + + // Message:FieldNum lists + // + // remember field numbers are specific to a particular message- in the example below the + // min_altitude value in a lap message has a field num of 62 and stored as an unsigned 16 bit + // integer- scaled by 5, so to decode you need to divide by 5. Lastly it is in units "m" (meters) + // + // { "message":"lap","num":62,"name":"min_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + + // convert so we can inspect + QJsonObject obj = val.toObject(); + + FitFieldDefinition add; + + // we must have message section name, field number, field name and type for this to be useful + // if we don't then it gets ignored, since this is the minimum information to decode and include in XDATA + if (obj.contains("message") && obj.contains("num") && obj.contains("name") && obj.contains("type")) { + + // check the base type is supported + QString type = obj["type"].toString(); + if (FITbasetypes.contains(type) || type == "date_time") { + + add.dev_id = -1; + add.native = add.num = obj["num"].toInt(); + add.message = obj["message"].toString().toStdString(); + add.name = obj["name"].toString().toStdString(); + + if (type == "date_time") { + add.type = 6; // "uint32" + add.istime = true; + } else { + add.type = FITbasetypes.indexOf(type); + add.istime = false; + } + add.size = 0; // uses the value from the file.. for now + + if (obj.contains("units")) add.unit = obj["unit"].toString().toStdString(); + else add.unit=""; + + if (obj.contains("scale")) add.scale = obj["scale"].toDouble(); + else add.scale=-1; + + if (obj.contains("offset")) add.offset = obj["offset"].toInt(); + else add.offset=-1; + + FITstandardfields << add; + if (FIT_DEBUG && FIT_DEBUG_LEVEL > 4) { fprintf(stderr, "Standard Field: [%s] %s (%s)\n", add.message.c_str(), add.name.c_str(), FITbasetypes[add.type].toStdString().c_str()); fflush(stderr); } + } + } + } + + if (!root.contains("MESSAGES")) goto badconfig; + QJsonArray MESSAGES = root["MESSAGES"].toArray(); + foreach(const QJsonValue val, MESSAGES) { + + // convert so we can inspect + QJsonObject obj = val.toObject(); + + FITmessage add; + + add.desc = obj["desc"].toString(); + add.num = obj["num"].toInt(); + + FITmessages << add; + if (FIT_DEBUG && FIT_DEBUG_LEVEL > 4) { fprintf(stderr, "FITmessage: %d %s\n", add.num, add.desc.toStdString().c_str()); fflush(stderr); } + } return; } badconfig: - fprintf(stderr, "FITRideFile: FITmetadata.json parse error\n"); fflush(stderr); + { fprintf(stderr, "FITRideFile: FITmetadata.json parse error\n"); fflush(stderr); } return; } -static int fitFileReaderRegistered = - RideFileFactory::instance().registerReader( - "fit", "Garmin FIT", new FitFileReader()); - -// 1989-12-31 00:00:00 UTC -static const QDateTime qbase_time(QDate(1989, 12, 31), QTime(0, 0, 0), Qt::UTC); - -/* FIT has uint32 as largest integer type. So qint64 is large enough to - * store all integer types - no matter if they're signed or not */ - -// this will need to change if float or other non-integer values are -// introduced into the file format -typedef qint64 fit_value_t; -#define NA_VALUE std::numeric_limits::max() -typedef std::string fit_string_value; -typedef float fit_float_value; - -struct FitField { - int num; - int type; // FIT base_type - int size; // in bytes - int deve_idx; // Developer Data Index -}; - -struct FitDeveField { - int dev_id; // Developer Data Index - int num; - int type; // FIT base_type - int size; // in bytes - int native; // native field number - int scale; - int offset; - fit_string_value name; - fit_string_value unit; -}; - -struct FitDeveApp { - fit_string_value dev_id; // Developer Data Index - fit_string_value app_id; // application_id - int man_id; // manufacturer_id - int dev_data_id; // developer_data_index - qint64 app_version; // application_version - - QList fields; -}; - -struct FitDefinition { - int global_msg_num; - bool is_big_endian; - std::vector fields; -}; - - -enum fitValueType { SingleValue, ListValue, FloatValue, StringValue }; -typedef enum fitValueType FitValueType; - -struct FitValue +// +// Section 1 - The FIT Parser +// +// The fit parser is managed via the FitFileParser structure +// its a janky way of managing scope of functions and data and is +// ripe for being refactored. For now we leave it untouched since it +// is stable, if a little tedious to maintain. You will notice for +// example that there is no FitFileParser header and all the methods +// are defined and declared inline below. This makes navigation +// harder and breaking into separate source files that little bit harder. +// +// It is not clear why std c containers are used instead of Qt +// ones; the use of std::string is quite annoying as it requires +// conversion to align with the rest of the code. It is likely that +// the original author was interested in learning about them rather +// than writing code that aligned with the rest of the codebase. +// +// The official FIT protocol docs are now hosted at Garmin and are +// very useful, see: https://developer.garmin.com/fit/protocol/ +// +// We try to outline how the FIT protocol works below, but you may +// get confused, 30 minutes perusing the URL above will save you a +// lot of time if you are new to FIT files. +// +// PARSING A FILE +// +// A parser is instantiated with a filename, and is tied to that file +// for the duration. A new parser is needed for each file parsed. +// To start parsing the run() method is called +// +// The run() method will read all *records* in a FIT file, there are +// multiple record types; -definitions- these declare new types such as +// developer fields and -data- these contain different types of data +// +// The read_header() method is used to read the header record that must +// exist at the top of every FIT file. +// +// The read_record() method is used to read all the subsequent records +// that follow the header and will extract the data within it. These are +// either definition records or data records. +// +// Definition records will create +// whilst *data* records containg *messages* will create structs +// +// The struct in turn contain a QList of structs that +// contain the data definitions whilst the value are stored stored in a QList +// of structs as extracted mechanically from the FIT file. +// +// There are a wide range of message types from laps, sessions, events and so on. +// Just to confuse you the message type 20 is called "record" and this is the message +// that contains recorded data samples-- the bit we care about the most. Do not +// confuse a "record message" that is decoded by the function decodeRecord() with +// the FIT protocol top level records decoded by the function read_record() (!!!) +// +// The last record in the file contains a CRC. +// +// LOCAL MESSAGE TYPES vs GLOBAL MESSAGE TYPES +// +// Every message containing a data payload will also be preceded at some point +// in the file by a definition message that tells you how to decode it. +// +// It is possible to read a FIT file without knowing anything about the FIT +// profiles and the different message types. Just reading field level data. +// But, of course, you won't know what the data means; just that it is called "x" +// and contains the value y. +// +// If you read the FIT docs you will see there are a number of message types +// defined and they each have an associated number. The metadata loaded above +// relates directly to this. +// +// But when messages are placed into a FIT file they always have a LOCAL message +// number- both the data record itself, and the definition record that tells you +// how to read it. +// +// To relate this back to the FIT profiles (so you get a clue what the fields +// actually mean, the definition will define the local message number (that we +// use to identify the record) and also a global message number (that we use +// to relate back and process accordingly). +// +// This means that although say a LAP message could have 50 fields in it, the +// definition in the file says a LAP message is implemented locally with only +// the 10 fields we have stored. +// +// FITMESSAGE PROCESSING +// +// As each struct and QList of is extracted by read_record() +// it is passed to a decoding function that should iterate over the fields in the +// message and add data to the rideFile being processed. +// +// A generic decoder runs first and adds data to XDATA- the data it creates are not +// used by standard GC code but are extracted for users to work with in user charts +// and so on. It is entirely driven by the metadata loaded above. See: +// +// decodeGeneric() +// +// After this not all of the standard messages are processed but the following are +// processed and added to the rideFile being constructed, generally the data they +// create IS used internally: +// +// decodeFileId() +// decodePhysiologicalMetrics() +// decodeSession() +// decodeDeviceInfo() +// decodeActivity() +// decodeEvent() +// decodeHRV() +// decodeLap() +// decodeRecord() +// decodeLength() +// decodeWeather() +// decodeHr() +// decodeDeviceSettings() +// decodeSegment() +// decodeUserProfile() +// decodeDeveloperID() +// decodeDeveloperFieldDescription() +// +// Along the way there are large number of utility functions that +// are used by the decode functions, these make up the rest of the +// code within the parser +// +struct FitFileParser { - FitValueType type; - fit_value_t v; - fit_string_value s; - fit_float_value f; - QList list; - int size; -}; -struct FitFileReaderState -{ + // + // STATE INFORMATION + // + // Various state information, yes there is a crap ton of it. You will + // see that across this source file there are a lot of aspects that have + // grown organically as different people have worked on it. + // + // this is ripe for refactoring. *FIXME* + // QFile &file; QStringList &errors; RideFile *rideFile; @@ -260,8 +435,8 @@ struct FitFileReaderState quint32 last_event_timestamp; double start_timestamp; double last_distance; - QMap local_msg_types; - QMap local_deve_fields; // All developer fields + QMap local_msg_types; + QMap local_deve_fields; // All developer fields QMap local_deve_fields_app; // All developper apps QMap record_extra_fields; QMap record_deve_fields; // Developer fields in DEVELOPER XDATA or STANDARD DATA @@ -297,7 +472,14 @@ struct FitFileReaderState QList> session_device_info_list_; QList> session_data_info_list_; - FitFileReaderState(QFile &file, QStringList &errors) : + + // + // CONSTRUCTOR + // + // construct a parser passing the file by reference, any encountered + // errors will go into the errors list also passed by reference + // + FitFileParser(QFile &file, QStringList &errors) : file(file), errors(errors), rideFile(NULL), start_time(0), last_time(0), last_distance(0.00f), interval(0), calibration(0), devices(0), stopped(true), isLapSwim(false), last_length(0.0), @@ -306,8 +488,10 @@ struct FitFileReaderState last_altitude(0.0) {} - struct TruncatedRead {}; + // yay, lets crash the whole fucking program if the reader + // has problems. sheesh. this is definitely a *FIXME* + struct TruncatedRead {}; void read_unknown( int size, int *count = NULL ) { if (!file.seek(file.pos() + size)) throw TruncatedRead(); @@ -315,6 +499,46 @@ struct FitFileReaderState (*count) += size; } + // + // FIT DATA TYPE READERS + // + // The FIT protocol is very focused on strongly typed data + // that must be read/written quite particularly and the + // names used uint16z etc are referred to as the FIT + // base types across the FIT protocol documentation + // + // Ultimately all data is represented using these base + // types, but the docs also uses semantic types to + // indicate the type of data being stored. For example + // timestamps are date_time types in the docs but + // they map to the uint32 base type. + // + // This section of the code contains all the readers + // read_text + // read_uint8 + // read_byte + // read_uint8z + // read_int16 + // read_uint16 + // read_uint16z + // read_int32 + // read_uint32 + // read_uint32z + // + // There are 16 base types and not all are represented + // in our code, this should be fixed (e.g. floats) + // + // Additionally there are some functions here for + // working with semantic types: + // + // getSport + // getSportId + // getSubSport + // getSubSportId + // + + // base types + fit_string_value read_text(int len, int *count = NULL) { char c; fit_string_value res = ""; @@ -468,2955 +692,7 @@ struct FitFileReaderState return f; } - void DumpFitValue(const FitValue& v) { - printf("type: %d %llx %s\n", v.type, v.v, v.s.c_str()); - } - - void convert2Run( RideFile *rf) { - if (rf->areDataPresent()->cad) { - foreach(RideFilePoint *pt, rf->dataPoints()) { - pt->rcad = pt->cad; - pt->cad = 0; - } - rf->setDataPresent(RideFile::rcad, true); - rf->setDataPresent(RideFile::cad, false); - } - } - - // return a name for the manufacturer, product combintion - // uses the config from FITmetadata.json initialised above - QString getManuProd(int manu, int prod) { - - QString returning; - - // is it a known or defaulted product? - foreach(FITproduct x, FITproducts) { - - if (x.manu == manu && x.prod == prod) { - // garmin devices special case (could also fix in FITmetadata.json) - // we have been inconsistent on this in the past e.g. Powertap, not SARIS Powertap - if (manu == 1) return QString("Garmin %1").arg(x.name); - else return x.name; - } - if (x.manu == manu && x.prod == -1) returning = x.name; - } - if (returning != "") return returning; - - // ok, then lets just return manufacturer and prod number - foreach(FITmanufacturer x, FITmanufacturers) { - if (x.manu == manu) return QString ("%1 Device (%2)").arg(x.name).arg(prod); - } - - // don't even recognise the manufacturer! - return QString("Unknown FIT Device %1:%2").arg(manu).arg(prod); - } - - QString getDeviceType(int device_type) { - switch (device_type) { - case 4: return "Headunit"; // bike_power - case 11: return "Powermeter"; // bike_power - case 12: case 25: return "Environment Sensor"; // s.t. temperature - case 16: return "Remote Control"; // s.t. Edge remote - case 17: return "Biketrainer"; // fitness equipment - case 18: return "Blood Presure"; - case 30: return "Running Dynamics"; - case 31: return "Muscle Oxygen"; - case 34: return "Shifting"; - case 35: case 36: return "Bikelight"; // bike_light_main/shared - case 40: return "Bike Radar"; // bike_radar - case 46: return "Bike Aero"; // bike_aero - case 120: return "HR"; // heart_rate - case 121: return "Speed-Cadence"; // bike_speed_cadence - case 122: return "Cadence"; // bike_speed - case 123: return "Speed"; // bike_speed - case 124: return "Stride"; // stride_speed_distance - - default: return QString("Type %1").arg(device_type); - } - } - - QString getBatteryStatus(quint8 battery_status) { - switch (battery_status) { - case 1: return "new"; - case 2: return "good"; - case 3: return "ok"; - case 4: return "low"; - case 5: return "critical"; - case 6: return "charging"; - default: return "unknown"; - } - } - - RideFile::SeriesType getSeriesForNative(int native_num) { - switch (native_num) { - - case 0: // POSITION_LAT - return RideFile::lat; - case 1: // POSITION_LONG - return RideFile::lon; - case 2: // ALTITUDE - return RideFile::alt; - case 3: // HEART_RATE - return RideFile::hr; - case 4: // CADENCE - return RideFile::cad; - case 5: // DISTANCE - return RideFile::km; - case 6: // SPEED - return RideFile::kph; - case 7: // POWER - return RideFile::watts; - case 9: // GRADE - return RideFile::slope; - case 13: // TEMPERATURE - return RideFile::temp; - case 30: // LEFT_RIGHT_BALANCE - return RideFile::lrbalance; - case 39: // VERTICAL OSCILLATION - return RideFile::rvert; - case 41: // GROUND CONTACT TIME - return RideFile::rcontact; - case 45: // LEFT_PEDAL_SMOOTHNESS - return RideFile::lps; - case 46: // RIGHT_PEDAL_SMOOTHNESS - return RideFile::rps; - //case 47: // COMBINED_PEDAL_SMOOTHNES - // return RideFile::cps; - case 54: // THb - return RideFile::thb; - case 57: // SMO2 - return RideFile::smo2; - - case 253: // SECS - return RideFile::secs; - default: - return RideFile::none; - } - } - - QString getNameForExtraNative(int native_num) { - switch (native_num) { - - case 32: // VERTICAL_SPEED - return "VERTICALSPEED"; // Vertical Speed - - case 40: // STANCE_TIME_PERCENT - return "STANCETIMEPERCENT"; // Stance Time Percent - - case 42: // ACTIVITY_TYPE - return "ACTIVITYTYPE"; // Activity Type - - case 47: // COMBINED_PEDAL_SMOOTHNES - return "COMBINEDSMOOTHNESS"; //Combined Pedal Smoothness - - case 81: // BATTERY_SOC - return "BATTERYSOC"; - - case 83: // VERTICAL_RATIO - return "VERTICALRATIO"; // Vertical Ratio - - case 85: // STEP_LENGTH - return "STEPLENGTH"; // Step Length - - case 90: // PERFORMANCE_CONDITION - return "PERFORMANCECONDITION"; // Performance Contition - - case 108: // RESPIRATIONRATE - return "RESPIRATIONRATE"; - - case 114: // MTB Dynamics - Grit - return "GRIT"; - - case 115: // MTB Dynamics - Flow - return "FLOW"; - - case 116: // Stress - return "STRESS"; - - case 133: // Pulse Ox - return "PULSEOX"; - - case 137: // Potential Stamina - return "POTENTIALSTAMINA"; - - case 138: // Stamina - return "STAMINA"; - - default: - return QString("FIELD_%1").arg(native_num); - } - } - - float getScaleForExtraNative(int native_num) { - switch (native_num) { - - case 32: // VERTICAL_SPEED - return 1000.0; - - case 40: // STANCE_TIME_PERCENT - case 83: // VERTICAL_RATIO - return 100.0; - - case 85: // STEP_LENGTH - return 10.0; - - case 47: // COMBINED_PEDAL_SMOOTHNES - case 81: // BATTERY_SOC - return 2.0; - - case 108: // RESPIRATIONRATE - case 116: // Stress - return 100.0; - - default: - return 1.0; - } - } - - int getOffsetForExtraNative(int native_num) { - switch (native_num) { - case 0: - return 0; - default: - return 0; - } - } - - void addRecordDeveField(QString key, FitDeveField deveField, bool xdata) { - QString name = deveField.name.c_str(); - - if (deveField.native>-1) { - int i = 0; - RideFile::SeriesType series = getSeriesForNative(deveField.native); - QString nativeName = rideFile->symbolForSeries(series); - - if (nativeName.length() == 0) - nativeName = QString("FIELD_%1").arg(deveField.native); - else - i++; - - QString typeName; - if (xdata) { - typeName = "DEVELOPER"; - do { - i++; - name = nativeName + (i>1?QString("-%1").arg(i):""); - } - while (deveXdata->valuename.contains(name)); - } - else { - typeName = "STANDARD"; - name = nativeName; - } - - const QString contain_info = QString("CIQ '%1' -> %2 %3").arg(deveField.name.c_str()).arg("STANDARD").arg(nativeName); - if (xdata && dataInfos.contains(contain_info)) { - int secs = last_time-start_time; - int idx = dataInfos.indexOf(contain_info); - const QString info_replacement = QString("CIQ '%1' -> %2 %3 (STANDARD until %4 secs)").arg(deveField.name.c_str()).arg(typeName).arg(name).arg(secs); - dataInfos.replace(idx, info_replacement); - if (session_data_info_.contains(contain_info)) - session_data_info_.replace(session_data_info_.indexOf(contain_info), info_replacement); - } else { - const QString the_info = QString("CIQ '%1' -> %2 %3").arg(deveField.name.c_str()).arg(typeName).arg(name); - dataInfos.append(the_info); - session_data_info_.append(the_info); - } - } - - if (xdata) { - deveXdata->valuename << name; - deveXdata->unitname << deveField.unit.c_str(); - - record_deve_fields.insert(key, deveXdata->valuename.count()-1); - } else - record_deve_fields.insert(key, -1); - - // Add field for app - if (local_deve_fields_app.contains(deveField.dev_id)) { - local_deve_fields_app[deveField.dev_id].fields.append(deveField); - } - } - - void decodeFileId(const FitDefinition &def, int, - const std::vector& values) { - int i = 0; - int manu = -1, prod = -1; - foreach(const FitField &field, def.fields) { - fit_value_t value = values[i++].v; - - if( value == NA_VALUE ) - continue; - - switch (field.num) { - case 1: manu = value; break; - case 2: prod = value; break; - - // other are ignored at present: - case 0: // file type: - // 4: activity log - // 6: Itinary - // 34: segment - break; - case 3: //serial number - case 4: //timestamp - case 5: //number - default: ; // do nothing - } - } - active_session_["_devicetype"] = getManuProd(manu, prod); - rideFile->setDeviceType(getManuProd(manu, prod)); - } - - - void decodePhysiologicalMetrics(const FitDefinition &def, int, - const std::vector& values) { - int i = 0; - - foreach(const FitField &field, def.fields) { - fit_value_t value = values[i++].v; - - - if( value == NA_VALUE ) - continue; - - switch (field.num) { - case 7: // METmax: 1 METmax = VO2max * 3.5, scale 65536 - active_session_["VO2max detected"] = QString::number(round(value / 65536.0 * 3.5 * 10.0) / 10.0); - rideFile->setTag("VO2max detected", QString::number(round(value / 65536.0 * 3.5 * 10.0) / 10.0)); - break; - - case 4: // Aerobic Training Effect, scale 10 - active_session_["Aerobic Training Effect"] = QString::number(value/10.0); - rideFile->setTag("Aerobic Training Effect", QString::number(value/10.0)); - break; - - case 20: // Anaerobic Training Effect, scale 10 - active_session_["Anaerobic Training Effect"] = QString::number(value/10.0); - rideFile->setTag("Anaerobic Training Effect", QString::number(value/10.0)); - break; - - case 9: // Recovery Time, minutes - active_session_["Recovery Time"] = QString::number(round(value/60.0)); - rideFile->setTag("Recovery Time", QString::number(round(value/60.0))); - break; - - case 17: // Performance Condition - active_session_["Performance Condition"] = QString::number(value); - rideFile->setTag("Performance Condition", QString::number(value)); - break; - - case 14: // If watch detected Running Lactate Threshold Heart Rate, bpm - if(rideFile->isRun() && value > 0){ - active_session_["LTHR detected"] = QString::number(value); - rideFile->setTag("LTHR detected", QString::number(value)); - } - break; - - case 15: // If watch detected Running Lactate Threshold Speed, m/s - if(rideFile->isRun() && value > 0){ - active_session_["LTS detected"] = QString::number(value/100.0); - rideFile->setTag("LTS detected", QString::number(value/100.0)); - } - break; - default: break; // do nothing - } - - - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) { - printf("decodePhysiologicalMetrics field %d: %d bytes, num %d, type %d\n", i, field.size, field.num, field.type ); - } - } - } - - void decodeSession(const FitDefinition &def, int time_offset, - const std::vector& values) { - time_t iniTime; - if (time_offset > 0) - iniTime = last_time + time_offset; - else - iniTime = last_time; - - int i = 0; - time_t this_timestamp = 0, this_start_time = 0, this_elapsed_time = 0; - QString sport, subsport; - bool sport_found = false, subsport_found = false; - QString prevSport = rideFile->getTag("Sport", ""); - double pool_length = 0.0; - - foreach(const FitField &field, def.fields) { - fit_value_t value = values[i++].v; - - if( value == NA_VALUE ) - continue; - - switch (field.num) { - case 5: // sport field - if (sport_found == false) { - sport_found = true; - sport = FitFileReaderState::getSport(value); - } - break; - case 6: // sub sport - if (subsport_found == false) { - subsport_found = true; - subsport = FitFileReaderState::getSubSport(value); - } - break; - case 44: // pool_length - pool_length = value / 100000.0; - active_session_["Pool Length"] = QString("%1").arg(pool_length*1000.0); - rideFile->setTag("Pool Length", // in meters - QString("%1").arg(pool_length*1000.0)); - break; - - // other fields are ignored at present - case 253: //timestamp - this_timestamp = value + qbase_time.toTime_t(); - active_session_["_timestamp"] = static_cast(this_timestamp); - break; - case 168: /* undocumented: Firstbeat EPOC based Exercise Load */ - active_session_["EPOC"] = QString::number(round(value / 65536.0 )); - rideFile->setTag("EPOC", QString::number(round(value / 65536.0 ))); - break; - case 192: /* undocumented: Feel manually entered after activity (0-25-50-75-100) */ - active_session_["Feel"] = QString::number(round(value)); - rideFile->setTag("Feel", QString::number(round(value))); - break; - case 193: /* undocumented: RPE manually entered after activity (0-10) */ - active_session_["RPE"] = QString::number(value / 10.0 ); - rideFile->setTag("RPE", QString::number(value / 10.0 )); - break; - case 254: //index - case 0: //event - case 1: /* event_type */ - case 2: /* start_time */ - this_start_time = value + qbase_time.toTime_t(); - active_session_["_start_time"] = static_cast(this_start_time); - break; - case 3: /* start_position_lat */ - case 4: /* start_position_long */ - case 7: /* total elapsed time */ - this_elapsed_time = value + qbase_time.toTime_t(); - active_session_["_total_elapsed_time"] = static_cast(this_elapsed_time); - break; - case 8: /* total timer time */ - case 9: /* total distance */ - case 10: /* total_cycles */ - case 11: /* total calories */ - case 13: /* total fat calories */ - case 14: /* avg_speed */ - case 15: /* max_speed */ - case 16: /* avg_HR */ - case 17: /* max_HR */ - case 18: /* avg_cad */ - case 19: /* max_cad */ - case 20: /* avg_pwr */ - case 21: /* max_pwr */ - case 22: /* total ascent */ - case 23: /* total descent */ - case 25: /* first lap index */ - case 26: /* num lap */ - case 29: /* north-east lat = bounding box */ - case 30: /* north-east lon = bounding box */ - case 31: /* south west lat = bounding box */ - case 32: /* south west lon = bounding box */ - case 34: /* normalized power */ - case 48: /* total work (J) */ - case 49: /* avg altitude */ - case 50: /* max altitude */ - case 52: /* avg grade */ - case 53: /* avg positive grade */ - case 54: /* avg negative grade */ - case 55: /* max pos grade */ - case 56: /* max neg grade */ - case 57: /* avg temperature (Celsius. deg) */ - case 58: /* max temp */ - case 59: /* total_moving_time */ - case 60: /* avg_pos_vertical_speed (m/s) */ - case 61: /* avg_neg_vertical_speed */ - case 62: /* max_pos_vertical_speed */ - case 63: /* max neg_vertical_speed */ - case 64: /* min HR bpm */ - case 69: /* avg lap time */ - case 70: /* best lap index */ - case 71: /* min altitude */ - case 92: /* fractional avg cadence (rpm) */ - case 93: /* fractional max cadence */ - default: break; // do nothing - } - - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) { - printf("decodeSession field %d: %d bytes, num %d, type %d\n", i, field.size, field.num, field.type ); - } - } - - if (sport_found) { - active_session_["Sport"] = sport; - rideFile->setTag("Sport", sport); - } - if (subsport_found) { - active_session_["SubSport"] = subsport; - rideFile->setTag("SubSport", subsport); - } - - // same procedure as for laps, code is c/p until a better solution is found - if (this_timestamp == 0 && this_elapsed_time > 0) { - this_timestamp = iniTime + this_elapsed_time - 1; - active_session_["_timestamp"] = static_cast(this_timestamp); - } - - if (this_start_time == 0 || this_start_time-start_time < 0) { - //errors << QString("lap %1 has invalid start time").arg(interval); - this_start_time = start_time; // time was corrected after lap start - active_session_["_start_time"] = static_cast(this_start_time); - - if (this_timestamp == 0 || this_timestamp-start_time < 0) { - active_session_.remove("_timestamp"); - errors << QString("lap %1 is ignored (invalid end time)").arg(interval); - return; - } - } - - session_tags_.append(active_session_); - session_device_info_list_.append(session_device_info_); - session_data_info_list_.append(session_data_info_); - active_session_.clear(); - session_device_info_.clear(); - session_data_info_.clear(); - } - - void decodeDeviceInfo(const FitDefinition &def, int, - const std::vector& values) { - int i = 0; - - int index=-1; - int manu = -1, prod = -1, version = -1, type = -1; - quint32 serial = 0; - quint8 battery_status = 0; - fit_string_value name; - - QString deviceInfo; - - foreach(const FitField &field, def.fields) { - FitValue value = values[i++]; - - //qDebug() << field.num << field.type << value.v; - - switch (field.num) { - case 0: // device index - index = value.v; - break; - case 1: // ANT+ device type - type = value.v; - break; - case 2: // manufacturer - manu = value.v; - break; - case 3: // serial number - serial = value.v; - break; - case 4: // product - prod = value.v; - break; - case 5: // software version - version = value.v; - break; - case 11: // battery status - battery_status = value.v; - break; - case 27: // product name - name = value.s; - break; - - // all other fields are ignored at present - case 253: //timestamp - case 10: // battery voltage - case 6: // hardware version - case 22: // ANT network - case 25: // source type - case 24: // equipment ID - default: ; // do nothing - } - - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) { - printf("decodeDeviceInfo field %d: %d bytes, num %d, type %d\n", i, field.size, field.num, field.type ); - } - //qDebug() << field.num << value.v; - } - - //deviceInfo += QString("Device %1 ").arg(index); - deviceInfo += QString("%1 ").arg(getDeviceType(type)); - if (manu>-1) - deviceInfo += getManuProd(manu, prod); - if (name.length()>0) - deviceInfo += QString(" %1").arg(name.c_str()); - if (version>0) - deviceInfo += QString(" (v%1)").arg(version/100.0); - if (serial > 0 && serial < std::numeric_limits::max()) - deviceInfo += QString(" ID:%1").arg(serial); - if (battery_status > 0 && battery_status < 8) - deviceInfo += QString(" BAT:%1").arg(getBatteryStatus(battery_status)); - - // What is 7 and 0 ? - // 3 for Moxy ? - if (type>-1 && type != 0 && type != 7 && type != 3) { - deviceInfos.insert(index, deviceInfo); - session_device_info_.insert(index, deviceInfo); - } - } - - void decodeActivity(const FitDefinition &def, int, - const std::vector& values) { - int i = 0; - - const int delta = qbase_time.toTime_t(); - int event = -1, event_type = -1, local_timestamp = -1, timestamp = -1; - - foreach(const FitField &field, def.fields) { - fit_value_t value = values[i++].v; - - if (value == NA_VALUE) - continue; - - switch (field.num) { - case 3: // event - event = value; - break; - case 4: // event_type - event_type = value; - break; - case 5: // local_timestamp - // adjust from seconds since 1989-12-31 00:00:00 UTC - if (0 != value) - { - local_timestamp = value + delta; - } - break; - case 253: // timestamp - // adjust from seconds since 1989-12-31 00:00:00 UTC - if (0 != value) - { - timestamp = value + delta; - } - break; - - case 1: // num_sessions - case 2: // type - default: - break; - } - - //qDebug() << field.num << value; - } - - if (event != 26) // activity - return; - - if (event_type != 1) // stop - return; - - if (local_timestamp < 0 || timestamp < 0) - return; - - if (0 == local_timestamp && 0 == timestamp) - return; - - QDateTime t(rideFile->startTime().toUTC()); - if (0 == local_timestamp) { - // ZWift FIT files are not reporting local timestamp - rideFile->setStartTime(t.addSecs(timestamp)); - } else { - // adjust start time to time zone of the ride - rideFile->setStartTime(t.addSecs(local_timestamp - timestamp)); - } - } - - void decodeEvent(const FitDefinition &def, int, - const std::vector& values) { - int time = -1; - int event = -1; - int event_type = -1; - qint16 data16 = -1; - qint32 data32 = -1; - int i = 0; - foreach(const FitField &field, def.fields) { - fit_value_t value = values[i++].v; - - if( value == NA_VALUE ) - continue; - - switch (field.num) { - case 253: // timestamp field (s) - time = value + qbase_time.toTime_t(); - break; - case 0: // event field - event = value; break; - case 1: // event_type field - event_type = value; break; - case 2: // data16 field - data16 = value; break; - case 3: //data32 field - data32 = value; break; - - // additional values (ignored at present): - case 4: // event group - default: ; // do nothing - } - } - - switch (event) { - case 0: // Timer event - { - switch (event_type) { - case 0: // start - stopped = false; - break; - case 1: // stop - stopped = true; - break; - case 2: // consecutive_depreciated - case 3: // marker - break; - case 4: // stop all - stopped = true; - break; - case 5: // begin_depreciated - case 6: // end_depreciated - case 7: // end_all_depreciated - case 8: // stop_disable - stopped = true; - break; - case 9: // stop_disable_all - stopped = true; - break; - default: - errors << QString("Unknown timer event type %1").arg(event_type); - } - } - break; - - case 36: // Calibration event - { - int secs = (start_time==0?0:time-start_time); - switch (event_type) { - case 3: // marker - ++calibration; - rideFile->addCalibration(secs, data16, QString("Calibration %1 (%2)").arg(calibration).arg(data16)); - //qDebug() << "marker" << secs << data16; - break; - default: - errors << QString("Unknown calibration event type %1").arg(event_type); - break; - } - } - break; - - case 42: /* front_gear_change */ - case 43: /* rear_gear_change */ - { - int secs = (start_time==0?0:time-start_time); - XDataPoint *p = new XDataPoint(); - - switch (event_type) { - case 3: - p->secs = secs; - p->km = last_distance; - p->number[0] = ((data32 >> 24) & 255); - p->number[1] = ((data32 >> 8) & 255); - p->number[2] = ((data32 >> 16) & 255); - p->number[3] = (data32 & 255); - gearsXdata->datapoints.append(p); - break; - default: - errors << QString("Unknown gear change event %1 type %2 data %3").arg(event).arg(event_type).arg(data32); - break; - } - } - break; - - case 3: /* workout */ - case 4: /* workout_step */ - case 5: /* power_down */ - case 6: /* power_up */ - case 7: /* off_course */ - case 8: /* session */ - case 9: /* lap */ - case 10: /* course_point */ - case 11: /* battery */ - case 12: /* virtual_partner_pace */ - case 13: /* hr_high_alert */ - case 14: /* hr_low_alert */ - case 15: /* speed_high_alert */ - case 16: /* speed_low_alert */ - case 17: /* cad_high_alert */ - case 18: /* cad_low_alert */ - case 19: /* power_high_alert */ - case 20: /* power_low_alert */ - case 21: /* recovery_hr */ - case 22: /* battery_low */ - case 23: /* time_duration_alert */ - case 24: /* distance_duration_alert */ - case 25: /* calorie_duration_alert */ - case 26: /* activity */ - case 27: /* fitness_equipment */ - case 28: /* length */ - case 32: /* user_marker */ - case 33: /* sport_point */ - default: ; - } - - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) { - printf("event type %d\n", event_type); - } - last_event = event; - last_event_type = event_type; - } - - void decodeHRV(const FitDefinition &def, - const std::vector& values) { - int rrvalue; - int i=0; - double hrv_time=0.0; - int n=hrvXdata->datapoints.count(); - - if (n>0) - hrv_time = hrvXdata->datapoints[n-1]->secs; - - foreach(const FitField &field, def.fields) { - FitValue value = values[i++]; - if ( value.type == ListValue && field.num == 0){ - for (int j=0; jsecs = hrv_time; - p->number[0] = rrvalue; - hrvXdata->datapoints.append(p); - } - } else if (value.type == SingleValue) - { - rrvalue = int(value.v); - hrv_time += rrvalue/1000.0; - - XDataPoint *p = new XDataPoint(); - p->secs = hrv_time; - p->number[0] = rrvalue; - hrvXdata->datapoints.append(p); - } - } - } - - void decodeLap(const FitDefinition &def, int time_offset, - const std::vector& values) { - time_t iniTime; - if (time_offset > 0) - iniTime = last_time + time_offset; - else - iniTime = last_time; - - time_t time = 0; - int i = 0; - time_t this_start_time = 0; - double total_distance = 0.0; - double total_elapsed_time = 0.0; - - QString lap_name; - - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) { - printf( " FIT decode lap \n"); - } - - foreach(const FitField &field, def.fields) { - const FitValue& value = values[i++]; - - if( value.v == NA_VALUE ) - continue; - - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) { - printf ("\tfield: num: %d ", field.num); - DumpFitValue(value); - } - - // ignore any developer fields in laps - if ( field.deve_idx > -1) - continue; - - switch (field.num) { - case 253: - time = value.v + qbase_time.toTime_t(); - break; - case 2: - this_start_time = value.v + qbase_time.toTime_t(); - break; - case 9: - total_distance = value.v / 100000.0; - break; - case 7: - total_elapsed_time = value.v / 1000.0; - break; - case 24: - //lap_trigger = value.v; - - - // other data (ignored at present): - case 254: // lap nbr - case 3: // start_position_lat - case 4: // start_position_lon - case 5: // end_position_lat - case 6: // end_position_lon - - case 8: // total_timer_time - case 10: // total_cycles - case 11: // total calories - case 12: // total fat calories - case 13: // avg_speed - case 14: // max_speed - case 15: // avg HR (bpm) - case 16: // Max HR - case 17: // AvCad - case 18: // MaxCad - case 21: // total ascent - case 22: // total descent - case 27: // north-east lat (bounding box) - case 28: // north-east lon - case 29: // south west lat - case 30: // south west lon - break; - default: ; // ignore it - } - } - - if (time == 0 && total_elapsed_time > 0) { - time = iniTime + total_elapsed_time - 1; - } - - if (this_start_time == 0 || this_start_time-start_time < 0) { - //errors << QString("lap %1 has invalid start time").arg(interval); - this_start_time = start_time; // time was corrected after lap start - - if (time == 0 || time-start_time < 0) { - errors << QString("lap %1 is ignored (invalid end time)").arg(interval); - return; - } - } - - if (isLapSwim) { - // Fill empty lengths due to false starts or pauses in some devices - // s.t. Garmin 910xt - double secs = time - start_time; - if ((total_distance == 0.0) && (secs > last_length + 1)) { - - XDataPoint *p = new XDataPoint(); - p->secs = secs; - p->km = last_distance; - p->number[0] = 0; - p->number[1] = secs-last_length; - p->number[2] = 0; - swimXdata->datapoints.append(p); - - last_length = secs; - } - ++interval; - } else if (rideFile->dataPoints().count()) { // no samples means no laps - ++interval; - if (lap_name == "") { - lap_name = QObject::tr("Lap %1").arg(interval); - } - rideFile->addInterval(RideFileInterval::DEVICE, - this_start_time - start_time, - time - start_time, - lap_name); - } - } - - void decodeRecord(const FitDefinition &def, int time_offset, - const std::vector& values) { - time_t time = 0; - if (time_offset == 0) // Damien : I have to confirm this... - last_reference_time = last_time; - if (time_offset > -1) - time = last_reference_time + time_offset; // was last_time + time_offset - - double alt = last_altitude, cad = 0, km = 0, hr = 0, lat = 0, lng = 0, badgps = 0, lrbalance = RideFile::NA; - double kph = 0, temperature = RideFile::NA, watts = 0, slope = 0, headwind = 0; - double leftTorqueEff = 0, rightTorqueEff = 0, leftPedalSmooth = 0, rightPedalSmooth = 0; - - double leftPedalCenterOffset = 0; - double rightPedalCenterOffset = 0; - double leftTopDeathCenter = 0; - double rightTopDeathCenter = 0; - double leftBottomDeathCenter = 0; - double rightBottomDeathCenter = 0; - double leftTopPeakPowerPhase = 0; - double rightTopPeakPowerPhase = 0; - double leftBottomPeakPowerPhase = 0; - double rightBottomPeakPowerPhase = 0; - - double rvert = 0, rcad = 0, rcontact = 0; - double smO2 = 0, tHb = 0; - //bool run=false; - - XDataPoint *p_deve = NULL; - XDataPoint *p_extra = NULL; - - fit_value_t lati = NA_VALUE, lngi = NA_VALUE; - int i = 0; - foreach(const FitField &field, def.fields) { - FitValue _values = values[i]; - fit_value_t value = values[i].v; - QList valueList = values[i++].list; - - double deve_value = 0.0; - - if( _values.type == SingleValue && value == NA_VALUE ) - continue; - - int native_num = field.num; - bool native_profile = true; - - if (field.deve_idx>-1) { - QString key = QString("%1.%2").arg(field.deve_idx).arg(field.num); - //qDebug() << "deve_idx" << field.deve_idx << "num" << field.num << "type" << field.type; - //qDebug() << "name" << local_deve_fields[key].name.c_str() << "unit" << local_deve_fields[key].unit.c_str() << local_deve_fields[key].offset << "(" << _values.v << _values.f << ")"; - - if (record_deve_native_fields.contains(key) && !record_native_fields.contains(record_deve_native_fields[key])) { - native_num = record_deve_native_fields[key]; - - int scale = local_deve_fields[key].scale; - if (scale == -1) - scale = 1; - int offset = local_deve_fields[key].offset; - if (offset == -1) - offset = 0; - - switch (_values.type) { - case SingleValue: deve_value=_values.v/(float)scale+offset; break; - case FloatValue: deve_value=_values.f/(float)scale+offset; break; - default: deve_value = 0.0; break; - } - - // For compatibility with old Moxy deve Fields (with the native profile) - if (_values.type == SingleValue && (native_num == 54 || native_num == 57) ) - native_profile = true; - else - native_profile = false;// Now Dynastream decided to use float values for CIQ - - //qDebug() << "deve_value" << deve_value << native_profile; - } - else - native_num = -1; - - //qDebug()<< "native_num"<-1) { - - switch (native_num) { - case 253: // TIMESTAMP - time = value + qbase_time.toTime_t(); - // Time MUST NOT go backwards - // You canny break the laws of physics, Jim - if (time < last_time) - time = last_time; // Not true for Bryton - break; - case 0: // POSITION_LAT - lati = value; - break; - case 1: // POSITION_LONG - lngi = value; - break; - case 2: // ALTITUDE - case 78:// ENHANCED ALTITUDE - if (!native_profile && field.deve_idx>-1) - alt = deve_value; - else - alt = value / 5.0 - 500.0; - break; - case 3: // HEART_RATE - hr = value; - break; - case 4: // CADENCE - if (rideFile->getTag("Sport", "Bike") == "Run") - rcad = value; - else - cad = value; - break; - - case 5: // DISTANCE - km = value / 100000.0; - break; - case 6: // SPEED - case 73:// ENHANCED SPEED - kph = value * 3.6 / 1000.0; - break; - case 7: // POWER - watts = value; - break; - case 8: break; // packed speed/dist - case 9: // GRADE - slope = value / 100.0; - break; - case 10: //resistance = value; - break; - case 11: //time_from_course = value / 1000.0; - break; - case 12: break; // "cycle_length" - case 13: // TEMPERATURE - temperature = value; - break; - case 29: // ACCUMULATED_POWER - break; - case 30: //LEFT_RIGHT_BALANCE - // When bit 7 is 1 value are right power contribution - // not '1' the location of the contribution is undefined - if (value & 0x80) - lrbalance = 100 - (value & 0x7F); - else - lrbalance = RideFile::NA; - break; - case 31: // GPS Accuracy - break; - - case 32: // VERTICAL_SPEED - native_num = -1; - break; - - case 39: // VERTICAL OSCILLATION - if (!native_profile && field.deve_idx>-1) - rvert = deve_value; - else - rvert = value / 100.0f; - break; - - case 40: // GROUND CONTACT TIME PERCENT - native_num = -1; - break; - - case 41: // GROUND CONTACT TIME - if (!native_profile && field.deve_idx>-1) - rcontact = deve_value; - else - rcontact = value / 10.0f; - break; - - case 42: // ACTIVITY_TYPE - native_num = -1; - break; - - case 43: // LEFT_TORQUE_EFFECTIVENESS - leftTorqueEff = value / 2.0; - break; - case 44: // RIGHT_TORQUE_EFFECTIVENESS - rightTorqueEff = value / 2.0; - break; - case 45: // LEFT_PEDAL_SMOOTHNESS - leftPedalSmooth = value / 2.0; - break; - case 46: // RIGHT_PEDAL_SMOOTHNESS - rightPedalSmooth = value / 2.0; - break; - case 47: // COMBINED_PEDAL_SMOOTHNES - //qDebug() << "COMBINED_PEDAL_SMOOTHNES" << value; - // --> XDATA - native_num = -1; - break; - case 53: // RUNNING CADENCE FRACTIONAL VALUE - if (rideFile->getTag("Sport", "Bike") == "Run") - rcad += value/128.0f; - else - cad += value/128.0f; - break; - case 54: // tHb - if (!native_profile && field.deve_idx>-1) { - tHb = deve_value; - } - else - tHb= value/100.0f; - break; - case 57: // SMO2 - if (!native_profile && field.deve_idx>-1) { - smO2 = deve_value; - } - else - smO2= value/10.0f; - break; - case 61: // ? GPS Altitude ? or atmospheric pressure ? - break; - case 66: // ?? - break; - case 67: // ? Left Platform Center Offset ? - leftPedalCenterOffset = value; - break; - case 68: // ? Right Platform Center Offset ? - rightPedalCenterOffset = value; - break; - case 69: // ? Left Power Phase ? - leftTopDeathCenter = round(valueList.at(0) * 360.0/256); - leftBottomDeathCenter = round(valueList.at(1) * 360.0/256); - - if (leftTopDeathCenter>360) { - leftTopDeathCenter = 0; - } - if (leftBottomDeathCenter>360) { - leftBottomDeathCenter = 0; - } - break; - case 70: // ? Left Peak Phase ? - leftTopPeakPowerPhase = round(valueList.at(0) * 360.0/256); - leftBottomPeakPowerPhase = round(valueList.at(1) * 360.0/256); - - if (leftTopPeakPowerPhase>360) { - leftTopPeakPowerPhase = 0; - } - if (leftBottomPeakPowerPhase>360) { - leftBottomPeakPowerPhase = 0; - } - break; - case 71: // ? Right Power Phase ? - rightTopDeathCenter = round(valueList.at(0) * 360.0/256); - rightBottomDeathCenter = round(valueList.at(1) * 360.0/256); - - if (rightTopDeathCenter>360) { - rightTopDeathCenter = 0; - } - if (rightBottomDeathCenter>360) { - rightBottomDeathCenter = 0; - } - break; - case 72: // ? Right Peak Phase ? - rightTopPeakPowerPhase = round(valueList.at(0) * 360.0/256); - rightBottomPeakPowerPhase = round(valueList.at(1) * 360.0/256); - - if (rightTopPeakPowerPhase>360) { - rightTopPeakPowerPhase = 0; - } - if (rightBottomPeakPowerPhase>360) { - rightBottomPeakPowerPhase = 0; - } - break; - case 81: // BATTERY_SOC - native_num = -1; - break; - case 83: // VERTICAL_RATIO - native_num = -1; - break; - case 84: // Left right balance - lrbalance = value/100.0; - break; - case 85: // STEP_LENGTH - native_num = -1; - break; - case 87: // ??? - break; - case 90: // PERFORMANCE_CONDITION - native_num = -1; - break; - case 108: // to confirm : RESPIRATIONRATE - native_num = -1; - break; - case 114: // MTB Dynamics - Grit - native_num = -1; - break; - case 115: // MTB Dynamics - Flow - native_num = -1; - break; - case 116: // Stress - native_num = -1; - break; - case 133: // Pulse Ox - native_num = -1; - break; - default: - unknown_record_fields.insert(native_num); - native_num = -1; - } - } - - if (native_num == -1) { - // native, deve_native or deve to record. - - int idx = -1; - - if (field.deve_idx>-1) { - QString key = QString("%1.%2").arg(field.deve_idx).arg(field.num); - FitDeveField deveField = local_deve_fields[key]; - - if (!record_deve_fields.contains(key)) { - addRecordDeveField(key, deveField, true); - } else { - if (record_deve_fields[key] == -1) { - addRecordDeveField(key, deveField, true); - } - } - idx = record_deve_fields[key]; - - if (idx>-1) { - if (p_deve == NULL && - (_values.type == SingleValue || - _values.type == FloatValue || - _values.type == StringValue)) - p_deve = new XDataPoint(); - - int scale = deveField.scale; - if (scale == -1) - scale = 1; - int offset = deveField.offset; - if (offset == -1) - offset = 0; - - switch (_values.type) { - case SingleValue: p_deve->number[idx]=_values.v/(float)scale+offset; break; - case FloatValue: p_deve->number[idx]=_values.f/(float)scale+offset; break; - case StringValue: p_deve->string[idx]=_values.s.c_str(); break; - default: break; - } - } - } else { - // Store standard native ignored - if (!record_extra_fields.contains(field.num)) { - RideFile::SeriesType series = getSeriesForNative(field.num); - QString nativeName = rideFile->symbolForSeries(series); - - if (nativeName.length() == 0) - nativeName = getNameForExtraNative(field.num); - - extraXdata->valuename << nativeName; - extraXdata->unitname << ""; - - //dataInfos.append(QString("EXTRA %1").arg(nativeName)); - - record_extra_fields.insert(field.num, record_extra_fields.count()); - } - idx = record_extra_fields[field.num]; - - if (idx>-1) { - float scale = getScaleForExtraNative(field.num); - int offset = getOffsetForExtraNative(field.num); - - if (p_extra == NULL && - (_values.type == SingleValue || - _values.type == FloatValue || - _values.type == StringValue)) - p_extra = new XDataPoint(); - - switch (_values.type) { - case SingleValue: p_extra->number[idx]=_values.v/scale+offset; break; - case FloatValue: p_extra->number[idx]=_values.f/scale+offset; break; - case StringValue: p_extra->string[idx]=_values.s.c_str(); break; - default: break; - } - } - - } - - - } else { - if (field.deve_idx>-1) { - QString key = QString("%1.%2").arg(field.deve_idx).arg(field.num); - FitDeveField deveField = local_deve_fields[key]; - - if (!record_deve_fields.contains(key)) { - addRecordDeveField(key, deveField, false); - } - } - } - } - - //if (time == last_time) - // return; // Not true for Bryton - - if (stopped) { - // As it turns out, this happens all the time in some FIT files. - // Since we don't really understand the meaning, don't make noise. - /* - errors << QString("At %1 seconds, time is stopped, but got record " - "anyway. Ignoring it. Last event type was " - "%2 for event %3.").arg(time-start_time).arg(last_event_type).arg(last_event); - return; - */ - } - if (lati != NA_VALUE && lngi != NA_VALUE) { - lat = lati * 180.0 / 0x7fffffff; - lng = lngi * 180.0 / 0x7fffffff; - } else - { - // If lat/lng are missng, set to 0/0 and fill point from last point as 0/0) - lat = 0; - lng = 0; - badgps = 1; - } - if (start_time == 0) { - start_time = time - 1; // recording interval? - last_reference_time = start_time; - QDateTime t; - t.setTime_t(start_time); - rideFile->setStartTime(t); - } - - //printf( "point time=%d lat=%.2lf lon=%.2lf alt=%.1lf hr=%.0lf " - // "cad=%.0lf km=%.1lf kph=%.1lf watts=%.0lf grade=%.1lf " - // "resist=%.1lf off=%.1lf temp=%.1lf\n", - // time, lat, lng, alt, hr, - // cad, km, kph, watts, grade, - // resistance, time_from_course, temperature ); - double secs = time - start_time; - double nm = 0; - - int interval = 0; - // if there are data points && a time difference > 1sec && smartRecording processing is requested at all - if ((!rideFile->dataPoints().empty()) && (last_time != 0) && - (time > last_time + 1) && (isGarminSmartRecording.toInt() != 0)) { - // Handle smart recording if configured in preferences. Linearly interpolate missing points. - RideFilePoint *prevPoint = rideFile->dataPoints().back(); - double deltaSecs = (secs - prevPoint->secs); - //assert(deltaSecs == secs - prevPoint->secs); // no fractional part -- don't CRASH FFS, be graceful - // This is only true if the previous record was of type record: - //assert(deltaSecs == time - last_time); -- don't CRASH FFS, be graceful - // If the last lat/lng was missing (0/0) then all points up to lat/lng are marked as 0/0. - if (prevPoint->lat == 0 && prevPoint->lon == 0 ) { - badgps = 1; - } - double deltaCad = cad - prevPoint->cad; - double deltaHr = hr - prevPoint->hr; - double deltaDist = km - prevPoint->km; - if (km < 0.00001) deltaDist = 0.000f; // effectively zero distance - double deltaSpeed = kph - prevPoint->kph; - double deltaTorque = nm - prevPoint->nm; - double deltaPower = watts - prevPoint->watts; - double deltaAlt = alt - prevPoint->alt; - double deltaLon = lng - prevPoint->lon; - double deltaLat = lat - prevPoint->lat; - // double deltaHeadwind = headwind - prevPoint->headwind; - double deltaSlope = slope - prevPoint->slope; - double deltaLeftRightBalance = lrbalance - prevPoint->lrbalance; - double deltaLeftTE = leftTorqueEff - prevPoint->lte; - double deltaRightTE = rightTorqueEff - prevPoint->rte; - double deltaLeftPS = leftPedalSmooth - prevPoint->lps; - double deltaRightPS = rightPedalSmooth - prevPoint->rps; - double deltaLeftPedalCenterOffset = leftPedalCenterOffset - prevPoint->lpco; - double deltaRightPedalCenterOffset = rightPedalCenterOffset - prevPoint->rpco; - double deltaLeftTopDeathCenter = leftTopDeathCenter - prevPoint->lppb; - double deltaRightTopDeathCenter = rightTopDeathCenter - prevPoint->rppb; - double deltaLeftBottomDeathCenter = leftBottomDeathCenter - prevPoint->lppe; - double deltaRightBottomDeathCenter = rightBottomDeathCenter - prevPoint->rppe; - double deltaLeftTopPeakPowerPhase = leftTopPeakPowerPhase - prevPoint->lpppb; - double deltaRightTopPeakPowerPhase = rightTopPeakPowerPhase - prevPoint->rpppb; - double deltaLeftBottomPeakPowerPhase = leftBottomPeakPowerPhase - prevPoint->lpppe; - double deltaRightBottomPeakPowerPhase = rightBottomPeakPowerPhase - prevPoint->rpppe; - double deltaSmO2 = smO2 - prevPoint->smo2; - double deltaTHb = tHb - prevPoint->thb; - double deltarvert = rvert - prevPoint->rvert; - double deltarcad = rcad - prevPoint->rcad; - double deltarcontact = rcontact - prevPoint->rcontact; - - // only smooth the maximal smart recording gap defined in preferences - we don't want to crash / stall on bad - // or corrupt files - if (deltaSecs > 0 && deltaSecs < GarminHWM.toInt()) { - - for (int i = 1; i < deltaSecs; i++) { - double weight = i /deltaSecs; - rideFile->appendPoint( - prevPoint->secs + (deltaSecs * weight), - prevPoint->cad + (deltaCad * weight), - prevPoint->hr + (deltaHr * weight), - prevPoint->km + (deltaDist * weight), - prevPoint->kph + (deltaSpeed * weight), - prevPoint->nm + (deltaTorque * weight), - prevPoint->watts + (deltaPower * weight), - prevPoint->alt + (deltaAlt * weight), - (badgps == 1) ? 0 : prevPoint->lon + (deltaLon * weight), - (badgps == 1) ? 0 : prevPoint->lat + (deltaLat * weight), - 0.0, // headwind - prevPoint->slope + (deltaSlope * weight), - temperature, - (lrbalance!=RideFile::NA && prevPoint->lrbalance!=RideFile::NA) ? prevPoint->lrbalance + (deltaLeftRightBalance * weight) : RideFile::NA, // interpolate between valid values only - prevPoint->lte + (deltaLeftTE * weight), - prevPoint->rte + (deltaRightTE * weight), - prevPoint->lps + (deltaLeftPS * weight), - prevPoint->rps + (deltaRightPS * weight), - prevPoint->lpco + (deltaLeftPedalCenterOffset * weight), - prevPoint->rpco + (deltaRightPedalCenterOffset * weight), - prevPoint->lppb + (deltaLeftTopDeathCenter * weight), - prevPoint->rppb + (deltaRightTopDeathCenter * weight), - prevPoint->lppe + (deltaLeftBottomDeathCenter * weight), - prevPoint->rppe + (deltaRightBottomDeathCenter * weight), - prevPoint->lpppb + (deltaLeftTopPeakPowerPhase * weight), - prevPoint->rpppb + (deltaRightTopPeakPowerPhase * weight), - prevPoint->lpppe + (deltaLeftBottomPeakPowerPhase * weight), - prevPoint->rpppe + (deltaRightBottomPeakPowerPhase * weight), - prevPoint->smo2 + (deltaSmO2 * weight), - prevPoint->thb + (deltaTHb * weight), - prevPoint->rvert + (deltarvert * weight), - prevPoint->rcad + (deltarcad * weight), - prevPoint->rcontact + (deltarcontact * weight), - 0.0, // tcore - interval); - } - } - } - - if (km < 0.00001f) km = last_distance; - rideFile->appendOrUpdatePoint(secs, cad, hr, km, kph, nm, watts, alt, lng, lat, headwind, slope, temperature, - lrbalance, leftTorqueEff, rightTorqueEff, leftPedalSmooth, rightPedalSmooth, - leftPedalCenterOffset, rightPedalCenterOffset, - leftTopDeathCenter, rightTopDeathCenter, leftBottomDeathCenter, rightBottomDeathCenter, - leftTopPeakPowerPhase, rightTopPeakPowerPhase, leftBottomPeakPowerPhase, rightBottomPeakPowerPhase, - smO2, tHb, rvert, rcad, rcontact, 0.0, interval, false); - - last_time = time; - last_distance = km; - last_altitude = alt; - - if (p_deve != NULL) { - p_deve->secs = secs; - deveXdata->datapoints.append(p_deve); - } - if (p_extra != NULL) { - p_extra->secs = secs; - extraXdata->datapoints.append(p_extra); - } - } - - void decodeLength(const FitDefinition &def, int time_offset, - const std::vector& values) { - if (!isLapSwim) { - isLapSwim = true; - last_length = 0.0; - } - time_t time = 0; - if (time_offset > 0) - time = last_time + time_offset; - - int length_type = 0; - int swim_stroke = 0; - int total_strokes = 0; - double length_duration = 0.0; - - int i = 0; - foreach(const FitField &field, def.fields) { - fit_value_t value = values[i++].v; - - if( value == NA_VALUE ) - continue; - - switch (field.num) { - case 0: // event - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) qDebug() << " event:" << value; - break; - case 1: // event type - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) qDebug() << " event_type:" << value; - break; - case 2: // start time - time = value + qbase_time.toTime_t(); - // Time MUST NOT go backwards - // You canny break the laws of physics, Jim - - if (time < last_length) - time = last_length; - break; - case 3: // total elapsed time - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) qDebug() << " total_elapsed_time:" << value; - break; - case 4: // total timer time - length_duration = value / 1000.0; - break; - case 5: // total strokes - total_strokes = value; - break; - case 6: // avg speed - // kph = value * 3.6 / 1000.0; - break; - case 7: // swim stroke: 0-free, 1-back, 2-breast, 3-fly, - // 4-drill, 5-mixed, 6-IM - swim_stroke = value; - break; - case 9: // cadence - // cad = value; - break; - case 11: // total_calories - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) qDebug() << " total_calories:" << value; - break; - case 12: // length type: 0-rest, 1-strokes - length_type = value; - break; - case 254: // message_index - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) qDebug() << " message_index:" << value; - break; - default: - unknown_record_fields.insert(field.num); - } - } - - if (length_duration > 0) { - XDataPoint *p = new XDataPoint(); - p->secs = last_length; - p->km = last_distance; - p->number[0] = length_type + swim_stroke; - p->number[1] = length_duration; - p->number[2] = total_strokes; - - swimXdata->datapoints.append(p); - } - - if (last_length == 0) { - start_time = time - 1; // recording interval? - last_reference_time = start_time; - QDateTime t; - t.setTime_t(start_time); - rideFile->setStartTime(t); - interval = 1; - } - - last_length += length_duration; - - } - - /* weather broadcast as observed at weather station (undocumented) */ - void decodeWeather(const FitDefinition &def, int time_offset, - const std::vector& values) { - Q_UNUSED(time_offset); - - time_t time = 0; - if (time_offset > 0) - time = last_time + time_offset; - double windHeading = 0.0, windSpeed = 0.0, temp = 0.0, humidity = 0.0; - - int i = 0; - foreach(const FitField &field, def.fields) { - fit_value_t value = values[i++].v; - - if( value == NA_VALUE ) - continue; - - switch (field.num) { - case 253: // Timestamp - time = value + qbase_time.toTime_t(); - break; - case 8: // Weather station name - // ignored - break; - case 9: // Weather observation timestamp - // ignored - break; - case 10: // Weather station latitude - // ignored - break; - case 11: // Weather station longitude - // ignored - break; - case 3: // Wind heading (0deg=North) - windHeading = value ; // 180.0 * MATHCONST_PI; - break; - case 4: // Wind speed (mm/s) - windSpeed = value * 0.0036; // km/h - break; - case 1: // Temperature - temp = value; - break; - case 7: // Humidity - humidity = value; - break; - default: ; // ignore it - } - } - - double secs = time - start_time; - XDataPoint *p = new XDataPoint(); - p->secs = secs; - p->km = last_distance; - p->number[0] = windSpeed; - p->number[1] = windHeading; - p->number[2] = temp; - p->number[3] = humidity; - - weatherXdata->datapoints.append(p); - } - - void decodeHr(const FitDefinition &def, int time_offset, - const std::vector& values) { - time_t time = 0; - if (time_offset > 0) { - time = last_time + time_offset; - } - - QList timestamps; - QList hr; - QList rr; - - int a = 0; - int j = 0; - foreach(const FitField &field, def.fields) { - FitValue value = values[a++]; - - if( value.type == SingleValue && value.v == NA_VALUE ) - continue; - - switch (field.num) { - case 253: // Timestamp - time = value.v + qbase_time.toTime_t(); - break; - case 0: // fractional_timestamp - break; - case 1: // time256 - break; - case 6: // filtered_bpm - if (value.type == SingleValue) { - hr.append(value.v); - } - else { - for (int i=0;i 0) start_timestamp = time-last_event_timestamp/1024.0; - timestamps.append(last_event_timestamp/1024.0); - last_RR=last_event_timestamp; - break; - case 10: // event_timestamp_12 - j=0; - for (int i=0;i> 4); - last_event_timestamp = (last_event_timestamp & 0xFFFFF000) + next_event_timestamp12; - i++; - } - if (next_event_timestamp12 < last_event_timestamp12) - last_event_timestamp += 0x1000; - - timestamps.append(last_event_timestamp/1024.0); - j++; - - rr.append((last_event_timestamp/1024.0-last_RR/1024.0)*1000); // R-R in ms - last_RR=last_event_timestamp; - } - - break; - - default: ; // ignore it - } - } - - // Garmin HR-Swim belt with internal memory - if (timestamps.count()>0 && timestamps.count()==rr.count() && timestamps.count()==hr.count()) { - // start from i=1 as we cannot determine R-R for the very first heart beat - for (int i=1;i=0 && rr.at(i)!=0) { - XDataPoint *p = new XDataPoint(); - p->secs = secs; - p->number[0] = rr.at(i); - hrvXdata->datapoints.append(p); - } - } - } - - for (int i=0;i0) { - int idx = rideFile->timeIndex(round(secs)); - - if (idx < 0 || rideFile->dataPoints().at(idx)->secs==secs) - rideFile->appendOrUpdatePoint( - secs, 0.0, hr.at(i), - 0.0, - 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, - 0.0, 0.0, RideFile::NA, RideFile::NA, - 0.0, 0.0, - 0.0, 0.0, - 0.0, 0.0, - 0.0, 0.0, - 0.0, 0.0, - 0.0, 0.0, - 0.0, 0.0, - 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0, false); - } - } - } - - void decodeDeviceSettings(const FitDefinition &def, int time_offset, - const std::vector& values) { - Q_UNUSED(time_offset); - int i = 0; - foreach(const FitField &field, def.fields) { - fit_value_t value = values[i++].v; - - if( value == NA_VALUE ) - continue; - - switch (field.num) { - case 0: // Active timezone - // ignored - break; - case 1: // UTC offset - // ignored - break; - case 5: // timezone offset - // ignored - break; - default: ; // ignore it - } - } - } - - void decodeSegment(const FitDefinition &def, int time_offset, - const std::vector& values) { - time_t time = 0; - if (time_offset > 0) - time = last_time + time_offset; - else - time = last_time; - - int i = 0; - time_t this_start_time = 0; - ++interval; - - QString segment_name; - bool fail = false; - - foreach(const FitField &field, def.fields) { - const FitValue& value = values[i++]; - - if( value.type != StringValue && value.v == NA_VALUE ) - continue; - - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) { - printf ("\tfield: num: %d ", field.num); - DumpFitValue(value); - } - - switch (field.num) { - case 253: // Message timestamp - time = value.v + qbase_time.toTime_t(); - break; - case 2: // start timestamp ? - this_start_time = value.v + qbase_time.toTime_t(); - break; - case 3: // start latitude - // ignored - break; - case 4: // start longitude - // ignored - break; - case 5: // end latitude - // ignored - break; - case 6: // end longitude - // ignored - break; - case 7: // personal best (ms) ? segment elapsed time from this activity (ms) ? - // => depends on file / device / version ? - // FIXME: to be investigated/confirmed. - // total_elapsed_time = round(value.v / 1000.0); - break; - case 8: // challenger best (ms) ? segment total timer time from this activity (ms) ? - // => depends on file / device / version ? - // FIXME: to be investigated/confirmed. - // ignored - break; - case 9: // leader best (ms) ? segment distance ? FIXME : to be investigated. - // => depends on file / device / version ? - //not used XXX total_distance = value.v / 100000.0; - break; - case 10: // personal rank ? to be confirmed - // ignored - break; - case 25: // north-east latitude (bounding box) - // ignored - break; - case 26: // north-east longitude - // ignored - break; - case 27: // south-west latitude - // ignored - break; - case 28: // south-west longitude - // ignored - break; - case 29: // Segment name - segment_name = QString(value.s.c_str()); - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) { - printf("Found segment name: %s\n", segment_name.toStdString().c_str()); - } - break; - case 64: // status - fail = (value.v == 1); - break; - - case 33: /* undocumented, ignored */ break; - case 71: /* undocumented, ignored */ break; - case 75: /* undocumented, ignored */ break; - case 76: /* undocumented, ignored */ break; - case 77: /* undocumented, ignored */ break; - case 78: /* undocumented, ignored */ break; - case 79: /* undocumented, ignored */ break; - case 80: /* undocumented, ignored */ break; - case 254: /* message counter idx, ignored */ break; - case 11: /* undocumented, ignored */ break; - case 12: /* undocumented, ignored */ break; - case 13: /* undocumented, ignored */ break; - case 14: /* undocumented, ignored */ break; - case 19: /* undocumented, ignored */ break; - case 20: /* undocumented, ignored */ break; - case 21: /* total ascent ? ignored */ break; - case 22: /* total descent ? ignored */ break; - case 30: /* undocumented, ignored */ break; - case 31: /* undocumented, ignored */ break; - case 69: /* undocumented, ignored */ break; - case 70: /* undocumented, ignored */ break; - case 72: /* undocumented, ignored */ break; - case 0: /* undocumented, ignored */ break; - case 1: /* undocumented, ignored */ break; - case 15: /* undocumented (HR?), ignored */ break; - case 16: /* undocumented (HR?), ignored */ break; - case 17: /* undocumented (cadence?), ignored */ break; - case 18: /* undocumented (cadence?), ignored */ break; - case 23: /* undocumented, ignored */ break; - case 24: /* undocumented, ignored */ break; - case 32: /* undocumented, ignored */ break; - case 58: /* undocumented, ignored */ break; - case 59: /* undocumented, ignored */ break; - case 60: /* undocumented, ignored */ break; - case 61: /* undocumented, ignored */ break; - case 62: /* undocumented, ignored */ break; - case 63: /* undocumented, ignored */ break; - case 65: // Segment UID - // ignored - break; - case 66: /* undocumented, ignored */ break; - case 67: /* undocumented, ignored */ break; - case 68: /* undocumented, ignored */ break; - case 73: /* undocumented, ignored */ break; - case 74: /* undocumented, ignored */ break; - case 81: /* undocumented, ignored */ break; - case 82: /* undocumented, ignored */ break; - default: ; // ignore it - } - } - - if (fail) { // Segment started but not ended - // no interval - return; - } - - if (this_start_time == 0 || this_start_time-start_time < 0) { - //errors << QString("lap %1 has invalid start time").arg(interval); - this_start_time = start_time; // time was corrected after lap start - - if (time == 0 || time-start_time < 0) { - errors << QString("lap %1 is ignored (invalid end time)").arg(interval); - return; - } - } - if (rideFile->dataPoints().count()) { // no samples means no laps.. - if (segment_name == "") segment_name = QObject::tr("Lap %1").arg(interval); - rideFile->addInterval(RideFileInterval::DEVICE, this_start_time - start_time, time - start_time, segment_name); - } - - } - - void decodeUserProfile(const FitDefinition &def, int time_offset, - const std::vector& values) { - Q_UNUSED(time_offset); - int i = 0; - foreach(const FitField &field, def.fields) { - fit_value_t value = values[i++].v; - - if( value == NA_VALUE ) - continue; - - switch (field.num) { - case 4: // Weight - active_session_["Weight"] = QString::number(value / 10.0 ); - rideFile->setTag("Weight", QString::number(value / 10.0 )); - break; - default: ; // ignore it - } - } - } - - - void decodeDeveloperID(const FitDefinition &def, int time_offset, - const std::vector& values) { - Q_UNUSED(time_offset); - - FitDeveApp deve; - - // 0 developer_id byte - // 1 application_id byte - // 2 manufacturer_id manufacturer - // 3 developer_data_index uint8 - // 4 application_version uint32 - - int i = 0; - foreach(const FitField &field, def.fields) { - FitValue value = values[i++]; - - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) - qDebug() << "deveID : num" << field.num << value.v << value.s.c_str(); - - fit_string_value dev_id = ""; - - switch (field.num) { - case 0: // developer_id - dev_id = ""; - - foreach(fit_value_t val, value.list) { - - if (val != NA_VALUE) { - std::stringstream sstream; - sstream << std::hex << val; - if (val<16) - dev_id += "0"; - dev_id += sstream.str(); - } - } - if (dev_id.length()>=20) { - dev_id.insert(8, "-"); - dev_id.insert(13, "-"); - dev_id.insert(18, "-"); - dev_id.insert(23, "-"); - } - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) - qDebug() << "developer_id" << dev_id.c_str(); - deve.dev_id = dev_id; - break; - case 1: // application_id - dev_id = ""; - - foreach(fit_value_t val, value.list) { - - if (val != NA_VALUE) { - std::stringstream sstream; - sstream << std::hex << val; - if (val<16) - dev_id += "0"; - dev_id += sstream.str(); - } - } - if (dev_id.length()>=20) { - dev_id.insert(8, "-"); - dev_id.insert(13, "-"); - dev_id.insert(18, "-"); - dev_id.insert(23, "-"); - } - - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) - qDebug() << "application_id" << dev_id.c_str(); - deve.app_id = dev_id; - break; - case 2: // manufacturer_id - deve.man_id = value.v; - break; - case 3: // developer_data_index - deve.dev_data_id = value.v; - break; - case 4: deve.app_version = value.v; - break; - default: - // ignore it - break; - } - } - - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) - qDebug() << "DEVE ID" << deve.dev_id.c_str() << "app_id" << deve.app_id.c_str() << "man_id" << deve.man_id << "dev_data_id" << deve.dev_data_id << "app_version" << deve.app_version; - - if (!local_deve_fields_app.contains(deve.dev_data_id)) { - local_deve_fields_app.insert(deve.dev_data_id, deve); - } - } - - void decodeDeveloperFieldDescription(const FitDefinition &def, int time_offset, - const std::vector& values) { - Q_UNUSED(time_offset); - int i = 0; - - FitDeveField fieldDef; - fieldDef.scale = -1; - fieldDef.offset = -1; - fieldDef.native = -1; - - foreach(const FitField &field, def.fields) { - FitValue value = values[i++]; - - //qDebug() << "deve : num" << field.num << value.v << value.s.c_str(); - - switch (field.num) { - case 0: // developer_data_index - fieldDef.dev_id = value.v; - break; - case 1: // field_definition_number - fieldDef.num = value.v; - break; - case 2: // fit_base_type_id - fieldDef.type = value.v; - break; - case 3: // field_name - fieldDef.name = value.s; - break; - case 4: // array - break; - case 5: // components - break; - case 6: // scale - fieldDef.scale = value.v; - break; - case 7: // offset - fieldDef.offset = value.v; - break; - case 8: // units - fieldDef.unit = value.s; - break; - case 9: // bits - case 10: // accumulate - case 13: // fit_base_unit_id - case 14: // native_mesg_num - break; - case 15: // native field number - fieldDef.native = value.v; - break; - default: - // ignore it - break; - } - } - - //qDebug() << "num" << fieldDef.num << "deve_idx" << fieldDef.dev_id << "type" << fieldDef.type << "native" << fieldDef.native << "name" << fieldDef.name.c_str() << "unit" << fieldDef.unit.c_str() << "scale" << fieldDef.scale << "offset" << fieldDef.offset; - - QString key = QString("%1.%2").arg(fieldDef.dev_id).arg(fieldDef.num); - - if (!local_deve_fields.contains(key)) { - local_deve_fields.insert((key), fieldDef); - } - - if (fieldDef.native > -1 && !record_deve_native_fields.values().contains(fieldDef.native)) { - record_deve_native_fields.insert(key, fieldDef.native); - - /*RideFile::SeriesType series = getSeriesForNative(fieldDef.native); - - if (series != RideFile::none) { - QString nativeName = rideFile->symbolForSeries(series); - dataInfos.append(QString("NATIVE %1 : Field %2").arg(nativeName).arg(fieldDef.name.c_str())); - }*/ - } - } - - void read_header(bool &stop, QStringList &errors, int &data_size) { - stop = false; - try { - // read the header - int header_size = read_uint8(); - if (header_size != 12 && header_size != 14) { - errors << QString("bad header size: %1").arg(header_size); - stop = true; - } - int protocol_version = read_uint8(); - (void) protocol_version; - - // if the header size is 14 we have profile minor then profile major - // version. We still don't do anything with this information - int profile_version = read_uint16(false); // always littleEndian - (void) profile_version; - //qDebug() << "profile_version" << profile_version/100.0; // not sure what to do with this - - data_size = read_uint32(false); // always littleEndian - char fit_str[5]; - if (file.read(fit_str, 4) != 4) { - errors << "truncated header"; - stop = true; - } - fit_str[4] = '\0'; - if (strcmp(fit_str, ".FIT") != 0) { - errors << QString("bad header, expected \".FIT\" but got \"%1\"").arg(fit_str); - stop = true; - } - - // read the rest of the header - if (header_size == 14) read_uint16(false); - } catch (TruncatedRead &e) { - Q_UNUSED(e) - errors << "truncated file header"; - stop = true; - } - } - - int read_record(bool &stop, QStringList &errors) { - stop = false; - int count = 0; - int header_byte = read_uint8(&count); - if (!(header_byte & 0x80) && (header_byte & 0x40)) { - // Definition record - int local_msg_type = header_byte & 0xf; - bool with_deve_data = (header_byte & 0x20) == 0x20 ; - - local_msg_types.insert(local_msg_type, FitDefinition()); - FitDefinition &def = local_msg_types[local_msg_type]; - - int reserved = read_uint8(&count); (void) reserved; // unused - def.is_big_endian = read_uint8(&count); - def.global_msg_num = read_uint16(def.is_big_endian, &count); - int num_fields = read_uint8(&count); - - if (FIT_DEBUG && FIT_DEBUG_LEVEL>0) { - //qDebug() << "definition: local type=" << local_msg_type << "global=" << def.global_msg_num << "arch=" << def.is_big_endian << "fields=" << num_fields; - - printf("definition: local type=%d global=%d arch=%d fields=%d\n", - local_msg_type, def.global_msg_num, def.is_big_endian, - num_fields ); - } - - for (int i = 0; i < num_fields; ++i) { - def.fields.push_back(FitField()); - FitField &field = def.fields.back(); - - field.num = read_uint8(&count); - field.size = read_uint8(&count); - int base_type = read_uint8(&count); - field.type = base_type & 0x1f; - field.deve_idx = -1; - - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) { - printf(" field %d: %d bytes, num %d, type %d, size %d\n", - i, field.size, field.num, field.type, field.size ); - } - } - - if (with_deve_data) { - - int num_fields = read_uint8(&count); - - for (int i = 0; i < num_fields; ++i) { - def.fields.push_back(FitField()); - FitField &field = def.fields.back(); - - field.num = read_uint8(&count); - field.size = read_uint8(&count); - field.deve_idx = read_uint8(&count); - - QString key = QString("%1.%2").arg(field.deve_idx).arg(field.num); - FitDeveField devField = local_deve_fields[key]; - field.type = devField.type & 0x1f; - - //qDebug() << "field" << field.num << "type" << field.type << "size" << field.size << "deve idx" << field.deve_idx; - - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) { - printf(" field %d: %d bytes, num %d, type %d, size %d\n", - i, field.size, field.num, field.type, field.size ); - } - } - } - } - else { - // Data record - int local_msg_type = 0; - int time_offset = -1; - if (header_byte & 0x80) { - // compressed time record - local_msg_type = (header_byte >> 5) & 0x3; - time_offset = header_byte & 0x1f; - } - else { - local_msg_type = header_byte & 0xf; - } - - if (!local_msg_types.contains(local_msg_type)) { - printf( "local type %d without previous definition\n", local_msg_type ); - errors << QString("local type %1 without previous definition").arg(local_msg_type); - stop = true; - return count; - } - const FitDefinition &def = local_msg_types[local_msg_type]; - - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) { - printf( "read_record message local=%d global=%d offset=%d\n", local_msg_type, - def.global_msg_num, time_offset ); - } - - std::vector values; - foreach(const FitField &field, def.fields) { - FitValue value; - int size; - - switch (field.type) { - case 0: size = 1; - if (field.size==size) { - value.type = SingleValue; value.v = read_uint8(&count);; - } else { // Multi-values - value.type = ListValue; - value.list.clear(); - for (int i=0;i1) { - // TODO: Dump raw data. - printf("unknown type: %d size: %d \n", field.type, - field.size); - - } - if (field.size > 0) read_unknown( field.size, &count ); - value.type = SingleValue; - value.v = NA_VALUE; - unknown_base_type.insert(field.type); - size = field.size; - } - // Size is greater than expected - if (size < field.size) { - if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) { - printf( " warning : size=%d for type=%d (num=%d)\n", - field.size, field.type, field.num); - } - read_unknown( field.size-size, &count ); - } - - values.push_back(value); - - if (FIT_DEBUG && ((FIT_DEBUG_LEVEL>2 && def.global_msg_num!=RECORD_MSG_NUM) || FIT_DEBUG_LEVEL>3 )) { - QString nativeName = ""; - if (def.global_msg_num == RECORD_MSG_NUM) { - RideFile::SeriesType series = getSeriesForNative(field.num); - nativeName = rideFile->symbolForSeries(series); - } - if (field.deve_idx>-1) { - QString key = QString("%1.%2").arg(field.deve_idx).arg(field.num); - FitDeveField deveField = local_deve_fields[key]; - nativeName = deveField.name.c_str(); - } - printf( " field: type=%d num=%d %s size=%d(%d) ", - field.type, field.num, nativeName.toStdString().c_str(), field.size, size); - if (value.type == SingleValue) { - if (value.v == NA_VALUE) - printf( "value=NA\n"); - else - printf( "value=%lld\n", value.v ); - } - else if (value.type == StringValue) - printf( "value=%s\n", value.s.c_str() ); - else if (value.type == FloatValue) - printf( "value=%f\n", value.f ); - else if (value.type == ListValue) { - printf( "values="); - for (int i=0;ivalue(NULL, GC_GARMIN_SMARTRECORD,Qt::Checked); - GarminHWM = appsettings->value(NULL, GC_GARMIN_HWMARK); - if (GarminHWM.isNull() || GarminHWM.toInt() == 0) GarminHWM.setValue(25); // default to 25 seconds. - - // start - rideFile = new RideFile; - rideFile->setDeviceType("Garmin FIT"); - rideFile->setFileFormat("Flexible and Interoperable Data Transfer (FIT)"); - rideFile->setRecIntSecs(1.0); // this is a terrible assumption! - if (!file.open(QIODevice::ReadOnly)) { - delete rideFile; - return NULL; - } - - int data_size = 0; - weatherXdata = new XDataSeries(); - weatherXdata->name = "WEATHER"; - weatherXdata->valuename << "WINDSPEED"; - weatherXdata->unitname << "kph"; - weatherXdata->valuename << "WINDHEADING"; - weatherXdata->unitname << ""; - weatherXdata->valuename << "TEMPERATURE"; - weatherXdata->unitname << "C"; - weatherXdata->valuename << "HUMIDITY"; - weatherXdata->unitname << "relative humidity"; - - swimXdata = new XDataSeries(); - swimXdata->name = "SWIM"; - swimXdata->valuename << "TYPE"; - swimXdata->unitname << "stroketype"; - swimXdata->valuename << "DURATION"; - swimXdata->unitname << "secs"; - swimXdata->valuename << "STROKES"; - swimXdata->unitname << ""; - - hrvXdata = new XDataSeries(); - hrvXdata->name = "HRV"; - hrvXdata->valuename << "R-R"; - hrvXdata->unitname << "msecs"; - - gearsXdata = new XDataSeries(); - gearsXdata->name = "GEARS"; - gearsXdata->valuename << "FRONT"; - gearsXdata->unitname << "t"; - gearsXdata->valuename << "REAR"; - gearsXdata->unitname << "t"; - gearsXdata->valuename << "FRONT-NUM"; - gearsXdata->unitname << ""; - gearsXdata->valuename << "REAR-NUM"; - gearsXdata->unitname << ""; - - deveXdata = new XDataSeries(); - deveXdata->name = "DEVELOPER"; - - extraXdata = new XDataSeries(); - extraXdata->name = "EXTRA"; - - bool stop = false; - bool truncated = false; - - // read the header - read_header(stop, errors, data_size); - - if (!stop) { - - int bytes_read = 0; - - try { - while (!stop && (bytes_read < data_size)) { - bytes_read += read_record(stop, errors); - } - } - catch (TruncatedRead &e) { - Q_UNUSED(e) - errors << "truncated file body"; - //file.close(); - //delete rideFile; - //return NULL; - truncated = true; - } - } - if (stop) { - file.close(); - delete rideFile; - return NULL; - } - else { - if (!truncated) { - try { - int crc = read_uint16( false ); // always littleEndian - (void) crc; - } - catch (TruncatedRead &e) { - Q_UNUSED(e) - errors << "truncated file body"; - return NULL; - } - - // second file ? - try { - while (file.canReadLine()) { - read_header(stop, errors, data_size); - if (!stop) { - - int bytes_read = 0; - - try { - while (!stop && (bytes_read < data_size)) { - bytes_read += read_record(stop, errors); - } - } - catch (TruncatedRead &e) { - Q_UNUSED(e) - errors << "truncated second file body"; - } - } - if (!truncated) { - try { - int crc = read_uint16( false ); // always littleEndian - (void) crc; - } - catch (TruncatedRead &e) { - Q_UNUSED(e) - errors << "truncated file body"; - return NULL; - } - } - } - } - catch (TruncatedRead &e) { - Q_UNUSED(e) - } - - } - - foreach(int num, unknown_global_msg_nums) - qDebug() << QString("FitRideFile: unknown global message number %1; ignoring it").arg(num); - foreach(int num, unknown_record_fields) - qDebug() << QString("FitRideFile: unknown record field %1; ignoring it").arg(num); - foreach(int num, unknown_base_type) - qDebug() << QString("FitRideFile: unknown base type %1; skipped").arg(num); - - setRideFileDeviceInfo(rideFile, deviceInfos); - setRideFileDataInfo(rideFile, dataInfos); - - // CIQINFO - if (local_deve_fields_app.count()>0) { - QString ciqInfo = "["; - int i=0; - foreach(FitDeveApp deve_app, local_deve_fields_app) { - ciqInfo += QString("{\n\t\"application_id\": %1,\n\t\"developer_data_index\": %2,\n\t").arg(deve_app.app_id.c_str() ).arg(deve_app.dev_data_id); - ciqInfo += QString("\"fields\": [\n\t\t"); - int j=0; - foreach(FitDeveField deve_field, deve_app.fields) { - ciqInfo += QString("{\n\t\t\"dev_id\": %1,\n\t\t\"name\": \"%2\"}").arg(deve_field.dev_id).arg(deve_field.name.c_str()); - if (++j2) - // rideFile->setTag("CIQ", ciqInfo); - } - - file.close(); - - appendXData(rideFile); - - if (rideFile->xdata("SWIM")) { - // Build synthetic kph, km and cad sample data for Lap Swims - DataProcessor* fixLapDP = DataProcessorFactory::instance().getProcessors(true).value("Fix Lap Swim"); - if (fixLapDP) fixLapDP->postProcess(rideFile, NULL, "NEW"); - else qDebug()<<"Fix Lap Swim Data Processor not found."; - } - - return rideFile; - } - } - - void setRideFileDeviceInfo(RideFile *rf, QMap const& device_infos) { - QStringList uniqueDevices(device_infos.values()); - uniqueDevices.removeDuplicates(); - QString deviceInfo = uniqueDevices.join("\n"); - if (! deviceInfo.isEmpty()) { - rf->setTag("Device Info", deviceInfo); - } - } - - void setRideFileDataInfo(RideFile *rf, QList const& data_infos) { - QString dataInfo; - foreach(QString info, data_infos) { - dataInfo += info + "\n"; - } - if (dataInfo.length()>0) { - rf->setTag("Data Info", dataInfo); - } - } - - void appendXData(RideFile *rf) { - if (rf == nullptr) { return; } - - if (!weatherXdata->datapoints.empty()) - rf->addXData("WEATHER", weatherXdata); - else - delete weatherXdata; - - if (!swimXdata->datapoints.empty()) - rf->addXData("SWIM", swimXdata); - else - delete swimXdata; - - if (!hrvXdata->datapoints.empty()) - rf->addXData("HRV", hrvXdata); - else - delete hrvXdata; - - if (!gearsXdata->datapoints.empty()) - rf->addXData("GEARS", gearsXdata); - else - delete gearsXdata; - - if (!deveXdata->datapoints.empty()) - rf->addXData("DEVELOPER", deveXdata); - else - delete deveXdata; - - if (!extraXdata->datapoints.empty()) - rf->addXData("EXTRA", extraXdata); - else - delete extraXdata; - } - - RideFile *splitSessions(QList *rides) { - // NOTES: - // - start altitude of first transition not correct (zero), leads to too high climb figure - // i think this is not really a big deal yet - - // check multiple rides are expected and available, otherwise return just the whole activity - if (!rides || session_tags_.size() < 2) { - // just check if it was a run activity and adjust values, like it was done - // in decoding the session before. - if (rideFile->isRun()) { - convert2Run(rideFile); - } - return rideFile; - } - - // If there is more than one session parsed we - // split the ride file just created into multiple - // ones, each representing a single session. - // BUT, we do not touch the original file. - - quint32 start = 0, start_time = 0; - const QString deviceType = rideFile->deviceType(); - const QString fileFormat = rideFile->fileFormat(); - const double recIntSecs = rideFile->recIntSecs(); - // start date of an activity in ISO format is guaranteed to be unique in GC, see discussion in MR. - const QString uniqueSessionCookie = rideFile->startTime().toUTC().toString(Qt::ISODate); - QString sport_before; - - int session_idx = 0; - for(auto s = session_tags_.begin(); s != session_tags_.end(); ++s, ++session_idx) { - RideFile *rf = new RideFile; - rf->setDeviceType(deviceType); - rf->setFileFormat(fileFormat); - rf->setRecIntSecs(recIntSecs); - - // each ride gets a unique cookie to allow filtering/grouping all sessions that belong together - rf->setTag("Multisport", uniqueSessionCookie); - - // set tags and filter out session meta data - quint32 stop = 0; - for(auto sle = s->begin(); sle != s->end(); ++sle) { - QString const& key = sle.key(); - // meta data is prefixed w/ '_', otherwise its a ride file tag - if (key.startsWith('_')) { - if (0 == QString::compare(key, "_timestamp", Qt::CaseInsensitive)) { - stop = sle->toUInt(); - } else if (start == 0 && 0 == QString::compare(key, "_start_time", Qt::CaseInsensitive)) { - // only do once - start = sle->toUInt(); - start_time = start; - } - } else { - rf->setTag(key, sle->toString()); - } - } - - // adjust the start time - rf->setStartTime(QDateTime::fromSecsSinceEpoch(start, Qt::UTC)); - - int idx_start = rideFile->timeIndex(start - start_time); - int idx_stop = rideFile->timeIndex(stop - start_time); - // add data points to the new file created. - const QVector points_from_file = rideFile->dataPoints().mid(idx_start, idx_stop - idx_start); - foreach(RideFilePoint *p, points_from_file) { - rf->appendPoint(*p); - } - - // fix subsport tag of transitions - if (0 == QString::compare(rf->getTag("Sport", ""), "Transition", Qt::CaseInsensitive)) { - QString sport_after; - auto s_cpy = s + 1; - if (s_cpy != session_tags_.end() && s_cpy->contains("Sport") && s_cpy->value("SubSport").toString().isEmpty()) { - sport_after = s_cpy->value("Sport").toString(); - } - if (!sport_before.isEmpty() && !sport_after.isEmpty()) { - rf->setTag("SubSport", (QString("%1_to_%2_transition").arg(sport_before.toLower(), sport_after.toLower()))); - } - } - - // add intervals - // Only intervals that fit in the range of the file we are recently creating - // are transferred. - auto ride_intervals = rideFile->intervals(); - int int_ctr = 1; - foreach (RideFileInterval *rfi, ride_intervals) { - // is the recent interval in the range of our new file? - if (rfi->start >= idx_start && rfi->start <= idx_stop && rfi->stop <= idx_stop) { // is it possible that the a start is beyond stop and stop fits? - rf->addInterval(rfi->type, rfi->start, rfi->stop, QString("Lap %1").arg(int_ctr)); - int_ctr++; - } - } - - // add XData - const auto file_xdata = rideFile->xdata(); - for (auto it = file_xdata.begin(); it != file_xdata.end(); ++it) { - XDataSeries *s = new XDataSeries(*(it.value())); - s->datapoints.erase(std::remove_if(s->datapoints.begin(), s->datapoints.end(), [start_time, start, stop](XDataPoint *xdp){ - return xdp && (xdp->secs >= (stop - start_time) || xdp->secs < (start - start_time)); - }), s->datapoints.end()); - // adjust their timing - if (!s->datapoints.empty()) { - auto first_time = s->datapoints.first()->secs; - foreach (XDataPoint *p, s->datapoints) { - p->secs -= first_time; - } - // and append - rf->addXData(it.key(), s); - } - } - - // convert if necessary (run and transition) - if (rf->isRun() || 0 == QString::compare(rf->getTag("Sport", ""), "Transition", Qt::CaseInsensitive)) { - convert2Run(rf); - } - - setRideFileDataInfo(rf, session_data_info_list_.at(session_idx)); - setRideFileDeviceInfo(rf, session_device_info_list_.at(session_idx)); - - rides->append(rf); - - // remember sport tag - sport_before = rf->getTag("Sport", ""); - - // adjust timing and go on - start = stop; - } - - // return original file - return rideFile; - } + // semantic types static QString getSport(quint8 sport_id) { switch (sport_id) { @@ -3652,7 +928,7 @@ struct FitFileReaderState return 0; } for (quint16 i=0; i<=255; i++) { - if (sport_descr.compare(FitFileReaderState::getSport(i), Qt::CaseInsensitive)==0) { + if (sport_descr.compare(FitFileParser::getSport(i), Qt::CaseInsensitive)==0) { return (quint8) i; } } @@ -3967,21 +1243,3404 @@ struct FitFileReaderState return 0; } for (quint16 i=0; i<=255; i++) { - if (subsport_descr.compare(FitFileReaderState::getSubSport(i), Qt::CaseInsensitive)==0) { + if (subsport_descr.compare(FitFileParser::getSubSport(i), Qt::CaseInsensitive)==0) { return (quint8) i; } } // qDebug() << "getSubSportId(QString subsport_descr): subsport_descr was not found"; return 0; // when not found return generic sport id } + + // + // A number of utility and helper functions + // + // There is no particular rationale or pattern behind + // these utilities and helpers they have increased in + // number as different folks have worked on the code + // and needed re-usable elements. + // + // Again, these are ripe for refactoring. *FIXME* + // + void DumpFitValue(const FitValue& v) { + if (FIT_DEBUG && FIT_DEBUG_LEVEL>4) fprintf(stderr, "type: %d %llx %s\n", v.type, v.v, v.s.c_str()); + } + + void convert2Run( RideFile *rf) { + if (rf->areDataPresent()->cad) { + foreach(RideFilePoint *pt, rf->dataPoints()) { + pt->rcad = pt->cad; + pt->cad = 0; + } + rf->setDataPresent(RideFile::rcad, true); + rf->setDataPresent(RideFile::cad, false); + } + } + + std::string fitTypeDesc(int type) + { + if (type >= 0 && type < FITbasetypes.count()) return FITbasetypes[type].toStdString(); + else return "Enumerated type"; + } + + std::string fitDeveloperFieldDescription(int idx, int num, QString &key) + { + key = QString("%1.%2").arg(idx).arg(num); + if (local_deve_fields.contains(key)) + return local_deve_fields.value(key).name.c_str(); + key=""; // to indicate not found + return "Unknown developer field"; + + } + + // the field numbers are message specific so need to pass + // the message name and field number to get the description + std::string fitStandardFieldDescription(QString message, int num, int &idx) + { + int index=0; + foreach(FitFieldDefinition x, FITstandardfields) { + if (x.message == message.toStdString() && x.num == num) { + idx=index; + return x.name; + } + index++; + } + idx=-1; + return "Unknown standard field"; + } + + QString fitBaseTypeDesc(int type) + { + if (type>=0 && type < FITbasetypes.count()) return FITbasetypes[type]; + return "Unknown"; + } + + QString fitMessageDesc(int message, bool lower) + { + QString returning = "Unknown message type"; + foreach(FITmessage x, FITmessages) { + if (x.num == message) { + returning= x.desc; + break; + } + } + if (lower) { + returning=returning.toLower(); + returning=returning.replace(" ", "_"); + } + return returning; + } + + // return a name for the manufacturer, product combintion + // uses the config from FITmetadata.json initialised above + QString getManuProd(int manu, int prod) { + + QString returning; + + // is it a known or defaulted product? + foreach(FITproduct x, FITproducts) { + + if (x.manu == manu && x.prod == prod) { + // garmin devices special case (could also fix in FITmetadata.json) + // we have been inconsistent on this in the past e.g. Powertap, not SARIS Powertap + if (manu == 1) return QString("Garmin %1").arg(x.name); + else return x.name; + } + if (x.manu == manu && x.prod == -1) returning = x.name; + } + if (returning != "") return returning; + + // ok, then lets just return manufacturer and prod number + foreach(FITmanufacturer x, FITmanufacturers) { + if (x.manu == manu) return QString ("%1 Device (%2)").arg(x.name).arg(prod); + } + + // don't even recognise the manufacturer! + return QString("Unknown FIT Device %1:%2").arg(manu).arg(prod); + } + + QString getDeviceType(int device_type) { + switch (device_type) { + case 4: return "Headunit"; // bike_power + case 11: return "Powermeter"; // bike_power + case 12: case 25: return "Environment Sensor"; // s.t. temperature + case 16: return "Remote Control"; // s.t. Edge remote + case 17: return "Biketrainer"; // fitness equipment + case 18: return "Blood Presure"; + case 30: return "Running Dynamics"; + case 31: return "Muscle Oxygen"; + case 34: return "Shifting"; + case 35: case 36: return "Bikelight"; // bike_light_main/shared + case 40: return "Bike Radar"; // bike_radar + case 46: return "Bike Aero"; // bike_aero + case 120: return "HR"; // heart_rate + case 121: return "Speed-Cadence"; // bike_speed_cadence + case 122: return "Cadence"; // bike_speed + case 123: return "Speed"; // bike_speed + case 124: return "Stride"; // stride_speed_distance + + default: return QString("Type %1").arg(device_type); + } + } + + QString getBatteryStatus(quint8 battery_status) { + switch (battery_status) { + case 1: return "new"; + case 2: return "good"; + case 3: return "ok"; + case 4: return "low"; + case 5: return "critical"; + case 6: return "charging"; + default: return "unknown"; + } + } + + RideFile::SeriesType getSeriesForNative(int native_num) { + switch (native_num) { + + case 0: // POSITION_LAT + return RideFile::lat; + case 1: // POSITION_LONG + return RideFile::lon; + case 2: // ALTITUDE + return RideFile::alt; + case 3: // HEART_RATE + return RideFile::hr; + case 4: // CADENCE + return RideFile::cad; + case 5: // DISTANCE + return RideFile::km; + case 6: // SPEED + return RideFile::kph; + case 7: // POWER + return RideFile::watts; + case 9: // GRADE + return RideFile::slope; + case 13: // TEMPERATURE + return RideFile::temp; + case 30: // LEFT_RIGHT_BALANCE + return RideFile::lrbalance; + case 39: // VERTICAL OSCILLATION + return RideFile::rvert; + case 41: // GROUND CONTACT TIME + return RideFile::rcontact; + case 45: // LEFT_PEDAL_SMOOTHNESS + return RideFile::lps; + case 46: // RIGHT_PEDAL_SMOOTHNESS + return RideFile::rps; + //case 47: // COMBINED_PEDAL_SMOOTHNES + // return RideFile::cps; + case 54: // THb + return RideFile::thb; + case 57: // SMO2 + return RideFile::smo2; + + case 253: // SECS + return RideFile::secs; + default: + return RideFile::none; + } + } + + QString getNameForExtraNative(int native_num) { + switch (native_num) { + + case 32: // VERTICAL_SPEED + return "VERTICALSPEED"; // Vertical Speed + + case 40: // STANCE_TIME_PERCENT + return "STANCETIMEPERCENT"; // Stance Time Percent + + case 42: // ACTIVITY_TYPE + return "ACTIVITYTYPE"; // Activity Type + + case 47: // COMBINED_PEDAL_SMOOTHNES + return "COMBINEDSMOOTHNESS"; //Combined Pedal Smoothness + + case 81: // BATTERY_SOC + return "BATTERYSOC"; + + case 83: // VERTICAL_RATIO + return "VERTICALRATIO"; // Vertical Ratio + + case 85: // STEP_LENGTH + return "STEPLENGTH"; // Step Length + + case 90: // PERFORMANCE_CONDITION + return "PERFORMANCECONDITION"; // Performance Contition + + case 108: // RESPIRATIONRATE + return "RESPIRATIONRATE"; + + case 114: // MTB Dynamics - Grit + return "GRIT"; + + case 115: // MTB Dynamics - Flow + return "FLOW"; + + case 116: // Stress + return "STRESS"; + + case 133: // Pulse Ox + return "PULSEOX"; + + case 137: // Potential Stamina + return "POTENTIALSTAMINA"; + + case 138: // Stamina + return "STAMINA"; + + default: + return QString("FIELD_%1").arg(native_num); + } + } + + float getScaleForExtraNative(int native_num) { + switch (native_num) { + + case 32: // VERTICAL_SPEED + return 1000.0; + + case 40: // STANCE_TIME_PERCENT + case 83: // VERTICAL_RATIO + return 100.0; + + case 85: // STEP_LENGTH + return 10.0; + + case 47: // COMBINED_PEDAL_SMOOTHNES + case 81: // BATTERY_SOC + return 2.0; + + case 108: // RESPIRATIONRATE + case 116: // Stress + return 100.0; + + default: + return 1.0; + } + } + + int getOffsetForExtraNative(int native_num) { + switch (native_num) { + case 0: + return 0; + default: + return 0; + } + } + + void addRecordDeveField(QString key, FitFieldDefinition deveField, bool xdata) { + QString name = deveField.name.c_str(); + + if (deveField.native>-1) { + int i = 0; + RideFile::SeriesType series = getSeriesForNative(deveField.native); + QString nativeName = rideFile->symbolForSeries(series); + + if (nativeName.length() == 0) + nativeName = QString("FIELD_%1").arg(deveField.native); + else + i++; + + QString typeName; + if (xdata) { + typeName = "DEVELOPER"; + do { + i++; + name = nativeName + (i>1?QString("-%1").arg(i):""); + } + while (deveXdata->valuename.contains(name)); + } + else { + typeName = "STANDARD"; + name = nativeName; + } + + const QString contain_info = QString("CIQ '%1' -> %2 %3").arg(deveField.name.c_str()).arg("STANDARD").arg(nativeName); + if (xdata && dataInfos.contains(contain_info)) { + int secs = last_time-start_time; + int idx = dataInfos.indexOf(contain_info); + const QString info_replacement = QString("CIQ '%1' -> %2 %3 (STANDARD until %4 secs)").arg(deveField.name.c_str()).arg(typeName).arg(name).arg(secs); + dataInfos.replace(idx, info_replacement); + if (session_data_info_.contains(contain_info)) + session_data_info_.replace(session_data_info_.indexOf(contain_info), info_replacement); + } else { + const QString the_info = QString("CIQ '%1' -> %2 %3").arg(deveField.name.c_str()).arg(typeName).arg(name); + dataInfos.append(the_info); + session_data_info_.append(the_info); + } + } + + if (xdata) { + deveXdata->valuename << name; + deveXdata->unitname << deveField.unit.c_str(); + + record_deve_fields.insert(key, deveXdata->valuename.count()-1); + } else + record_deve_fields.insert(key, -1); + + // Add field for app + if (local_deve_fields_app.contains(deveField.dev_id)) { + local_deve_fields_app[deveField.dev_id].fields.append(deveField); + } + } + + void setRideFileDeviceInfo(RideFile *rf, QMap const& device_infos) { + QStringList uniqueDevices(device_infos.values()); + uniqueDevices.removeDuplicates(); + QString deviceInfo = uniqueDevices.join("\n"); + if (! deviceInfo.isEmpty()) { + rf->setTag("Device Info", deviceInfo); + } + } + + void setRideFileDataInfo(RideFile *rf, QList const& data_infos) { + QString dataInfo; + foreach(QString info, data_infos) { + dataInfo += info + "\n"; + } + if (dataInfo.length()>0) { + rf->setTag("Data Info", dataInfo); + } + } + + void appendXData(RideFile *rf) { + if (rf == nullptr) { return; } + + if (!weatherXdata->datapoints.empty()) + rf->addXData("WEATHER", weatherXdata); + else + delete weatherXdata; + + if (!swimXdata->datapoints.empty()) + rf->addXData("SWIM", swimXdata); + else + delete swimXdata; + + if (!hrvXdata->datapoints.empty()) + rf->addXData("HRV", hrvXdata); + else + delete hrvXdata; + + if (!gearsXdata->datapoints.empty()) + rf->addXData("GEARS", gearsXdata); + else + delete gearsXdata; + + if (!deveXdata->datapoints.empty()) + rf->addXData("DEVELOPER", deveXdata); + else + delete deveXdata; + + if (!extraXdata->datapoints.empty()) + rf->addXData("EXTRA", extraXdata); + else + delete extraXdata; + } + + RideFile *splitSessions(QList *rides) { + // NOTES: + // - start altitude of first transition not correct (zero), leads to too high climb figure + // i think this is not really a big deal yet + + // check multiple rides are expected and available, otherwise return just the whole activity + if (!rides || session_tags_.size() < 2) { + // just check if it was a run activity and adjust values, like it was done + // in decoding the session before. + if (rideFile->isRun()) { + convert2Run(rideFile); + } + return rideFile; + } + + // If there is more than one session parsed we + // split the ride file just created into multiple + // ones, each representing a single session. + // BUT, we do not touch the original file. + + quint32 start = 0, start_time = 0; + const QString deviceType = rideFile->deviceType(); + const QString fileFormat = rideFile->fileFormat(); + const double recIntSecs = rideFile->recIntSecs(); + // start date of an activity in ISO format is guaranteed to be unique in GC, see discussion in MR. + const QString uniqueSessionCookie = rideFile->startTime().toUTC().toString(Qt::ISODate); + QString sport_before; + + int session_idx = 0; + for(auto s = session_tags_.begin(); s != session_tags_.end(); ++s, ++session_idx) { + RideFile *rf = new RideFile; + rf->setDeviceType(deviceType); + rf->setFileFormat(fileFormat); + rf->setRecIntSecs(recIntSecs); + + // each ride gets a unique cookie to allow filtering/grouping all sessions that belong together + rf->setTag("Multisport", uniqueSessionCookie); + + // set tags and filter out session meta data + quint32 stop = 0; + for(auto sle = s->begin(); sle != s->end(); ++sle) { + QString const& key = sle.key(); + // meta data is prefixed w/ '_', otherwise its a ride file tag + if (key.startsWith('_')) { + if (0 == QString::compare(key, "_timestamp", Qt::CaseInsensitive)) { + stop = sle->toUInt(); + } else if (start == 0 && 0 == QString::compare(key, "_start_time", Qt::CaseInsensitive)) { + // only do once + start = sle->toUInt(); + start_time = start; + } + } else { + rf->setTag(key, sle->toString()); + } + } + + // adjust the start time + rf->setStartTime(QDateTime::fromSecsSinceEpoch(start, Qt::UTC)); + + int idx_start = rideFile->timeIndex(start - start_time); + int idx_stop = rideFile->timeIndex(stop - start_time); + // add data points to the new file created. + const QVector points_from_file = rideFile->dataPoints().mid(idx_start, idx_stop - idx_start); + foreach(RideFilePoint *p, points_from_file) { + rf->appendPoint(*p); + } + + // fix subsport tag of transitions + if (0 == QString::compare(rf->getTag("Sport", ""), "Transition", Qt::CaseInsensitive)) { + QString sport_after; + auto s_cpy = s + 1; + if (s_cpy != session_tags_.end() && s_cpy->contains("Sport") && s_cpy->value("SubSport").toString().isEmpty()) { + sport_after = s_cpy->value("Sport").toString(); + } + if (!sport_before.isEmpty() && !sport_after.isEmpty()) { + rf->setTag("SubSport", (QString("%1_to_%2_transition").arg(sport_before.toLower(), sport_after.toLower()))); + } + } + + // add intervals + // Only intervals that fit in the range of the file we are recently creating + // are transferred. + auto ride_intervals = rideFile->intervals(); + int int_ctr = 1; + foreach (RideFileInterval *rfi, ride_intervals) { + // is the recent interval in the range of our new file? + if (rfi->start >= idx_start && rfi->start <= idx_stop && rfi->stop <= idx_stop) { // is it possible that the a start is beyond stop and stop fits? + rf->addInterval(rfi->type, rfi->start, rfi->stop, QString("Lap %1").arg(int_ctr)); + int_ctr++; + } + } + + // add XData + const auto file_xdata = rideFile->xdata(); + for (auto it = file_xdata.begin(); it != file_xdata.end(); ++it) { + XDataSeries *s = new XDataSeries(*(it.value())); + s->datapoints.erase(std::remove_if(s->datapoints.begin(), s->datapoints.end(), [start_time, start, stop](XDataPoint *xdp){ + return xdp && (xdp->secs >= (stop - start_time) || xdp->secs < (start - start_time)); + }), s->datapoints.end()); + // adjust their timing + if (!s->datapoints.empty()) { + auto first_time = s->datapoints.first()->secs; + foreach (XDataPoint *p, s->datapoints) { + p->secs -= first_time; + } + // and append + rf->addXData(it.key(), s); + } + } + + // convert if necessary (run and transition) + if (rf->isRun() || 0 == QString::compare(rf->getTag("Sport", ""), "Transition", Qt::CaseInsensitive)) { + convert2Run(rf); + } + + setRideFileDataInfo(rf, session_data_info_list_.at(session_idx)); + setRideFileDeviceInfo(rf, session_device_info_list_.at(session_idx)); + + rides->append(rf); + + // remember sport tag + sport_before = rf->getTag("Sport", ""); + + // adjust timing and go on + start = stop; + } + + // return original file + return rideFile; + } + + // + // FITMESSAGE DECODERS + // + // These form the majority of this code, running for the next 2k lines or so. + // + // Message decoding functions work with FitMessages and the decoded fields + // passed as vectors of FitValues + // + // decodeGeneric() + // + // decodeFileId() + // decodePhysiologicalMetrics() + // decodeSession() + // decodeDeviceInfo() + // decodeActivity() + // decodeEvent() + // decodeHRV() + // decodeLap() + // decodeRecord() + // decodeLength() + // decodeWeather() + // decodeHr() + // decodeDeviceSettings() + // decodeSegment() + // decodeUserProfile() + // decodeDeveloperID() + // decodeDeveloperFieldDescription() + // + // + + // general purpose decoding of message via metadata and placing + // the contents into an XDATA tab + void decodeGeneric(QString message, const FitMessage &def, int time_offset, + const std::vector& values) { + + // we don't do it for all messages, it would get out of hand! + if (!GenericDecodeList.contains(message)) return; + + // let those debuggers know we're doing a generic decode + if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) fprintf(stderr, "generic decode %s: %d fields to decode\n", + message.toStdString().c_str(), (int)values.size()); + + // we look for a timestamp field as we go through + double timestamp = -1; + int index=0; + int count=0; + + // lets add to XDATA if it is not already there + // for example TOTAL and SESSION messages only occur once in general so will never exist + // but LAP messages will be multiple, so we should reuse if we added it earlier + int seriesindex=-1; + XDataSeries *xdseries = rideFile->xdata(message.toUpper()); + if (xdseries == NULL) { + xdseries = new XDataSeries(); + xdseries->name = message.toUpper(); + + rideFile->addXData(message.toUpper(), xdseries); + } + + // this point will be added for this message + // with values appended as we go through the data below + // and ultimately the secs value is derived at the end + // before being added to the XDATA + XDataPoint *add= new XDataPoint(); + + foreach(const FitField &field, def.fields) { + + QString name; + double value=0; + double scaledvalue=0; //value after scaling is applied + int idx; // standard field index + QString key; // developer field key + FitFieldDefinition metadata; + + // XDATA does not really support string data, but the code + // is misleading on this, it should be fixed in the XDATA code *FIXME* + if (field.type == 7) goto genericnext; // can't handle this + + switch(field.type) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + // use the integer value v + if (values[index].v == NA_VALUE) goto genericnext; + value= values[index].v; + break; + case 8: + // use the float value f + if (values[index].f == NA_VALUEF) goto genericnext; + value=values[index].f; + break; + default: + if (values[index].v == NA_VALUE) goto genericnext; + value=values[index].v; // most likely drop through as type is unreliable + break; + } + + if (field.deve_idx == -1) { + + // find the metadata for a standard field + name = fitStandardFieldDescription(message, field.num, idx).c_str(); // standard field + if (idx < 0) goto genericnext; // not a field we support yet + metadata = FITstandardfields[idx]; + + } else if (field.deve_idx >=0) { + + // find the metadata for a developer field + name = fitDeveloperFieldDescription(field.deve_idx, field.num, key).c_str(); + if (key == "") goto genericnext; // not found as a developer field, so skip + metadata = local_deve_fields.value(key); + + } + + // if we get here we have metadata about the field in question + // so lets apply scaling and add to the XDATA section + scaledvalue = value; + if (metadata.scale != -1) scaledvalue /= double(metadata.scale); + + // if we get here then the field is going to be transferred into + // the XDATA section, so lets see if it is a start_time field? + if (strcmp(metadata.name.c_str(), "start_time") == 0) timestamp = value; + + // add the xdata series if not present yet + seriesindex=xdseries->valuename.indexOf(metadata.name.c_str()); + if (seriesindex == -1) { + xdseries->valuename.append(metadata.name.c_str()); + xdseries->unitname.append(metadata.unit.c_str()); + xdseries->valuetype.append(RideFile::SeriesType::none); // makes no sense, if it was a series type it wouldn't be xdata + seriesindex=xdseries->valuename.indexOf(metadata.name.c_str()); + } + add->number[seriesindex] = scaledvalue; + count++; + + if (FIT_DEBUG && FIT_DEBUG_LEVEL>3) { + fprintf(stderr, "decodeGeneric(%s) %d: %s field %d bytes, num %d, type %s [%s]=%f %s\n", + message.toStdString().c_str(), + index, + (field.deve_idx > -1 ? "developer" : "standard"), field.size, + field.num, fitTypeDesc(metadata.type).c_str(), + name.toStdString().c_str(), + scaledvalue, metadata.unit.c_str()); + } + +genericnext: + index++; + } + + // what timestamp to use for this row if XDATA ? + if (timestamp <= 0) timestamp=0; + QDateTime time= qbase_time.addSecs(timestamp); + QDateTime start= QDateTime::fromTime_t(start_time); + if (timestamp <= 0 || time < start) time=start; + + // update the xdata series with the timestamp and add for our record + // if we managed to extract any data from the file successfully + if (count > 0) { + add->secs = (float)(time.toUTC().toMSecsSinceEpoch() - start.toUTC().toMSecsSinceEpoch()) / 1000.00; + add->km = 0; + xdseries->datapoints.append(add); + } + } + + void decodeFileId(const FitMessage &def, int, + const std::vector& values) { + int i = 0; + int manu = -1, prod = -1; + foreach(const FitField &field, def.fields) { + fit_value_t value = values[i++].v; + + if( value == NA_VALUE ) + continue; + + switch (field.num) { + case 1: manu = value; break; + case 2: prod = value; break; + + // other are ignored at present: + case 0: // file type: + // 4: activity log + // 6: Itinary + // 34: segment + break; + case 3: //serial number + case 4: //timestamp + case 5: //number + default: ; // do nothing + } + } + active_session_["_devicetype"] = getManuProd(manu, prod); + rideFile->setDeviceType(getManuProd(manu, prod)); + } + + + void decodePhysiologicalMetrics(const FitMessage &def, int, + const std::vector& values) { + int i = 0; + + foreach(const FitField &field, def.fields) { + fit_value_t value = values[i++].v; + + + if( value == NA_VALUE ) + continue; + + switch (field.num) { + case 7: // METmax: 1 METmax = VO2max * 3.5, scale 65536 + active_session_["VO2max detected"] = QString::number(round(value / 65536.0 * 3.5 * 10.0) / 10.0); + rideFile->setTag("VO2max detected", QString::number(round(value / 65536.0 * 3.5 * 10.0) / 10.0)); + break; + + case 4: // Aerobic Training Effect, scale 10 + active_session_["Aerobic Training Effect"] = QString::number(value/10.0); + rideFile->setTag("Aerobic Training Effect", QString::number(value/10.0)); + break; + + case 20: // Anaerobic Training Effect, scale 10 + active_session_["Anaerobic Training Effect"] = QString::number(value/10.0); + rideFile->setTag("Anaerobic Training Effect", QString::number(value/10.0)); + break; + + case 9: // Recovery Time, minutes + active_session_["Recovery Time"] = QString::number(round(value/60.0)); + rideFile->setTag("Recovery Time", QString::number(round(value/60.0))); + break; + + case 17: // Performance Condition + active_session_["Performance Condition"] = QString::number(value); + rideFile->setTag("Performance Condition", QString::number(value)); + break; + + case 14: // If watch detected Running Lactate Threshold Heart Rate, bpm + if(rideFile->isRun() && value > 0){ + active_session_["LTHR detected"] = QString::number(value); + rideFile->setTag("LTHR detected", QString::number(value)); + } + break; + + case 15: // If watch detected Running Lactate Threshold Speed, m/s + if(rideFile->isRun() && value > 0){ + active_session_["LTS detected"] = QString::number(value/100.0); + rideFile->setTag("LTS detected", QString::number(value/100.0)); + } + break; + default: break; // do nothing + } + + + if (FIT_DEBUG && FIT_DEBUG_LEVEL>3) { + fprintf(stderr, "decodePhysiologicalMetrics field %d: %d bytes, num %d, type %d\n", i, field.size, field.num, field.type ); + } + } + } + + void decodeSession(const FitMessage &def, int time_offset, + const std::vector& values) { + time_t iniTime; + if (time_offset > 0) + iniTime = last_time + time_offset; + else + iniTime = last_time; + + int i = 0; + time_t this_timestamp = 0, this_start_time = 0, this_elapsed_time = 0; + QString sport, subsport; + bool sport_found = false, subsport_found = false; + QString prevSport = rideFile->getTag("Sport", ""); + double pool_length = 0.0; + + foreach(const FitField &field, def.fields) { + fit_value_t value = values[i++].v; + + if( value == NA_VALUE ) + continue; + + switch (field.num) { + case 5: // sport field + if (sport_found == false) { + sport_found = true; + sport = FitFileParser::getSport(value); + } + break; + case 6: // sub sport + if (subsport_found == false) { + subsport_found = true; + subsport = FitFileParser::getSubSport(value); + } + break; + case 44: // pool_length + pool_length = value / 100000.0; + active_session_["Pool Length"] = QString("%1").arg(pool_length*1000.0); + rideFile->setTag("Pool Length", // in meters + QString("%1").arg(pool_length*1000.0)); + break; + + // other fields are ignored at present + case 253: //timestamp + this_timestamp = value + qbase_time.toTime_t(); + active_session_["_timestamp"] = static_cast(this_timestamp); + break; + case 168: /* undocumented: Firstbeat EPOC based Exercise Load */ + active_session_["EPOC"] = QString::number(round(value / 65536.0 )); + rideFile->setTag("EPOC", QString::number(round(value / 65536.0 ))); + break; + case 192: /* undocumented: Feel manually entered after activity (0-25-50-75-100) */ + active_session_["Feel"] = QString::number(round(value)); + rideFile->setTag("Feel", QString::number(round(value))); + break; + case 193: /* undocumented: RPE manually entered after activity (0-10) */ + active_session_["RPE"] = QString::number(value / 10.0 ); + rideFile->setTag("RPE", QString::number(value / 10.0 )); + break; + case 254: //index + case 0: //event + case 1: /* event_type */ + case 2: /* start_time */ + this_start_time = value + qbase_time.toTime_t(); + active_session_["_start_time"] = static_cast(this_start_time); + break; + case 3: /* start_position_lat */ + case 4: /* start_position_long */ + case 7: /* total elapsed time */ + this_elapsed_time = value + qbase_time.toTime_t(); + active_session_["_total_elapsed_time"] = static_cast(this_elapsed_time); + break; + case 8: /* total timer time */ + case 9: /* total distance */ + case 10: /* total_cycles */ + case 11: /* total calories */ + case 13: /* total fat calories */ + case 14: /* avg_speed */ + case 15: /* max_speed */ + case 16: /* avg_HR */ + case 17: /* max_HR */ + case 18: /* avg_cad */ + case 19: /* max_cad */ + case 20: /* avg_pwr */ + case 21: /* max_pwr */ + case 22: /* total ascent */ + case 23: /* total descent */ + case 25: /* first lap index */ + case 26: /* num lap */ + case 29: /* north-east lat = bounding box */ + case 30: /* north-east lon = bounding box */ + case 31: /* south west lat = bounding box */ + case 32: /* south west lon = bounding box */ + case 34: /* normalized power */ + case 48: /* total work (J) */ + case 49: /* avg altitude */ + case 50: /* max altitude */ + case 52: /* avg grade */ + case 53: /* avg positive grade */ + case 54: /* avg negative grade */ + case 55: /* max pos grade */ + case 56: /* max neg grade */ + case 57: /* avg temperature (Celsius. deg) */ + case 58: /* max temp */ + case 59: /* total_moving_time */ + case 60: /* avg_pos_vertical_speed (m/s) */ + case 61: /* avg_neg_vertical_speed */ + case 62: /* max_pos_vertical_speed */ + case 63: /* max neg_vertical_speed */ + case 64: /* min HR bpm */ + case 69: /* avg lap time */ + case 70: /* best lap index */ + case 71: /* min altitude */ + case 92: /* fractional avg cadence (rpm) */ + case 93: /* fractional max cadence */ + default: break; // do nothing + } + + if (FIT_DEBUG && FIT_DEBUG_LEVEL>2) { + printf("decodeSession field %d: %d bytes, num %d, type %d\n", i, field.size, field.num, field.type ); + } + } + + if (sport_found) { + active_session_["Sport"] = sport; + rideFile->setTag("Sport", sport); + } + if (subsport_found) { + active_session_["SubSport"] = subsport; + rideFile->setTag("SubSport", subsport); + } + + // same procedure as for laps, code is c/p until a better solution is found + if (this_timestamp == 0 && this_elapsed_time > 0) { + this_timestamp = iniTime + this_elapsed_time - 1; + active_session_["_timestamp"] = static_cast(this_timestamp); + } + + if (this_start_time == 0 || this_start_time-start_time < 0) { + //errors << QString("lap %1 has invalid start time").arg(interval); + this_start_time = start_time; // time was corrected after lap start + active_session_["_start_time"] = static_cast(this_start_time); + + if (this_timestamp == 0 || this_timestamp-start_time < 0) { + active_session_.remove("_timestamp"); + errors << QString("lap %1 is ignored (invalid end time)").arg(interval); + return; + } + } + + session_tags_.append(active_session_); + session_device_info_list_.append(session_device_info_); + session_data_info_list_.append(session_data_info_); + active_session_.clear(); + session_device_info_.clear(); + session_data_info_.clear(); + } + + + void decodeDeviceInfo(const FitMessage &def, int, + const std::vector& values) { + int i = 0; + + int index=-1; + int manu = -1, prod = -1, version = -1, type = -1; + quint32 serial = 0; + quint8 battery_status = 0; + fit_string_value name; + + QString deviceInfo; + + foreach(const FitField &field, def.fields) { + FitValue value = values[i++]; + + //qDebug() << field.num << field.type << value.v; + + switch (field.num) { + case 0: // device index + index = value.v; + break; + case 1: // ANT+ device type + type = value.v; + break; + case 2: // manufacturer + manu = value.v; + break; + case 3: // serial number + serial = value.v; + break; + case 4: // product + prod = value.v; + break; + case 5: // software version + version = value.v; + break; + case 11: // battery status + battery_status = value.v; + break; + case 27: // product name + name = value.s; + break; + + // all other fields are ignored at present + case 253: //timestamp + case 10: // battery voltage + case 6: // hardware version + case 22: // ANT network + case 25: // source type + case 24: // equipment ID + default: ; // do nothing + } + + if (FIT_DEBUG && FIT_DEBUG_LEVEL>3) { + fprintf(stderr, "decodeDeviceInfo field %d: %d bytes, num %d, type %d\n", i, field.size, field.num, field.type ); + } + //qDebug() << field.num << value.v; + } + + //deviceInfo += QString("Device %1 ").arg(index); + deviceInfo += QString("%1 ").arg(getDeviceType(type)); + if (manu>-1) + deviceInfo += getManuProd(manu, prod); + if (name.length()>0) + deviceInfo += QString(" %1").arg(name.c_str()); + if (version>0) + deviceInfo += QString(" (v%1)").arg(version/100.0); + if (serial > 0 && serial < std::numeric_limits::max()) + deviceInfo += QString(" ID:%1").arg(serial); + if (battery_status > 0 && battery_status < 8) + deviceInfo += QString(" BAT:%1").arg(getBatteryStatus(battery_status)); + + // What is 7 and 0 ? + // 3 for Moxy ? + if (type>-1 && type != 0 && type != 7 && type != 3) { + deviceInfos.insert(index, deviceInfo); + session_device_info_.insert(index, deviceInfo); + } + } + + void decodeActivity(const FitMessage &def, int, + const std::vector& values) { + int i = 0; + + const int delta = qbase_time.toTime_t(); + int event = -1, event_type = -1, local_timestamp = -1, timestamp = -1; + + foreach(const FitField &field, def.fields) { + fit_value_t value = values[i++].v; + + if (value == NA_VALUE) + continue; + + switch (field.num) { + case 3: // event + event = value; + break; + case 4: // event_type + event_type = value; + break; + case 5: // local_timestamp + // adjust from seconds since 1989-12-31 00:00:00 UTC + if (0 != value) + { + local_timestamp = value + delta; + } + break; + case 253: // timestamp + // adjust from seconds since 1989-12-31 00:00:00 UTC + if (0 != value) + { + timestamp = value + delta; + } + break; + + case 1: // num_sessions + case 2: // type + default: + break; + } + + //qDebug() << field.num << value; + } + + if (event != 26) // activity + return; + + if (event_type != 1) // stop + return; + + if (local_timestamp < 0 || timestamp < 0) + return; + + if (0 == local_timestamp && 0 == timestamp) + return; + + QDateTime t(rideFile->startTime().toUTC()); + if (0 == local_timestamp) { + // ZWift FIT files are not reporting local timestamp + rideFile->setStartTime(t.addSecs(timestamp)); + } else { + // adjust start time to time zone of the ride + rideFile->setStartTime(t.addSecs(local_timestamp - timestamp)); + } + } + + void decodeEvent(const FitMessage &def, int, + const std::vector& values) { + int time = -1; + int event = -1; + int event_type = -1; + qint16 data16 = -1; + qint32 data32 = -1; + int i = 0; + foreach(const FitField &field, def.fields) { + fit_value_t value = values[i++].v; + + if( value == NA_VALUE ) + continue; + + switch (field.num) { + case 253: // timestamp field (s) + time = value + qbase_time.toTime_t(); + break; + case 0: // event field + event = value; break; + case 1: // event_type field + event_type = value; break; + case 2: // data16 field + data16 = value; break; + case 3: //data32 field + data32 = value; break; + + // additional values (ignored at present): + case 4: // event group + default: ; // do nothing + } + } + + switch (event) { + case 0: // Timer event + { + switch (event_type) { + case 0: // start + stopped = false; + break; + case 1: // stop + stopped = true; + break; + case 2: // consecutive_depreciated + case 3: // marker + break; + case 4: // stop all + stopped = true; + break; + case 5: // begin_depreciated + case 6: // end_depreciated + case 7: // end_all_depreciated + case 8: // stop_disable + stopped = true; + break; + case 9: // stop_disable_all + stopped = true; + break; + default: + errors << QString("Unknown timer event type %1").arg(event_type); + } + } + break; + + case 36: // Calibration event + { + int secs = (start_time==0?0:time-start_time); + switch (event_type) { + case 3: // marker + ++calibration; + rideFile->addCalibration(secs, data16, QString("Calibration %1 (%2)").arg(calibration).arg(data16)); + //qDebug() << "marker" << secs << data16; + break; + default: + errors << QString("Unknown calibration event type %1").arg(event_type); + break; + } + } + break; + + case 42: /* front_gear_change */ + case 43: /* rear_gear_change */ + { + int secs = (start_time==0?0:time-start_time); + XDataPoint *p = new XDataPoint(); + + switch (event_type) { + case 3: + p->secs = secs; + p->km = last_distance; + p->number[0] = ((data32 >> 24) & 255); + p->number[1] = ((data32 >> 8) & 255); + p->number[2] = ((data32 >> 16) & 255); + p->number[3] = (data32 & 255); + gearsXdata->datapoints.append(p); + break; + default: + errors << QString("Unknown gear change event %1 type %2 data %3").arg(event).arg(event_type).arg(data32); + break; + } + } + break; + + case 3: /* workout */ + case 4: /* workout_step */ + case 5: /* power_down */ + case 6: /* power_up */ + case 7: /* off_course */ + case 8: /* session */ + case 9: /* lap */ + case 10: /* course_point */ + case 11: /* battery */ + case 12: /* virtual_partner_pace */ + case 13: /* hr_high_alert */ + case 14: /* hr_low_alert */ + case 15: /* speed_high_alert */ + case 16: /* speed_low_alert */ + case 17: /* cad_high_alert */ + case 18: /* cad_low_alert */ + case 19: /* power_high_alert */ + case 20: /* power_low_alert */ + case 21: /* recovery_hr */ + case 22: /* battery_low */ + case 23: /* time_duration_alert */ + case 24: /* distance_duration_alert */ + case 25: /* calorie_duration_alert */ + case 26: /* activity */ + case 27: /* fitness_equipment */ + case 28: /* length */ + case 32: /* user_marker */ + case 33: /* sport_point */ + default: ; + } + + if (FIT_DEBUG && FIT_DEBUG_LEVEL>3) { + fprintf(stderr, "event type %d\n", event_type); + } + last_event = event; + last_event_type = event_type; + } + + void decodeHRV(const FitMessage &def, + const std::vector& values) { + int rrvalue; + int i=0; + double hrv_time=0.0; + int n=hrvXdata->datapoints.count(); + + if (n>0) + hrv_time = hrvXdata->datapoints[n-1]->secs; + + foreach(const FitField &field, def.fields) { + FitValue value = values[i++]; + if ( value.type == ListValue && field.num == 0){ + for (int j=0; jsecs = hrv_time; + p->number[0] = rrvalue; + hrvXdata->datapoints.append(p); + } + } else if (value.type == SingleValue) + { + rrvalue = int(value.v); + hrv_time += rrvalue/1000.0; + + XDataPoint *p = new XDataPoint(); + p->secs = hrv_time; + p->number[0] = rrvalue; + hrvXdata->datapoints.append(p); + } + } + } + + void decodeLap(const FitMessage &def, int time_offset, + const std::vector& values) { + time_t iniTime; + if (time_offset > 0) + iniTime = last_time + time_offset; + else + iniTime = last_time; + + time_t time = 0; + int i = 0; + time_t this_start_time = 0; + double total_distance = 0.0; + double total_elapsed_time = 0.0; + + QString lap_name; + + if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) { + fprintf(stderr, " FIT decode lap \n"); + } + + foreach(const FitField &field, def.fields) { + const FitValue& value = values[i++]; + + if( value.v == NA_VALUE ) + continue; + + if (FIT_DEBUG && FIT_DEBUG_LEVEL>3) { + fprintf (stderr, "\tfield: num: %d ", field.num); + DumpFitValue(value); + } + + // ignore any developer fields in laps + if ( field.deve_idx > -1) + continue; + + switch (field.num) { + case 253: + time = value.v + qbase_time.toTime_t(); + break; + case 2: + this_start_time = value.v + qbase_time.toTime_t(); + break; + case 9: + total_distance = value.v / 100000.0; + break; + case 7: + total_elapsed_time = value.v / 1000.0; + break; + case 24: + //lap_trigger = value.v; + + + // other data (ignored at present): + case 254: // lap nbr + case 3: // start_position_lat + case 4: // start_position_lon + case 5: // end_position_lat + case 6: // end_position_lon + + case 8: // total_timer_time + case 10: // total_cycles + case 11: // total calories + case 12: // total fat calories + case 13: // avg_speed + case 14: // max_speed + case 15: // avg HR (bpm) + case 16: // Max HR + case 17: // AvCad + case 18: // MaxCad + case 21: // total ascent + case 22: // total descent + case 27: // north-east lat (bounding box) + case 28: // north-east lon + case 29: // south west lat + case 30: // south west lon + break; + default: ; // ignore it + } + } + + if (time == 0 && total_elapsed_time > 0) { + time = iniTime + total_elapsed_time - 1; + } + + if (this_start_time == 0 || this_start_time-start_time < 0) { + //errors << QString("lap %1 has invalid start time").arg(interval); + this_start_time = start_time; // time was corrected after lap start + + if (time == 0 || time-start_time < 0) { + errors << QString("lap %1 is ignored (invalid end time)").arg(interval); + return; + } + } + + if (isLapSwim) { + // Fill empty lengths due to false starts or pauses in some devices + // s.t. Garmin 910xt + double secs = time - start_time; + if ((total_distance == 0.0) && (secs > last_length + 1)) { + + XDataPoint *p = new XDataPoint(); + p->secs = secs; + p->km = last_distance; + p->number[0] = 0; + p->number[1] = secs-last_length; + p->number[2] = 0; + swimXdata->datapoints.append(p); + + last_length = secs; + } + ++interval; + } else if (rideFile->dataPoints().count()) { // no samples means no laps + ++interval; + if (lap_name == "") { + lap_name = QObject::tr("Lap %1").arg(interval); + } + rideFile->addInterval(RideFileInterval::DEVICE, + this_start_time - start_time, + time - start_time, + lap_name); + } + } + + void decodeRecord(const FitMessage &def, int time_offset, + const std::vector& values) { + time_t time = 0; + if (time_offset == 0) // Damien : I have to confirm this... + last_reference_time = last_time; + if (time_offset > -1) + time = last_reference_time + time_offset; // was last_time + time_offset + + double alt = last_altitude, cad = 0, km = 0, hr = 0, lat = 0, lng = 0, badgps = 0, lrbalance = RideFile::NA; + double kph = 0, temperature = RideFile::NA, watts = 0, slope = 0, headwind = 0; + double leftTorqueEff = 0, rightTorqueEff = 0, leftPedalSmooth = 0, rightPedalSmooth = 0; + + double leftPedalCenterOffset = 0; + double rightPedalCenterOffset = 0; + double leftTopDeathCenter = 0; + double rightTopDeathCenter = 0; + double leftBottomDeathCenter = 0; + double rightBottomDeathCenter = 0; + double leftTopPeakPowerPhase = 0; + double rightTopPeakPowerPhase = 0; + double leftBottomPeakPowerPhase = 0; + double rightBottomPeakPowerPhase = 0; + + double rvert = 0, rcad = 0, rcontact = 0; + double smO2 = 0, tHb = 0; + //bool run=false; + + XDataPoint *p_deve = NULL; + XDataPoint *p_extra = NULL; + + fit_value_t lati = NA_VALUE, lngi = NA_VALUE; + int i = 0; + foreach(const FitField &field, def.fields) { + FitValue _values = values[i]; + fit_value_t value = values[i].v; + QList valueList = values[i++].list; + + double deve_value = 0.0; + + if( _values.type == SingleValue && value == NA_VALUE ) + continue; + + int native_num = field.num; + bool native_profile = true; + + if (field.deve_idx>-1) { + QString key = QString("%1.%2").arg(field.deve_idx).arg(field.num); + //qDebug() << "deve_idx" << field.deve_idx << "num" << field.num << "type" << field.type; + //qDebug() << "name" << local_deve_fields[key].name.c_str() << "unit" << local_deve_fields[key].unit.c_str() << local_deve_fields[key].offset << "(" << _values.v << _values.f << ")"; + + if (record_deve_native_fields.contains(key) && !record_native_fields.contains(record_deve_native_fields[key])) { + native_num = record_deve_native_fields[key]; + + int scale = local_deve_fields[key].scale; + if (scale == -1) + scale = 1; + int offset = local_deve_fields[key].offset; + if (offset == -1) + offset = 0; + + switch (_values.type) { + case SingleValue: deve_value=_values.v/(float)scale+offset; break; + case FloatValue: deve_value=_values.f/(float)scale+offset; break; + default: deve_value = 0.0; break; + } + + // For compatibility with old Moxy deve Fields (with the native profile) + if (_values.type == SingleValue && (native_num == 54 || native_num == 57) ) + native_profile = true; + else + native_profile = false;// Now Dynastream decided to use float values for CIQ + + //qDebug() << "deve_value" << deve_value << native_profile; + } + else + native_num = -1; + + //qDebug()<< "native_num"<-1) { + + switch (native_num) { + case 253: // TIMESTAMP + time = value + qbase_time.toTime_t(); + // Time MUST NOT go backwards + // You canny break the laws of physics, Jim + if (time < last_time) + time = last_time; // Not true for Bryton + break; + case 0: // POSITION_LAT + lati = value; + break; + case 1: // POSITION_LONG + lngi = value; + break; + case 2: // ALTITUDE + case 78:// ENHANCED ALTITUDE + if (!native_profile && field.deve_idx>-1) + alt = deve_value; + else + alt = value / 5.0 - 500.0; + break; + case 3: // HEART_RATE + hr = value; + break; + case 4: // CADENCE + if (rideFile->getTag("Sport", "Bike") == "Run") + rcad = value; + else + cad = value; + break; + + case 5: // DISTANCE + km = value / 100000.0; + break; + case 6: // SPEED + case 73:// ENHANCED SPEED + kph = value * 3.6 / 1000.0; + break; + case 7: // POWER + watts = value; + break; + case 8: break; // packed speed/dist + case 9: // GRADE + slope = value / 100.0; + break; + case 10: //resistance = value; + break; + case 11: //time_from_course = value / 1000.0; + break; + case 12: break; // "cycle_length" + case 13: // TEMPERATURE + temperature = value; + break; + case 29: // ACCUMULATED_POWER + break; + case 30: //LEFT_RIGHT_BALANCE + // When bit 7 is 1 value are right power contribution + // not '1' the location of the contribution is undefined + if (value & 0x80) + lrbalance = 100 - (value & 0x7F); + else + lrbalance = RideFile::NA; + break; + case 31: // GPS Accuracy + break; + + case 32: // VERTICAL_SPEED + native_num = -1; + break; + + case 39: // VERTICAL OSCILLATION + if (!native_profile && field.deve_idx>-1) + rvert = deve_value; + else + rvert = value / 100.0f; + break; + + case 40: // GROUND CONTACT TIME PERCENT + native_num = -1; + break; + + case 41: // GROUND CONTACT TIME + if (!native_profile && field.deve_idx>-1) + rcontact = deve_value; + else + rcontact = value / 10.0f; + break; + + case 42: // ACTIVITY_TYPE + native_num = -1; + break; + + case 43: // LEFT_TORQUE_EFFECTIVENESS + leftTorqueEff = value / 2.0; + break; + case 44: // RIGHT_TORQUE_EFFECTIVENESS + rightTorqueEff = value / 2.0; + break; + case 45: // LEFT_PEDAL_SMOOTHNESS + leftPedalSmooth = value / 2.0; + break; + case 46: // RIGHT_PEDAL_SMOOTHNESS + rightPedalSmooth = value / 2.0; + break; + case 47: // COMBINED_PEDAL_SMOOTHNES + //qDebug() << "COMBINED_PEDAL_SMOOTHNES" << value; + // --> XDATA + native_num = -1; + break; + case 53: // RUNNING CADENCE FRACTIONAL VALUE + if (rideFile->getTag("Sport", "Bike") == "Run") + rcad += value/128.0f; + else + cad += value/128.0f; + break; + case 54: // tHb + if (!native_profile && field.deve_idx>-1) { + tHb = deve_value; + } + else + tHb= value/100.0f; + break; + case 57: // SMO2 + if (!native_profile && field.deve_idx>-1) { + smO2 = deve_value; + } + else + smO2= value/10.0f; + break; + case 61: // ? GPS Altitude ? or atmospheric pressure ? + break; + case 66: // ?? + break; + case 67: // ? Left Platform Center Offset ? + leftPedalCenterOffset = value; + break; + case 68: // ? Right Platform Center Offset ? + rightPedalCenterOffset = value; + break; + case 69: // ? Left Power Phase ? + leftTopDeathCenter = round(valueList.at(0) * 360.0/256); + leftBottomDeathCenter = round(valueList.at(1) * 360.0/256); + + if (leftTopDeathCenter>360) { + leftTopDeathCenter = 0; + } + if (leftBottomDeathCenter>360) { + leftBottomDeathCenter = 0; + } + break; + case 70: // ? Left Peak Phase ? + leftTopPeakPowerPhase = round(valueList.at(0) * 360.0/256); + leftBottomPeakPowerPhase = round(valueList.at(1) * 360.0/256); + + if (leftTopPeakPowerPhase>360) { + leftTopPeakPowerPhase = 0; + } + if (leftBottomPeakPowerPhase>360) { + leftBottomPeakPowerPhase = 0; + } + break; + case 71: // ? Right Power Phase ? + rightTopDeathCenter = round(valueList.at(0) * 360.0/256); + rightBottomDeathCenter = round(valueList.at(1) * 360.0/256); + + if (rightTopDeathCenter>360) { + rightTopDeathCenter = 0; + } + if (rightBottomDeathCenter>360) { + rightBottomDeathCenter = 0; + } + break; + case 72: // ? Right Peak Phase ? + rightTopPeakPowerPhase = round(valueList.at(0) * 360.0/256); + rightBottomPeakPowerPhase = round(valueList.at(1) * 360.0/256); + + if (rightTopPeakPowerPhase>360) { + rightTopPeakPowerPhase = 0; + } + if (rightBottomPeakPowerPhase>360) { + rightBottomPeakPowerPhase = 0; + } + break; + case 81: // BATTERY_SOC + native_num = -1; + break; + case 83: // VERTICAL_RATIO + native_num = -1; + break; + case 84: // Left right balance + lrbalance = value/100.0; + break; + case 85: // STEP_LENGTH + native_num = -1; + break; + case 87: // ??? + break; + case 90: // PERFORMANCE_CONDITION + native_num = -1; + break; + case 108: // to confirm : RESPIRATIONRATE + native_num = -1; + break; + case 114: // MTB Dynamics - Grit + native_num = -1; + break; + case 115: // MTB Dynamics - Flow + native_num = -1; + break; + case 116: // Stress + native_num = -1; + break; + case 133: // Pulse Ox + native_num = -1; + break; + default: + unknown_record_fields.insert(native_num); + native_num = -1; + } + } + + if (native_num == -1) { + // native, deve_native or deve to record. + + int idx = -1; + + if (field.deve_idx>-1) { + QString key = QString("%1.%2").arg(field.deve_idx).arg(field.num); + FitFieldDefinition deveField = local_deve_fields[key]; + + if (!record_deve_fields.contains(key)) { + addRecordDeveField(key, deveField, true); + } else { + if (record_deve_fields[key] == -1) { + addRecordDeveField(key, deveField, true); + } + } + idx = record_deve_fields[key]; + + if (idx>-1) { + if (p_deve == NULL && + (_values.type == SingleValue || + _values.type == FloatValue || + _values.type == StringValue)) + p_deve = new XDataPoint(); + + int scale = deveField.scale; + if (scale == -1) + scale = 1; + int offset = deveField.offset; + if (offset == -1) + offset = 0; + + switch (_values.type) { + case SingleValue: p_deve->number[idx]=_values.v/(float)scale+offset; break; + case FloatValue: p_deve->number[idx]=_values.f/(float)scale+offset; break; + case StringValue: p_deve->string[idx]=_values.s.c_str(); break; + default: break; + } + } + } else { + // Store standard native ignored + if (!record_extra_fields.contains(field.num)) { + RideFile::SeriesType series = getSeriesForNative(field.num); + QString nativeName = rideFile->symbolForSeries(series); + + if (nativeName.length() == 0) + nativeName = getNameForExtraNative(field.num); + + extraXdata->valuename << nativeName; + extraXdata->unitname << ""; + + //dataInfos.append(QString("EXTRA %1").arg(nativeName)); + + record_extra_fields.insert(field.num, record_extra_fields.count()); + } + idx = record_extra_fields[field.num]; + + if (idx>-1) { + float scale = getScaleForExtraNative(field.num); + int offset = getOffsetForExtraNative(field.num); + + if (p_extra == NULL && + (_values.type == SingleValue || + _values.type == FloatValue || + _values.type == StringValue)) + p_extra = new XDataPoint(); + + switch (_values.type) { + case SingleValue: p_extra->number[idx]=_values.v/scale+offset; break; + case FloatValue: p_extra->number[idx]=_values.f/scale+offset; break; + case StringValue: p_extra->string[idx]=_values.s.c_str(); break; + default: break; + } + } + + } + + + } else { + if (field.deve_idx>-1) { + QString key = QString("%1.%2").arg(field.deve_idx).arg(field.num); + FitFieldDefinition deveField = local_deve_fields[key]; + + if (!record_deve_fields.contains(key)) { + addRecordDeveField(key, deveField, false); + } + } + } + } + + //if (time == last_time) + // return; // Not true for Bryton + + if (stopped) { + // As it turns out, this happens all the time in some FIT files. + // Since we don't really understand the meaning, don't make noise. + /* + errors << QString("At %1 seconds, time is stopped, but got record " + "anyway. Ignoring it. Last event type was " + "%2 for event %3.").arg(time-start_time).arg(last_event_type).arg(last_event); + return; + */ + } + if (lati != NA_VALUE && lngi != NA_VALUE) { + lat = lati * 180.0 / 0x7fffffff; + lng = lngi * 180.0 / 0x7fffffff; + } else + { + // If lat/lng are missng, set to 0/0 and fill point from last point as 0/0) + lat = 0; + lng = 0; + badgps = 1; + } + if (start_time == 0) { + start_time = time - 1; // recording interval? + last_reference_time = start_time; + QDateTime t; + t.setTime_t(start_time); + rideFile->setStartTime(t); + } + + //printf( "point time=%d lat=%.2lf lon=%.2lf alt=%.1lf hr=%.0lf " + // "cad=%.0lf km=%.1lf kph=%.1lf watts=%.0lf grade=%.1lf " + // "resist=%.1lf off=%.1lf temp=%.1lf\n", + // time, lat, lng, alt, hr, + // cad, km, kph, watts, grade, + // resistance, time_from_course, temperature ); + double secs = time - start_time; + double nm = 0; + + int interval = 0; + // if there are data points && a time difference > 1sec && smartRecording processing is requested at all + if ((!rideFile->dataPoints().empty()) && (last_time != 0) && + (time > last_time + 1) && (isGarminSmartRecording.toInt() != 0)) { + // Handle smart recording if configured in preferences. Linearly interpolate missing points. + RideFilePoint *prevPoint = rideFile->dataPoints().back(); + double deltaSecs = (secs - prevPoint->secs); + //assert(deltaSecs == secs - prevPoint->secs); // no fractional part -- don't CRASH FFS, be graceful + // This is only true if the previous record was of type record: + //assert(deltaSecs == time - last_time); -- don't CRASH FFS, be graceful + // If the last lat/lng was missing (0/0) then all points up to lat/lng are marked as 0/0. + if (prevPoint->lat == 0 && prevPoint->lon == 0 ) { + badgps = 1; + } + double deltaCad = cad - prevPoint->cad; + double deltaHr = hr - prevPoint->hr; + double deltaDist = km - prevPoint->km; + if (km < 0.00001) deltaDist = 0.000f; // effectively zero distance + double deltaSpeed = kph - prevPoint->kph; + double deltaTorque = nm - prevPoint->nm; + double deltaPower = watts - prevPoint->watts; + double deltaAlt = alt - prevPoint->alt; + double deltaLon = lng - prevPoint->lon; + double deltaLat = lat - prevPoint->lat; + // double deltaHeadwind = headwind - prevPoint->headwind; + double deltaSlope = slope - prevPoint->slope; + double deltaLeftRightBalance = lrbalance - prevPoint->lrbalance; + double deltaLeftTE = leftTorqueEff - prevPoint->lte; + double deltaRightTE = rightTorqueEff - prevPoint->rte; + double deltaLeftPS = leftPedalSmooth - prevPoint->lps; + double deltaRightPS = rightPedalSmooth - prevPoint->rps; + double deltaLeftPedalCenterOffset = leftPedalCenterOffset - prevPoint->lpco; + double deltaRightPedalCenterOffset = rightPedalCenterOffset - prevPoint->rpco; + double deltaLeftTopDeathCenter = leftTopDeathCenter - prevPoint->lppb; + double deltaRightTopDeathCenter = rightTopDeathCenter - prevPoint->rppb; + double deltaLeftBottomDeathCenter = leftBottomDeathCenter - prevPoint->lppe; + double deltaRightBottomDeathCenter = rightBottomDeathCenter - prevPoint->rppe; + double deltaLeftTopPeakPowerPhase = leftTopPeakPowerPhase - prevPoint->lpppb; + double deltaRightTopPeakPowerPhase = rightTopPeakPowerPhase - prevPoint->rpppb; + double deltaLeftBottomPeakPowerPhase = leftBottomPeakPowerPhase - prevPoint->lpppe; + double deltaRightBottomPeakPowerPhase = rightBottomPeakPowerPhase - prevPoint->rpppe; + double deltaSmO2 = smO2 - prevPoint->smo2; + double deltaTHb = tHb - prevPoint->thb; + double deltarvert = rvert - prevPoint->rvert; + double deltarcad = rcad - prevPoint->rcad; + double deltarcontact = rcontact - prevPoint->rcontact; + + // only smooth the maximal smart recording gap defined in preferences - we don't want to crash / stall on bad + // or corrupt files + if (deltaSecs > 0 && deltaSecs < GarminHWM.toInt()) { + + for (int i = 1; i < deltaSecs; i++) { + double weight = i /deltaSecs; + rideFile->appendPoint( + prevPoint->secs + (deltaSecs * weight), + prevPoint->cad + (deltaCad * weight), + prevPoint->hr + (deltaHr * weight), + prevPoint->km + (deltaDist * weight), + prevPoint->kph + (deltaSpeed * weight), + prevPoint->nm + (deltaTorque * weight), + prevPoint->watts + (deltaPower * weight), + prevPoint->alt + (deltaAlt * weight), + (badgps == 1) ? 0 : prevPoint->lon + (deltaLon * weight), + (badgps == 1) ? 0 : prevPoint->lat + (deltaLat * weight), + 0.0, // headwind + prevPoint->slope + (deltaSlope * weight), + temperature, + (lrbalance!=RideFile::NA && prevPoint->lrbalance!=RideFile::NA) ? prevPoint->lrbalance + (deltaLeftRightBalance * weight) : RideFile::NA, // interpolate between valid values only + prevPoint->lte + (deltaLeftTE * weight), + prevPoint->rte + (deltaRightTE * weight), + prevPoint->lps + (deltaLeftPS * weight), + prevPoint->rps + (deltaRightPS * weight), + prevPoint->lpco + (deltaLeftPedalCenterOffset * weight), + prevPoint->rpco + (deltaRightPedalCenterOffset * weight), + prevPoint->lppb + (deltaLeftTopDeathCenter * weight), + prevPoint->rppb + (deltaRightTopDeathCenter * weight), + prevPoint->lppe + (deltaLeftBottomDeathCenter * weight), + prevPoint->rppe + (deltaRightBottomDeathCenter * weight), + prevPoint->lpppb + (deltaLeftTopPeakPowerPhase * weight), + prevPoint->rpppb + (deltaRightTopPeakPowerPhase * weight), + prevPoint->lpppe + (deltaLeftBottomPeakPowerPhase * weight), + prevPoint->rpppe + (deltaRightBottomPeakPowerPhase * weight), + prevPoint->smo2 + (deltaSmO2 * weight), + prevPoint->thb + (deltaTHb * weight), + prevPoint->rvert + (deltarvert * weight), + prevPoint->rcad + (deltarcad * weight), + prevPoint->rcontact + (deltarcontact * weight), + 0.0, // tcore + interval); + } + } + } + + if (km < 0.00001f) km = last_distance; + rideFile->appendOrUpdatePoint(secs, cad, hr, km, kph, nm, watts, alt, lng, lat, headwind, slope, temperature, + lrbalance, leftTorqueEff, rightTorqueEff, leftPedalSmooth, rightPedalSmooth, + leftPedalCenterOffset, rightPedalCenterOffset, + leftTopDeathCenter, rightTopDeathCenter, leftBottomDeathCenter, rightBottomDeathCenter, + leftTopPeakPowerPhase, rightTopPeakPowerPhase, leftBottomPeakPowerPhase, rightBottomPeakPowerPhase, + smO2, tHb, rvert, rcad, rcontact, 0.0, interval, false); + + last_time = time; + last_distance = km; + last_altitude = alt; + + if (p_deve != NULL) { + p_deve->secs = secs; + deveXdata->datapoints.append(p_deve); + } + if (p_extra != NULL) { + p_extra->secs = secs; + extraXdata->datapoints.append(p_extra); + } + } + + void decodeLength(const FitMessage &def, int time_offset, + const std::vector& values) { + if (!isLapSwim) { + isLapSwim = true; + last_length = 0.0; + } + time_t time = 0; + if (time_offset > 0) + time = last_time + time_offset; + + int length_type = 0; + int swim_stroke = 0; + int total_strokes = 0; + double length_duration = 0.0; + + int i = 0; + foreach(const FitField &field, def.fields) { + fit_value_t value = values[i++].v; + + if( value == NA_VALUE ) + continue; + + switch (field.num) { + case 0: // event + if (FIT_DEBUG && FIT_DEBUG_LEVEL>2) qDebug() << " event:" << value; + break; + case 1: // event type + if (FIT_DEBUG && FIT_DEBUG_LEVEL>2) qDebug() << " event_type:" << value; + break; + case 2: // start time + time = value + qbase_time.toTime_t(); + // Time MUST NOT go backwards + // You canny break the laws of physics, Jim + + if (time < last_length) + time = last_length; + break; + case 3: // total elapsed time + if (FIT_DEBUG && FIT_DEBUG_LEVEL>2) qDebug() << " total_elapsed_time:" << value; + break; + case 4: // total timer time + length_duration = value / 1000.0; + break; + case 5: // total strokes + total_strokes = value; + break; + case 6: // avg speed + // kph = value * 3.6 / 1000.0; + break; + case 7: // swim stroke: 0-free, 1-back, 2-breast, 3-fly, + // 4-drill, 5-mixed, 6-IM + swim_stroke = value; + break; + case 9: // cadence + // cad = value; + break; + case 11: // total_calories + if (FIT_DEBUG && FIT_DEBUG_LEVEL>2) qDebug() << " total_calories:" << value; + break; + case 12: // length type: 0-rest, 1-strokes + length_type = value; + break; + case 254: // message_index + if (FIT_DEBUG && FIT_DEBUG_LEVEL>2) qDebug() << " message_index:" << value; + break; + default: + unknown_record_fields.insert(field.num); + } + } + + if (length_duration > 0) { + XDataPoint *p = new XDataPoint(); + p->secs = last_length; + p->km = last_distance; + p->number[0] = length_type + swim_stroke; + p->number[1] = length_duration; + p->number[2] = total_strokes; + + swimXdata->datapoints.append(p); + } + + if (last_length == 0) { + start_time = time - 1; // recording interval? + last_reference_time = start_time; + QDateTime t; + t.setTime_t(start_time); + rideFile->setStartTime(t); + interval = 1; + } + + last_length += length_duration; + + } + + /* weather broadcast as observed at weather station (undocumented) */ + void decodeWeather(const FitMessage &def, int time_offset, + const std::vector& values) { + Q_UNUSED(time_offset); + + time_t time = 0; + if (time_offset > 0) + time = last_time + time_offset; + double windHeading = 0.0, windSpeed = 0.0, temp = 0.0, humidity = 0.0; + + int i = 0; + foreach(const FitField &field, def.fields) { + fit_value_t value = values[i++].v; + + if( value == NA_VALUE ) + continue; + + switch (field.num) { + case 253: // Timestamp + time = value + qbase_time.toTime_t(); + break; + case 8: // Weather station name + // ignored + break; + case 9: // Weather observation timestamp + // ignored + break; + case 10: // Weather station latitude + // ignored + break; + case 11: // Weather station longitude + // ignored + break; + case 3: // Wind heading (0deg=North) + windHeading = value ; // 180.0 * MATHCONST_PI; + break; + case 4: // Wind speed (mm/s) + windSpeed = value * 0.0036; // km/h + break; + case 1: // Temperature + temp = value; + break; + case 7: // Humidity + humidity = value; + break; + default: ; // ignore it + } + } + + double secs = time - start_time; + XDataPoint *p = new XDataPoint(); + p->secs = secs; + p->km = last_distance; + p->number[0] = windSpeed; + p->number[1] = windHeading; + p->number[2] = temp; + p->number[3] = humidity; + + weatherXdata->datapoints.append(p); + } + + void decodeHr(const FitMessage &def, int time_offset, + const std::vector& values) { + time_t time = 0; + if (time_offset > 0) { + time = last_time + time_offset; + } + + QList timestamps; + QList hr; + QList rr; + + int a = 0; + int j = 0; + foreach(const FitField &field, def.fields) { + FitValue value = values[a++]; + + if( value.type == SingleValue && value.v == NA_VALUE ) + continue; + + switch (field.num) { + case 253: // Timestamp + time = value.v + qbase_time.toTime_t(); + break; + case 0: // fractional_timestamp + break; + case 1: // time256 + break; + case 6: // filtered_bpm + if (value.type == SingleValue) { + hr.append(value.v); + } + else { + for (int i=0;i 0) start_timestamp = time-last_event_timestamp/1024.0; + timestamps.append(last_event_timestamp/1024.0); + last_RR=last_event_timestamp; + break; + case 10: // event_timestamp_12 + j=0; + for (int i=0;i> 4); + last_event_timestamp = (last_event_timestamp & 0xFFFFF000) + next_event_timestamp12; + i++; + } + if (next_event_timestamp12 < last_event_timestamp12) + last_event_timestamp += 0x1000; + + timestamps.append(last_event_timestamp/1024.0); + j++; + + rr.append((last_event_timestamp/1024.0-last_RR/1024.0)*1000); // R-R in ms + last_RR=last_event_timestamp; + } + + break; + + default: ; // ignore it + } + } + + // Garmin HR-Swim belt with internal memory + if (timestamps.count()>0 && timestamps.count()==rr.count() && timestamps.count()==hr.count()) { + // start from i=1 as we cannot determine R-R for the very first heart beat + for (int i=1;i=0 && rr.at(i)!=0) { + XDataPoint *p = new XDataPoint(); + p->secs = secs; + p->number[0] = rr.at(i); + hrvXdata->datapoints.append(p); + } + } + } + + for (int i=0;i0) { + int idx = rideFile->timeIndex(round(secs)); + + if (idx < 0 || rideFile->dataPoints().at(idx)->secs==secs) + rideFile->appendOrUpdatePoint( + secs, 0.0, hr.at(i), + 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, RideFile::NA, RideFile::NA, + 0.0, 0.0, + 0.0, 0.0, + 0.0, 0.0, + 0.0, 0.0, + 0.0, 0.0, + 0.0, 0.0, + 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0, false); + } + } + } + + void decodeDeviceSettings(const FitMessage &def, int time_offset, + const std::vector& values) { + Q_UNUSED(time_offset); + int i = 0; + foreach(const FitField &field, def.fields) { + fit_value_t value = values[i++].v; + + if( value == NA_VALUE ) + continue; + + switch (field.num) { + case 0: // Active timezone + // ignored + break; + case 1: // UTC offset + // ignored + break; + case 5: // timezone offset + // ignored + break; + default: ; // ignore it + } + } + } + + void decodeSegment(const FitMessage &def, int time_offset, + const std::vector& values) { + time_t time = 0; + if (time_offset > 0) + time = last_time + time_offset; + else + time = last_time; + + int i = 0; + time_t this_start_time = 0; + ++interval; + + QString segment_name; + bool fail = false; + + foreach(const FitField &field, def.fields) { + const FitValue& value = values[i++]; + + if( value.type != StringValue && value.v == NA_VALUE ) + continue; + + if (FIT_DEBUG && FIT_DEBUG_LEVEL>3) { + fprintf (stderr, "\tfield: num: %d ", field.num); + DumpFitValue(value); + } + + switch (field.num) { + case 253: // Message timestamp + time = value.v + qbase_time.toTime_t(); + break; + case 2: // start timestamp ? + this_start_time = value.v + qbase_time.toTime_t(); + break; + case 3: // start latitude + // ignored + break; + case 4: // start longitude + // ignored + break; + case 5: // end latitude + // ignored + break; + case 6: // end longitude + // ignored + break; + case 7: // personal best (ms) ? segment elapsed time from this activity (ms) ? + // => depends on file / device / version ? + // FIXME: to be investigated/confirmed. + // total_elapsed_time = round(value.v / 1000.0); + break; + case 8: // challenger best (ms) ? segment total timer time from this activity (ms) ? + // => depends on file / device / version ? + // FIXME: to be investigated/confirmed. + // ignored + break; + case 9: // leader best (ms) ? segment distance ? FIXME : to be investigated. + // => depends on file / device / version ? + //not used XXX total_distance = value.v / 100000.0; + break; + case 10: // personal rank ? to be confirmed + // ignored + break; + case 25: // north-east latitude (bounding box) + // ignored + break; + case 26: // north-east longitude + // ignored + break; + case 27: // south-west latitude + // ignored + break; + case 28: // south-west longitude + // ignored + break; + case 29: // Segment name + segment_name = QString(value.s.c_str()); + if (FIT_DEBUG && FIT_DEBUG_LEVEL>4) { + fprintf(stderr, "Found segment name: %s\n", segment_name.toStdString().c_str()); + } + break; + case 64: // status + fail = (value.v == 1); + break; + + case 33: /* undocumented, ignored */ break; + case 71: /* undocumented, ignored */ break; + case 75: /* undocumented, ignored */ break; + case 76: /* undocumented, ignored */ break; + case 77: /* undocumented, ignored */ break; + case 78: /* undocumented, ignored */ break; + case 79: /* undocumented, ignored */ break; + case 80: /* undocumented, ignored */ break; + case 254: /* message counter idx, ignored */ break; + case 11: /* undocumented, ignored */ break; + case 12: /* undocumented, ignored */ break; + case 13: /* undocumented, ignored */ break; + case 14: /* undocumented, ignored */ break; + case 19: /* undocumented, ignored */ break; + case 20: /* undocumented, ignored */ break; + case 21: /* total ascent ? ignored */ break; + case 22: /* total descent ? ignored */ break; + case 30: /* undocumented, ignored */ break; + case 31: /* undocumented, ignored */ break; + case 69: /* undocumented, ignored */ break; + case 70: /* undocumented, ignored */ break; + case 72: /* undocumented, ignored */ break; + case 0: /* undocumented, ignored */ break; + case 1: /* undocumented, ignored */ break; + case 15: /* undocumented (HR?), ignored */ break; + case 16: /* undocumented (HR?), ignored */ break; + case 17: /* undocumented (cadence?), ignored */ break; + case 18: /* undocumented (cadence?), ignored */ break; + case 23: /* undocumented, ignored */ break; + case 24: /* undocumented, ignored */ break; + case 32: /* undocumented, ignored */ break; + case 58: /* undocumented, ignored */ break; + case 59: /* undocumented, ignored */ break; + case 60: /* undocumented, ignored */ break; + case 61: /* undocumented, ignored */ break; + case 62: /* undocumented, ignored */ break; + case 63: /* undocumented, ignored */ break; + case 65: // Segment UID + // ignored + break; + case 66: /* undocumented, ignored */ break; + case 67: /* undocumented, ignored */ break; + case 68: /* undocumented, ignored */ break; + case 73: /* undocumented, ignored */ break; + case 74: /* undocumented, ignored */ break; + case 81: /* undocumented, ignored */ break; + case 82: /* undocumented, ignored */ break; + default: ; // ignore it + } + } + + if (fail) { // Segment started but not ended + // no interval + return; + } + + if (this_start_time == 0 || this_start_time-start_time < 0) { + //errors << QString("lap %1 has invalid start time").arg(interval); + this_start_time = start_time; // time was corrected after lap start + + if (time == 0 || time-start_time < 0) { + errors << QString("lap %1 is ignored (invalid end time)").arg(interval); + return; + } + } + if (rideFile->dataPoints().count()) { // no samples means no laps.. + if (segment_name == "") segment_name = QObject::tr("Lap %1").arg(interval); + rideFile->addInterval(RideFileInterval::DEVICE, this_start_time - start_time, time - start_time, segment_name); + } + + } + + void decodeUserProfile(const FitMessage &def, int time_offset, + const std::vector& values) { + Q_UNUSED(time_offset); + int i = 0; + foreach(const FitField &field, def.fields) { + fit_value_t value = values[i++].v; + + if( value == NA_VALUE ) + continue; + + switch (field.num) { + case 4: // Weight + active_session_["Weight"] = QString::number(value / 10.0 ); + rideFile->setTag("Weight", QString::number(value / 10.0 )); + break; + default: ; // ignore it + } + } + } + + + void decodeDeveloperID(const FitMessage &def, int time_offset, + const std::vector& values) { + Q_UNUSED(time_offset); + + FitDeveApp deve; + + // 0 developer_id byte + // 1 application_id byte + // 2 manufacturer_id manufacturer + // 3 developer_data_index uint8 + // 4 application_version uint32 + + int i = 0; + foreach(const FitField &field, def.fields) { + FitValue value = values[i++]; + + if (FIT_DEBUG && FIT_DEBUG_LEVEL>2) + qDebug() << "deveID : num" << field.num << value.v << value.s.c_str(); + + fit_string_value dev_id = ""; + + switch (field.num) { + case 0: // developer_id + dev_id = ""; + + foreach(fit_value_t val, value.list) { + + if (val != NA_VALUE) { + std::stringstream sstream; + sstream << std::hex << val; + if (val<16) + dev_id += "0"; + dev_id += sstream.str(); + } + } + if (dev_id.length()>=20) { + dev_id.insert(8, "-"); + dev_id.insert(13, "-"); + dev_id.insert(18, "-"); + dev_id.insert(23, "-"); + } + if (FIT_DEBUG && FIT_DEBUG_LEVEL>2) + qDebug() << "developer_id" << dev_id.c_str(); + deve.dev_id = dev_id; + break; + case 1: // application_id + dev_id = ""; + + foreach(fit_value_t val, value.list) { + + if (val != NA_VALUE) { + std::stringstream sstream; + sstream << std::hex << val; + if (val<16) + dev_id += "0"; + dev_id += sstream.str(); + } + } + if (dev_id.length()>=20) { + dev_id.insert(8, "-"); + dev_id.insert(13, "-"); + dev_id.insert(18, "-"); + dev_id.insert(23, "-"); + } + + if (FIT_DEBUG && FIT_DEBUG_LEVEL>2) + qDebug() << "application_id" << dev_id.c_str(); + deve.app_id = dev_id; + break; + case 2: // manufacturer_id + deve.man_id = value.v; + break; + case 3: // developer_data_index + deve.dev_data_id = value.v; + break; + case 4: deve.app_version = value.v; + break; + default: + // ignore it + break; + } + } + + if (FIT_DEBUG && FIT_DEBUG_LEVEL>2) + qDebug() << "DEVE ID" << deve.dev_id.c_str() << "app_id" << deve.app_id.c_str() << "man_id" << deve.man_id << "dev_data_id" << deve.dev_data_id << "app_version" << deve.app_version; + + if (!local_deve_fields_app.contains(deve.dev_data_id)) { + local_deve_fields_app.insert(deve.dev_data_id, deve); + } + } + + void decodeDeveloperFieldDescription(const FitMessage &def, int time_offset, + const std::vector& values) { + Q_UNUSED(time_offset); + int i = 0; + + FitFieldDefinition fieldDef; + fieldDef.scale = -1; + fieldDef.offset = -1; + fieldDef.native = -1; + + foreach(const FitField &field, def.fields) { + FitValue value = values[i++]; + + switch (field.num) { + case 0: // developer_data_index + fieldDef.dev_id = value.v; + break; + case 1: // field_definition_number + fieldDef.num = value.v; + break; + case 2: // fit_base_type_id + fieldDef.type = value.v & 0x1F; // FIX applied in refactor + break; + case 3: // field_name + fieldDef.name = value.s; + break; + case 4: // array + break; + case 5: // components + break; + case 6: // scale + if (value.v == NA_VALUE) fieldDef.scale = -1; // FIX applied in refactor + else fieldDef.scale = value.v; + break; + case 7: // offset + if (value.v == NA_VALUE) fieldDef.offset = -1; // FIX applied in refactor + else fieldDef.offset = value.v; + break; + case 8: // units + fieldDef.unit = value.s; + break; + case 9: // bits + case 10: // accumulate + case 13: // fit_base_unit_id + case 14: // native_mesg_num + break; + case 15: // native field number + if (value.v == NA_VALUE) fieldDef.native = -1; // FIX applied in refactor + else fieldDef.native = value.v; + break; + default: + // ignore it + break; + } + } + + if (FIT_DEBUG && FIT_DEBUG_LEVEL>0) { + // always show these regardless of debug level + fprintf(stderr,"** Developer Field Definition Added '%s' num %d Developer id %d type %s native %d unit %s scale %f offset %d\n", + fieldDef.name.c_str(), + fieldDef.num, + fieldDef.dev_id, + fitBaseTypeDesc(fieldDef.type).toStdString().c_str(), + fieldDef.native, + fieldDef.unit.c_str(), + fieldDef.scale, + fieldDef.offset); + } + + QString key = QString("%1.%2").arg(fieldDef.dev_id).arg(fieldDef.num); + + if (!local_deve_fields.contains(key)) { + local_deve_fields.insert((key), fieldDef); + } + + if (fieldDef.native > -1 && !record_deve_native_fields.values().contains(fieldDef.native)) { + record_deve_native_fields.insert(key, fieldDef.native); + + /*RideFile::SeriesType series = getSeriesForNative(fieldDef.native); + + if (series != RideFile::none) { + QString nativeName = rideFile->symbolForSeries(series); + dataInfos.append(QString("NATIVE %1 : Field %2").arg(nativeName).arg(fieldDef.name.c_str())); + }*/ + } + } + + // + // FIT FILE EXECUTIVE FUNCTIONS AND RECORD READING + // + // The executive functions that read FIT protocol records and + // create the top-level data structures used by the decoders + // listed above + // + // read_header() + // read_record() + // run() - start the parser ! + // + // + + + // + // + // The FIT header is either + // + // 12 bytes long- for the original FIT file protocol + // 14 bytes long- for the current FIT file protocol (includes a header CRC) + // >14 bytes long- it is for a later protocol + // + // As of November 2023 the FIT protocol is v32 + // + void read_header(bool &stop, QStringList &errors, int &data_size) { + + stop = false; + try { + + // read the header- make sure its 12 or 14 bytes long as that's all we know about + int header_size = read_uint8(); + if (header_size != 12 && header_size != 14) { + errors << QString("bad header size: %1 (we only support 12 or 14)").arg(header_size); + stop = true; + } + + // protocol version should be 1 or 2 + int protocol_version = read_uint8(); + (void) protocol_version; + + // if the header size is 14 we have profile minor then profile major + // version. We still don't do anything with this information + int profile_version = read_uint16(false); // always littleEndian + (void) profile_version; + //qDebug() << "profile_version" << profile_version/100.0; // not sure what to do with this + + // we always start with version info if debug is on + if (FIT_DEBUG) fprintf(stderr, "FIT Protocol Version %d, Profile Version %d\n", protocol_version, profile_version); + + // length of data section excluding the header and trailing CRC record + data_size = read_uint32(false); // always littleEndian + + // the chars ".FIT" for no other reason than it appears if you open + // the file in a text editor (they haven't heard of magic numbers) + char fit_str[5]; + if (file.read(fit_str, 4) != 4) { + errors << "truncated header"; + stop = true; + } + fit_str[4] = '\0'; + if (strcmp(fit_str, ".FIT") != 0) { + errors << QString("bad header, expected \".FIT\" but got \"%1\"").arg(fit_str); + stop = true; + } + + // read the rest of the header + int header_crc=0; + if (header_size == 14) { + header_crc = read_uint16(false); + } + Q_UNUSED(header_crc); // we don't check since its optional anyway + + } catch (TruncatedRead &e) { + Q_UNUSED(e) + errors << "truncated file header"; + stop = true; + } + } + + // + // Records are either: A Definition Record (defining a local message type, optionally including developer fields) + // A Data Record (as a local nessage type, stored in accordance with a previous definition record) + // + // This function parses definition records and stores the details in local_msg_types (Qmap) + // Or it parses data records and calls the relevant decodeXXXX function to work with the data extracted + // + int read_record(bool &stop, QStringList &errors) { + + stop = false; + int count = 0; + + // the header byte tells us what kind of record we are parsing + // + // Bit 7 0x80 0- Normal header 1- Compressed time record (only applies to data message) + // 6 0x40 0- Data Message or 1- Definition Message + // 5 0x20 When set in a definition message indicates that developer fields are included + // 4 0x10 Reserved (should be ignored) + // 0-3 0x0F (mask) Local Message Number (also referred to as type) + // + int header_byte = read_uint8(&count); + + // For some reason the header byte is being parsed differently inside this if clause + // this makes no sense but will not fix at this point *FIXME* + // + // The test for a definition record- is it normal (0x80) and a Definition message (0x40) + if (!(header_byte & 0x80) && (header_byte & 0x40)) { + + // + // LOCAL MESSAGE DEFINITION + // + + // lets get the local message number + int local_msg_num = header_byte & 0xf; + + // Do we also have developer fields in this definition ? + bool hasDeveloperFields = (header_byte & 0x20) == 0x20 ; + + // If the definition already exists it will be replaced + // with a blank new one, so re-defining as we go + local_msg_types.insert(local_msg_num, FitMessage()); + + // We get a reference to the newly created message definition to work with + FitMessage &def = local_msg_types[local_msg_num]; + + // + // A local message definition is comprised: + // + // Byte 1 Reserved (ignored) + // 2 Architecture 0- little-endian 1- big endian + // 3-4 Global Message Nunber (for semantics) + // 5 Number of fields that follow (n) + // + // 6 onwards n x Field Definitions + // + int reserved = read_uint8(&count); (void) reserved; // unused + def.is_big_endian = read_uint8(&count); + def.global_msg_num = read_uint16(def.is_big_endian, &count); + def.local_msg_num = local_msg_num; + int num_fields = read_uint8(&count); + + if (FIT_DEBUG && FIT_DEBUG_LEVEL>0) fprintf(stderr, "message definition: local=%d global=%d (%s) big endian=%d fields=%d\n", + def.local_msg_num, def.global_msg_num, fitMessageDesc(def.global_msg_num, false).toStdString().c_str(), + def.is_big_endian, num_fields ); + + + // + // Run through the field definitions that follow, comprised of + // + // Byte 1 Field Number + // 2 Field Size (also inferred from the base type next) + // 3 Base Type (see defn below) + // + // Base Type is comprised: + // + // Bit 7 0x80 Endianness (0- for single byte data, 1 for multi-byte) + // 5-6 0x60 (mask) Reserved (ignored) + // 0-4 0x1F (mask) Base type (max 32 types currently 17 defined in specs see FITBaseTypes above) + // + for (int i = 0; i < num_fields; ++i) { + + def.fields.push_back(FitField()); + FitField &field = def.fields.back(); + + field.num = read_uint8(&count); + field.size = read_uint8(&count); + int base_type = read_uint8(&count); + field.type = base_type & 0x1F; + field.deve_idx = -1; + + if (FIT_DEBUG && FIT_DEBUG_LEVEL>3) fprintf(stderr, " field %d: %d bytes, num %d, type %d, size %d\n", + i, field.size, field.num, field.type, field.size ); + } + + // Once all the standard field definitions have been read they will be followed + // by optional developer fields, these are indicated in the header (see + // hasDeveloperFields above) + // + // 1 Number of developer fields (m) + // 2 m x Developer Field Definitions if flag set in header + // + if (hasDeveloperFields) { + + // first byte is the number of fields defined + int num_fields = read_uint8(&count); + + // + // Run through the developer field references that follow, comprised of + // + // Byte 1 Developer Field Number + // 2 Field Size (also inferred from the base type next) + // 3 Developer ID (they start from 0) + // + // NOTE: the developer ID and field is not defined here, it is referenced by developer id + // and field number. The definition is parsed as a separate message type (206). + // See decodeDeveloperID and decodeDeveloperFieldDescription() for the details + // + for (int i = 0; i < num_fields; ++i) { + + def.fields.push_back(FitField()); + FitField &field = def.fields.back(); + + field.num = read_uint8(&count); + field.size = read_uint8(&count); + field.deve_idx = read_uint8(&count); + + QString key = QString("%1.%2").arg(field.deve_idx).arg(field.num); + FitFieldDefinition devField = local_deve_fields[key]; + field.type = devField.type; + + if (FIT_DEBUG && FIT_DEBUG_LEVEL>3) fprintf(stderr, " developer field %d: %d bytes, num %d, type %s, size %d\n", + i, field.size, field.num, fitBaseTypeDesc(field.type).toStdString().c_str(), field.size); + } + } + + } else { + + // + // LOCAL MESSAGE DATA + // + + int local_msg_num = 0; + int time_offset = -1; + + // + // Data records can contain a compressed time record, in which case + // .... + // + // In all cases, the rest of the record after the header byte + // contains the data stored according to the definition we decoded + // above + // + + // compressed time record? + if (header_byte & 0x80) { + local_msg_num = (header_byte >> 5) & 0x3; + time_offset = header_byte & 0x1f; + + } else { + + // normal data + local_msg_num = header_byte & 0xf; + } + + // lets check we have previously seen a definition record for + // the message we are now going to process, because if we haven't + // then there is no way we can deserialise the contents and will + // need to abort. + if (!local_msg_types.contains(local_msg_num)) { + errors << QString("local type %1 without previous definition").arg(local_msg_num); + stop = true; + return count; + } + + // lets get the previously stored definition + const FitMessage &def = local_msg_types[local_msg_num]; + + if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) { fprintf(stderr, "read_record message local=%d global=%d offset=%d\n", + local_msg_num, def.global_msg_num, time_offset ); } + + + // now we just work through the definition and extract the field values + // from the file directly + std::vector values; + foreach(const FitField &field, def.fields) { + + // we store the value into a struct that has members + // for all the fit base types- so floats are in 'f' and + // integers are in 'v' and strings are in 's' + FitValue value; + int size; + + // see FITbasetypes at the top of the file for the basic types + // that are supported. Note that the read_XXXX routines will + // check for FIT NA values and set to NA_VALUE where needed + // + // It is worth noting that size > the sizeof(type) indicates + // a list or array of values + switch (field.type) { + + // Enumerated type (8 bit) + case 0: size = 1; + + if (field.size==size) { + value.type = SingleValue; value.v = read_uint8(&count);; + } else { // Multi-values + value.type = ListValue; + value.list.clear(); + for (int i=0;i3) { fprintf(stderr, "unknown type: %d size: %d \n", field.type, field.size); } + + if (field.size > 0) read_unknown( field.size, &count ); + value.type = SingleValue; + value.v = NA_VALUE; + unknown_base_type.insert(field.type); + size = field.size; + break; + } + + // Size is greater than expected + // Note we already check above for arrays + // So this is likely a redundant check + if (size < field.size) { + if (FIT_DEBUG && FIT_DEBUG_LEVEL>4) { fprintf(stderr, " warning : size=%d for type=%d (num=%d)\n", + field.size, field.type, field.num); } + + // jump over unaccounted for data + read_unknown( field.size-size, &count ); + } + + // add to the container + values.push_back(value); + + } + + // we have now extracted the data stored in the message- so lets pass it to the decoders + // to handle- in this case we use the global message number to decide since it indicates + // the associated profile and semantics that would apply + + if (FIT_DEBUG && FIT_DEBUG_LEVEL>1) { + if (def.global_msg_num != 20 || (FIT_DEBUG_LEVEL>2 && def.global_msg_num==20)) { + + fprintf(stderr, "** Decoding message '%s' (local=%d global=%d)\n", + fitMessageDesc(def.global_msg_num, false).toStdString().c_str(), + def.local_msg_num, def.global_msg_num); + } + } + + // first lets run a generic decode for XDATA using metadata + decodeGeneric(fitMessageDesc(def.global_msg_num,true), def, time_offset, values); + + // now for hand-crafted parsing that aligns to RideFile and its needs + switch (def.global_msg_num) { + case FILE_ID_MSG_NUM: // #0 + decodeFileId(def, time_offset, values); + break; + + case SESSION_MSG_NUM: // #18 + decodeSession(def, time_offset, values); + break; + + case LAP_MSG_NUM: // #19 + decodeLap(def, time_offset, values); + break; + + case RECORD_MSG_NUM: // #20 + decodeRecord(def, time_offset, values); + break; + + case EVENT_MSG_NUM: // #21 + decodeEvent(def, time_offset, values); + break; + + case 23: + decodeDeviceInfo(def, time_offset, values); /* device info */ + break; + + case ACTIVITY_MSG_NUM: // #34 + decodeActivity(def, time_offset, values); + break; + + case 101: + decodeLength(def, time_offset, values); + break; /* lap swimming */ + + case 128: + decodeWeather(def, time_offset, values); + break; /* weather broadcast */ + + case 132: + decodeHr(def, time_offset, values); /* HR */ + break; + + case SEGMENT_MSG_NUM: // #142 + decodeSegment(def, time_offset, values); /* segment data */ + break; + + case 206: // Developer Field Description + decodeDeveloperFieldDescription(def, time_offset, values); + break; + + case 140: /* undocumented Garmin/Firstbeat specific metrics */ + decodePhysiologicalMetrics(def, time_offset, values); + break; + + case 207: /* Developer ID */ + decodeDeveloperID(def, time_offset, values); + break; + + case 1: /* capabilities, device settings and timezone */ break; + case 2: + decodeDeviceSettings(def, time_offset, values); + break; + + case 3: /* USER_PROFILE */ + decodeUserProfile(def, time_offset, values); + break; + + case 4: /* hrm profile */ + case 5: /* sdm profile */ + case 6: /* bike profile */ + case 7: /* ZONES_TARGET field#1 = MaxHR (bpm) */ + case 8: /* HR_ZONE */ + case 9: /* POWER_ZONE */ + case 10: /* MET_ZONE */ + case 12: /* SPORT */ + case 13: /* unknown */ + case 15: /* goal */ + case 22: /* source (undocumented) = sensors used for records ; see details below: */ + /* #253: timestamp / #0: SPD/DIST / #1: SPD/DIST / #2: cadence / #4: HRM / #5: HRM */ + case 26: /* workout */ + case 27: /* workout step */ + case 28: /* schedule */ + case 29: /* location */ + case 30: /* weight scale */ + case 31: /* course */ + case 32: /* course point */ + case 33: /* totals */ + case 35: /* software */ + case 37: /* file capabilities */ + case 38: /* message capabilities */ + case 39: /* field capabilities */ + case 49: /* file creator */ + case 51: /* blood pressure */ + case 53: /* speed zone */ + case 55: /* monitoring */ + case 72: /* training file (undocumented) : new since garmin 800 */ + break; + + case HRV_MSG_NUM: + decodeHRV(def, values); + break; /* hrv */ + + case 79: /* HR zone (undocumented) ; see details below: */ + /* #253: timestamp / #1: default Min HR / #2: default Max HR / #5: user Min HR / #6: user Max HR */ + case 103: /* monitoring info */ + case 104: /* battery */ + case 105: /* pad */ + case 106: /* salve device */ + case 113: /* unknown */ + + case 125: /* unknown */ + case 131: /* cadence zone */ + + case 141: /* unknown */ + case 145: /* memo glob */ + case 147: /* equipment (undocumented) = sensors presets (sensor name, wheel circumference, etc.) ; see details below: */ + /* #0: equipment ID / #2: equipment name / #10: default wheel circ. value / #21: user wheel circ. value / #254: local eqt idx */ + case 148: /* segment description & metadata (undocumented) ; see details below: */ + /* #0: segment name (string) / #1: segment UID (string) / #2: unknown, seems to be always 2 (enum) / #3: unknown, seems to be always 1 (enum) + / #4: exporting_user_id ? =user ID from connect ? (uint32) / #6: unknown, seems to be always 0 */ + case 149: /* segment leaderboard (undocumented) ; see details below: */ + /* #1: who (0=segment leader, 1=personal best, 2=connection, 3=group leader, 4=challenger, 5+=H) + / #3: ID of source garmin connect activity (uint32) ? OR ? timestamp ? / #4: time to finish (ms) / #254: message counter idx */ + case 150: /* segment trackpoint (undocumented) ; see details below: */ + /* #1: latitude / #2: longitude / #3: distance from start point / #4: elevation / #5: timer since start (ms) / #6: message counter index */ + break; + + default: + + // I'm not sure we really care if the global number is now known + // since they could be from a product profile - this is not + // as big an issue these days, but lets keep warning if we really + // don't recognise it + if (fitMessageDesc(def.global_msg_num,false) == "Unknown message type") + unknown_global_msg_nums.insert(def.global_msg_num); + break; + } + last_msg_type = def.global_msg_num; + } + return count; + } + + // + // MAIN ENTRY POINT INTO PARSER + // + // Kind of neat that you have to scroll down to line 4k or so to find it + // + // + RideFile * run() { + + // get the Smart Recording parameters + isGarminSmartRecording = appsettings->value(NULL, GC_GARMIN_SMARTRECORD,Qt::Checked); + GarminHWM = appsettings->value(NULL, GC_GARMIN_HWMARK); + if (GarminHWM.isNull() || GarminHWM.toInt() == 0) GarminHWM.setValue(25); // default to 25 seconds. + + // start + rideFile = new RideFile; + rideFile->setDeviceType("Garmin FIT"); + rideFile->setFileFormat("Flexible and Interoperable Data Transfer (FIT)"); + rideFile->setRecIntSecs(1.0); // this is a terrible assumption! + if (!file.open(QIODevice::ReadOnly)) { + delete rideFile; + return NULL; + } + + int data_size = 0; + weatherXdata = new XDataSeries(); + weatherXdata->name = "WEATHER"; + weatherXdata->valuename << "WINDSPEED"; + weatherXdata->unitname << "kph"; + weatherXdata->valuename << "WINDHEADING"; + weatherXdata->unitname << ""; + weatherXdata->valuename << "TEMPERATURE"; + weatherXdata->unitname << "C"; + weatherXdata->valuename << "HUMIDITY"; + weatherXdata->unitname << "relative humidity"; + + swimXdata = new XDataSeries(); + swimXdata->name = "SWIM"; + swimXdata->valuename << "TYPE"; + swimXdata->unitname << "stroketype"; + swimXdata->valuename << "DURATION"; + swimXdata->unitname << "secs"; + swimXdata->valuename << "STROKES"; + swimXdata->unitname << ""; + + hrvXdata = new XDataSeries(); + hrvXdata->name = "HRV"; + hrvXdata->valuename << "R-R"; + hrvXdata->unitname << "msecs"; + + gearsXdata = new XDataSeries(); + gearsXdata->name = "GEARS"; + gearsXdata->valuename << "FRONT"; + gearsXdata->unitname << "t"; + gearsXdata->valuename << "REAR"; + gearsXdata->unitname << "t"; + gearsXdata->valuename << "FRONT-NUM"; + gearsXdata->unitname << ""; + gearsXdata->valuename << "REAR-NUM"; + gearsXdata->unitname << ""; + + deveXdata = new XDataSeries(); + deveXdata->name = "DEVELOPER"; + + extraXdata = new XDataSeries(); + extraXdata->name = "EXTRA"; + + bool stop = false; + bool truncated = false; + + // read the header + read_header(stop, errors, data_size); + + if (!stop) { + + int bytes_read = 0; + + try { + while (!stop && (bytes_read < data_size)) { + bytes_read += read_record(stop, errors); + } + } + catch (TruncatedRead &e) { + Q_UNUSED(e) + errors << "truncated file body"; + //file.close(); + //delete rideFile; + //return NULL; + truncated = true; + } + } + if (stop) { + file.close(); + delete rideFile; + return NULL; + } + else { + if (!truncated) { + try { + int crc = read_uint16( false ); // always littleEndian + (void) crc; + } + catch (TruncatedRead &e) { + Q_UNUSED(e) + errors << "truncated file body"; + return NULL; + } + + // second file ? + try { + while (file.canReadLine()) { + read_header(stop, errors, data_size); + if (!stop) { + + int bytes_read = 0; + + try { + while (!stop && (bytes_read < data_size)) { + bytes_read += read_record(stop, errors); + } + } + catch (TruncatedRead &e) { + Q_UNUSED(e) + errors << "truncated second file body"; + } + } + if (!truncated) { + try { + int crc = read_uint16( false ); // always littleEndian + (void) crc; + } + catch (TruncatedRead &e) { + Q_UNUSED(e) + errors << "truncated file body"; + return NULL; + } + } + } + } + catch (TruncatedRead &e) { + Q_UNUSED(e) + } + + } + + foreach(int num, unknown_global_msg_nums) + qDebug() << QString("FitRideFile: unknown global message number %1; ignoring it").arg(num); + foreach(int num, unknown_record_fields) + qDebug() << QString("FitRideFile: unknown record field %1; ignoring it").arg(num); + foreach(int num, unknown_base_type) + qDebug() << QString("FitRideFile: unknown base type %1; skipped").arg(num); + + setRideFileDeviceInfo(rideFile, deviceInfos); + setRideFileDataInfo(rideFile, dataInfos); + + // CIQINFO + if (local_deve_fields_app.count()>0) { + QString ciqInfo = "["; + int i=0; + foreach(FitDeveApp deve_app, local_deve_fields_app) { + ciqInfo += QString("{\n\t\"application_id\": %1,\n\t\"developer_data_index\": %2,\n\t").arg(deve_app.app_id.c_str() ).arg(deve_app.dev_data_id); + ciqInfo += QString("\"fields\": [\n\t\t"); + int j=0; + foreach(FitFieldDefinition deve_field, deve_app.fields) { + ciqInfo += QString("{\n\t\t\"dev_id\": %1,\n\t\t\"name\": \"%2\"}").arg(deve_field.dev_id).arg(deve_field.name.c_str()); + if (++j2) + // rideFile->setTag("CIQ", ciqInfo); + } + + file.close(); + + appendXData(rideFile); + + if (rideFile->xdata("SWIM")) { + // Build synthetic kph, km and cad sample data for Lap Swims + DataProcessor* fixLapDP = DataProcessorFactory::instance().getProcessors(true).value("Fix Lap Swim"); + if (fixLapDP) fixLapDP->postProcess(rideFile, NULL, "NEW"); + else qDebug()<<"Fix Lap Swim Data Processor not found."; + } + + return rideFile; + } + } }; +// Section 2 - the main entry point for all ride file readers +// +// openRideFile() is the main entry point used across the +// codebase for filereaders +// RideFile *FitFileReader::openRideFile(QFile &file, QStringList &errors, QList *rides) const { // prepare the metadata first loadMetadata(); - QSharedPointer state(new FitFileReaderState(file, errors)); + QSharedPointer state(new FitFileParser(file, errors)); RideFile* ret = state->run(); // Split sessions, only if we have a valid RideFile if (ret) ret = state->splitSessions(rides); @@ -3989,7 +4648,11 @@ RideFile *FitFileReader::openRideFile(QFile &file, QStringList &errors, QListappend(value); @@ -4183,11 +4846,11 @@ void write_session(QByteArray *array, const RideFile *ride, QHashsport()); + value=FitFileParser::getSportId(ride->sport()); write_int8(array, value); // 7. sub sport - value=FitFileReaderState::getSubSportId(ride->getTag("SubSport","")); + value=FitFileParser::getSubSportId(ride->getTag("SubSport","")); write_int8(array, value); // 8. total_elapsed_time (7) diff --git a/src/FileIO/FitRideFile.h b/src/FileIO/FitRideFile.h index ba75cb6dc..5f0b6039c 100644 --- a/src/FileIO/FitRideFile.h +++ b/src/FileIO/FitRideFile.h @@ -32,5 +32,89 @@ struct FitFileReader : public RideFileReader { }; +#ifndef MATHCONST_PI +#define MATHCONST_PI 3.141592653589793238462643383279502884L /* pi */ +#endif + +#define DEFINITION_MSG_HEADER 64 +#define FILE_ID_MSG_NUM 0 +#define SESSION_MSG_NUM 18 +#define LAP_MSG_NUM 19 +#define RECORD_MSG_NUM 20 +#define EVENT_MSG_NUM 21 +#define ACTIVITY_MSG_NUM 34 +#define FILE_CREATOR_MSG_NUM 49 +#define HRV_MSG_NUM 78 +#define SEGMENT_MSG_NUM 142 + +/* FIT has uint32 as largest integer type. So qint64 is large enough to + * store all integer types - no matter if they're signed or not */ + +// this will need to change if float or other non-integer values are +// introduced into the file format *FIXME* +typedef qint64 fit_value_t; + +#define NA_VALUE std::numeric_limits::max() +#define NA_VALUEF (double)(0xFFFFFFFF) + +typedef std::string fit_string_value; +typedef float fit_float_value; + +struct FitField { + int num; + int type; // FIT base_type + int size; // in bytes + int deve_idx; // Developer Data Index +}; + +struct FitFieldDefinition { + int dev_id; // Developer Data Index (for developer fields) + int num; + int type; // FIT base_type + bool istime; // for date_time fields with base type uint32 + int size; // in bytes + int native; // native field number + double scale; // should be a double not an int + int offset; + fit_string_value message; // what message section does this belong to + fit_string_value name; // what is the name of the field + fit_string_value unit; // what units does the field use +}; + +struct FitDeveApp { + fit_string_value dev_id; // Developer Data Index + fit_string_value app_id; // application_id + int man_id; // manufacturer_id + int dev_data_id; // developer_data_index + qint64 app_version; // application_version + + QList fields; +}; + +struct FitMessage { + int global_msg_num; + int local_msg_num; + bool is_big_endian; + std::vector fields; +}; + +enum fitValueType { SingleValue, ListValue, FloatValue, StringValue }; +typedef enum fitValueType FitValueType; + +struct FitValue +{ + FitValueType type; + fit_value_t v; + fit_string_value s; + fit_float_value f; + QList list; + int size; +}; + +// Fit types metadata +struct FITproduct { int manu, prod; QString name; }; +struct FITmanufacturer { int manu; QString name; }; +struct FITmessage { int num; QString desc; }; + #endif // _FitRideFile_h diff --git a/src/FileIO/RideFile.h b/src/FileIO/RideFile.h index fc4ddcbd7..63126a24d 100644 --- a/src/FileIO/RideFile.h +++ b/src/FileIO/RideFile.h @@ -189,7 +189,7 @@ class RideFile : public QObject // QObject to emit signals // fix tools friend class FixLapSwim; friend class Snippets; - friend struct FitFileReaderState; + friend struct FitFileParser; // utility static unsigned int computeFileCRC(QString); @@ -551,7 +551,7 @@ class RideFileIterator { int start, stop, index; }; -#define XDATA_MAXVALUES 32 +#define XDATA_MAXVALUES 64 class XDataPoint { public: diff --git a/src/Resources/json/FITmetadata.json b/src/Resources/json/FITmetadata.json index d153a6710..3b7b35c71 100644 --- a/src/Resources/json/FITmetadata.json +++ b/src/Resources/json/FITmetadata.json @@ -1,5 +1,5 @@ { - "VERSION":1687474976, + "VERSION":1699181949, "COMMENT":"Do not edit this file directly it is generated.", "PRODUCTS":[ { "manu":1, "prod":3592, "name":"Varia Rtl515" }, @@ -24,6 +24,7 @@ { "manu":32, "prod":0, "name":"Wahoo fitness" }, { "manu":32, "prod":28, "name":"Wahoo ELEMNT" }, { "manu":32, "prod":31, "name":"Wahoo ELEMNT BOLT" }, + { "manu":32, "prod":41, "name":"Wahoo PowrLink" }, { "manu":38, "prod":1, "name":"o_synce navi2coach" }, { "manu":48, "prod":2, "name":"Pioneer SGX-CA500" }, { "manu":54, "prod":1, "name":"IpBike" }, @@ -712,5 +713,1390 @@ { "manu":323, "name":"Spinning Mda" }, { "manu":324, "name":"Hilldating" }, { "manu":5759, "name":"Actigraphcorp" } + ], + +"FIELDS":[ + + { "message":"file_id","num":2,"name":"product","type":"uint16" }, + { "message":"file_id","num":3,"name":"serial_number","type":"uint32z" }, + { "message":"file_id","num":4,"name":"time_created","type":"date_time" }, + { "message":"file_id","num":5,"name":"number","type":"uint16" }, + { "message":"file_id","num":8,"name":"product_name","type":"string" }, + { "message":"file_creator","num":0,"name":"software_version","type":"uint16" }, + { "message":"file_creator","num":1,"name":"hardware_version","type":"uint8" }, + { "message":"timestamp_correlation","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"timestamp_correlation","num":0,"name":"fractional_timestamp","type":"uint16","scale":32768,"units":"s" }, + { "message":"timestamp_correlation","num":1,"name":"system_timestamp","type":"date_time","units":"s" }, + { "message":"timestamp_correlation","num":2,"name":"fractional_system_timestamp","type":"uint16","scale":32768,"units":"s" }, + { "message":"timestamp_correlation","num":3,"name":"local_timestamp","type":"local_date_time","units":"s" }, + { "message":"timestamp_correlation","num":4,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"timestamp_correlation","num":5,"name":"system_timestamp_ms","type":"uint16","units":"ms" }, + { "message":"software","num":254,"name":"message_index","type":"message_index" }, + { "message":"software","num":3,"name":"version","type":"uint16","scale":100 }, + { "message":"software","num":5,"name":"part_number","type":"string" }, + { "message":"slave_device","num":1,"name":"product","type":"uint16" }, + { "message":"capabilities","num":0,"name":"languages","type":"uint8z","array":"[N]" }, + { "message":"capabilities","num":1,"name":"sports","type":"sport_bits_0","array":"[N]" }, + { "message":"capabilities","num":21,"name":"workouts_supported","type":"workout_capabilities" }, + { "message":"capabilities","num":23,"name":"connectivity_supported","type":"connectivity_capabilities" }, + { "message":"file_capabilities","num":254,"name":"message_index","type":"message_index" }, + { "message":"file_capabilities","num":0,"name":"type","type":"file" }, + { "message":"file_capabilities","num":1,"name":"flags","type":"file_flags" }, + { "message":"file_capabilities","num":2,"name":"directory","type":"string" }, + { "message":"file_capabilities","num":3,"name":"max_count","type":"uint16" }, + { "message":"file_capabilities","num":4,"name":"max_size","type":"uint32","units":"bytes" }, + { "message":"mesg_capabilities","num":254,"name":"message_index","type":"message_index" }, + { "message":"mesg_capabilities","num":0,"name":"file","type":"file" }, + { "message":"mesg_capabilities","num":1,"name":"mesg_num","type":"mesg_num" }, + { "message":"mesg_capabilities","num":2,"name":"count_type","type":"mesg_count" }, + { "message":"mesg_capabilities","num":3,"name":"count","type":"uint16" }, + { "message":"field_capabilities","num":254,"name":"message_index","type":"message_index" }, + { "message":"field_capabilities","num":0,"name":"file","type":"file" }, + { "message":"field_capabilities","num":1,"name":"mesg_num","type":"mesg_num" }, + { "message":"field_capabilities","num":2,"name":"field_num","type":"uint8" }, + { "message":"field_capabilities","num":3,"name":"count","type":"uint16" }, + { "message":"device_settings","num":0,"name":"active_time_zone","type":"uint8" }, + { "message":"device_settings","num":1,"name":"utc_offset","type":"uint32" }, + { "message":"device_settings","num":2,"name":"time_offset","type":"uint32","array":"[N]","units":"s" }, + { "message":"device_settings","num":4,"name":"time_mode","type":"time_mode","array":"[N]" }, + { "message":"device_settings","num":5,"name":"time_zone_offset","type":"sint8","array":"[N]","scale":4,"units":"hr" }, + { "message":"device_settings","num":12,"name":"backlight_mode","type":"backlight_mode" }, + { "message":"device_settings","num":36,"name":"activity_tracker_enabled","type":"bool" }, + { "message":"device_settings","num":39,"name":"clock_time","type":"date_time" }, + { "message":"device_settings","num":40,"name":"pages_enabled","type":"uint16","array":"[N]" }, + { "message":"device_settings","num":46,"name":"move_alert_enabled","type":"bool" }, + { "message":"device_settings","num":47,"name":"date_mode","type":"date_mode" }, + { "message":"device_settings","num":55,"name":"display_orientation","type":"display_orientation" }, + { "message":"device_settings","num":56,"name":"mounting_side","type":"side" }, + { "message":"device_settings","num":57,"name":"default_page","type":"uint16","array":"[N]" }, + { "message":"device_settings","num":58,"name":"autosync_min_steps","type":"uint16","units":"steps" }, + { "message":"device_settings","num":59,"name":"autosync_min_time","type":"uint16","units":"minutes" }, + { "message":"device_settings","num":80,"name":"lactate_threshold_autodetect_enabled","type":"bool" }, + { "message":"device_settings","num":86,"name":"ble_auto_upload_enabled","type":"bool" }, + { "message":"device_settings","num":89,"name":"auto_sync_frequency","type":"auto_sync_frequency" }, + { "message":"device_settings","num":90,"name":"auto_activity_detect","type":"auto_activity_detect" }, + { "message":"device_settings","num":94,"name":"number_of_screens","type":"uint8" }, + { "message":"device_settings","num":95,"name":"smart_notification_display_orientation","type":"display_orientation" }, + { "message":"device_settings","num":134,"name":"tap_interface","type":"switch" }, + { "message":"device_settings","num":174,"name":"tap_sensitivity","type":"tap_sensitivity" }, + { "message":"user_profile","num":254,"name":"message_index","type":"message_index" }, + { "message":"user_profile","num":0,"name":"friendly_name","type":"string" }, + { "message":"user_profile","num":1,"name":"gender","type":"gender" }, + { "message":"user_profile","num":2,"name":"age","type":"uint8","units":"years" }, + { "message":"user_profile","num":3,"name":"height","type":"uint8","scale":100,"units":"m" }, + { "message":"user_profile","num":4,"name":"weight","type":"uint16","scale":10,"units":"kg" }, + { "message":"user_profile","num":5,"name":"language","type":"language" }, + { "message":"user_profile","num":6,"name":"elev_setting","type":"display_measure" }, + { "message":"user_profile","num":7,"name":"weight_setting","type":"display_measure" }, + { "message":"user_profile","num":8,"name":"resting_heart_rate","type":"uint8","units":"bpm" }, + { "message":"user_profile","num":9,"name":"default_max_running_heart_rate","type":"uint8","units":"bpm" }, + { "message":"user_profile","num":10,"name":"default_max_biking_heart_rate","type":"uint8","units":"bpm" }, + { "message":"user_profile","num":11,"name":"default_max_heart_rate","type":"uint8","units":"bpm" }, + { "message":"user_profile","num":12,"name":"hr_setting","type":"display_heart" }, + { "message":"user_profile","num":13,"name":"speed_setting","type":"display_measure" }, + { "message":"user_profile","num":14,"name":"dist_setting","type":"display_measure" }, + { "message":"user_profile","num":16,"name":"power_setting","type":"display_power" }, + { "message":"user_profile","num":17,"name":"activity_class","type":"activity_class" }, + { "message":"user_profile","num":18,"name":"position_setting","type":"display_position" }, + { "message":"user_profile","num":21,"name":"temperature_setting","type":"display_measure" }, + { "message":"user_profile","num":22,"name":"local_id","type":"user_local_id" }, + { "message":"user_profile","num":23,"name":"global_id","type":"byte","array":"[6]" }, + { "message":"user_profile","num":28,"name":"wake_time","type":"localtime_into_day" }, + { "message":"user_profile","num":29,"name":"sleep_time","type":"localtime_into_day" }, + { "message":"user_profile","num":30,"name":"height_setting","type":"display_measure" }, + { "message":"user_profile","num":31,"name":"user_running_step_length","type":"uint16","scale":1000,"units":"m" }, + { "message":"user_profile","num":32,"name":"user_walking_step_length","type":"uint16","scale":1000,"units":"m" }, + { "message":"user_profile","num":47,"name":"depth_setting","type":"display_measure" }, + { "message":"user_profile","num":49,"name":"dive_count","type":"uint32" }, + { "message":"hrm_profile","num":254,"name":"message_index","type":"message_index" }, + { "message":"hrm_profile","num":0,"name":"enabled","type":"bool" }, + { "message":"hrm_profile","num":1,"name":"hrm_ant_id","type":"uint16z" }, + { "message":"hrm_profile","num":2,"name":"log_hrv","type":"bool" }, + { "message":"hrm_profile","num":3,"name":"hrm_ant_id_trans_type","type":"uint8z" }, + { "message":"sdm_profile","num":254,"name":"message_index","type":"message_index" }, + { "message":"sdm_profile","num":0,"name":"enabled","type":"bool" }, + { "message":"sdm_profile","num":1,"name":"sdm_ant_id","type":"uint16z" }, + { "message":"sdm_profile","num":2,"name":"sdm_cal_factor","type":"uint16","scale":10,"units":"%" }, + { "message":"sdm_profile","num":3,"name":"odometer","type":"uint32","scale":100,"units":"m" }, + { "message":"sdm_profile","num":4,"name":"speed_source","type":"bool" }, + { "message":"sdm_profile","num":5,"name":"sdm_ant_id_trans_type","type":"uint8z" }, + { "message":"sdm_profile","num":7,"name":"odometer_rollover","type":"uint8" }, + { "message":"bike_profile","num":254,"name":"message_index","type":"message_index" }, + { "message":"bike_profile","num":0,"name":"name","type":"string" }, + { "message":"bike_profile","num":1,"name":"sport","type":"sport" }, + { "message":"bike_profile","num":2,"name":"sub_sport","type":"sub_sport" }, + { "message":"bike_profile","num":3,"name":"odometer","type":"uint32","scale":100,"units":"m" }, + { "message":"bike_profile","num":4,"name":"bike_spd_ant_id","type":"uint16z" }, + { "message":"bike_profile","num":5,"name":"bike_cad_ant_id","type":"uint16z" }, + { "message":"bike_profile","num":6,"name":"bike_spdcad_ant_id","type":"uint16z" }, + { "message":"bike_profile","num":7,"name":"bike_power_ant_id","type":"uint16z" }, + { "message":"bike_profile","num":8,"name":"custom_wheelsize","type":"uint16","scale":1000,"units":"m" }, + { "message":"bike_profile","num":9,"name":"auto_wheelsize","type":"uint16","scale":1000,"units":"m" }, + { "message":"bike_profile","num":10,"name":"bike_weight","type":"uint16","scale":10,"units":"kg" }, + { "message":"bike_profile","num":11,"name":"power_cal_factor","type":"uint16","scale":10,"units":"%" }, + { "message":"bike_profile","num":12,"name":"auto_wheel_cal","type":"bool" }, + { "message":"bike_profile","num":13,"name":"auto_power_zero","type":"bool" }, + { "message":"bike_profile","num":14,"name":"id","type":"uint8" }, + { "message":"bike_profile","num":15,"name":"spd_enabled","type":"bool" }, + { "message":"bike_profile","num":16,"name":"cad_enabled","type":"bool" }, + { "message":"bike_profile","num":17,"name":"spdcad_enabled","type":"bool" }, + { "message":"bike_profile","num":18,"name":"power_enabled","type":"bool" }, + { "message":"bike_profile","num":19,"name":"crank_length","type":"uint8","scale":2,"offset":"-110","units":"mm" }, + { "message":"bike_profile","num":20,"name":"enabled","type":"bool" }, + { "message":"bike_profile","num":21,"name":"bike_spd_ant_id_trans_type","type":"uint8z" }, + { "message":"bike_profile","num":22,"name":"bike_cad_ant_id_trans_type","type":"uint8z" }, + { "message":"bike_profile","num":23,"name":"bike_spdcad_ant_id_trans_type","type":"uint8z" }, + { "message":"bike_profile","num":24,"name":"bike_power_ant_id_trans_type","type":"uint8z" }, + { "message":"bike_profile","num":37,"name":"odometer_rollover","type":"uint8" }, + { "message":"bike_profile","num":38,"name":"front_gear_num","type":"uint8z" }, + { "message":"bike_profile","num":39,"name":"front_gear","type":"uint8z","array":"[N]" }, + { "message":"bike_profile","num":40,"name":"rear_gear_num","type":"uint8z" }, + { "message":"bike_profile","num":41,"name":"rear_gear","type":"uint8z","array":"[N]" }, + { "message":"bike_profile","num":44,"name":"shimano_di2_enabled","type":"bool" }, + { "message":"connectivity","num":0,"name":"bluetooth_enabled","type":"bool" }, + { "message":"connectivity","num":1,"name":"bluetooth_le_enabled","type":"bool" }, + { "message":"connectivity","num":2,"name":"ant_enabled","type":"bool" }, + { "message":"connectivity","num":3,"name":"name","type":"string" }, + { "message":"connectivity","num":4,"name":"live_tracking_enabled","type":"bool" }, + { "message":"connectivity","num":5,"name":"weather_conditions_enabled","type":"bool" }, + { "message":"connectivity","num":6,"name":"weather_alerts_enabled","type":"bool" }, + { "message":"connectivity","num":7,"name":"auto_activity_upload_enabled","type":"bool" }, + { "message":"connectivity","num":8,"name":"course_download_enabled","type":"bool" }, + { "message":"connectivity","num":9,"name":"workout_download_enabled","type":"bool" }, + { "message":"connectivity","num":10,"name":"gps_ephemeris_download_enabled","type":"bool" }, + { "message":"connectivity","num":11,"name":"incident_detection_enabled","type":"bool" }, + { "message":"connectivity","num":12,"name":"grouptrack_enabled","type":"bool" }, + { "message":"watchface_settings","num":254,"name":"message_index","type":"message_index" }, + { "message":"watchface_settings","num":0,"name":"mode","type":"watchface_mode" }, + { "message":"watchface_settings","num":1,"name":"layout","type":"byte" }, + { "message":"ohr_settings","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"ohr_settings","num":0,"name":"enabled","type":"switch" }, + { "message":"time_in_zone","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"time_in_zone","num":0,"name":"reference_mesg","type":"mesg_num" }, + { "message":"time_in_zone","num":1,"name":"reference_index","type":"message_index" }, + { "message":"time_in_zone","num":2,"name":"time_in_hr_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"time_in_zone","num":3,"name":"time_in_speed_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"time_in_zone","num":4,"name":"time_in_cadence_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"time_in_zone","num":5,"name":"time_in_power_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"time_in_zone","num":6,"name":"hr_zone_high_boundary","type":"uint8","array":"[N]","units":"bpm" }, + { "message":"time_in_zone","num":7,"name":"speed_zone_high_boundary","type":"uint16","array":"[N]","scale":1000,"units":"m/s" }, + { "message":"time_in_zone","num":8,"name":"cadence_zone_high_bondary","type":"uint8","array":"[N]","units":"rpm" }, + { "message":"time_in_zone","num":9,"name":"power_zone_high_boundary","type":"uint16","array":"[N]","units":"watts" }, + { "message":"time_in_zone","num":10,"name":"hr_calc_type","type":"hr_zone_calc" }, + { "message":"time_in_zone","num":11,"name":"max_heart_rate","type":"uint8" }, + { "message":"time_in_zone","num":12,"name":"resting_heart_rate","type":"uint8" }, + { "message":"time_in_zone","num":13,"name":"threshold_heart_rate","type":"uint8" }, + { "message":"time_in_zone","num":14,"name":"pwr_calc_type","type":"pwr_zone_calc" }, + { "message":"time_in_zone","num":15,"name":"functional_threshold_power","type":"uint16" }, + { "message":"zones_target","num":1,"name":"max_heart_rate","type":"uint8" }, + { "message":"zones_target","num":2,"name":"threshold_heart_rate","type":"uint8" }, + { "message":"zones_target","num":3,"name":"functional_threshold_power","type":"uint16" }, + { "message":"zones_target","num":5,"name":"hr_calc_type","type":"hr_zone_calc" }, + { "message":"zones_target","num":7,"name":"pwr_calc_type","type":"pwr_zone_calc" }, + { "message":"sport","num":0,"name":"sport","type":"sport" }, + { "message":"sport","num":1,"name":"sub_sport","type":"sub_sport" }, + { "message":"sport","num":3,"name":"name","type":"string" }, + { "message":"hr_zone","num":254,"name":"message_index","type":"message_index" }, + { "message":"hr_zone","num":1,"name":"high_bpm","type":"uint8","units":"bpm" }, + { "message":"hr_zone","num":2,"name":"name","type":"string" }, + { "message":"speed_zone","num":254,"name":"message_index","type":"message_index" }, + { "message":"speed_zone","num":0,"name":"high_value","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"speed_zone","num":1,"name":"name","type":"string" }, + { "message":"cadence_zone","num":254,"name":"message_index","type":"message_index" }, + { "message":"cadence_zone","num":0,"name":"high_value","type":"uint8","units":"rpm" }, + { "message":"cadence_zone","num":1,"name":"name","type":"string" }, + { "message":"power_zone","num":254,"name":"message_index","type":"message_index" }, + { "message":"power_zone","num":1,"name":"high_value","type":"uint16","units":"watts" }, + { "message":"power_zone","num":2,"name":"name","type":"string" }, + { "message":"met_zone","num":254,"name":"message_index","type":"message_index" }, + { "message":"met_zone","num":1,"name":"high_bpm","type":"uint8" }, + { "message":"met_zone","num":2,"name":"calories","type":"uint16","scale":10,"units":"kcal / min" }, + { "message":"met_zone","num":3,"name":"fat_calories","type":"uint8","scale":10,"units":"kcal / min" }, + { "message":"dive_settings","num":253,"name":"timestamp","type":"date_time" }, + { "message":"dive_settings","num":254,"name":"message_index","type":"message_index" }, + { "message":"dive_settings","num":0,"name":"name","type":"string" }, + { "message":"dive_settings","num":1,"name":"model","type":"tissue_model_type" }, + { "message":"dive_settings","num":2,"name":"gf_low","type":"uint8","units":"percent" }, + { "message":"dive_settings","num":3,"name":"gf_high","type":"uint8","units":"percent" }, + { "message":"dive_settings","num":4,"name":"water_type","type":"water_type" }, + { "message":"dive_settings","num":5,"name":"water_density","type":"float32","units":"kg/m^3" }, + { "message":"dive_settings","num":6,"name":"po2_warn","type":"uint8","scale":100,"units":"percent" }, + { "message":"dive_settings","num":7,"name":"po2_critical","type":"uint8","scale":100,"units":"percent" }, + { "message":"dive_settings","num":8,"name":"po2_deco","type":"uint8","scale":100,"units":"percent" }, + { "message":"dive_settings","num":9,"name":"safety_stop_enabled","type":"bool" }, + { "message":"dive_settings","num":10,"name":"bottom_depth","type":"float32" }, + { "message":"dive_settings","num":11,"name":"bottom_time","type":"uint32" }, + { "message":"dive_settings","num":12,"name":"apnea_countdown_enabled","type":"bool" }, + { "message":"dive_settings","num":13,"name":"apnea_countdown_time","type":"uint32" }, + { "message":"dive_settings","num":14,"name":"backlight_mode","type":"dive_backlight_mode" }, + { "message":"dive_settings","num":15,"name":"backlight_brightness","type":"uint8" }, + { "message":"dive_settings","num":16,"name":"backlight_timeout","type":"backlight_timeout" }, + { "message":"dive_settings","num":17,"name":"repeat_dive_interval","type":"uint16","scale":1,"units":"s" }, + { "message":"dive_settings","num":18,"name":"safety_stop_time","type":"uint16","scale":1,"units":"s" }, + { "message":"dive_settings","num":19,"name":"heart_rate_source_type","type":"source_type" }, + { "message":"dive_settings","num":20,"name":"heart_rate_source","type":"uint8" }, + { "message":"dive_settings","num":21,"name":"travel_gas","type":"message_index" }, + { "message":"dive_settings","num":22,"name":"ccr_low_setpoint_switch_mode","type":"ccr_setpoint_switch_mode" }, + { "message":"dive_settings","num":23,"name":"ccr_low_setpoint","type":"uint8","scale":100,"units":"percent" }, + { "message":"dive_settings","num":24,"name":"ccr_low_setpoint_depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"dive_settings","num":25,"name":"ccr_high_setpoint_switch_mode","type":"ccr_setpoint_switch_mode" }, + { "message":"dive_settings","num":26,"name":"ccr_high_setpoint","type":"uint8","scale":100,"units":"percent" }, + { "message":"dive_settings","num":27,"name":"ccr_high_setpoint_depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"dive_settings","num":29,"name":"gas_consumption_display","type":"gas_consumption_rate_type" }, + { "message":"dive_settings","num":30,"name":"up_key_enabled","type":"bool" }, + { "message":"dive_settings","num":35,"name":"dive_sounds","type":"tone" }, + { "message":"dive_settings","num":36,"name":"last_stop_multiple","type":"uint8","scale":10 }, + { "message":"dive_settings","num":37,"name":"no_fly_time_mode","type":"no_fly_time_mode" }, + { "message":"dive_alarm","num":254,"name":"message_index","type":"message_index" }, + { "message":"dive_alarm","num":0,"name":"depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"dive_alarm","num":1,"name":"time","type":"sint32","scale":1,"units":"s" }, + { "message":"dive_alarm","num":2,"name":"enabled","type":"bool" }, + { "message":"dive_alarm","num":3,"name":"alarm_type","type":"dive_alarm_type" }, + { "message":"dive_alarm","num":4,"name":"sound","type":"tone" }, + { "message":"dive_alarm","num":5,"name":"dive_types","type":"sub_sport","array":"[N]" }, + { "message":"dive_alarm","num":6,"name":"id","type":"uint32" }, + { "message":"dive_alarm","num":7,"name":"popup_enabled","type":"bool" }, + { "message":"dive_alarm","num":8,"name":"trigger_on_descent","type":"bool" }, + { "message":"dive_alarm","num":9,"name":"trigger_on_ascent","type":"bool" }, + { "message":"dive_alarm","num":10,"name":"repeating","type":"bool" }, + { "message":"dive_alarm","num":11,"name":"speed","type":"sint32","scale":1000,"units":"mps" }, + { "message":"dive_apnea_alarm","num":254,"name":"message_index","type":"message_index" }, + { "message":"dive_apnea_alarm","num":0,"name":"depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"dive_apnea_alarm","num":1,"name":"time","type":"sint32","scale":1,"units":"s" }, + { "message":"dive_apnea_alarm","num":2,"name":"enabled","type":"bool" }, + { "message":"dive_apnea_alarm","num":3,"name":"alarm_type","type":"dive_alarm_type" }, + { "message":"dive_apnea_alarm","num":4,"name":"sound","type":"tone" }, + { "message":"dive_apnea_alarm","num":5,"name":"dive_types","type":"sub_sport","array":"[N]" }, + { "message":"dive_apnea_alarm","num":6,"name":"id","type":"uint32" }, + { "message":"dive_apnea_alarm","num":7,"name":"popup_enabled","type":"bool" }, + { "message":"dive_apnea_alarm","num":8,"name":"trigger_on_descent","type":"bool" }, + { "message":"dive_apnea_alarm","num":9,"name":"trigger_on_ascent","type":"bool" }, + { "message":"dive_apnea_alarm","num":10,"name":"repeating","type":"bool" }, + { "message":"dive_apnea_alarm","num":11,"name":"speed","type":"sint32","scale":1000,"units":"mps" }, + { "message":"dive_gas","num":254,"name":"message_index","type":"message_index" }, + { "message":"dive_gas","num":0,"name":"helium_content","type":"uint8","units":"percent" }, + { "message":"dive_gas","num":1,"name":"oxygen_content","type":"uint8","units":"percent" }, + { "message":"dive_gas","num":2,"name":"status","type":"dive_gas_status" }, + { "message":"dive_gas","num":3,"name":"mode","type":"dive_gas_mode" }, + { "message":"goal","num":254,"name":"message_index","type":"message_index" }, + { "message":"goal","num":0,"name":"sport","type":"sport" }, + { "message":"goal","num":1,"name":"sub_sport","type":"sub_sport" }, + { "message":"goal","num":2,"name":"start_date","type":"date_time" }, + { "message":"goal","num":3,"name":"end_date","type":"date_time" }, + { "message":"goal","num":4,"name":"type","type":"goal" }, + { "message":"goal","num":5,"name":"value","type":"uint32" }, + { "message":"goal","num":6,"name":"repeat","type":"bool" }, + { "message":"goal","num":7,"name":"target_value","type":"uint32" }, + { "message":"goal","num":8,"name":"recurrence","type":"goal_recurrence" }, + { "message":"goal","num":9,"name":"recurrence_value","type":"uint16" }, + { "message":"goal","num":10,"name":"enabled","type":"bool" }, + { "message":"goal","num":11,"name":"source","type":"goal_source" }, + { "message":"activity","num":253,"name":"timestamp","type":"date_time" }, + { "message":"activity","num":0,"name":"total_timer_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"activity","num":1,"name":"num_sessions","type":"uint16" }, + { "message":"activity","num":2,"name":"type","type":"activity" }, + { "message":"activity","num":3,"name":"event","type":"event" }, + { "message":"activity","num":4,"name":"event_type","type":"event_type" }, + { "message":"activity","num":5,"name":"local_timestamp","type":"local_date_time" }, + { "message":"activity","num":6,"name":"event_group","type":"uint8" }, + { "message":"session","num":254,"name":"message_index","type":"message_index" }, + { "message":"session","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"session","num":0,"name":"event","type":"event" }, + { "message":"session","num":1,"name":"event_type","type":"event_type" }, + { "message":"session","num":2,"name":"start_time","type":"date_time" }, + { "message":"session","num":3,"name":"start_position_lat","type":"sint32","units":"semicircles" }, + { "message":"session","num":4,"name":"start_position_long","type":"sint32","units":"semicircles" }, + { "message":"session","num":5,"name":"sport","type":"sport" }, + { "message":"session","num":6,"name":"sub_sport","type":"sub_sport" }, + { "message":"session","num":7,"name":"total_elapsed_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"session","num":8,"name":"total_timer_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"session","num":9,"name":"total_distance","type":"uint32","scale":100,"units":"m" }, + { "message":"session","num":10,"name":"total_cycles","type":"uint32","units":"cycles" }, + { "message":"session","num":11,"name":"total_calories","type":"uint16","units":"kcal" }, + { "message":"session","num":13,"name":"total_fat_calories","type":"uint16","units":"kcal" }, + { "message":"session","num":14,"name":"avg_speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"session","num":15,"name":"max_speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"session","num":16,"name":"avg_heart_rate","type":"uint8","units":"bpm" }, + { "message":"session","num":17,"name":"max_heart_rate","type":"uint8","units":"bpm" }, + { "message":"session","num":18,"name":"avg_cadence","type":"uint8","units":"rpm" }, + { "message":"session","num":19,"name":"max_cadence","type":"uint8","units":"rpm" }, + { "message":"session","num":20,"name":"avg_power","type":"uint16","units":"watts" }, + { "message":"session","num":21,"name":"max_power","type":"uint16","units":"watts" }, + { "message":"session","num":22,"name":"total_ascent","type":"uint16","units":"m" }, + { "message":"session","num":23,"name":"total_descent","type":"uint16","units":"m" }, + { "message":"session","num":24,"name":"total_training_effect","type":"uint8","scale":10 }, + { "message":"session","num":25,"name":"first_lap_index","type":"uint16" }, + { "message":"session","num":26,"name":"num_laps","type":"uint16" }, + { "message":"session","num":27,"name":"event_group","type":"uint8" }, + { "message":"session","num":28,"name":"trigger","type":"session_trigger" }, + { "message":"session","num":29,"name":"nec_lat","type":"sint32","units":"semicircles" }, + { "message":"session","num":30,"name":"nec_long","type":"sint32","units":"semicircles" }, + { "message":"session","num":31,"name":"swc_lat","type":"sint32","units":"semicircles" }, + { "message":"session","num":32,"name":"swc_long","type":"sint32","units":"semicircles" }, + { "message":"session","num":33,"name":"num_lengths","type":"uint16","units":"lengths" }, + { "message":"session","num":34,"name":"normalized_power","type":"uint16","units":"watts" }, + { "message":"session","num":35,"name":"training_stress_score","type":"uint16","scale":10,"units":"tss" }, + { "message":"session","num":36,"name":"intensity_factor","type":"uint16","scale":1000,"units":"if" }, + { "message":"session","num":37,"name":"left_right_balance","type":"left_right_balance_100" }, + { "message":"session","num":38,"name":"end_position_lat","type":"sint32","units":"semicircles" }, + { "message":"session","num":39,"name":"end_position_long","type":"sint32","units":"semicircles" }, + { "message":"session","num":41,"name":"avg_stroke_count","type":"uint32","scale":10,"units":"strokes/lap" }, + { "message":"session","num":42,"name":"avg_stroke_distance","type":"uint16","scale":100,"units":"m" }, + { "message":"session","num":43,"name":"swim_stroke","type":"swim_stroke","units":"swim_stroke" }, + { "message":"session","num":44,"name":"pool_length","type":"uint16","scale":100,"units":"m" }, + { "message":"session","num":45,"name":"threshold_power","type":"uint16","units":"watts" }, + { "message":"session","num":46,"name":"pool_length_unit","type":"display_measure" }, + { "message":"session","num":47,"name":"num_active_lengths","type":"uint16","units":"lengths" }, + { "message":"session","num":48,"name":"total_work","type":"uint32","units":"J" }, + { "message":"session","num":49,"name":"avg_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"session","num":50,"name":"max_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"session","num":51,"name":"gps_accuracy","type":"uint8","units":"m" }, + { "message":"session","num":52,"name":"avg_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"session","num":53,"name":"avg_pos_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"session","num":54,"name":"avg_neg_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"session","num":55,"name":"max_pos_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"session","num":56,"name":"max_neg_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"session","num":57,"name":"avg_temperature","type":"sint8","units":"C" }, + { "message":"session","num":58,"name":"max_temperature","type":"sint8","units":"C" }, + { "message":"session","num":59,"name":"total_moving_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"session","num":60,"name":"avg_pos_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"session","num":61,"name":"avg_neg_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"session","num":62,"name":"max_pos_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"session","num":63,"name":"max_neg_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"session","num":64,"name":"min_heart_rate","type":"uint8","units":"bpm" }, + { "message":"session","num":65,"name":"time_in_hr_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"session","num":66,"name":"time_in_speed_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"session","num":67,"name":"time_in_cadence_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"session","num":68,"name":"time_in_power_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"session","num":69,"name":"avg_lap_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"session","num":70,"name":"best_lap_index","type":"uint16" }, + { "message":"session","num":71,"name":"min_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"session","num":82,"name":"player_score","type":"uint16" }, + { "message":"session","num":83,"name":"opponent_score","type":"uint16" }, + { "message":"session","num":84,"name":"opponent_name","type":"string" }, + { "message":"session","num":85,"name":"stroke_count","type":"uint16","array":"[N]","units":"counts" }, + { "message":"session","num":86,"name":"zone_count","type":"uint16","array":"[N]","units":"counts" }, + { "message":"session","num":87,"name":"max_ball_speed","type":"uint16","scale":100,"units":"m/s" }, + { "message":"session","num":88,"name":"avg_ball_speed","type":"uint16","scale":100,"units":"m/s" }, + { "message":"session","num":89,"name":"avg_vertical_oscillation","type":"uint16","scale":10,"units":"mm" }, + { "message":"session","num":90,"name":"avg_stance_time_percent","type":"uint16","scale":100,"units":"percent" }, + { "message":"session","num":91,"name":"avg_stance_time","type":"uint16","scale":10,"units":"ms" }, + { "message":"session","num":92,"name":"avg_fractional_cadence","type":"uint8","scale":128,"units":"rpm" }, + { "message":"session","num":93,"name":"max_fractional_cadence","type":"uint8","scale":128,"units":"rpm" }, + { "message":"session","num":94,"name":"total_fractional_cycles","type":"uint8","scale":128,"units":"cycles" }, + { "message":"session","num":95,"name":"avg_total_hemoglobin_conc","type":"uint16","array":"[N]","scale":100,"units":"g/dL" }, + { "message":"session","num":96,"name":"min_total_hemoglobin_conc","type":"uint16","array":"[N]","scale":100,"units":"g/dL" }, + { "message":"session","num":97,"name":"max_total_hemoglobin_conc","type":"uint16","array":"[N]","scale":100,"units":"g/dL" }, + { "message":"session","num":98,"name":"avg_saturated_hemoglobin_percent","type":"uint16","array":"[N]","scale":10,"units":"%" }, + { "message":"session","num":99,"name":"min_saturated_hemoglobin_percent","type":"uint16","array":"[N]","scale":10,"units":"%" }, + { "message":"session","num":100,"name":"max_saturated_hemoglobin_percent","type":"uint16","array":"[N]","scale":10,"units":"%" }, + { "message":"session","num":101,"name":"avg_left_torque_effectiveness","type":"uint8","scale":2,"units":"percent" }, + { "message":"session","num":102,"name":"avg_right_torque_effectiveness","type":"uint8","scale":2,"units":"percent" }, + { "message":"session","num":103,"name":"avg_left_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"session","num":104,"name":"avg_right_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"session","num":105,"name":"avg_combined_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"session","num":110,"name":"sport_profile_name","type":"string" }, + { "message":"session","num":111,"name":"sport_index","type":"uint8" }, + { "message":"session","num":112,"name":"time_standing","type":"uint32","scale":1000,"units":"s" }, + { "message":"session","num":113,"name":"stand_count","type":"uint16" }, + { "message":"session","num":114,"name":"avg_left_pco","type":"sint8","units":"mm" }, + { "message":"session","num":115,"name":"avg_right_pco","type":"sint8","units":"mm" }, + { "message":"session","num":116,"name":"avg_left_power_phase","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"session","num":117,"name":"avg_left_power_phase_peak","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"session","num":118,"name":"avg_right_power_phase","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"session","num":119,"name":"avg_right_power_phase_peak","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"session","num":120,"name":"avg_power_position","type":"uint16","array":"[N]","units":"watts" }, + { "message":"session","num":121,"name":"max_power_position","type":"uint16","array":"[N]","units":"watts" }, + { "message":"session","num":122,"name":"avg_cadence_position","type":"uint8","array":"[N]","units":"rpm" }, + { "message":"session","num":123,"name":"max_cadence_position","type":"uint8","array":"[N]","units":"rpm" }, + { "message":"session","num":124,"name":"enhanced_avg_speed","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"session","num":125,"name":"enhanced_max_speed","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"session","num":126,"name":"enhanced_avg_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"session","num":127,"name":"enhanced_min_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"session","num":128,"name":"enhanced_max_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"session","num":129,"name":"avg_lev_motor_power","type":"uint16","units":"watts" }, + { "message":"session","num":130,"name":"max_lev_motor_power","type":"uint16","units":"watts" }, + { "message":"session","num":131,"name":"lev_battery_consumption","type":"uint8","scale":2,"units":"percent" }, + { "message":"session","num":132,"name":"avg_vertical_ratio","type":"uint16","scale":100,"units":"percent" }, + { "message":"session","num":133,"name":"avg_stance_time_balance","type":"uint16","scale":100,"units":"percent" }, + { "message":"session","num":134,"name":"avg_step_length","type":"uint16","scale":10,"units":"mm" }, + { "message":"session","num":137,"name":"total_anaerobic_training_effect","type":"uint8","scale":10 }, + { "message":"session","num":139,"name":"avg_vam","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"session","num":140,"name":"avg_depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"session","num":141,"name":"max_depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"session","num":142,"name":"surface_interval","type":"uint32","scale":1,"units":"s" }, + { "message":"session","num":143,"name":"start_cns","type":"uint8","scale":1,"units":"percent" }, + { "message":"session","num":144,"name":"end_cns","type":"uint8","scale":1,"units":"percent" }, + { "message":"session","num":145,"name":"start_n2","type":"uint16","scale":1,"units":"percent" }, + { "message":"session","num":146,"name":"end_n2","type":"uint16","scale":1,"units":"percent" }, + { "message":"session","num":147,"name":"avg_respiration_rate","type":"uint8" }, + { "message":"session","num":148,"name":"max_respiration_rate","type":"uint8" }, + { "message":"session","num":149,"name":"min_respiration_rate","type":"uint8" }, + { "message":"session","num":150,"name":"min_temperature","type":"sint8","units":"C" }, + { "message":"session","num":155,"name":"o2_toxicity","type":"uint16","units":"OTUs" }, + { "message":"session","num":156,"name":"dive_number","type":"uint32" }, + { "message":"session","num":168,"name":"training_load_peak","type":"sint32","scale":65536 }, + { "message":"session","num":169,"name":"enhanced_avg_respiration_rate","type":"uint16","scale":100,"units":"Breaths/min" }, + { "message":"session","num":170,"name":"enhanced_max_respiration_rate","type":"uint16","scale":100,"units":"Breaths/min" }, + { "message":"session","num":180,"name":"enhanced_min_respiration_rate","type":"uint16","scale":100 }, + { "message":"session","num":181,"name":"total_grit","type":"float32","units":"kGrit" }, + { "message":"session","num":182,"name":"total_flow","type":"float32","units":"Flow" }, + { "message":"session","num":183,"name":"jump_count","type":"uint16" }, + { "message":"session","num":186,"name":"avg_grit","type":"float32","units":"kGrit" }, + { "message":"session","num":187,"name":"avg_flow","type":"float32","units":"Flow" }, + { "message":"session","num":194,"name":"avg_spo2","type":"uint8","units":"percent" }, + { "message":"session","num":195,"name":"avg_stress","type":"uint8","units":"percent" }, + { "message":"session","num":197,"name":"sdrr_hrv","type":"uint8","units":"mS" }, + { "message":"session","num":198,"name":"rmssd_hrv","type":"uint8","units":"mS" }, + { "message":"session","num":199,"name":"total_fractional_ascent","type":"uint8","scale":100,"units":"m" }, + { "message":"session","num":200,"name":"total_fractional_descent","type":"uint8","scale":100,"units":"m" }, + { "message":"session","num":208,"name":"avg_core_temperature","type":"uint16","scale":100,"units":"C" }, + { "message":"session","num":209,"name":"min_core_temperature","type":"uint16","scale":100,"units":"C" }, + { "message":"session","num":210,"name":"max_core_temperature","type":"uint16","scale":100,"units":"C" }, + { "message":"lap","num":254,"name":"message_index","type":"message_index" }, + { "message":"lap","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"lap","num":0,"name":"event","type":"event" }, + { "message":"lap","num":1,"name":"event_type","type":"event_type" }, + { "message":"lap","num":2,"name":"start_time","type":"date_time" }, + { "message":"lap","num":3,"name":"start_position_lat","type":"sint32","units":"semicircles" }, + { "message":"lap","num":4,"name":"start_position_long","type":"sint32","units":"semicircles" }, + { "message":"lap","num":5,"name":"end_position_lat","type":"sint32","units":"semicircles" }, + { "message":"lap","num":6,"name":"end_position_long","type":"sint32","units":"semicircles" }, + { "message":"lap","num":7,"name":"total_elapsed_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"lap","num":8,"name":"total_timer_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"lap","num":9,"name":"total_distance","type":"uint32","scale":100,"units":"m" }, + { "message":"lap","num":10,"name":"total_cycles","type":"uint32","units":"cycles" }, + { "message":"lap","num":11,"name":"total_calories","type":"uint16","units":"kcal" }, + { "message":"lap","num":12,"name":"total_fat_calories","type":"uint16","units":"kcal" }, + { "message":"lap","num":13,"name":"avg_speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"lap","num":14,"name":"max_speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"lap","num":15,"name":"avg_heart_rate","type":"uint8","units":"bpm" }, + { "message":"lap","num":16,"name":"max_heart_rate","type":"uint8","units":"bpm" }, + { "message":"lap","num":17,"name":"avg_cadence","type":"uint8","units":"rpm" }, + { "message":"lap","num":18,"name":"max_cadence","type":"uint8","units":"rpm" }, + { "message":"lap","num":19,"name":"avg_power","type":"uint16","units":"watts" }, + { "message":"lap","num":20,"name":"max_power","type":"uint16","units":"watts" }, + { "message":"lap","num":21,"name":"total_ascent","type":"uint16","units":"m" }, + { "message":"lap","num":22,"name":"total_descent","type":"uint16","units":"m" }, + { "message":"lap","num":23,"name":"intensity","type":"intensity" }, + { "message":"lap","num":24,"name":"lap_trigger","type":"lap_trigger" }, + { "message":"lap","num":25,"name":"sport","type":"sport" }, + { "message":"lap","num":26,"name":"event_group","type":"uint8" }, + { "message":"lap","num":32,"name":"num_lengths","type":"uint16","units":"lengths" }, + { "message":"lap","num":33,"name":"normalized_power","type":"uint16","units":"watts" }, + { "message":"lap","num":34,"name":"left_right_balance","type":"left_right_balance_100" }, + { "message":"lap","num":35,"name":"first_length_index","type":"uint16" }, + { "message":"lap","num":37,"name":"avg_stroke_distance","type":"uint16","scale":100,"units":"m" }, + { "message":"lap","num":38,"name":"swim_stroke","type":"swim_stroke" }, + { "message":"lap","num":39,"name":"sub_sport","type":"sub_sport" }, + { "message":"lap","num":40,"name":"num_active_lengths","type":"uint16","units":"lengths" }, + { "message":"lap","num":41,"name":"total_work","type":"uint32","units":"J" }, + { "message":"lap","num":42,"name":"avg_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"lap","num":43,"name":"max_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"lap","num":44,"name":"gps_accuracy","type":"uint8","units":"m" }, + { "message":"lap","num":45,"name":"avg_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"lap","num":46,"name":"avg_pos_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"lap","num":47,"name":"avg_neg_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"lap","num":48,"name":"max_pos_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"lap","num":49,"name":"max_neg_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"lap","num":50,"name":"avg_temperature","type":"sint8","units":"C" }, + { "message":"lap","num":51,"name":"max_temperature","type":"sint8","units":"C" }, + { "message":"lap","num":52,"name":"total_moving_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"lap","num":53,"name":"avg_pos_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"lap","num":54,"name":"avg_neg_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"lap","num":55,"name":"max_pos_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"lap","num":56,"name":"max_neg_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"lap","num":57,"name":"time_in_hr_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"lap","num":58,"name":"time_in_speed_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"lap","num":59,"name":"time_in_cadence_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"lap","num":60,"name":"time_in_power_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"lap","num":61,"name":"repetition_num","type":"uint16" }, + { "message":"lap","num":62,"name":"min_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"lap","num":63,"name":"min_heart_rate","type":"uint8","units":"bpm" }, + { "message":"lap","num":71,"name":"wkt_step_index","type":"message_index" }, + { "message":"lap","num":74,"name":"opponent_score","type":"uint16" }, + { "message":"lap","num":75,"name":"stroke_count","type":"uint16","array":"[N]","units":"counts" }, + { "message":"lap","num":76,"name":"zone_count","type":"uint16","array":"[N]","units":"counts" }, + { "message":"lap","num":77,"name":"avg_vertical_oscillation","type":"uint16","scale":10,"units":"mm" }, + { "message":"lap","num":78,"name":"avg_stance_time_percent","type":"uint16","scale":100,"units":"percent" }, + { "message":"lap","num":79,"name":"avg_stance_time","type":"uint16","scale":10,"units":"ms" }, + { "message":"lap","num":80,"name":"avg_fractional_cadence","type":"uint8","scale":128,"units":"rpm" }, + { "message":"lap","num":81,"name":"max_fractional_cadence","type":"uint8","scale":128,"units":"rpm" }, + { "message":"lap","num":82,"name":"total_fractional_cycles","type":"uint8","scale":128,"units":"cycles" }, + { "message":"lap","num":83,"name":"player_score","type":"uint16" }, + { "message":"lap","num":84,"name":"avg_total_hemoglobin_conc","type":"uint16","array":"[N]","scale":100,"units":"g/dL" }, + { "message":"lap","num":85,"name":"min_total_hemoglobin_conc","type":"uint16","array":"[N]","scale":100,"units":"g/dL" }, + { "message":"lap","num":86,"name":"max_total_hemoglobin_conc","type":"uint16","array":"[N]","scale":100,"units":"g/dL" }, + { "message":"lap","num":87,"name":"avg_saturated_hemoglobin_percent","type":"uint16","array":"[N]","scale":10,"units":"%" }, + { "message":"lap","num":88,"name":"min_saturated_hemoglobin_percent","type":"uint16","array":"[N]","scale":10,"units":"%" }, + { "message":"lap","num":89,"name":"max_saturated_hemoglobin_percent","type":"uint16","array":"[N]","scale":10,"units":"%" }, + { "message":"lap","num":91,"name":"avg_left_torque_effectiveness","type":"uint8","scale":2,"units":"percent" }, + { "message":"lap","num":92,"name":"avg_right_torque_effectiveness","type":"uint8","scale":2,"units":"percent" }, + { "message":"lap","num":93,"name":"avg_left_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"lap","num":94,"name":"avg_right_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"lap","num":95,"name":"avg_combined_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"lap","num":98,"name":"time_standing","type":"uint32","scale":1000,"units":"s" }, + { "message":"lap","num":99,"name":"stand_count","type":"uint16" }, + { "message":"lap","num":100,"name":"avg_left_pco","type":"sint8","units":"mm" }, + { "message":"lap","num":101,"name":"avg_right_pco","type":"sint8","units":"mm" }, + { "message":"lap","num":102,"name":"avg_left_power_phase","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"lap","num":103,"name":"avg_left_power_phase_peak","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"lap","num":104,"name":"avg_right_power_phase","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"lap","num":105,"name":"avg_right_power_phase_peak","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"lap","num":106,"name":"avg_power_position","type":"uint16","array":"[N]","units":"watts" }, + { "message":"lap","num":107,"name":"max_power_position","type":"uint16","array":"[N]","units":"watts" }, + { "message":"lap","num":108,"name":"avg_cadence_position","type":"uint8","array":"[N]","units":"rpm" }, + { "message":"lap","num":109,"name":"max_cadence_position","type":"uint8","array":"[N]","units":"rpm" }, + { "message":"lap","num":110,"name":"enhanced_avg_speed","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"lap","num":111,"name":"enhanced_max_speed","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"lap","num":112,"name":"enhanced_avg_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"lap","num":113,"name":"enhanced_min_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"lap","num":114,"name":"enhanced_max_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"lap","num":115,"name":"avg_lev_motor_power","type":"uint16","units":"watts" }, + { "message":"lap","num":116,"name":"max_lev_motor_power","type":"uint16","units":"watts" }, + { "message":"lap","num":117,"name":"lev_battery_consumption","type":"uint8","scale":2,"units":"percent" }, + { "message":"lap","num":118,"name":"avg_vertical_ratio","type":"uint16","scale":100,"units":"percent" }, + { "message":"lap","num":119,"name":"avg_stance_time_balance","type":"uint16","scale":100,"units":"percent" }, + { "message":"lap","num":120,"name":"avg_step_length","type":"uint16","scale":10,"units":"mm" }, + { "message":"lap","num":121,"name":"avg_vam","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"lap","num":122,"name":"avg_depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"lap","num":123,"name":"max_depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"lap","num":124,"name":"min_temperature","type":"sint8","units":"C" }, + { "message":"lap","num":136,"name":"enhanced_avg_respiration_rate","type":"uint16","scale":100,"units":"Breaths/min" }, + { "message":"lap","num":137,"name":"enhanced_max_respiration_rate","type":"uint16","scale":100,"units":"Breaths/min" }, + { "message":"lap","num":147,"name":"avg_respiration_rate","type":"uint8" }, + { "message":"lap","num":148,"name":"max_respiration_rate","type":"uint8" }, + { "message":"lap","num":149,"name":"total_grit","type":"float32","units":"kGrit" }, + { "message":"lap","num":150,"name":"total_flow","type":"float32","units":"Flow" }, + { "message":"lap","num":151,"name":"jump_count","type":"uint16" }, + { "message":"lap","num":153,"name":"avg_grit","type":"float32","units":"kGrit" }, + { "message":"lap","num":154,"name":"avg_flow","type":"float32","units":"Flow" }, + { "message":"lap","num":156,"name":"total_fractional_ascent","type":"uint8","scale":100,"units":"m" }, + { "message":"lap","num":157,"name":"total_fractional_descent","type":"uint8","scale":100,"units":"m" }, + { "message":"lap","num":158,"name":"avg_core_temperature","type":"uint16","scale":100,"units":"C" }, + { "message":"lap","num":159,"name":"min_core_temperature","type":"uint16","scale":100,"units":"C" }, + { "message":"lap","num":160,"name":"max_core_temperature","type":"uint16","scale":100,"units":"C" }, + { "message":"length","num":254,"name":"message_index","type":"message_index" }, + { "message":"length","num":253,"name":"timestamp","type":"date_time" }, + { "message":"length","num":0,"name":"event","type":"event" }, + { "message":"length","num":1,"name":"event_type","type":"event_type" }, + { "message":"length","num":2,"name":"start_time","type":"date_time" }, + { "message":"length","num":3,"name":"total_elapsed_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"length","num":4,"name":"total_timer_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"length","num":5,"name":"total_strokes","type":"uint16","units":"strokes" }, + { "message":"length","num":6,"name":"avg_speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"length","num":7,"name":"swim_stroke","type":"swim_stroke","units":"swim_stroke" }, + { "message":"length","num":9,"name":"avg_swimming_cadence","type":"uint8","units":"strokes/min" }, + { "message":"length","num":10,"name":"event_group","type":"uint8" }, + { "message":"length","num":11,"name":"total_calories","type":"uint16","units":"kcal" }, + { "message":"length","num":12,"name":"length_type","type":"length_type" }, + { "message":"length","num":18,"name":"player_score","type":"uint16" }, + { "message":"length","num":19,"name":"opponent_score","type":"uint16" }, + { "message":"length","num":20,"name":"stroke_count","type":"uint16","array":"[N]","units":"counts" }, + { "message":"length","num":21,"name":"zone_count","type":"uint16","array":"[N]","units":"counts" }, + { "message":"length","num":22,"name":"enhanced_avg_respiration_rate","type":"uint16","scale":100,"units":"Breaths/min" }, + { "message":"length","num":23,"name":"enhanced_max_respiration_rate","type":"uint16","scale":100,"units":"Breaths/min" }, + { "message":"length","num":24,"name":"avg_respiration_rate","type":"uint8" }, + { "message":"length","num":25,"name":"max_respiration_rate","type":"uint8" }, + { "message":"record","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"record","num":0,"name":"position_lat","type":"sint32","units":"semicircles" }, + { "message":"record","num":1,"name":"position_long","type":"sint32","units":"semicircles" }, + { "message":"record","num":2,"name":"altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"record","num":3,"name":"heart_rate","type":"uint8","units":"bpm" }, + { "message":"record","num":4,"name":"cadence","type":"uint8","units":"rpm" }, + { "message":"record","num":5,"name":"distance","type":"uint32","scale":100,"units":"m" }, + { "message":"record","num":6,"name":"speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"record","num":7,"name":"power","type":"uint16","units":"watts" }, + { "message":"record","num":9,"name":"grade","type":"sint16","scale":100,"units":"%" }, + { "message":"record","num":10,"name":"resistance","type":"uint8" }, + { "message":"record","num":11,"name":"time_from_course","type":"sint32","scale":1000,"units":"s" }, + { "message":"record","num":12,"name":"cycle_length","type":"uint8","scale":100,"units":"m" }, + { "message":"record","num":13,"name":"temperature","type":"sint8","units":"C" }, + { "message":"record","num":17,"name":"speed_1s","type":"uint8","array":"[N]","scale":16,"units":"m/s" }, + { "message":"record","num":18,"name":"cycles","type":"uint8","units":"cycles" }, + { "message":"record","num":19,"name":"total_cycles","type":"uint32","units":"cycles" }, + { "message":"record","num":28,"name":"compressed_accumulated_power","type":"uint16","units":"watts" }, + { "message":"record","num":29,"name":"accumulated_power","type":"uint32","units":"watts" }, + { "message":"record","num":30,"name":"left_right_balance","type":"left_right_balance" }, + { "message":"record","num":31,"name":"gps_accuracy","type":"uint8","units":"m" }, + { "message":"record","num":32,"name":"vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"record","num":33,"name":"calories","type":"uint16","units":"kcal" }, + { "message":"record","num":39,"name":"vertical_oscillation","type":"uint16","scale":10,"units":"mm" }, + { "message":"record","num":40,"name":"stance_time_percent","type":"uint16","scale":100,"units":"percent" }, + { "message":"record","num":41,"name":"stance_time","type":"uint16","scale":10,"units":"ms" }, + { "message":"record","num":42,"name":"activity_type","type":"activity_type" }, + { "message":"record","num":43,"name":"left_torque_effectiveness","type":"uint8","scale":2,"units":"percent" }, + { "message":"record","num":44,"name":"right_torque_effectiveness","type":"uint8","scale":2,"units":"percent" }, + { "message":"record","num":45,"name":"left_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"record","num":46,"name":"right_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"record","num":47,"name":"combined_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"record","num":48,"name":"time128","type":"uint8","scale":128,"units":"s" }, + { "message":"record","num":49,"name":"stroke_type","type":"stroke_type" }, + { "message":"record","num":50,"name":"zone","type":"uint8" }, + { "message":"record","num":51,"name":"ball_speed","type":"uint16","scale":100,"units":"m/s" }, + { "message":"record","num":52,"name":"cadence256","type":"uint16","scale":256,"units":"rpm" }, + { "message":"record","num":53,"name":"fractional_cadence","type":"uint8","scale":128,"units":"rpm" }, + { "message":"record","num":54,"name":"total_hemoglobin_conc","type":"uint16","scale":100,"units":"g/dL" }, + { "message":"record","num":55,"name":"total_hemoglobin_conc_min","type":"uint16","scale":100,"units":"g/dL" }, + { "message":"record","num":56,"name":"total_hemoglobin_conc_max","type":"uint16","scale":100,"units":"g/dL" }, + { "message":"record","num":57,"name":"saturated_hemoglobin_percent","type":"uint16","scale":10,"units":"%" }, + { "message":"record","num":58,"name":"saturated_hemoglobin_percent_min","type":"uint16","scale":10,"units":"%" }, + { "message":"record","num":59,"name":"saturated_hemoglobin_percent_max","type":"uint16","scale":10,"units":"%" }, + { "message":"record","num":62,"name":"device_index","type":"device_index" }, + { "message":"record","num":67,"name":"left_pco","type":"sint8","units":"mm" }, + { "message":"record","num":68,"name":"right_pco","type":"sint8","units":"mm" }, + { "message":"record","num":69,"name":"left_power_phase","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"record","num":70,"name":"left_power_phase_peak","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"record","num":71,"name":"right_power_phase","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"record","num":72,"name":"right_power_phase_peak","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"record","num":73,"name":"enhanced_speed","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"record","num":78,"name":"enhanced_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"record","num":81,"name":"battery_soc","type":"uint8","scale":2,"units":"percent" }, + { "message":"record","num":82,"name":"motor_power","type":"uint16","units":"watts" }, + { "message":"record","num":83,"name":"vertical_ratio","type":"uint16","scale":100,"units":"percent" }, + { "message":"record","num":84,"name":"stance_time_balance","type":"uint16","scale":100,"units":"percent" }, + { "message":"record","num":85,"name":"step_length","type":"uint16","scale":10,"units":"mm" }, + { "message":"record","num":87,"name":"cycle_length16","type":"uint16","scale":100,"units":"m" }, + { "message":"record","num":91,"name":"absolute_pressure","type":"uint32","units":"Pa" }, + { "message":"record","num":92,"name":"depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"record","num":93,"name":"next_stop_depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"record","num":94,"name":"next_stop_time","type":"uint32","scale":1,"units":"s" }, + { "message":"record","num":95,"name":"time_to_surface","type":"uint32","scale":1,"units":"s" }, + { "message":"record","num":96,"name":"ndl_time","type":"uint32","scale":1,"units":"s" }, + { "message":"record","num":97,"name":"cns_load","type":"uint8","units":"percent" }, + { "message":"record","num":98,"name":"n2_load","type":"uint16","scale":1,"units":"percent" }, + { "message":"record","num":99,"name":"respiration_rate","type":"uint8","scale":1,"units":"s" }, + { "message":"record","num":108,"name":"enhanced_respiration_rate","type":"uint16","scale":100,"units":"Breaths/min" }, + { "message":"record","num":114,"name":"grit","type":"float32" }, + { "message":"record","num":115,"name":"flow","type":"float32" }, + { "message":"record","num":116,"name":"current_stress","type":"uint16","scale":100 }, + { "message":"record","num":117,"name":"ebike_travel_range","type":"uint16","units":"km" }, + { "message":"record","num":118,"name":"ebike_battery_level","type":"uint8","units":"percent" }, + { "message":"record","num":119,"name":"ebike_assist_mode","type":"uint8","units":"depends on sensor" }, + { "message":"record","num":120,"name":"ebike_assist_level_percent","type":"uint8","units":"percent" }, + { "message":"record","num":123,"name":"air_time_remaining","type":"uint32","units":"s" }, + { "message":"record","num":124,"name":"pressure_sac","type":"uint16","scale":100,"units":"bar/min" }, + { "message":"record","num":125,"name":"volume_sac","type":"uint16","scale":100,"units":"L/min" }, + { "message":"record","num":126,"name":"rmv","type":"uint16","scale":100,"units":"L/min" }, + { "message":"record","num":127,"name":"ascent_rate","type":"sint32","scale":1000,"units":"m/s" }, + { "message":"record","num":129,"name":"po2","type":"uint8","scale":100,"units":"percent" }, + { "message":"record","num":139,"name":"core_temperature","type":"uint16","scale":100,"units":"C" }, + { "message":"event","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"event","num":0,"name":"event","type":"event" }, + { "message":"event","num":1,"name":"event_type","type":"event_type" }, + { "message":"event","num":2,"name":"data16","type":"uint16" }, + { "message":"event","num":3,"name":"data","type":"uint32" }, + { "message":"event","num":4,"name":"event_group","type":"uint8" }, + { "message":"event","num":7,"name":"score","type":"uint16" }, + { "message":"event","num":8,"name":"opponent_score","type":"uint16" }, + { "message":"event","num":9,"name":"front_gear_num","type":"uint8z" }, + { "message":"event","num":10,"name":"front_gear","type":"uint8z" }, + { "message":"event","num":11,"name":"rear_gear_num","type":"uint8z" }, + { "message":"event","num":12,"name":"rear_gear","type":"uint8z" }, + { "message":"event","num":13,"name":"device_index","type":"device_index" }, + { "message":"event","num":14,"name":"activity_type","type":"activity_type" }, + { "message":"event","num":15,"name":"start_timestamp","type":"date_time","units":"s" }, + { "message":"event","num":21,"name":"radar_threat_level_max","type":"radar_threat_level_type" }, + { "message":"event","num":22,"name":"radar_threat_count","type":"uint8" }, + { "message":"event","num":23,"name":"radar_threat_avg_approach_speed","type":"uint8","scale":10,"units":"m/s" }, + { "message":"event","num":24,"name":"radar_threat_max_approach_speed","type":"uint8","scale":10,"units":"m/s" }, + { "message":"device_info","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"device_info","num":0,"name":"device_index","type":"device_index" }, + { "message":"device_info","num":1,"name":"device_type","type":"uint8" }, + { "message":"device_info","num":2,"name":"manufacturer","type":"manufacturer" }, + { "message":"device_info","num":3,"name":"serial_number","type":"uint32z" }, + { "message":"device_info","num":4,"name":"product","type":"uint16" }, + { "message":"device_info","num":5,"name":"software_version","type":"uint16","scale":100 }, + { "message":"device_info","num":6,"name":"hardware_version","type":"uint8" }, + { "message":"device_info","num":7,"name":"cum_operating_time","type":"uint32","units":"s" }, + { "message":"device_info","num":10,"name":"battery_voltage","type":"uint16","scale":256,"units":"V" }, + { "message":"device_info","num":11,"name":"battery_status","type":"battery_status" }, + { "message":"device_info","num":18,"name":"sensor_position","type":"body_location" }, + { "message":"device_info","num":19,"name":"descriptor","type":"string" }, + { "message":"device_info","num":20,"name":"ant_transmission_type","type":"uint8z" }, + { "message":"device_info","num":21,"name":"ant_device_number","type":"uint16z" }, + { "message":"device_info","num":22,"name":"ant_network","type":"ant_network" }, + { "message":"device_info","num":25,"name":"source_type","type":"source_type" }, + { "message":"device_info","num":27,"name":"product_name","type":"string" }, + { "message":"device_info","num":32,"name":"battery_level","type":"uint8","units":"%" }, + { "message":"device_aux_battery_info","num":253,"name":"timestamp","type":"date_time" }, + { "message":"device_aux_battery_info","num":0,"name":"device_index","type":"device_index" }, + { "message":"device_aux_battery_info","num":1,"name":"battery_voltage","type":"uint16","scale":256,"units":"V" }, + { "message":"device_aux_battery_info","num":2,"name":"battery_status","type":"battery_status" }, + { "message":"device_aux_battery_info","num":3,"name":"battery_identifier","type":"uint8" }, + { "message":"training_file","num":253,"name":"timestamp","type":"date_time" }, + { "message":"training_file","num":0,"name":"type","type":"file" }, + { "message":"training_file","num":1,"name":"manufacturer","type":"manufacturer" }, + { "message":"training_file","num":2,"name":"product","type":"uint16" }, + { "message":"training_file","num":3,"name":"serial_number","type":"uint32z" }, + { "message":"training_file","num":4,"name":"time_created","type":"date_time" }, + { "message":"weather_conditions","num":253,"name":"timestamp","type":"date_time" }, + { "message":"weather_conditions","num":0,"name":"weather_report","type":"weather_report" }, + { "message":"weather_conditions","num":1,"name":"temperature","type":"sint8","units":"C" }, + { "message":"weather_conditions","num":2,"name":"condition","type":"weather_status" }, + { "message":"weather_conditions","num":3,"name":"wind_direction","type":"uint16","units":"degrees" }, + { "message":"weather_conditions","num":4,"name":"wind_speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"weather_conditions","num":5,"name":"precipitation_probability","type":"uint8" }, + { "message":"weather_conditions","num":6,"name":"temperature_feels_like","type":"sint8","units":"C" }, + { "message":"weather_conditions","num":7,"name":"relative_humidity","type":"uint8" }, + { "message":"weather_conditions","num":8,"name":"location","type":"string" }, + { "message":"weather_conditions","num":9,"name":"observed_at_time","type":"date_time" }, + { "message":"weather_conditions","num":10,"name":"observed_location_lat","type":"sint32","units":"semicircles" }, + { "message":"weather_conditions","num":11,"name":"observed_location_long","type":"sint32","units":"semicircles" }, + { "message":"weather_conditions","num":12,"name":"day_of_week","type":"day_of_week" }, + { "message":"weather_conditions","num":13,"name":"high_temperature","type":"sint8","units":"C" }, + { "message":"weather_conditions","num":14,"name":"low_temperature","type":"sint8","units":"C" }, + { "message":"weather_alert","num":253,"name":"timestamp","type":"date_time" }, + { "message":"weather_alert","num":0,"name":"report_id","type":"string" }, + { "message":"weather_alert","num":1,"name":"issue_time","type":"date_time" }, + { "message":"weather_alert","num":2,"name":"expire_time","type":"date_time" }, + { "message":"weather_alert","num":3,"name":"severity","type":"weather_severity" }, + { "message":"weather_alert","num":4,"name":"type","type":"weather_severe_type" }, + { "message":"gps_metadata","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"gps_metadata","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"gps_metadata","num":1,"name":"position_lat","type":"sint32","units":"semicircles" }, + { "message":"gps_metadata","num":2,"name":"position_long","type":"sint32","units":"semicircles" }, + { "message":"gps_metadata","num":3,"name":"enhanced_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"gps_metadata","num":4,"name":"enhanced_speed","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"gps_metadata","num":5,"name":"heading","type":"uint16","scale":100,"units":"degrees" }, + { "message":"gps_metadata","num":6,"name":"utc_timestamp","type":"date_time","units":"s" }, + { "message":"gps_metadata","num":7,"name":"velocity","type":"sint16","array":"[3]","scale":100,"units":"m/s" }, + { "message":"camera_event","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"camera_event","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"camera_event","num":1,"name":"camera_event_type","type":"camera_event_type" }, + { "message":"camera_event","num":2,"name":"camera_file_uuid","type":"string" }, + { "message":"camera_event","num":3,"name":"camera_orientation","type":"camera_orientation_type" }, + { "message":"gyroscope_data","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"gyroscope_data","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"gyroscope_data","num":1,"name":"sample_time_offset","type":"uint16","array":"[N]","units":"ms" }, + { "message":"gyroscope_data","num":2,"name":"gyro_x","type":"uint16","array":"[N]","units":"counts" }, + { "message":"gyroscope_data","num":3,"name":"gyro_y","type":"uint16","array":"[N]","units":"counts" }, + { "message":"gyroscope_data","num":4,"name":"gyro_z","type":"uint16","array":"[N]","units":"counts" }, + { "message":"gyroscope_data","num":5,"name":"calibrated_gyro_x","type":"float32","array":"[N]","units":"deg/s" }, + { "message":"gyroscope_data","num":6,"name":"calibrated_gyro_y","type":"float32","array":"[N]","units":"deg/s" }, + { "message":"gyroscope_data","num":7,"name":"calibrated_gyro_z","type":"float32","array":"[N]","units":"deg/s" }, + { "message":"accelerometer_data","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"accelerometer_data","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"accelerometer_data","num":1,"name":"sample_time_offset","type":"uint16","array":"[N]","units":"ms" }, + { "message":"accelerometer_data","num":2,"name":"accel_x","type":"uint16","array":"[N]","units":"counts" }, + { "message":"accelerometer_data","num":3,"name":"accel_y","type":"uint16","array":"[N]","units":"counts" }, + { "message":"accelerometer_data","num":4,"name":"accel_z","type":"uint16","array":"[N]","units":"counts" }, + { "message":"accelerometer_data","num":5,"name":"calibrated_accel_x","type":"float32","array":"[N]","units":"g" }, + { "message":"accelerometer_data","num":6,"name":"calibrated_accel_y","type":"float32","array":"[N]","units":"g" }, + { "message":"accelerometer_data","num":7,"name":"calibrated_accel_z","type":"float32","array":"[N]","units":"g" }, + { "message":"accelerometer_data","num":8,"name":"compressed_calibrated_accel_x","type":"sint16","array":"[N]","units":"mG" }, + { "message":"accelerometer_data","num":9,"name":"compressed_calibrated_accel_y","type":"sint16","array":"[N]","units":"mG" }, + { "message":"accelerometer_data","num":10,"name":"compressed_calibrated_accel_z","type":"sint16","array":"[N]","units":"mG" }, + { "message":"magnetometer_data","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"magnetometer_data","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"magnetometer_data","num":1,"name":"sample_time_offset","type":"uint16","array":"[N]","units":"ms" }, + { "message":"magnetometer_data","num":2,"name":"mag_x","type":"uint16","array":"[N]","units":"counts" }, + { "message":"magnetometer_data","num":3,"name":"mag_y","type":"uint16","array":"[N]","units":"counts" }, + { "message":"magnetometer_data","num":4,"name":"mag_z","type":"uint16","array":"[N]","units":"counts" }, + { "message":"magnetometer_data","num":5,"name":"calibrated_mag_x","type":"float32","array":"[N]","units":"G" }, + { "message":"magnetometer_data","num":6,"name":"calibrated_mag_y","type":"float32","array":"[N]","units":"G" }, + { "message":"magnetometer_data","num":7,"name":"calibrated_mag_z","type":"float32","array":"[N]","units":"G" }, + { "message":"barometer_data","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"barometer_data","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"barometer_data","num":1,"name":"sample_time_offset","type":"uint16","array":"[N]","units":"ms" }, + { "message":"barometer_data","num":2,"name":"baro_pres","type":"uint32","array":"[N]","units":"Pa" }, + { "message":"three_d_sensor_calibration","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"three_d_sensor_calibration","num":0,"name":"sensor_type","type":"sensor_type" }, + { "message":"three_d_sensor_calibration","num":1,"name":"calibration_factor","type":"uint32" }, + { "message":"three_d_sensor_calibration","name":"accel_cal_factor","type":"uint32","units":"g" }, + { "message":"three_d_sensor_calibration","name":"gyro_cal_factor","type":"uint32","units":"deg/s" }, + { "message":"three_d_sensor_calibration","num":2,"name":"calibration_divisor","type":"uint32","units":"counts" }, + { "message":"three_d_sensor_calibration","num":3,"name":"level_shift","type":"uint32" }, + { "message":"three_d_sensor_calibration","num":4,"name":"offset_cal","type":"sint32","array":"[3]" }, + { "message":"three_d_sensor_calibration","num":5,"name":"orientation_matrix","type":"sint32","array":"[9]","scale":65535 }, + { "message":"one_d_sensor_calibration","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"one_d_sensor_calibration","num":0,"name":"sensor_type","type":"sensor_type" }, + { "message":"one_d_sensor_calibration","num":1,"name":"calibration_factor","type":"uint32" }, + { "message":"one_d_sensor_calibration","name":"baro_cal_factor","type":"uint32","units":"Pa" }, + { "message":"one_d_sensor_calibration","num":2,"name":"calibration_divisor","type":"uint32","units":"counts" }, + { "message":"one_d_sensor_calibration","num":3,"name":"level_shift","type":"uint32" }, + { "message":"one_d_sensor_calibration","num":4,"name":"offset_cal","type":"sint32" }, + { "message":"video_frame","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"video_frame","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"video_frame","num":1,"name":"frame_number","type":"uint32" }, + { "message":"obdii_data","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"obdii_data","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"obdii_data","num":1,"name":"time_offset","type":"uint16","array":"[N]","units":"ms" }, + { "message":"obdii_data","num":2,"name":"pid","type":"byte" }, + { "message":"obdii_data","num":3,"name":"raw_data","type":"byte","array":"[N]" }, + { "message":"obdii_data","num":4,"name":"pid_data_size","type":"uint8","array":"[N]" }, + { "message":"obdii_data","num":5,"name":"system_time","type":"uint32","array":"[N]" }, + { "message":"obdii_data","num":6,"name":"start_timestamp","type":"date_time" }, + { "message":"obdii_data","num":7,"name":"start_timestamp_ms","type":"uint16","units":"ms" }, + { "message":"nmea_sentence","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"nmea_sentence","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"nmea_sentence","num":1,"name":"sentence","type":"string" }, + { "message":"aviation_attitude","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"aviation_attitude","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"aviation_attitude","num":1,"name":"system_time","type":"uint32","array":"[N]","units":"ms" }, + { "message":"aviation_attitude","num":2,"name":"pitch","type":"sint16","array":"[N]","scale":10430.38,"units":"radians" }, + { "message":"aviation_attitude","num":3,"name":"roll","type":"sint16","array":"[N]","scale":10430.38,"units":"radians" }, + { "message":"aviation_attitude","num":4,"name":"accel_lateral","type":"sint16","array":"[N]","scale":100,"units":"m/s^2" }, + { "message":"aviation_attitude","num":5,"name":"accel_normal","type":"sint16","array":"[N]","scale":100,"units":"m/s^2" }, + { "message":"aviation_attitude","num":6,"name":"turn_rate","type":"sint16","array":"[N]","scale":1024,"units":"radians/second" }, + { "message":"aviation_attitude","num":7,"name":"stage","type":"attitude_stage","array":"[N]" }, + { "message":"aviation_attitude","num":8,"name":"attitude_stage_complete","type":"uint8","array":"[N]","units":"%" }, + { "message":"aviation_attitude","num":9,"name":"track","type":"uint16","array":"[N]","scale":10430.38,"units":"radians" }, + { "message":"aviation_attitude","num":10,"name":"validity","type":"attitude_validity","array":"[N]" }, + { "message":"video","num":0,"name":"url","type":"string" }, + { "message":"video","num":1,"name":"hosting_provider","type":"string" }, + { "message":"video","num":2,"name":"duration","type":"uint32","units":"ms" }, + { "message":"video_title","num":254,"name":"message_index","type":"message_index" }, + { "message":"video_title","num":0,"name":"message_count","type":"uint16" }, + { "message":"video_title","num":1,"name":"text","type":"string" }, + { "message":"video_description","num":254,"name":"message_index","type":"message_index" }, + { "message":"video_description","num":0,"name":"message_count","type":"uint16" }, + { "message":"video_description","num":1,"name":"text","type":"string" }, + { "message":"video_clip","num":0,"name":"clip_number","type":"uint16" }, + { "message":"video_clip","num":1,"name":"start_timestamp","type":"date_time" }, + { "message":"video_clip","num":2,"name":"start_timestamp_ms","type":"uint16" }, + { "message":"video_clip","num":3,"name":"end_timestamp","type":"date_time" }, + { "message":"video_clip","num":4,"name":"end_timestamp_ms","type":"uint16" }, + { "message":"video_clip","num":6,"name":"clip_start","type":"uint32","units":"ms" }, + { "message":"video_clip","num":7,"name":"clip_end","type":"uint32","units":"ms" }, + { "message":"set","num":254,"name":"timestamp","type":"date_time" }, + { "message":"set","num":0,"name":"duration","type":"uint32","scale":1000,"units":"s" }, + { "message":"set","num":3,"name":"repetitions","type":"uint16" }, + { "message":"set","num":4,"name":"weight","type":"uint16","scale":16,"units":"kg" }, + { "message":"set","num":5,"name":"set_type","type":"set_type" }, + { "message":"set","num":6,"name":"start_time","type":"date_time" }, + { "message":"set","num":7,"name":"category","type":"exercise_category","array":"[N]" }, + { "message":"set","num":8,"name":"category_subtype","type":"uint16","array":"[N]" }, + { "message":"set","num":9,"name":"weight_display_unit","type":"fit_base_unit" }, + { "message":"set","num":10,"name":"message_index","type":"message_index" }, + { "message":"set","num":11,"name":"wkt_step_index","type":"message_index" }, + { "message":"jump","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"jump","num":0,"name":"distance","type":"float32","units":"m" }, + { "message":"jump","num":1,"name":"height","type":"float32","units":"m" }, + { "message":"jump","num":2,"name":"rotations","type":"uint8" }, + { "message":"jump","num":3,"name":"hang_time","type":"float32","units":"s" }, + { "message":"jump","num":4,"name":"score","type":"float32" }, + { "message":"jump","num":5,"name":"position_lat","type":"sint32","units":"semicircles" }, + { "message":"jump","num":6,"name":"position_long","type":"sint32","units":"semicircles" }, + { "message":"jump","num":7,"name":"speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"jump","num":8,"name":"enhanced_speed","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"split","num":0,"name":"split_type","type":"split_type" }, + { "message":"split","num":1,"name":"total_elapsed_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"split","num":2,"name":"total_timer_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"split","num":3,"name":"total_distance","type":"uint32","scale":100,"units":"m" }, + { "message":"split","num":9,"name":"start_time","type":"date_time" }, + { "message":"climb_pro","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"climb_pro","num":0,"name":"position_lat","type":"sint32","units":"semicircles" }, + { "message":"climb_pro","num":1,"name":"position_long","type":"sint32","units":"semicircles" }, + { "message":"climb_pro","num":2,"name":"climb_pro_event","type":"climb_pro_event" }, + { "message":"climb_pro","num":3,"name":"climb_number","type":"uint16" }, + { "message":"climb_pro","num":4,"name":"climb_category","type":"uint8" }, + { "message":"climb_pro","num":5,"name":"current_dist","type":"float32","units":"m" }, + { "message":"field_description","num":0,"name":"developer_data_index","type":"uint8" }, + { "message":"field_description","num":1,"name":"field_definition_number","type":"uint8" }, + { "message":"field_description","num":2,"name":"fit_base_type_id","type":"fit_base_type" }, + { "message":"field_description","num":3,"name":"field_name","type":"string","array":"[N]" }, + { "message":"field_description","num":4,"name":"array","type":"uint8" }, + { "message":"field_description","num":5,"name":"components","type":"string" }, + { "message":"field_description","num":6,"name":"scale","type":"uint8" }, + { "message":"field_description","num":7,"name":"offset","type":"sint8" }, + { "message":"field_description","num":8,"name":"units","type":"string","array":"[N]" }, + { "message":"field_description","num":9,"name":"bits","type":"string" }, + { "message":"field_description","num":10,"name":"accumulate","type":"string" }, + { "message":"field_description","num":13,"name":"fit_base_unit_id","type":"fit_base_unit" }, + { "message":"field_description","num":14,"name":"native_mesg_num","type":"mesg_num" }, + { "message":"field_description","num":15,"name":"native_field_num","type":"uint8" }, + { "message":"developer_data_id","num":0,"name":"developer_id","type":"byte","array":"[N]" }, + { "message":"developer_data_id","num":1,"name":"application_id","type":"byte","array":"[N]" }, + { "message":"developer_data_id","num":2,"name":"manufacturer_id","type":"manufacturer" }, + { "message":"developer_data_id","num":3,"name":"developer_data_index","type":"uint8" }, + { "message":"developer_data_id","num":4,"name":"application_version","type":"uint32" }, + { "message":"course","num":4,"name":"sport","type":"sport" }, + { "message":"course","num":5,"name":"name","type":"string" }, + { "message":"course","num":6,"name":"capabilities","type":"course_capabilities" }, + { "message":"course","num":7,"name":"sub_sport","type":"sub_sport" }, + { "message":"course_point","num":254,"name":"message_index","type":"message_index" }, + { "message":"course_point","num":1,"name":"timestamp","type":"date_time" }, + { "message":"course_point","num":2,"name":"position_lat","type":"sint32","units":"semicircles" }, + { "message":"course_point","num":3,"name":"position_long","type":"sint32","units":"semicircles" }, + { "message":"course_point","num":4,"name":"distance","type":"uint32","scale":100,"units":"m" }, + { "message":"course_point","num":5,"name":"type","type":"course_point" }, + { "message":"course_point","num":6,"name":"name","type":"string" }, + { "message":"course_point","num":8,"name":"favorite","type":"bool" }, + { "message":"segment_id","num":0,"name":"name","type":"string" }, + { "message":"segment_id","num":1,"name":"uuid","type":"string" }, + { "message":"segment_id","num":2,"name":"sport","type":"sport" }, + { "message":"segment_id","num":3,"name":"enabled","type":"bool" }, + { "message":"segment_id","num":4,"name":"user_profile_primary_key","type":"uint32" }, + { "message":"segment_id","num":5,"name":"device_id","type":"uint32" }, + { "message":"segment_id","num":6,"name":"default_race_leader","type":"uint8" }, + { "message":"segment_id","num":7,"name":"delete_status","type":"segment_delete_status" }, + { "message":"segment_id","num":8,"name":"selection_type","type":"segment_selection_type" }, + { "message":"segment_leaderboard_entry","num":254,"name":"message_index","type":"message_index" }, + { "message":"segment_leaderboard_entry","num":0,"name":"name","type":"string" }, + { "message":"segment_leaderboard_entry","num":1,"name":"type","type":"segment_leaderboard_type" }, + { "message":"segment_leaderboard_entry","num":2,"name":"group_primary_key","type":"uint32" }, + { "message":"segment_leaderboard_entry","num":3,"name":"activity_id","type":"uint32" }, + { "message":"segment_leaderboard_entry","num":4,"name":"segment_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"segment_leaderboard_entry","num":5,"name":"activity_id_string","type":"string" }, + { "message":"segment_point","num":254,"name":"message_index","type":"message_index" }, + { "message":"segment_point","num":1,"name":"position_lat","type":"sint32","units":"semicircles" }, + { "message":"segment_point","num":2,"name":"position_long","type":"sint32","units":"semicircles" }, + { "message":"segment_point","num":3,"name":"distance","type":"uint32","scale":100,"units":"m" }, + { "message":"segment_point","num":4,"name":"altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"segment_point","num":5,"name":"leader_time","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"segment_point","num":6,"name":"enhanced_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"segment_lap","num":254,"name":"message_index","type":"message_index" }, + { "message":"segment_lap","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"segment_lap","num":0,"name":"event","type":"event" }, + { "message":"segment_lap","num":1,"name":"event_type","type":"event_type" }, + { "message":"segment_lap","num":2,"name":"start_time","type":"date_time" }, + { "message":"segment_lap","num":3,"name":"start_position_lat","type":"sint32","units":"semicircles" }, + { "message":"segment_lap","num":4,"name":"start_position_long","type":"sint32","units":"semicircles" }, + { "message":"segment_lap","num":5,"name":"end_position_lat","type":"sint32","units":"semicircles" }, + { "message":"segment_lap","num":6,"name":"end_position_long","type":"sint32","units":"semicircles" }, + { "message":"segment_lap","num":7,"name":"total_elapsed_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"segment_lap","num":8,"name":"total_timer_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"segment_lap","num":9,"name":"total_distance","type":"uint32","scale":100,"units":"m" }, + { "message":"segment_lap","num":10,"name":"total_cycles","type":"uint32","units":"cycles" }, + { "message":"segment_lap","num":11,"name":"total_calories","type":"uint16","units":"kcal" }, + { "message":"segment_lap","num":12,"name":"total_fat_calories","type":"uint16","units":"kcal" }, + { "message":"segment_lap","num":13,"name":"avg_speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"segment_lap","num":14,"name":"max_speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"segment_lap","num":15,"name":"avg_heart_rate","type":"uint8","units":"bpm" }, + { "message":"segment_lap","num":16,"name":"max_heart_rate","type":"uint8","units":"bpm" }, + { "message":"segment_lap","num":17,"name":"avg_cadence","type":"uint8","units":"rpm" }, + { "message":"segment_lap","num":18,"name":"max_cadence","type":"uint8","units":"rpm" }, + { "message":"segment_lap","num":19,"name":"avg_power","type":"uint16","units":"watts" }, + { "message":"segment_lap","num":20,"name":"max_power","type":"uint16","units":"watts" }, + { "message":"segment_lap","num":21,"name":"total_ascent","type":"uint16","units":"m" }, + { "message":"segment_lap","num":22,"name":"total_descent","type":"uint16","units":"m" }, + { "message":"segment_lap","num":23,"name":"sport","type":"sport" }, + { "message":"segment_lap","num":24,"name":"event_group","type":"uint8" }, + { "message":"segment_lap","num":25,"name":"nec_lat","type":"sint32","units":"semicircles" }, + { "message":"segment_lap","num":26,"name":"nec_long","type":"sint32","units":"semicircles" }, + { "message":"segment_lap","num":27,"name":"swc_lat","type":"sint32","units":"semicircles" }, + { "message":"segment_lap","num":28,"name":"swc_long","type":"sint32","units":"semicircles" }, + { "message":"segment_lap","num":29,"name":"name","type":"string" }, + { "message":"segment_lap","num":30,"name":"normalized_power","type":"uint16","units":"watts" }, + { "message":"segment_lap","num":31,"name":"left_right_balance","type":"left_right_balance_100" }, + { "message":"segment_lap","num":32,"name":"sub_sport","type":"sub_sport" }, + { "message":"segment_lap","num":33,"name":"total_work","type":"uint32","units":"J" }, + { "message":"segment_lap","num":34,"name":"avg_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"segment_lap","num":35,"name":"max_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"segment_lap","num":36,"name":"gps_accuracy","type":"uint8","units":"m" }, + { "message":"segment_lap","num":37,"name":"avg_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"segment_lap","num":38,"name":"avg_pos_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"segment_lap","num":39,"name":"avg_neg_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"segment_lap","num":40,"name":"max_pos_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"segment_lap","num":41,"name":"max_neg_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"segment_lap","num":42,"name":"avg_temperature","type":"sint8","units":"C" }, + { "message":"segment_lap","num":43,"name":"max_temperature","type":"sint8","units":"C" }, + { "message":"segment_lap","num":44,"name":"total_moving_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"segment_lap","num":45,"name":"avg_pos_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"segment_lap","num":46,"name":"avg_neg_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"segment_lap","num":47,"name":"max_pos_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"segment_lap","num":48,"name":"max_neg_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"segment_lap","num":49,"name":"time_in_hr_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"segment_lap","num":50,"name":"time_in_speed_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"segment_lap","num":51,"name":"time_in_cadence_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"segment_lap","num":52,"name":"time_in_power_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"segment_lap","num":53,"name":"repetition_num","type":"uint16" }, + { "message":"segment_lap","num":54,"name":"min_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"segment_lap","num":55,"name":"min_heart_rate","type":"uint8","units":"bpm" }, + { "message":"segment_lap","num":56,"name":"active_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"segment_lap","num":57,"name":"wkt_step_index","type":"message_index" }, + { "message":"segment_lap","num":58,"name":"sport_event","type":"sport_event" }, + { "message":"segment_lap","num":59,"name":"avg_left_torque_effectiveness","type":"uint8","scale":2,"units":"percent" }, + { "message":"segment_lap","num":60,"name":"avg_right_torque_effectiveness","type":"uint8","scale":2,"units":"percent" }, + { "message":"segment_lap","num":61,"name":"avg_left_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"segment_lap","num":62,"name":"avg_right_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"segment_lap","num":63,"name":"avg_combined_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"segment_lap","num":64,"name":"status","type":"segment_lap_status" }, + { "message":"segment_lap","num":65,"name":"uuid","type":"string" }, + { "message":"segment_lap","num":66,"name":"avg_fractional_cadence","type":"uint8","scale":128,"units":"rpm" }, + { "message":"segment_lap","num":67,"name":"max_fractional_cadence","type":"uint8","scale":128,"units":"rpm" }, + { "message":"segment_lap","num":68,"name":"total_fractional_cycles","type":"uint8","scale":128,"units":"cycles" }, + { "message":"segment_lap","num":69,"name":"front_gear_shift_count","type":"uint16" }, + { "message":"segment_lap","num":70,"name":"rear_gear_shift_count","type":"uint16" }, + { "message":"segment_lap","num":71,"name":"time_standing","type":"uint32","scale":1000,"units":"s" }, + { "message":"segment_lap","num":72,"name":"stand_count","type":"uint16" }, + { "message":"segment_lap","num":73,"name":"avg_left_pco","type":"sint8","units":"mm" }, + { "message":"segment_lap","num":74,"name":"avg_right_pco","type":"sint8","units":"mm" }, + { "message":"segment_lap","num":75,"name":"avg_left_power_phase","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"segment_lap","num":76,"name":"avg_left_power_phase_peak","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"segment_lap","num":77,"name":"avg_right_power_phase","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"segment_lap","num":78,"name":"avg_right_power_phase_peak","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"segment_lap","num":79,"name":"avg_power_position","type":"uint16","array":"[N]","units":"watts" }, + { "message":"segment_lap","num":80,"name":"max_power_position","type":"uint16","array":"[N]","units":"watts" }, + { "message":"segment_lap","num":81,"name":"avg_cadence_position","type":"uint8","array":"[N]","units":"rpm" }, + { "message":"segment_lap","num":82,"name":"max_cadence_position","type":"uint8","array":"[N]","units":"rpm" }, + { "message":"segment_lap","num":83,"name":"manufacturer","type":"manufacturer" }, + { "message":"segment_lap","num":84,"name":"total_grit","type":"float32","units":"kGrit" }, + { "message":"segment_lap","num":85,"name":"total_flow","type":"float32","units":"Flow" }, + { "message":"segment_lap","num":86,"name":"avg_grit","type":"float32","units":"kGrit" }, + { "message":"segment_lap","num":87,"name":"avg_flow","type":"float32","units":"Flow" }, + { "message":"segment_lap","num":89,"name":"total_fractional_ascent","type":"uint8","scale":100,"units":"m" }, + { "message":"segment_lap","num":90,"name":"total_fractional_descent","type":"uint8","scale":100,"units":"m" }, + { "message":"segment_lap","num":91,"name":"enhanced_avg_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"segment_lap","num":92,"name":"enhanced_max_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"segment_lap","num":93,"name":"enhanced_min_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"segment_file","num":254,"name":"message_index","type":"message_index" }, + { "message":"segment_file","num":1,"name":"file_uuid","type":"string" }, + { "message":"segment_file","num":3,"name":"enabled","type":"bool" }, + { "message":"segment_file","num":4,"name":"user_profile_primary_key","type":"uint32" }, + { "message":"segment_file","num":7,"name":"leader_type","type":"segment_leaderboard_type","array":"[N]" }, + { "message":"segment_file","num":8,"name":"leader_group_primary_key","type":"uint32","array":"[N]" }, + { "message":"segment_file","num":9,"name":"leader_activity_id","type":"uint32","array":"[N]" }, + { "message":"segment_file","num":10,"name":"leader_activity_id_string","type":"string","array":"[N]" }, + { "message":"segment_file","num":11,"name":"default_race_leader","type":"uint8" }, + { "message":"workout","num":254,"name":"message_index","type":"message_index" }, + { "message":"workout","num":4,"name":"sport","type":"sport" }, + { "message":"workout","num":5,"name":"capabilities","type":"workout_capabilities" }, + { "message":"workout","num":6,"name":"num_valid_steps","type":"uint16" }, + { "message":"workout","num":8,"name":"wkt_name","type":"string" }, + { "message":"workout","num":11,"name":"sub_sport","type":"sub_sport" }, + { "message":"workout","num":14,"name":"pool_length","type":"uint16","scale":100,"units":"m" }, + { "message":"workout","num":15,"name":"pool_length_unit","type":"display_measure" }, + { "message":"workout_session","num":254,"name":"message_index","type":"message_index" }, + { "message":"workout_session","num":0,"name":"sport","type":"sport" }, + { "message":"workout_session","num":1,"name":"sub_sport","type":"sub_sport" }, + { "message":"workout_session","num":2,"name":"num_valid_steps","type":"uint16" }, + { "message":"workout_session","num":3,"name":"first_step_index","type":"uint16" }, + { "message":"workout_session","num":4,"name":"pool_length","type":"uint16","scale":100,"units":"m" }, + { "message":"workout_session","num":5,"name":"pool_length_unit","type":"display_measure" }, + { "message":"workout_step","num":254,"name":"message_index","type":"message_index" }, + { "message":"workout_step","num":0,"name":"wkt_step_name","type":"string" }, + { "message":"workout_step","num":1,"name":"duration_type","type":"wkt_step_duration" }, + { "message":"workout_step","num":2,"name":"duration_value","type":"uint32" }, + { "message":"workout_step","num":3,"name":"target_type","type":"wkt_step_target" }, + { "message":"workout_step","num":4,"name":"target_value","type":"uint32" }, + { "message":"workout_step","num":5,"name":"custom_target_value_low","type":"uint32" }, + { "message":"workout_step","num":6,"name":"custom_target_value_high","type":"uint32" }, + { "message":"workout_step","num":7,"name":"intensity","type":"intensity" }, + { "message":"workout_step","num":8,"name":"notes","type":"string" }, + { "message":"workout_step","num":9,"name":"equipment","type":"workout_equipment" }, + { "message":"workout_step","num":10,"name":"exercise_category","type":"exercise_category" }, + { "message":"workout_step","num":11,"name":"exercise_name","type":"uint16" }, + { "message":"workout_step","num":12,"name":"exercise_weight","type":"uint16","scale":100,"units":"kg" }, + { "message":"workout_step","num":13,"name":"weight_display_unit","type":"fit_base_unit" }, + { "message":"workout_step","num":19,"name":"secondary_target_type","type":"wkt_step_target" }, + { "message":"workout_step","num":20,"name":"secondary_target_value","type":"uint32" }, + { "message":"workout_step","num":21,"name":"secondary_custom_target_value_low","type":"uint32" }, + { "message":"workout_step","num":22,"name":"secondary_custom_target_value_high","type":"uint32" }, + { "message":"exercise_title","num":254,"name":"message_index","type":"message_index" }, + { "message":"exercise_title","num":0,"name":"exercise_category","type":"exercise_category" }, + { "message":"exercise_title","num":1,"name":"exercise_name","type":"uint16" }, + { "message":"exercise_title","num":2,"name":"wkt_step_name","type":"string","array":"[N]" }, + { "message":"schedule","num":0,"name":"manufacturer","type":"manufacturer" }, + { "message":"schedule","num":1,"name":"product","type":"uint16" }, + { "message":"schedule","num":2,"name":"serial_number","type":"uint32z" }, + { "message":"schedule","num":3,"name":"time_created","type":"date_time" }, + { "message":"schedule","num":4,"name":"completed","type":"bool" }, + { "message":"schedule","num":5,"name":"type","type":"schedule" }, + { "message":"schedule","num":6,"name":"scheduled_time","type":"local_date_time" }, + { "message":"totals","num":254,"name":"message_index","type":"message_index" }, + { "message":"totals","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"totals","num":0,"name":"timer_time","type":"uint32","units":"s" }, + { "message":"totals","num":1,"name":"distance","type":"uint32","units":"m" }, + { "message":"totals","num":2,"name":"calories","type":"uint32","units":"kcal" }, + { "message":"totals","num":3,"name":"sport","type":"sport" }, + { "message":"totals","num":4,"name":"elapsed_time","type":"uint32","units":"s" }, + { "message":"totals","num":5,"name":"sessions","type":"uint16" }, + { "message":"totals","num":6,"name":"active_time","type":"uint32","units":"s" }, + { "message":"totals","num":9,"name":"sport_index","type":"uint8" }, + { "message":"weight_scale","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"weight_scale","num":0,"name":"weight","type":"weight","scale":100,"units":"kg" }, + { "message":"weight_scale","num":1,"name":"percent_fat","type":"uint16","scale":100,"units":"%" }, + { "message":"weight_scale","num":2,"name":"percent_hydration","type":"uint16","scale":100,"units":"%" }, + { "message":"weight_scale","num":3,"name":"visceral_fat_mass","type":"uint16","scale":100,"units":"kg" }, + { "message":"weight_scale","num":4,"name":"bone_mass","type":"uint16","scale":100,"units":"kg" }, + { "message":"weight_scale","num":5,"name":"muscle_mass","type":"uint16","scale":100,"units":"kg" }, + { "message":"weight_scale","num":7,"name":"basal_met","type":"uint16","scale":4,"units":"kcal/day" }, + { "message":"weight_scale","num":8,"name":"physique_rating","type":"uint8" }, + { "message":"weight_scale","num":9,"name":"active_met","type":"uint16","scale":4,"units":"kcal/day" }, + { "message":"weight_scale","num":10,"name":"metabolic_age","type":"uint8","units":"years" }, + { "message":"weight_scale","num":11,"name":"visceral_fat_rating","type":"uint8" }, + { "message":"weight_scale","num":12,"name":"user_profile_index","type":"message_index" }, + { "message":"weight_scale","num":13,"name":"bmi","type":"uint16","scale":10,"units":"kg/m^2" }, + { "message":"blood_pressure","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"blood_pressure","num":0,"name":"systolic_pressure","type":"uint16","units":"mmHg" }, + { "message":"blood_pressure","num":1,"name":"diastolic_pressure","type":"uint16","units":"mmHg" }, + { "message":"blood_pressure","num":2,"name":"mean_arterial_pressure","type":"uint16","units":"mmHg" }, + { "message":"blood_pressure","num":3,"name":"map_3_sample_mean","type":"uint16","units":"mmHg" }, + { "message":"blood_pressure","num":4,"name":"map_morning_values","type":"uint16","units":"mmHg" }, + { "message":"blood_pressure","num":5,"name":"map_evening_values","type":"uint16","units":"mmHg" }, + { "message":"blood_pressure","num":6,"name":"heart_rate","type":"uint8","units":"bpm" }, + { "message":"blood_pressure","num":7,"name":"heart_rate_type","type":"hr_type" }, + { "message":"blood_pressure","num":8,"name":"status","type":"bp_status" }, + { "message":"blood_pressure","num":9,"name":"user_profile_index","type":"message_index" }, + { "message":"monitoring_info","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"monitoring_info","num":0,"name":"local_timestamp","type":"local_date_time","units":"s" }, + { "message":"monitoring_info","num":1,"name":"activity_type","type":"activity_type","array":"[N]" }, + { "message":"monitoring_info","num":3,"name":"cycles_to_distance","type":"uint16","array":"[N]","scale":5000,"units":"m/cycle" }, + { "message":"monitoring_info","num":4,"name":"cycles_to_calories","type":"uint16","array":"[N]","scale":5000,"units":"kcal/cycle" }, + { "message":"monitoring_info","num":5,"name":"resting_metabolic_rate","type":"uint16","units":"kcal / day" }, + { "message":"monitoring","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"monitoring","num":0,"name":"device_index","type":"device_index" }, + { "message":"monitoring","num":1,"name":"calories","type":"uint16","units":"kcal" }, + { "message":"monitoring","num":2,"name":"distance","type":"uint32","scale":100,"units":"m" }, + { "message":"monitoring","num":3,"name":"cycles","type":"uint32","scale":2,"units":"cycles" }, + { "message":"monitoring","num":4,"name":"active_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"monitoring","num":5,"name":"activity_type","type":"activity_type" }, + { "message":"monitoring","num":6,"name":"activity_subtype","type":"activity_subtype" }, + { "message":"monitoring","num":7,"name":"activity_level","type":"activity_level" }, + { "message":"monitoring","num":8,"name":"distance_16","type":"uint16","units":"100 * m" }, + { "message":"monitoring","num":9,"name":"cycles_16","type":"uint16","units":"2 * cycles (steps)" }, + { "message":"monitoring","num":10,"name":"active_time_16","type":"uint16","units":"s" }, + { "message":"monitoring","num":11,"name":"local_timestamp","type":"local_date_time" }, + { "message":"monitoring","num":12,"name":"temperature","type":"sint16","scale":100,"units":"C" }, + { "message":"monitoring","num":14,"name":"temperature_min","type":"sint16","scale":100,"units":"C" }, + { "message":"monitoring","num":15,"name":"temperature_max","type":"sint16","scale":100,"units":"C" }, + { "message":"monitoring","num":16,"name":"activity_time","type":"uint16","array":"[8]","units":"minutes" }, + { "message":"monitoring","num":19,"name":"active_calories","type":"uint16","units":"kcal" }, + { "message":"monitoring","num":24,"name":"current_activity_type_intensity","type":"byte" }, + { "message":"monitoring","num":25,"name":"timestamp_min_8","type":"uint8","units":"min" }, + { "message":"monitoring","num":26,"name":"timestamp_16","type":"uint16","units":"s" }, + { "message":"monitoring","num":27,"name":"heart_rate","type":"uint8","units":"bpm" }, + { "message":"monitoring","num":28,"name":"intensity","type":"uint8","scale":10 }, + { "message":"monitoring","num":29,"name":"duration_min","type":"uint16","units":"min" }, + { "message":"monitoring","num":30,"name":"duration","type":"uint32","units":"s" }, + { "message":"monitoring","num":31,"name":"ascent","type":"uint32","scale":1000,"units":"m" }, + { "message":"monitoring","num":32,"name":"descent","type":"uint32","scale":1000,"units":"m" }, + { "message":"monitoring","num":33,"name":"moderate_activity_minutes","type":"uint16","units":"minutes" }, + { "message":"monitoring","num":34,"name":"vigorous_activity_minutes","type":"uint16","units":"minutes" }, + { "message":"monitoring_hr_data","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"monitoring_hr_data","num":0,"name":"resting_heart_rate","type":"uint8","units":"bpm" }, + { "message":"monitoring_hr_data","num":1,"name":"current_day_resting_heart_rate","type":"uint8","units":"bpm" }, + { "message":"spo2_data","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"spo2_data","num":0,"name":"reading_spo2","type":"uint8","scale":1,"units":"percent" }, + { "message":"spo2_data","num":1,"name":"reading_confidence","type":"uint8","scale":1 }, + { "message":"spo2_data","num":2,"name":"mode","type":"spo2_measurement_type" }, + { "message":"hr","num":253,"name":"timestamp","type":"date_time" }, + { "message":"hr","num":0,"name":"fractional_timestamp","type":"uint16","scale":32768,"units":"s" }, + { "message":"hr","num":1,"name":"time256","type":"uint8","scale":256,"units":"s" }, + { "message":"hr","num":6,"name":"filtered_bpm","type":"uint8","array":"[N]","units":"bpm" }, + { "message":"hr","num":9,"name":"event_timestamp","type":"uint32","array":"[N]","scale":1024,"units":"s" }, + { "message":"stress_level","num":0,"name":"stress_level_value","type":"sint16" }, + { "message":"stress_level","num":1,"name":"stress_level_time","type":"date_time","units":"s" }, + { "message":"max_met_data","num":0,"name":"update_time","type":"date_time" }, + { "message":"max_met_data","num":2,"name":"vo2_max","type":"uint16","scale":10,"units":"mL/kg/min" }, + { "message":"max_met_data","num":5,"name":"sport","type":"sport" }, + { "message":"max_met_data","num":6,"name":"sub_sport","type":"sub_sport" }, + { "message":"max_met_data","num":8,"name":"max_met_category","type":"max_met_category" }, + { "message":"max_met_data","num":9,"name":"calibrated_data","type":"bool" }, + { "message":"max_met_data","num":12,"name":"hr_source","type":"max_met_heart_rate_source" }, + { "message":"max_met_data","num":13,"name":"speed_source","type":"max_met_speed_source" }, + { "message":"memo_glob","num":250,"name":"part_index","type":"uint32" }, + { "message":"memo_glob","num":0,"name":"memo","type":"byte","array":"[N]" }, + { "message":"memo_glob","num":1,"name":"mesg_num","type":"mesg_num" }, + { "message":"memo_glob","num":2,"name":"parent_index","type":"message_index" }, + { "message":"memo_glob","num":3,"name":"field_num","type":"uint8" }, + { "message":"memo_glob","num":4,"name":"data","type":"uint8z","array":"[N]" }, + { "message":"sleep_level","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"sleep_level","num":0,"name":"sleep_level","type":"sleep_level" }, + { "message":"ant_channel_id","num":0,"name":"channel_number","type":"uint8" }, + { "message":"ant_channel_id","num":1,"name":"device_type","type":"uint8z" }, + { "message":"ant_channel_id","num":2,"name":"device_number","type":"uint16z" }, + { "message":"ant_channel_id","num":3,"name":"transmission_type","type":"uint8z" }, + { "message":"ant_channel_id","num":4,"name":"device_index","type":"device_index" }, + { "message":"ant_rx","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"ant_rx","num":0,"name":"fractional_timestamp","type":"uint16","scale":32768,"units":"s" }, + { "message":"ant_rx","num":1,"name":"mesg_id","type":"byte" }, + { "message":"ant_rx","num":3,"name":"channel_number","type":"uint8" }, + { "message":"ant_rx","num":4,"name":"data","type":"byte","array":"[N]" }, + { "message":"ant_tx","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"ant_tx","num":0,"name":"fractional_timestamp","type":"uint16","scale":32768,"units":"s" }, + { "message":"ant_tx","num":1,"name":"mesg_id","type":"byte" }, + { "message":"ant_tx","num":3,"name":"channel_number","type":"uint8" }, + { "message":"ant_tx","num":4,"name":"data","type":"byte","array":"[N]" }, + { "message":"exd_screen_configuration","num":0,"name":"screen_index","type":"uint8" }, + { "message":"exd_screen_configuration","num":1,"name":"field_count","type":"uint8" }, + { "message":"exd_screen_configuration","num":2,"name":"layout","type":"exd_layout" }, + { "message":"exd_screen_configuration","num":3,"name":"screen_enabled","type":"bool" }, + { "message":"exd_data_field_configuration","num":0,"name":"screen_index","type":"uint8" }, + { "message":"exd_data_field_configuration","num":1,"name":"concept_field","type":"byte" }, + { "message":"exd_data_field_configuration","num":2,"name":"field_id","type":"uint8" }, + { "message":"exd_data_field_configuration","num":3,"name":"concept_count","type":"uint8" }, + { "message":"exd_data_field_configuration","num":4,"name":"display_type","type":"exd_display_type" }, + { "message":"exd_data_field_configuration","num":5,"name":"title","type":"string","array":"[32]" }, + { "message":"exd_data_concept_configuration","num":0,"name":"screen_index","type":"uint8" }, + { "message":"exd_data_concept_configuration","num":1,"name":"concept_field","type":"byte" }, + { "message":"exd_data_concept_configuration","num":2,"name":"field_id","type":"uint8" }, + { "message":"exd_data_concept_configuration","num":3,"name":"concept_index","type":"uint8" }, + { "message":"exd_data_concept_configuration","num":4,"name":"data_page","type":"uint8" }, + { "message":"exd_data_concept_configuration","num":5,"name":"concept_key","type":"uint8" }, + { "message":"exd_data_concept_configuration","num":6,"name":"scaling","type":"uint8" }, + { "message":"exd_data_concept_configuration","num":8,"name":"data_units","type":"exd_data_units" }, + { "message":"exd_data_concept_configuration","num":9,"name":"qualifier","type":"exd_qualifiers" }, + { "message":"exd_data_concept_configuration","num":10,"name":"descriptor","type":"exd_descriptors" }, + { "message":"exd_data_concept_configuration","num":11,"name":"is_signed","type":"bool" }, + { "message":"dive_summary","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"dive_summary","num":0,"name":"reference_mesg","type":"mesg_num" }, + { "message":"dive_summary","num":1,"name":"reference_index","type":"message_index" }, + { "message":"dive_summary","num":2,"name":"avg_depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"dive_summary","num":3,"name":"max_depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"dive_summary","num":4,"name":"surface_interval","type":"uint32","scale":1,"units":"s" }, + { "message":"dive_summary","num":5,"name":"start_cns","type":"uint8","scale":1,"units":"percent" }, + { "message":"dive_summary","num":6,"name":"end_cns","type":"uint8","scale":1,"units":"percent" }, + { "message":"dive_summary","num":7,"name":"start_n2","type":"uint16","scale":1,"units":"percent" }, + { "message":"dive_summary","num":8,"name":"end_n2","type":"uint16","scale":1,"units":"percent" }, + { "message":"dive_summary","num":9,"name":"o2_toxicity","type":"uint16","units":"OTUs" }, + { "message":"dive_summary","num":10,"name":"dive_number","type":"uint32" }, + { "message":"dive_summary","num":11,"name":"bottom_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"dive_summary","num":12,"name":"avg_pressure_sac","type":"uint16","scale":100,"units":"bar/min" }, + { "message":"dive_summary","num":13,"name":"avg_volume_sac","type":"uint16","scale":100,"units":"L/min" }, + { "message":"dive_summary","num":14,"name":"avg_rmv","type":"uint16","scale":100,"units":"L/min" }, + { "message":"dive_summary","num":15,"name":"descent_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"dive_summary","num":16,"name":"ascent_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"dive_summary","num":17,"name":"avg_ascent_rate","type":"sint32","scale":1000,"units":"m/s" }, + { "message":"dive_summary","num":22,"name":"avg_descent_rate","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"dive_summary","num":23,"name":"max_ascent_rate","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"dive_summary","num":24,"name":"max_descent_rate","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"dive_summary","num":25,"name":"hang_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"hrv","num":0,"name":"time","type":"uint16","array":"[N]","scale":1000,"units":"s" }, + { "message":"beat_intervals","num":253,"name":"timestamp","type":"date_time" }, + { "message":"beat_intervals","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"beat_intervals","num":1,"name":"time","type":"uint16","array":"[N]","units":"ms" }, + { "message":"hrv_status_summary","num":253,"name":"timestamp","type":"date_time" }, + { "message":"hrv_status_summary","num":0,"name":"weekly_average","type":"uint16","scale":128,"units":"ms" }, + { "message":"hrv_status_summary","num":1,"name":"last_night_average","type":"uint16","scale":128,"units":"ms" }, + { "message":"hrv_status_summary","num":2,"name":"last_night_5_min_high","type":"uint16","scale":128,"units":"ms" }, + { "message":"hrv_status_summary","num":3,"name":"baseline_low_upper","type":"uint16","scale":128,"units":"ms" }, + { "message":"hrv_status_summary","num":4,"name":"baseline_balanced_lower","type":"uint16","scale":128,"units":"ms" }, + { "message":"hrv_status_summary","num":5,"name":"baseline_balanced_upper","type":"uint16","scale":128,"units":"ms" }, + { "message":"hrv_status_summary","num":6,"name":"status","type":"hrv_status" }, + { "message":"hrv_value","num":253,"name":"timestamp","type":"date_time" }, + { "message":"hrv_value","num":0,"name":"value","type":"uint16","scale":128,"units":"ms" }, + { "message":"respiration_rate","num":253,"name":"timestamp","type":"date_time" }, + { "message":"respiration_rate","num":0,"name":"respiration_rate","type":"sint16","scale":100,"units":"breaths/min" }, + { "message":"tank_update","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"tank_update","num":0,"name":"sensor","type":"ant_channel_id" }, + { "message":"tank_update","num":1,"name":"pressure","type":"uint16","scale":100,"units":"bar" }, + { "message":"tank_summary","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"tank_summary","num":0,"name":"sensor","type":"ant_channel_id" }, + { "message":"tank_summary","num":1,"name":"start_pressure","type":"uint16","scale":100,"units":"bar" }, + { "message":"tank_summary","num":2,"name":"end_pressure","type":"uint16","scale":100,"units":"bar" }, + { "message":"tank_summary","num":3,"name":"volume_used","type":"uint32","scale":100,"units":"L" }, + { "message":"sleep_assessment","num":0,"name":"combined_awake_score","type":"uint8" }, + { "message":"sleep_assessment","num":1,"name":"awake_time_score","type":"uint8" }, + { "message":"sleep_assessment","num":2,"name":"awakenings_count_score","type":"uint8" }, + { "message":"sleep_assessment","num":3,"name":"deep_sleep_score","type":"uint8" }, + { "message":"sleep_assessment","num":4,"name":"sleep_duration_score","type":"uint8" }, + { "message":"sleep_assessment","num":5,"name":"light_sleep_score","type":"uint8" }, + { "message":"sleep_assessment","num":6,"name":"overall_sleep_score","type":"uint8" }, + { "message":"sleep_assessment","num":7,"name":"sleep_quality_score","type":"uint8" }, + { "message":"sleep_assessment","num":8,"name":"sleep_recovery_score","type":"uint8" }, + { "message":"sleep_assessment","num":9,"name":"rem_sleep_score","type":"uint8" }, + { "message":"sleep_assessment","num":10,"name":"sleep_restlessness_score","type":"uint8" }, + { "message":"sleep_assessment","num":11,"name":"awakenings_count","type":"uint8" }, + { "message":"sleep_assessment","num":14,"name":"interruptions_score","type":"uint8" }, + { "message":"sleep_assessment","num":15,"name":"average_stress_during_sleep","type":"uint16","scale":100 } + +], + + "MESSAGES":[ + { "num": 1 , "desc":"Capabilities" }, + { "num": 2 , "desc":"Device Settings" }, + { "num": 3 , "desc":"User Profile" }, + { "num": 4 , "desc":"Hrm Profile" }, + { "num": 5 , "desc":"Sdm Profile" }, + { "num": 6 , "desc":"Bike Profile" }, + { "num": 7 , "desc":"Zones Target" }, + { "num": 8 , "desc":"Hr Zone" }, + { "num": 9 , "desc":"Power Zone" }, + { "num": 10 , "desc":"Met Zone" }, + { "num": 12 , "desc":"Sport" }, + { "num": 15 , "desc":"Goal" }, + { "num": 18 , "desc":"Session" }, + { "num": 19 , "desc":"Lap" }, + { "num": 20 , "desc":"Record" }, + { "num": 21 , "desc":"Event" }, + { "num": 23 , "desc":"Device Info" }, + { "num": 26 , "desc":"Workout" }, + { "num": 27 , "desc":"Workout Step" }, + { "num": 28 , "desc":"Schedule" }, + { "num": 30 , "desc":"Weight Scale" }, + { "num": 31 , "desc":"Course" }, + { "num": 32 , "desc":"Course Point" }, + { "num": 33 , "desc":"Totals" }, + { "num": 34 , "desc":"Activity" }, + { "num": 35 , "desc":"Software" }, + { "num": 37 , "desc":"File Capabilities" }, + { "num": 38 , "desc":"Mesg Capabilities" }, + { "num": 39 , "desc":"Field Capabilities" }, + { "num": 49 , "desc":"File Creator" }, + { "num": 51 , "desc":"Blood Pressure" }, + { "num": 53 , "desc":"Speed Zone" }, + { "num": 55 , "desc":"Monitoring" }, + { "num": 72 , "desc":"Training File" }, + { "num": 78 , "desc":"Hrv" }, + { "num": 80 , "desc":"Ant Rx" }, + { "num": 81 , "desc":"Ant Tx" }, + { "num": 82 , "desc":"Ant Channel Id" }, + { "num": 101 , "desc":"Length" }, + { "num": 103 , "desc":"Monitoring Info" }, + { "num": 105 , "desc":"Pad" }, + { "num": 106 , "desc":"Slave Device" }, + { "num": 127 , "desc":"Connectivity" }, + { "num": 128 , "desc":"Weather Conditions" }, + { "num": 129 , "desc":"Weather Alert" }, + { "num": 131 , "desc":"Cadence Zone" }, + { "num": 132 , "desc":"Hr" }, + { "num": 142 , "desc":"Segment Lap" }, + { "num": 145 , "desc":"Memo Glob" }, + { "num": 148 , "desc":"Segment Id" }, + { "num": 149 , "desc":"Segment Leaderboard Entry" }, + { "num": 150 , "desc":"Segment Point" }, + { "num": 151 , "desc":"Segment File" }, + { "num": 158 , "desc":"Workout Session" }, + { "num": 159 , "desc":"Watchface Settings" }, + { "num": 160 , "desc":"Gps Metadata" }, + { "num": 161 , "desc":"Camera Event" }, + { "num": 162 , "desc":"Timestamp Correlation" }, + { "num": 164 , "desc":"Gyroscope Data" }, + { "num": 165 , "desc":"Accelerometer Data" }, + { "num": 167 , "desc":"Three D Sensor Calibration" }, + { "num": 169 , "desc":"Video Frame" }, + { "num": 174 , "desc":"Obdii Data" }, + { "num": 177 , "desc":"Nmea Sentence" }, + { "num": 178 , "desc":"Aviation Attitude" }, + { "num": 184 , "desc":"Video" }, + { "num": 185 , "desc":"Video Title" }, + { "num": 186 , "desc":"Video Description" }, + { "num": 187 , "desc":"Video Clip" }, + { "num": 188 , "desc":"Ohr Settings" }, + { "num": 200 , "desc":"Exd Screen Configuration" }, + { "num": 201 , "desc":"Exd Data Field Configuration" }, + { "num": 202 , "desc":"Exd Data Concept Configuration" }, + { "num": 206 , "desc":"Field Description" }, + { "num": 207 , "desc":"Developer Data Id" }, + { "num": 208 , "desc":"Magnetometer Data" }, + { "num": 209 , "desc":"Barometer Data" }, + { "num": 210 , "desc":"One D Sensor Calibration" }, + { "num": 211 , "desc":"Monitoring Hr Data" }, + { "num": 216 , "desc":"Time In Zone" }, + { "num": 225 , "desc":"Set" }, + { "num": 227 , "desc":"Stress Level" }, + { "num": 229 , "desc":"Max Met Data" }, + { "num": 258 , "desc":"Dive Settings" }, + { "num": 259 , "desc":"Dive Gas" }, + { "num": 262 , "desc":"Dive Alarm" }, + { "num": 264 , "desc":"Exercise Title" }, + { "num": 268 , "desc":"Dive Summary" }, + { "num": 269 , "desc":"Spo2 Data" }, + { "num": 275 , "desc":"Sleep Level" }, + { "num": 285 , "desc":"Jump" }, + { "num": 290 , "desc":"Beat Intervals" }, + { "num": 297 , "desc":"Respiration Rate" }, + { "num": 312 , "desc":"Split" }, + { "num": 317 , "desc":"Climb Pro" }, + { "num": 319 , "desc":"Tank Update" }, + { "num": 323 , "desc":"Tank Summary" }, + { "num": 346 , "desc":"Sleep Assessment" }, + { "num": 370 , "desc":"Hrv Status Summary" }, + { "num": 371 , "desc":"Hrv Value" }, + { "num": 375 , "desc":"Device Aux Battery Info" }, + { "num": 393 , "desc":"Dive Apnea Alarm" } ] } diff --git a/util/fit/Makefile b/util/fit/Makefile index 2b0e2e3d6..0e9be14c0 100644 --- a/util/fit/Makefile +++ b/util/fit/Makefile @@ -1,3 +1,3 @@ -../../src/Resources/json/FITmetadata.json: fit_example.h nongarmin.json fitprod.py +../../src/Resources/json/FITmetadata.json: fit_example.h nongarmin.json fields.json fitprod.py python3 fitprod.py > ../../src/Resources/json/FITmetadata.json diff --git a/util/fit/README b/util/fit/README index 381489748..6bc533535 100644 --- a/util/fit/README +++ b/util/fit/README @@ -3,12 +3,36 @@ FITmetadata.json generator For Garmin device updates: - Make sure you download the latest FIT SDK from thisisant.com and extract - the c/fit_example.h file and place it in this directory. + Make sure you download the latest FIT SDK from https://developer.garmin.com/fit/download/ + and extract the c/fit_example.h file and place it in this directory. Do not edit this file, we expect it to be lifted directly from the SDK and it will be replaced as new versions of the SDK are released +For Garmin profile updates: + + The fields.json file in this directory is metadata describing most of the standard + fields and is based upon the Profile.xls file in the SDK. If new fields are or profiles + are added and you want them to be parsed via metadata then update fields.json to + include the entries. + + At present the FIT ride file reader code is a mix of hard coded parsing for + the majority of the message types, but the code for parsing session and lap + message types does use the metadata to control parsing (and puts the results + into the XDATA section of a ridefile) + + If you add new profile then you should use metadata to drive the parsing and + add the data to the XDATA section to avoid impacting existing code. + +Generate a new FITmetadata.json file + + There is a Makefile in this directory that will refresh baed upon the timestamp + of the fit_example.h. To refresh simply run 'make'. If you wish to re-run and + regenerate 'touch fit_example.h; make' will do that. + + You will need python3 installed since the generator is a python script. Please + do not edit this script but raise a github issue if you find it is broken. + When Garmin devices are not yet supported by the SDK The SDK lags behind device availability in this case you should add diff --git a/util/fit/fields.json b/util/fit/fields.json new file mode 100644 index 000000000..002ba1692 --- /dev/null +++ b/util/fit/fields.json @@ -0,0 +1,1280 @@ +"FIELDS":[ + + { "message":"file_id","num":2,"name":"product","type":"uint16" }, + { "message":"file_id","num":3,"name":"serial_number","type":"uint32z" }, + { "message":"file_id","num":4,"name":"time_created","type":"date_time" }, + { "message":"file_id","num":5,"name":"number","type":"uint16" }, + { "message":"file_id","num":8,"name":"product_name","type":"string" }, + { "message":"file_creator","num":0,"name":"software_version","type":"uint16" }, + { "message":"file_creator","num":1,"name":"hardware_version","type":"uint8" }, + { "message":"timestamp_correlation","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"timestamp_correlation","num":0,"name":"fractional_timestamp","type":"uint16","scale":32768,"units":"s" }, + { "message":"timestamp_correlation","num":1,"name":"system_timestamp","type":"date_time","units":"s" }, + { "message":"timestamp_correlation","num":2,"name":"fractional_system_timestamp","type":"uint16","scale":32768,"units":"s" }, + { "message":"timestamp_correlation","num":3,"name":"local_timestamp","type":"local_date_time","units":"s" }, + { "message":"timestamp_correlation","num":4,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"timestamp_correlation","num":5,"name":"system_timestamp_ms","type":"uint16","units":"ms" }, + { "message":"software","num":254,"name":"message_index","type":"message_index" }, + { "message":"software","num":3,"name":"version","type":"uint16","scale":100 }, + { "message":"software","num":5,"name":"part_number","type":"string" }, + { "message":"slave_device","num":1,"name":"product","type":"uint16" }, + { "message":"capabilities","num":0,"name":"languages","type":"uint8z","array":"[N]" }, + { "message":"capabilities","num":1,"name":"sports","type":"sport_bits_0","array":"[N]" }, + { "message":"capabilities","num":21,"name":"workouts_supported","type":"workout_capabilities" }, + { "message":"capabilities","num":23,"name":"connectivity_supported","type":"connectivity_capabilities" }, + { "message":"file_capabilities","num":254,"name":"message_index","type":"message_index" }, + { "message":"file_capabilities","num":0,"name":"type","type":"file" }, + { "message":"file_capabilities","num":1,"name":"flags","type":"file_flags" }, + { "message":"file_capabilities","num":2,"name":"directory","type":"string" }, + { "message":"file_capabilities","num":3,"name":"max_count","type":"uint16" }, + { "message":"file_capabilities","num":4,"name":"max_size","type":"uint32","units":"bytes" }, + { "message":"mesg_capabilities","num":254,"name":"message_index","type":"message_index" }, + { "message":"mesg_capabilities","num":0,"name":"file","type":"file" }, + { "message":"mesg_capabilities","num":1,"name":"mesg_num","type":"mesg_num" }, + { "message":"mesg_capabilities","num":2,"name":"count_type","type":"mesg_count" }, + { "message":"mesg_capabilities","num":3,"name":"count","type":"uint16" }, + { "message":"field_capabilities","num":254,"name":"message_index","type":"message_index" }, + { "message":"field_capabilities","num":0,"name":"file","type":"file" }, + { "message":"field_capabilities","num":1,"name":"mesg_num","type":"mesg_num" }, + { "message":"field_capabilities","num":2,"name":"field_num","type":"uint8" }, + { "message":"field_capabilities","num":3,"name":"count","type":"uint16" }, + { "message":"device_settings","num":0,"name":"active_time_zone","type":"uint8" }, + { "message":"device_settings","num":1,"name":"utc_offset","type":"uint32" }, + { "message":"device_settings","num":2,"name":"time_offset","type":"uint32","array":"[N]","units":"s" }, + { "message":"device_settings","num":4,"name":"time_mode","type":"time_mode","array":"[N]" }, + { "message":"device_settings","num":5,"name":"time_zone_offset","type":"sint8","array":"[N]","scale":4,"units":"hr" }, + { "message":"device_settings","num":12,"name":"backlight_mode","type":"backlight_mode" }, + { "message":"device_settings","num":36,"name":"activity_tracker_enabled","type":"bool" }, + { "message":"device_settings","num":39,"name":"clock_time","type":"date_time" }, + { "message":"device_settings","num":40,"name":"pages_enabled","type":"uint16","array":"[N]" }, + { "message":"device_settings","num":46,"name":"move_alert_enabled","type":"bool" }, + { "message":"device_settings","num":47,"name":"date_mode","type":"date_mode" }, + { "message":"device_settings","num":55,"name":"display_orientation","type":"display_orientation" }, + { "message":"device_settings","num":56,"name":"mounting_side","type":"side" }, + { "message":"device_settings","num":57,"name":"default_page","type":"uint16","array":"[N]" }, + { "message":"device_settings","num":58,"name":"autosync_min_steps","type":"uint16","units":"steps" }, + { "message":"device_settings","num":59,"name":"autosync_min_time","type":"uint16","units":"minutes" }, + { "message":"device_settings","num":80,"name":"lactate_threshold_autodetect_enabled","type":"bool" }, + { "message":"device_settings","num":86,"name":"ble_auto_upload_enabled","type":"bool" }, + { "message":"device_settings","num":89,"name":"auto_sync_frequency","type":"auto_sync_frequency" }, + { "message":"device_settings","num":90,"name":"auto_activity_detect","type":"auto_activity_detect" }, + { "message":"device_settings","num":94,"name":"number_of_screens","type":"uint8" }, + { "message":"device_settings","num":95,"name":"smart_notification_display_orientation","type":"display_orientation" }, + { "message":"device_settings","num":134,"name":"tap_interface","type":"switch" }, + { "message":"device_settings","num":174,"name":"tap_sensitivity","type":"tap_sensitivity" }, + { "message":"user_profile","num":254,"name":"message_index","type":"message_index" }, + { "message":"user_profile","num":0,"name":"friendly_name","type":"string" }, + { "message":"user_profile","num":1,"name":"gender","type":"gender" }, + { "message":"user_profile","num":2,"name":"age","type":"uint8","units":"years" }, + { "message":"user_profile","num":3,"name":"height","type":"uint8","scale":100,"units":"m" }, + { "message":"user_profile","num":4,"name":"weight","type":"uint16","scale":10,"units":"kg" }, + { "message":"user_profile","num":5,"name":"language","type":"language" }, + { "message":"user_profile","num":6,"name":"elev_setting","type":"display_measure" }, + { "message":"user_profile","num":7,"name":"weight_setting","type":"display_measure" }, + { "message":"user_profile","num":8,"name":"resting_heart_rate","type":"uint8","units":"bpm" }, + { "message":"user_profile","num":9,"name":"default_max_running_heart_rate","type":"uint8","units":"bpm" }, + { "message":"user_profile","num":10,"name":"default_max_biking_heart_rate","type":"uint8","units":"bpm" }, + { "message":"user_profile","num":11,"name":"default_max_heart_rate","type":"uint8","units":"bpm" }, + { "message":"user_profile","num":12,"name":"hr_setting","type":"display_heart" }, + { "message":"user_profile","num":13,"name":"speed_setting","type":"display_measure" }, + { "message":"user_profile","num":14,"name":"dist_setting","type":"display_measure" }, + { "message":"user_profile","num":16,"name":"power_setting","type":"display_power" }, + { "message":"user_profile","num":17,"name":"activity_class","type":"activity_class" }, + { "message":"user_profile","num":18,"name":"position_setting","type":"display_position" }, + { "message":"user_profile","num":21,"name":"temperature_setting","type":"display_measure" }, + { "message":"user_profile","num":22,"name":"local_id","type":"user_local_id" }, + { "message":"user_profile","num":23,"name":"global_id","type":"byte","array":"[6]" }, + { "message":"user_profile","num":28,"name":"wake_time","type":"localtime_into_day" }, + { "message":"user_profile","num":29,"name":"sleep_time","type":"localtime_into_day" }, + { "message":"user_profile","num":30,"name":"height_setting","type":"display_measure" }, + { "message":"user_profile","num":31,"name":"user_running_step_length","type":"uint16","scale":1000,"units":"m" }, + { "message":"user_profile","num":32,"name":"user_walking_step_length","type":"uint16","scale":1000,"units":"m" }, + { "message":"user_profile","num":47,"name":"depth_setting","type":"display_measure" }, + { "message":"user_profile","num":49,"name":"dive_count","type":"uint32" }, + { "message":"hrm_profile","num":254,"name":"message_index","type":"message_index" }, + { "message":"hrm_profile","num":0,"name":"enabled","type":"bool" }, + { "message":"hrm_profile","num":1,"name":"hrm_ant_id","type":"uint16z" }, + { "message":"hrm_profile","num":2,"name":"log_hrv","type":"bool" }, + { "message":"hrm_profile","num":3,"name":"hrm_ant_id_trans_type","type":"uint8z" }, + { "message":"sdm_profile","num":254,"name":"message_index","type":"message_index" }, + { "message":"sdm_profile","num":0,"name":"enabled","type":"bool" }, + { "message":"sdm_profile","num":1,"name":"sdm_ant_id","type":"uint16z" }, + { "message":"sdm_profile","num":2,"name":"sdm_cal_factor","type":"uint16","scale":10,"units":"%" }, + { "message":"sdm_profile","num":3,"name":"odometer","type":"uint32","scale":100,"units":"m" }, + { "message":"sdm_profile","num":4,"name":"speed_source","type":"bool" }, + { "message":"sdm_profile","num":5,"name":"sdm_ant_id_trans_type","type":"uint8z" }, + { "message":"sdm_profile","num":7,"name":"odometer_rollover","type":"uint8" }, + { "message":"bike_profile","num":254,"name":"message_index","type":"message_index" }, + { "message":"bike_profile","num":0,"name":"name","type":"string" }, + { "message":"bike_profile","num":1,"name":"sport","type":"sport" }, + { "message":"bike_profile","num":2,"name":"sub_sport","type":"sub_sport" }, + { "message":"bike_profile","num":3,"name":"odometer","type":"uint32","scale":100,"units":"m" }, + { "message":"bike_profile","num":4,"name":"bike_spd_ant_id","type":"uint16z" }, + { "message":"bike_profile","num":5,"name":"bike_cad_ant_id","type":"uint16z" }, + { "message":"bike_profile","num":6,"name":"bike_spdcad_ant_id","type":"uint16z" }, + { "message":"bike_profile","num":7,"name":"bike_power_ant_id","type":"uint16z" }, + { "message":"bike_profile","num":8,"name":"custom_wheelsize","type":"uint16","scale":1000,"units":"m" }, + { "message":"bike_profile","num":9,"name":"auto_wheelsize","type":"uint16","scale":1000,"units":"m" }, + { "message":"bike_profile","num":10,"name":"bike_weight","type":"uint16","scale":10,"units":"kg" }, + { "message":"bike_profile","num":11,"name":"power_cal_factor","type":"uint16","scale":10,"units":"%" }, + { "message":"bike_profile","num":12,"name":"auto_wheel_cal","type":"bool" }, + { "message":"bike_profile","num":13,"name":"auto_power_zero","type":"bool" }, + { "message":"bike_profile","num":14,"name":"id","type":"uint8" }, + { "message":"bike_profile","num":15,"name":"spd_enabled","type":"bool" }, + { "message":"bike_profile","num":16,"name":"cad_enabled","type":"bool" }, + { "message":"bike_profile","num":17,"name":"spdcad_enabled","type":"bool" }, + { "message":"bike_profile","num":18,"name":"power_enabled","type":"bool" }, + { "message":"bike_profile","num":19,"name":"crank_length","type":"uint8","scale":2,"offset":"-110","units":"mm" }, + { "message":"bike_profile","num":20,"name":"enabled","type":"bool" }, + { "message":"bike_profile","num":21,"name":"bike_spd_ant_id_trans_type","type":"uint8z" }, + { "message":"bike_profile","num":22,"name":"bike_cad_ant_id_trans_type","type":"uint8z" }, + { "message":"bike_profile","num":23,"name":"bike_spdcad_ant_id_trans_type","type":"uint8z" }, + { "message":"bike_profile","num":24,"name":"bike_power_ant_id_trans_type","type":"uint8z" }, + { "message":"bike_profile","num":37,"name":"odometer_rollover","type":"uint8" }, + { "message":"bike_profile","num":38,"name":"front_gear_num","type":"uint8z" }, + { "message":"bike_profile","num":39,"name":"front_gear","type":"uint8z","array":"[N]" }, + { "message":"bike_profile","num":40,"name":"rear_gear_num","type":"uint8z" }, + { "message":"bike_profile","num":41,"name":"rear_gear","type":"uint8z","array":"[N]" }, + { "message":"bike_profile","num":44,"name":"shimano_di2_enabled","type":"bool" }, + { "message":"connectivity","num":0,"name":"bluetooth_enabled","type":"bool" }, + { "message":"connectivity","num":1,"name":"bluetooth_le_enabled","type":"bool" }, + { "message":"connectivity","num":2,"name":"ant_enabled","type":"bool" }, + { "message":"connectivity","num":3,"name":"name","type":"string" }, + { "message":"connectivity","num":4,"name":"live_tracking_enabled","type":"bool" }, + { "message":"connectivity","num":5,"name":"weather_conditions_enabled","type":"bool" }, + { "message":"connectivity","num":6,"name":"weather_alerts_enabled","type":"bool" }, + { "message":"connectivity","num":7,"name":"auto_activity_upload_enabled","type":"bool" }, + { "message":"connectivity","num":8,"name":"course_download_enabled","type":"bool" }, + { "message":"connectivity","num":9,"name":"workout_download_enabled","type":"bool" }, + { "message":"connectivity","num":10,"name":"gps_ephemeris_download_enabled","type":"bool" }, + { "message":"connectivity","num":11,"name":"incident_detection_enabled","type":"bool" }, + { "message":"connectivity","num":12,"name":"grouptrack_enabled","type":"bool" }, + { "message":"watchface_settings","num":254,"name":"message_index","type":"message_index" }, + { "message":"watchface_settings","num":0,"name":"mode","type":"watchface_mode" }, + { "message":"watchface_settings","num":1,"name":"layout","type":"byte" }, + { "message":"ohr_settings","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"ohr_settings","num":0,"name":"enabled","type":"switch" }, + { "message":"time_in_zone","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"time_in_zone","num":0,"name":"reference_mesg","type":"mesg_num" }, + { "message":"time_in_zone","num":1,"name":"reference_index","type":"message_index" }, + { "message":"time_in_zone","num":2,"name":"time_in_hr_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"time_in_zone","num":3,"name":"time_in_speed_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"time_in_zone","num":4,"name":"time_in_cadence_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"time_in_zone","num":5,"name":"time_in_power_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"time_in_zone","num":6,"name":"hr_zone_high_boundary","type":"uint8","array":"[N]","units":"bpm" }, + { "message":"time_in_zone","num":7,"name":"speed_zone_high_boundary","type":"uint16","array":"[N]","scale":1000,"units":"m/s" }, + { "message":"time_in_zone","num":8,"name":"cadence_zone_high_bondary","type":"uint8","array":"[N]","units":"rpm" }, + { "message":"time_in_zone","num":9,"name":"power_zone_high_boundary","type":"uint16","array":"[N]","units":"watts" }, + { "message":"time_in_zone","num":10,"name":"hr_calc_type","type":"hr_zone_calc" }, + { "message":"time_in_zone","num":11,"name":"max_heart_rate","type":"uint8" }, + { "message":"time_in_zone","num":12,"name":"resting_heart_rate","type":"uint8" }, + { "message":"time_in_zone","num":13,"name":"threshold_heart_rate","type":"uint8" }, + { "message":"time_in_zone","num":14,"name":"pwr_calc_type","type":"pwr_zone_calc" }, + { "message":"time_in_zone","num":15,"name":"functional_threshold_power","type":"uint16" }, + { "message":"zones_target","num":1,"name":"max_heart_rate","type":"uint8" }, + { "message":"zones_target","num":2,"name":"threshold_heart_rate","type":"uint8" }, + { "message":"zones_target","num":3,"name":"functional_threshold_power","type":"uint16" }, + { "message":"zones_target","num":5,"name":"hr_calc_type","type":"hr_zone_calc" }, + { "message":"zones_target","num":7,"name":"pwr_calc_type","type":"pwr_zone_calc" }, + { "message":"sport","num":0,"name":"sport","type":"sport" }, + { "message":"sport","num":1,"name":"sub_sport","type":"sub_sport" }, + { "message":"sport","num":3,"name":"name","type":"string" }, + { "message":"hr_zone","num":254,"name":"message_index","type":"message_index" }, + { "message":"hr_zone","num":1,"name":"high_bpm","type":"uint8","units":"bpm" }, + { "message":"hr_zone","num":2,"name":"name","type":"string" }, + { "message":"speed_zone","num":254,"name":"message_index","type":"message_index" }, + { "message":"speed_zone","num":0,"name":"high_value","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"speed_zone","num":1,"name":"name","type":"string" }, + { "message":"cadence_zone","num":254,"name":"message_index","type":"message_index" }, + { "message":"cadence_zone","num":0,"name":"high_value","type":"uint8","units":"rpm" }, + { "message":"cadence_zone","num":1,"name":"name","type":"string" }, + { "message":"power_zone","num":254,"name":"message_index","type":"message_index" }, + { "message":"power_zone","num":1,"name":"high_value","type":"uint16","units":"watts" }, + { "message":"power_zone","num":2,"name":"name","type":"string" }, + { "message":"met_zone","num":254,"name":"message_index","type":"message_index" }, + { "message":"met_zone","num":1,"name":"high_bpm","type":"uint8" }, + { "message":"met_zone","num":2,"name":"calories","type":"uint16","scale":10,"units":"kcal / min" }, + { "message":"met_zone","num":3,"name":"fat_calories","type":"uint8","scale":10,"units":"kcal / min" }, + { "message":"dive_settings","num":253,"name":"timestamp","type":"date_time" }, + { "message":"dive_settings","num":254,"name":"message_index","type":"message_index" }, + { "message":"dive_settings","num":0,"name":"name","type":"string" }, + { "message":"dive_settings","num":1,"name":"model","type":"tissue_model_type" }, + { "message":"dive_settings","num":2,"name":"gf_low","type":"uint8","units":"percent" }, + { "message":"dive_settings","num":3,"name":"gf_high","type":"uint8","units":"percent" }, + { "message":"dive_settings","num":4,"name":"water_type","type":"water_type" }, + { "message":"dive_settings","num":5,"name":"water_density","type":"float32","units":"kg/m^3" }, + { "message":"dive_settings","num":6,"name":"po2_warn","type":"uint8","scale":100,"units":"percent" }, + { "message":"dive_settings","num":7,"name":"po2_critical","type":"uint8","scale":100,"units":"percent" }, + { "message":"dive_settings","num":8,"name":"po2_deco","type":"uint8","scale":100,"units":"percent" }, + { "message":"dive_settings","num":9,"name":"safety_stop_enabled","type":"bool" }, + { "message":"dive_settings","num":10,"name":"bottom_depth","type":"float32" }, + { "message":"dive_settings","num":11,"name":"bottom_time","type":"uint32" }, + { "message":"dive_settings","num":12,"name":"apnea_countdown_enabled","type":"bool" }, + { "message":"dive_settings","num":13,"name":"apnea_countdown_time","type":"uint32" }, + { "message":"dive_settings","num":14,"name":"backlight_mode","type":"dive_backlight_mode" }, + { "message":"dive_settings","num":15,"name":"backlight_brightness","type":"uint8" }, + { "message":"dive_settings","num":16,"name":"backlight_timeout","type":"backlight_timeout" }, + { "message":"dive_settings","num":17,"name":"repeat_dive_interval","type":"uint16","scale":1,"units":"s" }, + { "message":"dive_settings","num":18,"name":"safety_stop_time","type":"uint16","scale":1,"units":"s" }, + { "message":"dive_settings","num":19,"name":"heart_rate_source_type","type":"source_type" }, + { "message":"dive_settings","num":20,"name":"heart_rate_source","type":"uint8" }, + { "message":"dive_settings","num":21,"name":"travel_gas","type":"message_index" }, + { "message":"dive_settings","num":22,"name":"ccr_low_setpoint_switch_mode","type":"ccr_setpoint_switch_mode" }, + { "message":"dive_settings","num":23,"name":"ccr_low_setpoint","type":"uint8","scale":100,"units":"percent" }, + { "message":"dive_settings","num":24,"name":"ccr_low_setpoint_depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"dive_settings","num":25,"name":"ccr_high_setpoint_switch_mode","type":"ccr_setpoint_switch_mode" }, + { "message":"dive_settings","num":26,"name":"ccr_high_setpoint","type":"uint8","scale":100,"units":"percent" }, + { "message":"dive_settings","num":27,"name":"ccr_high_setpoint_depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"dive_settings","num":29,"name":"gas_consumption_display","type":"gas_consumption_rate_type" }, + { "message":"dive_settings","num":30,"name":"up_key_enabled","type":"bool" }, + { "message":"dive_settings","num":35,"name":"dive_sounds","type":"tone" }, + { "message":"dive_settings","num":36,"name":"last_stop_multiple","type":"uint8","scale":10 }, + { "message":"dive_settings","num":37,"name":"no_fly_time_mode","type":"no_fly_time_mode" }, + { "message":"dive_alarm","num":254,"name":"message_index","type":"message_index" }, + { "message":"dive_alarm","num":0,"name":"depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"dive_alarm","num":1,"name":"time","type":"sint32","scale":1,"units":"s" }, + { "message":"dive_alarm","num":2,"name":"enabled","type":"bool" }, + { "message":"dive_alarm","num":3,"name":"alarm_type","type":"dive_alarm_type" }, + { "message":"dive_alarm","num":4,"name":"sound","type":"tone" }, + { "message":"dive_alarm","num":5,"name":"dive_types","type":"sub_sport","array":"[N]" }, + { "message":"dive_alarm","num":6,"name":"id","type":"uint32" }, + { "message":"dive_alarm","num":7,"name":"popup_enabled","type":"bool" }, + { "message":"dive_alarm","num":8,"name":"trigger_on_descent","type":"bool" }, + { "message":"dive_alarm","num":9,"name":"trigger_on_ascent","type":"bool" }, + { "message":"dive_alarm","num":10,"name":"repeating","type":"bool" }, + { "message":"dive_alarm","num":11,"name":"speed","type":"sint32","scale":1000,"units":"mps" }, + { "message":"dive_apnea_alarm","num":254,"name":"message_index","type":"message_index" }, + { "message":"dive_apnea_alarm","num":0,"name":"depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"dive_apnea_alarm","num":1,"name":"time","type":"sint32","scale":1,"units":"s" }, + { "message":"dive_apnea_alarm","num":2,"name":"enabled","type":"bool" }, + { "message":"dive_apnea_alarm","num":3,"name":"alarm_type","type":"dive_alarm_type" }, + { "message":"dive_apnea_alarm","num":4,"name":"sound","type":"tone" }, + { "message":"dive_apnea_alarm","num":5,"name":"dive_types","type":"sub_sport","array":"[N]" }, + { "message":"dive_apnea_alarm","num":6,"name":"id","type":"uint32" }, + { "message":"dive_apnea_alarm","num":7,"name":"popup_enabled","type":"bool" }, + { "message":"dive_apnea_alarm","num":8,"name":"trigger_on_descent","type":"bool" }, + { "message":"dive_apnea_alarm","num":9,"name":"trigger_on_ascent","type":"bool" }, + { "message":"dive_apnea_alarm","num":10,"name":"repeating","type":"bool" }, + { "message":"dive_apnea_alarm","num":11,"name":"speed","type":"sint32","scale":1000,"units":"mps" }, + { "message":"dive_gas","num":254,"name":"message_index","type":"message_index" }, + { "message":"dive_gas","num":0,"name":"helium_content","type":"uint8","units":"percent" }, + { "message":"dive_gas","num":1,"name":"oxygen_content","type":"uint8","units":"percent" }, + { "message":"dive_gas","num":2,"name":"status","type":"dive_gas_status" }, + { "message":"dive_gas","num":3,"name":"mode","type":"dive_gas_mode" }, + { "message":"goal","num":254,"name":"message_index","type":"message_index" }, + { "message":"goal","num":0,"name":"sport","type":"sport" }, + { "message":"goal","num":1,"name":"sub_sport","type":"sub_sport" }, + { "message":"goal","num":2,"name":"start_date","type":"date_time" }, + { "message":"goal","num":3,"name":"end_date","type":"date_time" }, + { "message":"goal","num":4,"name":"type","type":"goal" }, + { "message":"goal","num":5,"name":"value","type":"uint32" }, + { "message":"goal","num":6,"name":"repeat","type":"bool" }, + { "message":"goal","num":7,"name":"target_value","type":"uint32" }, + { "message":"goal","num":8,"name":"recurrence","type":"goal_recurrence" }, + { "message":"goal","num":9,"name":"recurrence_value","type":"uint16" }, + { "message":"goal","num":10,"name":"enabled","type":"bool" }, + { "message":"goal","num":11,"name":"source","type":"goal_source" }, + { "message":"activity","num":253,"name":"timestamp","type":"date_time" }, + { "message":"activity","num":0,"name":"total_timer_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"activity","num":1,"name":"num_sessions","type":"uint16" }, + { "message":"activity","num":2,"name":"type","type":"activity" }, + { "message":"activity","num":3,"name":"event","type":"event" }, + { "message":"activity","num":4,"name":"event_type","type":"event_type" }, + { "message":"activity","num":5,"name":"local_timestamp","type":"local_date_time" }, + { "message":"activity","num":6,"name":"event_group","type":"uint8" }, + { "message":"session","num":254,"name":"message_index","type":"message_index" }, + { "message":"session","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"session","num":0,"name":"event","type":"event" }, + { "message":"session","num":1,"name":"event_type","type":"event_type" }, + { "message":"session","num":2,"name":"start_time","type":"date_time" }, + { "message":"session","num":3,"name":"start_position_lat","type":"sint32","units":"semicircles" }, + { "message":"session","num":4,"name":"start_position_long","type":"sint32","units":"semicircles" }, + { "message":"session","num":5,"name":"sport","type":"sport" }, + { "message":"session","num":6,"name":"sub_sport","type":"sub_sport" }, + { "message":"session","num":7,"name":"total_elapsed_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"session","num":8,"name":"total_timer_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"session","num":9,"name":"total_distance","type":"uint32","scale":100,"units":"m" }, + { "message":"session","num":10,"name":"total_cycles","type":"uint32","units":"cycles" }, + { "message":"session","num":11,"name":"total_calories","type":"uint16","units":"kcal" }, + { "message":"session","num":13,"name":"total_fat_calories","type":"uint16","units":"kcal" }, + { "message":"session","num":14,"name":"avg_speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"session","num":15,"name":"max_speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"session","num":16,"name":"avg_heart_rate","type":"uint8","units":"bpm" }, + { "message":"session","num":17,"name":"max_heart_rate","type":"uint8","units":"bpm" }, + { "message":"session","num":18,"name":"avg_cadence","type":"uint8","units":"rpm" }, + { "message":"session","num":19,"name":"max_cadence","type":"uint8","units":"rpm" }, + { "message":"session","num":20,"name":"avg_power","type":"uint16","units":"watts" }, + { "message":"session","num":21,"name":"max_power","type":"uint16","units":"watts" }, + { "message":"session","num":22,"name":"total_ascent","type":"uint16","units":"m" }, + { "message":"session","num":23,"name":"total_descent","type":"uint16","units":"m" }, + { "message":"session","num":24,"name":"total_training_effect","type":"uint8","scale":10 }, + { "message":"session","num":25,"name":"first_lap_index","type":"uint16" }, + { "message":"session","num":26,"name":"num_laps","type":"uint16" }, + { "message":"session","num":27,"name":"event_group","type":"uint8" }, + { "message":"session","num":28,"name":"trigger","type":"session_trigger" }, + { "message":"session","num":29,"name":"nec_lat","type":"sint32","units":"semicircles" }, + { "message":"session","num":30,"name":"nec_long","type":"sint32","units":"semicircles" }, + { "message":"session","num":31,"name":"swc_lat","type":"sint32","units":"semicircles" }, + { "message":"session","num":32,"name":"swc_long","type":"sint32","units":"semicircles" }, + { "message":"session","num":33,"name":"num_lengths","type":"uint16","units":"lengths" }, + { "message":"session","num":34,"name":"normalized_power","type":"uint16","units":"watts" }, + { "message":"session","num":35,"name":"training_stress_score","type":"uint16","scale":10,"units":"tss" }, + { "message":"session","num":36,"name":"intensity_factor","type":"uint16","scale":1000,"units":"if" }, + { "message":"session","num":37,"name":"left_right_balance","type":"left_right_balance_100" }, + { "message":"session","num":38,"name":"end_position_lat","type":"sint32","units":"semicircles" }, + { "message":"session","num":39,"name":"end_position_long","type":"sint32","units":"semicircles" }, + { "message":"session","num":41,"name":"avg_stroke_count","type":"uint32","scale":10,"units":"strokes/lap" }, + { "message":"session","num":42,"name":"avg_stroke_distance","type":"uint16","scale":100,"units":"m" }, + { "message":"session","num":43,"name":"swim_stroke","type":"swim_stroke","units":"swim_stroke" }, + { "message":"session","num":44,"name":"pool_length","type":"uint16","scale":100,"units":"m" }, + { "message":"session","num":45,"name":"threshold_power","type":"uint16","units":"watts" }, + { "message":"session","num":46,"name":"pool_length_unit","type":"display_measure" }, + { "message":"session","num":47,"name":"num_active_lengths","type":"uint16","units":"lengths" }, + { "message":"session","num":48,"name":"total_work","type":"uint32","units":"J" }, + { "message":"session","num":49,"name":"avg_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"session","num":50,"name":"max_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"session","num":51,"name":"gps_accuracy","type":"uint8","units":"m" }, + { "message":"session","num":52,"name":"avg_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"session","num":53,"name":"avg_pos_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"session","num":54,"name":"avg_neg_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"session","num":55,"name":"max_pos_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"session","num":56,"name":"max_neg_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"session","num":57,"name":"avg_temperature","type":"sint8","units":"C" }, + { "message":"session","num":58,"name":"max_temperature","type":"sint8","units":"C" }, + { "message":"session","num":59,"name":"total_moving_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"session","num":60,"name":"avg_pos_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"session","num":61,"name":"avg_neg_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"session","num":62,"name":"max_pos_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"session","num":63,"name":"max_neg_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"session","num":64,"name":"min_heart_rate","type":"uint8","units":"bpm" }, + { "message":"session","num":65,"name":"time_in_hr_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"session","num":66,"name":"time_in_speed_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"session","num":67,"name":"time_in_cadence_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"session","num":68,"name":"time_in_power_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"session","num":69,"name":"avg_lap_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"session","num":70,"name":"best_lap_index","type":"uint16" }, + { "message":"session","num":71,"name":"min_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"session","num":82,"name":"player_score","type":"uint16" }, + { "message":"session","num":83,"name":"opponent_score","type":"uint16" }, + { "message":"session","num":84,"name":"opponent_name","type":"string" }, + { "message":"session","num":85,"name":"stroke_count","type":"uint16","array":"[N]","units":"counts" }, + { "message":"session","num":86,"name":"zone_count","type":"uint16","array":"[N]","units":"counts" }, + { "message":"session","num":87,"name":"max_ball_speed","type":"uint16","scale":100,"units":"m/s" }, + { "message":"session","num":88,"name":"avg_ball_speed","type":"uint16","scale":100,"units":"m/s" }, + { "message":"session","num":89,"name":"avg_vertical_oscillation","type":"uint16","scale":10,"units":"mm" }, + { "message":"session","num":90,"name":"avg_stance_time_percent","type":"uint16","scale":100,"units":"percent" }, + { "message":"session","num":91,"name":"avg_stance_time","type":"uint16","scale":10,"units":"ms" }, + { "message":"session","num":92,"name":"avg_fractional_cadence","type":"uint8","scale":128,"units":"rpm" }, + { "message":"session","num":93,"name":"max_fractional_cadence","type":"uint8","scale":128,"units":"rpm" }, + { "message":"session","num":94,"name":"total_fractional_cycles","type":"uint8","scale":128,"units":"cycles" }, + { "message":"session","num":95,"name":"avg_total_hemoglobin_conc","type":"uint16","array":"[N]","scale":100,"units":"g/dL" }, + { "message":"session","num":96,"name":"min_total_hemoglobin_conc","type":"uint16","array":"[N]","scale":100,"units":"g/dL" }, + { "message":"session","num":97,"name":"max_total_hemoglobin_conc","type":"uint16","array":"[N]","scale":100,"units":"g/dL" }, + { "message":"session","num":98,"name":"avg_saturated_hemoglobin_percent","type":"uint16","array":"[N]","scale":10,"units":"%" }, + { "message":"session","num":99,"name":"min_saturated_hemoglobin_percent","type":"uint16","array":"[N]","scale":10,"units":"%" }, + { "message":"session","num":100,"name":"max_saturated_hemoglobin_percent","type":"uint16","array":"[N]","scale":10,"units":"%" }, + { "message":"session","num":101,"name":"avg_left_torque_effectiveness","type":"uint8","scale":2,"units":"percent" }, + { "message":"session","num":102,"name":"avg_right_torque_effectiveness","type":"uint8","scale":2,"units":"percent" }, + { "message":"session","num":103,"name":"avg_left_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"session","num":104,"name":"avg_right_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"session","num":105,"name":"avg_combined_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"session","num":110,"name":"sport_profile_name","type":"string" }, + { "message":"session","num":111,"name":"sport_index","type":"uint8" }, + { "message":"session","num":112,"name":"time_standing","type":"uint32","scale":1000,"units":"s" }, + { "message":"session","num":113,"name":"stand_count","type":"uint16" }, + { "message":"session","num":114,"name":"avg_left_pco","type":"sint8","units":"mm" }, + { "message":"session","num":115,"name":"avg_right_pco","type":"sint8","units":"mm" }, + { "message":"session","num":116,"name":"avg_left_power_phase","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"session","num":117,"name":"avg_left_power_phase_peak","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"session","num":118,"name":"avg_right_power_phase","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"session","num":119,"name":"avg_right_power_phase_peak","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"session","num":120,"name":"avg_power_position","type":"uint16","array":"[N]","units":"watts" }, + { "message":"session","num":121,"name":"max_power_position","type":"uint16","array":"[N]","units":"watts" }, + { "message":"session","num":122,"name":"avg_cadence_position","type":"uint8","array":"[N]","units":"rpm" }, + { "message":"session","num":123,"name":"max_cadence_position","type":"uint8","array":"[N]","units":"rpm" }, + { "message":"session","num":124,"name":"enhanced_avg_speed","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"session","num":125,"name":"enhanced_max_speed","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"session","num":126,"name":"enhanced_avg_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"session","num":127,"name":"enhanced_min_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"session","num":128,"name":"enhanced_max_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"session","num":129,"name":"avg_lev_motor_power","type":"uint16","units":"watts" }, + { "message":"session","num":130,"name":"max_lev_motor_power","type":"uint16","units":"watts" }, + { "message":"session","num":131,"name":"lev_battery_consumption","type":"uint8","scale":2,"units":"percent" }, + { "message":"session","num":132,"name":"avg_vertical_ratio","type":"uint16","scale":100,"units":"percent" }, + { "message":"session","num":133,"name":"avg_stance_time_balance","type":"uint16","scale":100,"units":"percent" }, + { "message":"session","num":134,"name":"avg_step_length","type":"uint16","scale":10,"units":"mm" }, + { "message":"session","num":137,"name":"total_anaerobic_training_effect","type":"uint8","scale":10 }, + { "message":"session","num":139,"name":"avg_vam","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"session","num":140,"name":"avg_depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"session","num":141,"name":"max_depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"session","num":142,"name":"surface_interval","type":"uint32","scale":1,"units":"s" }, + { "message":"session","num":143,"name":"start_cns","type":"uint8","scale":1,"units":"percent" }, + { "message":"session","num":144,"name":"end_cns","type":"uint8","scale":1,"units":"percent" }, + { "message":"session","num":145,"name":"start_n2","type":"uint16","scale":1,"units":"percent" }, + { "message":"session","num":146,"name":"end_n2","type":"uint16","scale":1,"units":"percent" }, + { "message":"session","num":147,"name":"avg_respiration_rate","type":"uint8" }, + { "message":"session","num":148,"name":"max_respiration_rate","type":"uint8" }, + { "message":"session","num":149,"name":"min_respiration_rate","type":"uint8" }, + { "message":"session","num":150,"name":"min_temperature","type":"sint8","units":"C" }, + { "message":"session","num":155,"name":"o2_toxicity","type":"uint16","units":"OTUs" }, + { "message":"session","num":156,"name":"dive_number","type":"uint32" }, + { "message":"session","num":168,"name":"training_load_peak","type":"sint32","scale":65536 }, + { "message":"session","num":169,"name":"enhanced_avg_respiration_rate","type":"uint16","scale":100,"units":"Breaths/min" }, + { "message":"session","num":170,"name":"enhanced_max_respiration_rate","type":"uint16","scale":100,"units":"Breaths/min" }, + { "message":"session","num":180,"name":"enhanced_min_respiration_rate","type":"uint16","scale":100 }, + { "message":"session","num":181,"name":"total_grit","type":"float32","units":"kGrit" }, + { "message":"session","num":182,"name":"total_flow","type":"float32","units":"Flow" }, + { "message":"session","num":183,"name":"jump_count","type":"uint16" }, + { "message":"session","num":186,"name":"avg_grit","type":"float32","units":"kGrit" }, + { "message":"session","num":187,"name":"avg_flow","type":"float32","units":"Flow" }, + { "message":"session","num":194,"name":"avg_spo2","type":"uint8","units":"percent" }, + { "message":"session","num":195,"name":"avg_stress","type":"uint8","units":"percent" }, + { "message":"session","num":197,"name":"sdrr_hrv","type":"uint8","units":"mS" }, + { "message":"session","num":198,"name":"rmssd_hrv","type":"uint8","units":"mS" }, + { "message":"session","num":199,"name":"total_fractional_ascent","type":"uint8","scale":100,"units":"m" }, + { "message":"session","num":200,"name":"total_fractional_descent","type":"uint8","scale":100,"units":"m" }, + { "message":"session","num":208,"name":"avg_core_temperature","type":"uint16","scale":100,"units":"C" }, + { "message":"session","num":209,"name":"min_core_temperature","type":"uint16","scale":100,"units":"C" }, + { "message":"session","num":210,"name":"max_core_temperature","type":"uint16","scale":100,"units":"C" }, + { "message":"lap","num":254,"name":"message_index","type":"message_index" }, + { "message":"lap","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"lap","num":0,"name":"event","type":"event" }, + { "message":"lap","num":1,"name":"event_type","type":"event_type" }, + { "message":"lap","num":2,"name":"start_time","type":"date_time" }, + { "message":"lap","num":3,"name":"start_position_lat","type":"sint32","units":"semicircles" }, + { "message":"lap","num":4,"name":"start_position_long","type":"sint32","units":"semicircles" }, + { "message":"lap","num":5,"name":"end_position_lat","type":"sint32","units":"semicircles" }, + { "message":"lap","num":6,"name":"end_position_long","type":"sint32","units":"semicircles" }, + { "message":"lap","num":7,"name":"total_elapsed_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"lap","num":8,"name":"total_timer_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"lap","num":9,"name":"total_distance","type":"uint32","scale":100,"units":"m" }, + { "message":"lap","num":10,"name":"total_cycles","type":"uint32","units":"cycles" }, + { "message":"lap","num":11,"name":"total_calories","type":"uint16","units":"kcal" }, + { "message":"lap","num":12,"name":"total_fat_calories","type":"uint16","units":"kcal" }, + { "message":"lap","num":13,"name":"avg_speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"lap","num":14,"name":"max_speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"lap","num":15,"name":"avg_heart_rate","type":"uint8","units":"bpm" }, + { "message":"lap","num":16,"name":"max_heart_rate","type":"uint8","units":"bpm" }, + { "message":"lap","num":17,"name":"avg_cadence","type":"uint8","units":"rpm" }, + { "message":"lap","num":18,"name":"max_cadence","type":"uint8","units":"rpm" }, + { "message":"lap","num":19,"name":"avg_power","type":"uint16","units":"watts" }, + { "message":"lap","num":20,"name":"max_power","type":"uint16","units":"watts" }, + { "message":"lap","num":21,"name":"total_ascent","type":"uint16","units":"m" }, + { "message":"lap","num":22,"name":"total_descent","type":"uint16","units":"m" }, + { "message":"lap","num":23,"name":"intensity","type":"intensity" }, + { "message":"lap","num":24,"name":"lap_trigger","type":"lap_trigger" }, + { "message":"lap","num":25,"name":"sport","type":"sport" }, + { "message":"lap","num":26,"name":"event_group","type":"uint8" }, + { "message":"lap","num":32,"name":"num_lengths","type":"uint16","units":"lengths" }, + { "message":"lap","num":33,"name":"normalized_power","type":"uint16","units":"watts" }, + { "message":"lap","num":34,"name":"left_right_balance","type":"left_right_balance_100" }, + { "message":"lap","num":35,"name":"first_length_index","type":"uint16" }, + { "message":"lap","num":37,"name":"avg_stroke_distance","type":"uint16","scale":100,"units":"m" }, + { "message":"lap","num":38,"name":"swim_stroke","type":"swim_stroke" }, + { "message":"lap","num":39,"name":"sub_sport","type":"sub_sport" }, + { "message":"lap","num":40,"name":"num_active_lengths","type":"uint16","units":"lengths" }, + { "message":"lap","num":41,"name":"total_work","type":"uint32","units":"J" }, + { "message":"lap","num":42,"name":"avg_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"lap","num":43,"name":"max_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"lap","num":44,"name":"gps_accuracy","type":"uint8","units":"m" }, + { "message":"lap","num":45,"name":"avg_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"lap","num":46,"name":"avg_pos_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"lap","num":47,"name":"avg_neg_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"lap","num":48,"name":"max_pos_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"lap","num":49,"name":"max_neg_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"lap","num":50,"name":"avg_temperature","type":"sint8","units":"C" }, + { "message":"lap","num":51,"name":"max_temperature","type":"sint8","units":"C" }, + { "message":"lap","num":52,"name":"total_moving_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"lap","num":53,"name":"avg_pos_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"lap","num":54,"name":"avg_neg_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"lap","num":55,"name":"max_pos_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"lap","num":56,"name":"max_neg_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"lap","num":57,"name":"time_in_hr_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"lap","num":58,"name":"time_in_speed_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"lap","num":59,"name":"time_in_cadence_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"lap","num":60,"name":"time_in_power_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"lap","num":61,"name":"repetition_num","type":"uint16" }, + { "message":"lap","num":62,"name":"min_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"lap","num":63,"name":"min_heart_rate","type":"uint8","units":"bpm" }, + { "message":"lap","num":71,"name":"wkt_step_index","type":"message_index" }, + { "message":"lap","num":74,"name":"opponent_score","type":"uint16" }, + { "message":"lap","num":75,"name":"stroke_count","type":"uint16","array":"[N]","units":"counts" }, + { "message":"lap","num":76,"name":"zone_count","type":"uint16","array":"[N]","units":"counts" }, + { "message":"lap","num":77,"name":"avg_vertical_oscillation","type":"uint16","scale":10,"units":"mm" }, + { "message":"lap","num":78,"name":"avg_stance_time_percent","type":"uint16","scale":100,"units":"percent" }, + { "message":"lap","num":79,"name":"avg_stance_time","type":"uint16","scale":10,"units":"ms" }, + { "message":"lap","num":80,"name":"avg_fractional_cadence","type":"uint8","scale":128,"units":"rpm" }, + { "message":"lap","num":81,"name":"max_fractional_cadence","type":"uint8","scale":128,"units":"rpm" }, + { "message":"lap","num":82,"name":"total_fractional_cycles","type":"uint8","scale":128,"units":"cycles" }, + { "message":"lap","num":83,"name":"player_score","type":"uint16" }, + { "message":"lap","num":84,"name":"avg_total_hemoglobin_conc","type":"uint16","array":"[N]","scale":100,"units":"g/dL" }, + { "message":"lap","num":85,"name":"min_total_hemoglobin_conc","type":"uint16","array":"[N]","scale":100,"units":"g/dL" }, + { "message":"lap","num":86,"name":"max_total_hemoglobin_conc","type":"uint16","array":"[N]","scale":100,"units":"g/dL" }, + { "message":"lap","num":87,"name":"avg_saturated_hemoglobin_percent","type":"uint16","array":"[N]","scale":10,"units":"%" }, + { "message":"lap","num":88,"name":"min_saturated_hemoglobin_percent","type":"uint16","array":"[N]","scale":10,"units":"%" }, + { "message":"lap","num":89,"name":"max_saturated_hemoglobin_percent","type":"uint16","array":"[N]","scale":10,"units":"%" }, + { "message":"lap","num":91,"name":"avg_left_torque_effectiveness","type":"uint8","scale":2,"units":"percent" }, + { "message":"lap","num":92,"name":"avg_right_torque_effectiveness","type":"uint8","scale":2,"units":"percent" }, + { "message":"lap","num":93,"name":"avg_left_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"lap","num":94,"name":"avg_right_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"lap","num":95,"name":"avg_combined_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"lap","num":98,"name":"time_standing","type":"uint32","scale":1000,"units":"s" }, + { "message":"lap","num":99,"name":"stand_count","type":"uint16" }, + { "message":"lap","num":100,"name":"avg_left_pco","type":"sint8","units":"mm" }, + { "message":"lap","num":101,"name":"avg_right_pco","type":"sint8","units":"mm" }, + { "message":"lap","num":102,"name":"avg_left_power_phase","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"lap","num":103,"name":"avg_left_power_phase_peak","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"lap","num":104,"name":"avg_right_power_phase","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"lap","num":105,"name":"avg_right_power_phase_peak","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"lap","num":106,"name":"avg_power_position","type":"uint16","array":"[N]","units":"watts" }, + { "message":"lap","num":107,"name":"max_power_position","type":"uint16","array":"[N]","units":"watts" }, + { "message":"lap","num":108,"name":"avg_cadence_position","type":"uint8","array":"[N]","units":"rpm" }, + { "message":"lap","num":109,"name":"max_cadence_position","type":"uint8","array":"[N]","units":"rpm" }, + { "message":"lap","num":110,"name":"enhanced_avg_speed","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"lap","num":111,"name":"enhanced_max_speed","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"lap","num":112,"name":"enhanced_avg_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"lap","num":113,"name":"enhanced_min_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"lap","num":114,"name":"enhanced_max_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"lap","num":115,"name":"avg_lev_motor_power","type":"uint16","units":"watts" }, + { "message":"lap","num":116,"name":"max_lev_motor_power","type":"uint16","units":"watts" }, + { "message":"lap","num":117,"name":"lev_battery_consumption","type":"uint8","scale":2,"units":"percent" }, + { "message":"lap","num":118,"name":"avg_vertical_ratio","type":"uint16","scale":100,"units":"percent" }, + { "message":"lap","num":119,"name":"avg_stance_time_balance","type":"uint16","scale":100,"units":"percent" }, + { "message":"lap","num":120,"name":"avg_step_length","type":"uint16","scale":10,"units":"mm" }, + { "message":"lap","num":121,"name":"avg_vam","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"lap","num":122,"name":"avg_depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"lap","num":123,"name":"max_depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"lap","num":124,"name":"min_temperature","type":"sint8","units":"C" }, + { "message":"lap","num":136,"name":"enhanced_avg_respiration_rate","type":"uint16","scale":100,"units":"Breaths/min" }, + { "message":"lap","num":137,"name":"enhanced_max_respiration_rate","type":"uint16","scale":100,"units":"Breaths/min" }, + { "message":"lap","num":147,"name":"avg_respiration_rate","type":"uint8" }, + { "message":"lap","num":148,"name":"max_respiration_rate","type":"uint8" }, + { "message":"lap","num":149,"name":"total_grit","type":"float32","units":"kGrit" }, + { "message":"lap","num":150,"name":"total_flow","type":"float32","units":"Flow" }, + { "message":"lap","num":151,"name":"jump_count","type":"uint16" }, + { "message":"lap","num":153,"name":"avg_grit","type":"float32","units":"kGrit" }, + { "message":"lap","num":154,"name":"avg_flow","type":"float32","units":"Flow" }, + { "message":"lap","num":156,"name":"total_fractional_ascent","type":"uint8","scale":100,"units":"m" }, + { "message":"lap","num":157,"name":"total_fractional_descent","type":"uint8","scale":100,"units":"m" }, + { "message":"lap","num":158,"name":"avg_core_temperature","type":"uint16","scale":100,"units":"C" }, + { "message":"lap","num":159,"name":"min_core_temperature","type":"uint16","scale":100,"units":"C" }, + { "message":"lap","num":160,"name":"max_core_temperature","type":"uint16","scale":100,"units":"C" }, + { "message":"length","num":254,"name":"message_index","type":"message_index" }, + { "message":"length","num":253,"name":"timestamp","type":"date_time" }, + { "message":"length","num":0,"name":"event","type":"event" }, + { "message":"length","num":1,"name":"event_type","type":"event_type" }, + { "message":"length","num":2,"name":"start_time","type":"date_time" }, + { "message":"length","num":3,"name":"total_elapsed_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"length","num":4,"name":"total_timer_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"length","num":5,"name":"total_strokes","type":"uint16","units":"strokes" }, + { "message":"length","num":6,"name":"avg_speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"length","num":7,"name":"swim_stroke","type":"swim_stroke","units":"swim_stroke" }, + { "message":"length","num":9,"name":"avg_swimming_cadence","type":"uint8","units":"strokes/min" }, + { "message":"length","num":10,"name":"event_group","type":"uint8" }, + { "message":"length","num":11,"name":"total_calories","type":"uint16","units":"kcal" }, + { "message":"length","num":12,"name":"length_type","type":"length_type" }, + { "message":"length","num":18,"name":"player_score","type":"uint16" }, + { "message":"length","num":19,"name":"opponent_score","type":"uint16" }, + { "message":"length","num":20,"name":"stroke_count","type":"uint16","array":"[N]","units":"counts" }, + { "message":"length","num":21,"name":"zone_count","type":"uint16","array":"[N]","units":"counts" }, + { "message":"length","num":22,"name":"enhanced_avg_respiration_rate","type":"uint16","scale":100,"units":"Breaths/min" }, + { "message":"length","num":23,"name":"enhanced_max_respiration_rate","type":"uint16","scale":100,"units":"Breaths/min" }, + { "message":"length","num":24,"name":"avg_respiration_rate","type":"uint8" }, + { "message":"length","num":25,"name":"max_respiration_rate","type":"uint8" }, + { "message":"record","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"record","num":0,"name":"position_lat","type":"sint32","units":"semicircles" }, + { "message":"record","num":1,"name":"position_long","type":"sint32","units":"semicircles" }, + { "message":"record","num":2,"name":"altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"record","num":3,"name":"heart_rate","type":"uint8","units":"bpm" }, + { "message":"record","num":4,"name":"cadence","type":"uint8","units":"rpm" }, + { "message":"record","num":5,"name":"distance","type":"uint32","scale":100,"units":"m" }, + { "message":"record","num":6,"name":"speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"record","num":7,"name":"power","type":"uint16","units":"watts" }, + { "message":"record","num":9,"name":"grade","type":"sint16","scale":100,"units":"%" }, + { "message":"record","num":10,"name":"resistance","type":"uint8" }, + { "message":"record","num":11,"name":"time_from_course","type":"sint32","scale":1000,"units":"s" }, + { "message":"record","num":12,"name":"cycle_length","type":"uint8","scale":100,"units":"m" }, + { "message":"record","num":13,"name":"temperature","type":"sint8","units":"C" }, + { "message":"record","num":17,"name":"speed_1s","type":"uint8","array":"[N]","scale":16,"units":"m/s" }, + { "message":"record","num":18,"name":"cycles","type":"uint8","units":"cycles" }, + { "message":"record","num":19,"name":"total_cycles","type":"uint32","units":"cycles" }, + { "message":"record","num":28,"name":"compressed_accumulated_power","type":"uint16","units":"watts" }, + { "message":"record","num":29,"name":"accumulated_power","type":"uint32","units":"watts" }, + { "message":"record","num":30,"name":"left_right_balance","type":"left_right_balance" }, + { "message":"record","num":31,"name":"gps_accuracy","type":"uint8","units":"m" }, + { "message":"record","num":32,"name":"vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"record","num":33,"name":"calories","type":"uint16","units":"kcal" }, + { "message":"record","num":39,"name":"vertical_oscillation","type":"uint16","scale":10,"units":"mm" }, + { "message":"record","num":40,"name":"stance_time_percent","type":"uint16","scale":100,"units":"percent" }, + { "message":"record","num":41,"name":"stance_time","type":"uint16","scale":10,"units":"ms" }, + { "message":"record","num":42,"name":"activity_type","type":"activity_type" }, + { "message":"record","num":43,"name":"left_torque_effectiveness","type":"uint8","scale":2,"units":"percent" }, + { "message":"record","num":44,"name":"right_torque_effectiveness","type":"uint8","scale":2,"units":"percent" }, + { "message":"record","num":45,"name":"left_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"record","num":46,"name":"right_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"record","num":47,"name":"combined_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"record","num":48,"name":"time128","type":"uint8","scale":128,"units":"s" }, + { "message":"record","num":49,"name":"stroke_type","type":"stroke_type" }, + { "message":"record","num":50,"name":"zone","type":"uint8" }, + { "message":"record","num":51,"name":"ball_speed","type":"uint16","scale":100,"units":"m/s" }, + { "message":"record","num":52,"name":"cadence256","type":"uint16","scale":256,"units":"rpm" }, + { "message":"record","num":53,"name":"fractional_cadence","type":"uint8","scale":128,"units":"rpm" }, + { "message":"record","num":54,"name":"total_hemoglobin_conc","type":"uint16","scale":100,"units":"g/dL" }, + { "message":"record","num":55,"name":"total_hemoglobin_conc_min","type":"uint16","scale":100,"units":"g/dL" }, + { "message":"record","num":56,"name":"total_hemoglobin_conc_max","type":"uint16","scale":100,"units":"g/dL" }, + { "message":"record","num":57,"name":"saturated_hemoglobin_percent","type":"uint16","scale":10,"units":"%" }, + { "message":"record","num":58,"name":"saturated_hemoglobin_percent_min","type":"uint16","scale":10,"units":"%" }, + { "message":"record","num":59,"name":"saturated_hemoglobin_percent_max","type":"uint16","scale":10,"units":"%" }, + { "message":"record","num":62,"name":"device_index","type":"device_index" }, + { "message":"record","num":67,"name":"left_pco","type":"sint8","units":"mm" }, + { "message":"record","num":68,"name":"right_pco","type":"sint8","units":"mm" }, + { "message":"record","num":69,"name":"left_power_phase","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"record","num":70,"name":"left_power_phase_peak","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"record","num":71,"name":"right_power_phase","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"record","num":72,"name":"right_power_phase_peak","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"record","num":73,"name":"enhanced_speed","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"record","num":78,"name":"enhanced_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"record","num":81,"name":"battery_soc","type":"uint8","scale":2,"units":"percent" }, + { "message":"record","num":82,"name":"motor_power","type":"uint16","units":"watts" }, + { "message":"record","num":83,"name":"vertical_ratio","type":"uint16","scale":100,"units":"percent" }, + { "message":"record","num":84,"name":"stance_time_balance","type":"uint16","scale":100,"units":"percent" }, + { "message":"record","num":85,"name":"step_length","type":"uint16","scale":10,"units":"mm" }, + { "message":"record","num":87,"name":"cycle_length16","type":"uint16","scale":100,"units":"m" }, + { "message":"record","num":91,"name":"absolute_pressure","type":"uint32","units":"Pa" }, + { "message":"record","num":92,"name":"depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"record","num":93,"name":"next_stop_depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"record","num":94,"name":"next_stop_time","type":"uint32","scale":1,"units":"s" }, + { "message":"record","num":95,"name":"time_to_surface","type":"uint32","scale":1,"units":"s" }, + { "message":"record","num":96,"name":"ndl_time","type":"uint32","scale":1,"units":"s" }, + { "message":"record","num":97,"name":"cns_load","type":"uint8","units":"percent" }, + { "message":"record","num":98,"name":"n2_load","type":"uint16","scale":1,"units":"percent" }, + { "message":"record","num":99,"name":"respiration_rate","type":"uint8","scale":1,"units":"s" }, + { "message":"record","num":108,"name":"enhanced_respiration_rate","type":"uint16","scale":100,"units":"Breaths/min" }, + { "message":"record","num":114,"name":"grit","type":"float32" }, + { "message":"record","num":115,"name":"flow","type":"float32" }, + { "message":"record","num":116,"name":"current_stress","type":"uint16","scale":100 }, + { "message":"record","num":117,"name":"ebike_travel_range","type":"uint16","units":"km" }, + { "message":"record","num":118,"name":"ebike_battery_level","type":"uint8","units":"percent" }, + { "message":"record","num":119,"name":"ebike_assist_mode","type":"uint8","units":"depends on sensor" }, + { "message":"record","num":120,"name":"ebike_assist_level_percent","type":"uint8","units":"percent" }, + { "message":"record","num":123,"name":"air_time_remaining","type":"uint32","units":"s" }, + { "message":"record","num":124,"name":"pressure_sac","type":"uint16","scale":100,"units":"bar/min" }, + { "message":"record","num":125,"name":"volume_sac","type":"uint16","scale":100,"units":"L/min" }, + { "message":"record","num":126,"name":"rmv","type":"uint16","scale":100,"units":"L/min" }, + { "message":"record","num":127,"name":"ascent_rate","type":"sint32","scale":1000,"units":"m/s" }, + { "message":"record","num":129,"name":"po2","type":"uint8","scale":100,"units":"percent" }, + { "message":"record","num":139,"name":"core_temperature","type":"uint16","scale":100,"units":"C" }, + { "message":"event","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"event","num":0,"name":"event","type":"event" }, + { "message":"event","num":1,"name":"event_type","type":"event_type" }, + { "message":"event","num":2,"name":"data16","type":"uint16" }, + { "message":"event","num":3,"name":"data","type":"uint32" }, + { "message":"event","num":4,"name":"event_group","type":"uint8" }, + { "message":"event","num":7,"name":"score","type":"uint16" }, + { "message":"event","num":8,"name":"opponent_score","type":"uint16" }, + { "message":"event","num":9,"name":"front_gear_num","type":"uint8z" }, + { "message":"event","num":10,"name":"front_gear","type":"uint8z" }, + { "message":"event","num":11,"name":"rear_gear_num","type":"uint8z" }, + { "message":"event","num":12,"name":"rear_gear","type":"uint8z" }, + { "message":"event","num":13,"name":"device_index","type":"device_index" }, + { "message":"event","num":14,"name":"activity_type","type":"activity_type" }, + { "message":"event","num":15,"name":"start_timestamp","type":"date_time","units":"s" }, + { "message":"event","num":21,"name":"radar_threat_level_max","type":"radar_threat_level_type" }, + { "message":"event","num":22,"name":"radar_threat_count","type":"uint8" }, + { "message":"event","num":23,"name":"radar_threat_avg_approach_speed","type":"uint8","scale":10,"units":"m/s" }, + { "message":"event","num":24,"name":"radar_threat_max_approach_speed","type":"uint8","scale":10,"units":"m/s" }, + { "message":"device_info","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"device_info","num":0,"name":"device_index","type":"device_index" }, + { "message":"device_info","num":1,"name":"device_type","type":"uint8" }, + { "message":"device_info","num":2,"name":"manufacturer","type":"manufacturer" }, + { "message":"device_info","num":3,"name":"serial_number","type":"uint32z" }, + { "message":"device_info","num":4,"name":"product","type":"uint16" }, + { "message":"device_info","num":5,"name":"software_version","type":"uint16","scale":100 }, + { "message":"device_info","num":6,"name":"hardware_version","type":"uint8" }, + { "message":"device_info","num":7,"name":"cum_operating_time","type":"uint32","units":"s" }, + { "message":"device_info","num":10,"name":"battery_voltage","type":"uint16","scale":256,"units":"V" }, + { "message":"device_info","num":11,"name":"battery_status","type":"battery_status" }, + { "message":"device_info","num":18,"name":"sensor_position","type":"body_location" }, + { "message":"device_info","num":19,"name":"descriptor","type":"string" }, + { "message":"device_info","num":20,"name":"ant_transmission_type","type":"uint8z" }, + { "message":"device_info","num":21,"name":"ant_device_number","type":"uint16z" }, + { "message":"device_info","num":22,"name":"ant_network","type":"ant_network" }, + { "message":"device_info","num":25,"name":"source_type","type":"source_type" }, + { "message":"device_info","num":27,"name":"product_name","type":"string" }, + { "message":"device_info","num":32,"name":"battery_level","type":"uint8","units":"%" }, + { "message":"device_aux_battery_info","num":253,"name":"timestamp","type":"date_time" }, + { "message":"device_aux_battery_info","num":0,"name":"device_index","type":"device_index" }, + { "message":"device_aux_battery_info","num":1,"name":"battery_voltage","type":"uint16","scale":256,"units":"V" }, + { "message":"device_aux_battery_info","num":2,"name":"battery_status","type":"battery_status" }, + { "message":"device_aux_battery_info","num":3,"name":"battery_identifier","type":"uint8" }, + { "message":"training_file","num":253,"name":"timestamp","type":"date_time" }, + { "message":"training_file","num":0,"name":"type","type":"file" }, + { "message":"training_file","num":1,"name":"manufacturer","type":"manufacturer" }, + { "message":"training_file","num":2,"name":"product","type":"uint16" }, + { "message":"training_file","num":3,"name":"serial_number","type":"uint32z" }, + { "message":"training_file","num":4,"name":"time_created","type":"date_time" }, + { "message":"weather_conditions","num":253,"name":"timestamp","type":"date_time" }, + { "message":"weather_conditions","num":0,"name":"weather_report","type":"weather_report" }, + { "message":"weather_conditions","num":1,"name":"temperature","type":"sint8","units":"C" }, + { "message":"weather_conditions","num":2,"name":"condition","type":"weather_status" }, + { "message":"weather_conditions","num":3,"name":"wind_direction","type":"uint16","units":"degrees" }, + { "message":"weather_conditions","num":4,"name":"wind_speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"weather_conditions","num":5,"name":"precipitation_probability","type":"uint8" }, + { "message":"weather_conditions","num":6,"name":"temperature_feels_like","type":"sint8","units":"C" }, + { "message":"weather_conditions","num":7,"name":"relative_humidity","type":"uint8" }, + { "message":"weather_conditions","num":8,"name":"location","type":"string" }, + { "message":"weather_conditions","num":9,"name":"observed_at_time","type":"date_time" }, + { "message":"weather_conditions","num":10,"name":"observed_location_lat","type":"sint32","units":"semicircles" }, + { "message":"weather_conditions","num":11,"name":"observed_location_long","type":"sint32","units":"semicircles" }, + { "message":"weather_conditions","num":12,"name":"day_of_week","type":"day_of_week" }, + { "message":"weather_conditions","num":13,"name":"high_temperature","type":"sint8","units":"C" }, + { "message":"weather_conditions","num":14,"name":"low_temperature","type":"sint8","units":"C" }, + { "message":"weather_alert","num":253,"name":"timestamp","type":"date_time" }, + { "message":"weather_alert","num":0,"name":"report_id","type":"string" }, + { "message":"weather_alert","num":1,"name":"issue_time","type":"date_time" }, + { "message":"weather_alert","num":2,"name":"expire_time","type":"date_time" }, + { "message":"weather_alert","num":3,"name":"severity","type":"weather_severity" }, + { "message":"weather_alert","num":4,"name":"type","type":"weather_severe_type" }, + { "message":"gps_metadata","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"gps_metadata","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"gps_metadata","num":1,"name":"position_lat","type":"sint32","units":"semicircles" }, + { "message":"gps_metadata","num":2,"name":"position_long","type":"sint32","units":"semicircles" }, + { "message":"gps_metadata","num":3,"name":"enhanced_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"gps_metadata","num":4,"name":"enhanced_speed","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"gps_metadata","num":5,"name":"heading","type":"uint16","scale":100,"units":"degrees" }, + { "message":"gps_metadata","num":6,"name":"utc_timestamp","type":"date_time","units":"s" }, + { "message":"gps_metadata","num":7,"name":"velocity","type":"sint16","array":"[3]","scale":100,"units":"m/s" }, + { "message":"camera_event","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"camera_event","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"camera_event","num":1,"name":"camera_event_type","type":"camera_event_type" }, + { "message":"camera_event","num":2,"name":"camera_file_uuid","type":"string" }, + { "message":"camera_event","num":3,"name":"camera_orientation","type":"camera_orientation_type" }, + { "message":"gyroscope_data","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"gyroscope_data","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"gyroscope_data","num":1,"name":"sample_time_offset","type":"uint16","array":"[N]","units":"ms" }, + { "message":"gyroscope_data","num":2,"name":"gyro_x","type":"uint16","array":"[N]","units":"counts" }, + { "message":"gyroscope_data","num":3,"name":"gyro_y","type":"uint16","array":"[N]","units":"counts" }, + { "message":"gyroscope_data","num":4,"name":"gyro_z","type":"uint16","array":"[N]","units":"counts" }, + { "message":"gyroscope_data","num":5,"name":"calibrated_gyro_x","type":"float32","array":"[N]","units":"deg/s" }, + { "message":"gyroscope_data","num":6,"name":"calibrated_gyro_y","type":"float32","array":"[N]","units":"deg/s" }, + { "message":"gyroscope_data","num":7,"name":"calibrated_gyro_z","type":"float32","array":"[N]","units":"deg/s" }, + { "message":"accelerometer_data","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"accelerometer_data","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"accelerometer_data","num":1,"name":"sample_time_offset","type":"uint16","array":"[N]","units":"ms" }, + { "message":"accelerometer_data","num":2,"name":"accel_x","type":"uint16","array":"[N]","units":"counts" }, + { "message":"accelerometer_data","num":3,"name":"accel_y","type":"uint16","array":"[N]","units":"counts" }, + { "message":"accelerometer_data","num":4,"name":"accel_z","type":"uint16","array":"[N]","units":"counts" }, + { "message":"accelerometer_data","num":5,"name":"calibrated_accel_x","type":"float32","array":"[N]","units":"g" }, + { "message":"accelerometer_data","num":6,"name":"calibrated_accel_y","type":"float32","array":"[N]","units":"g" }, + { "message":"accelerometer_data","num":7,"name":"calibrated_accel_z","type":"float32","array":"[N]","units":"g" }, + { "message":"accelerometer_data","num":8,"name":"compressed_calibrated_accel_x","type":"sint16","array":"[N]","units":"mG" }, + { "message":"accelerometer_data","num":9,"name":"compressed_calibrated_accel_y","type":"sint16","array":"[N]","units":"mG" }, + { "message":"accelerometer_data","num":10,"name":"compressed_calibrated_accel_z","type":"sint16","array":"[N]","units":"mG" }, + { "message":"magnetometer_data","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"magnetometer_data","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"magnetometer_data","num":1,"name":"sample_time_offset","type":"uint16","array":"[N]","units":"ms" }, + { "message":"magnetometer_data","num":2,"name":"mag_x","type":"uint16","array":"[N]","units":"counts" }, + { "message":"magnetometer_data","num":3,"name":"mag_y","type":"uint16","array":"[N]","units":"counts" }, + { "message":"magnetometer_data","num":4,"name":"mag_z","type":"uint16","array":"[N]","units":"counts" }, + { "message":"magnetometer_data","num":5,"name":"calibrated_mag_x","type":"float32","array":"[N]","units":"G" }, + { "message":"magnetometer_data","num":6,"name":"calibrated_mag_y","type":"float32","array":"[N]","units":"G" }, + { "message":"magnetometer_data","num":7,"name":"calibrated_mag_z","type":"float32","array":"[N]","units":"G" }, + { "message":"barometer_data","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"barometer_data","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"barometer_data","num":1,"name":"sample_time_offset","type":"uint16","array":"[N]","units":"ms" }, + { "message":"barometer_data","num":2,"name":"baro_pres","type":"uint32","array":"[N]","units":"Pa" }, + { "message":"three_d_sensor_calibration","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"three_d_sensor_calibration","num":0,"name":"sensor_type","type":"sensor_type" }, + { "message":"three_d_sensor_calibration","num":1,"name":"calibration_factor","type":"uint32" }, + { "message":"three_d_sensor_calibration","name":"accel_cal_factor","type":"uint32","units":"g" }, + { "message":"three_d_sensor_calibration","name":"gyro_cal_factor","type":"uint32","units":"deg/s" }, + { "message":"three_d_sensor_calibration","num":2,"name":"calibration_divisor","type":"uint32","units":"counts" }, + { "message":"three_d_sensor_calibration","num":3,"name":"level_shift","type":"uint32" }, + { "message":"three_d_sensor_calibration","num":4,"name":"offset_cal","type":"sint32","array":"[3]" }, + { "message":"three_d_sensor_calibration","num":5,"name":"orientation_matrix","type":"sint32","array":"[9]","scale":65535 }, + { "message":"one_d_sensor_calibration","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"one_d_sensor_calibration","num":0,"name":"sensor_type","type":"sensor_type" }, + { "message":"one_d_sensor_calibration","num":1,"name":"calibration_factor","type":"uint32" }, + { "message":"one_d_sensor_calibration","name":"baro_cal_factor","type":"uint32","units":"Pa" }, + { "message":"one_d_sensor_calibration","num":2,"name":"calibration_divisor","type":"uint32","units":"counts" }, + { "message":"one_d_sensor_calibration","num":3,"name":"level_shift","type":"uint32" }, + { "message":"one_d_sensor_calibration","num":4,"name":"offset_cal","type":"sint32" }, + { "message":"video_frame","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"video_frame","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"video_frame","num":1,"name":"frame_number","type":"uint32" }, + { "message":"obdii_data","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"obdii_data","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"obdii_data","num":1,"name":"time_offset","type":"uint16","array":"[N]","units":"ms" }, + { "message":"obdii_data","num":2,"name":"pid","type":"byte" }, + { "message":"obdii_data","num":3,"name":"raw_data","type":"byte","array":"[N]" }, + { "message":"obdii_data","num":4,"name":"pid_data_size","type":"uint8","array":"[N]" }, + { "message":"obdii_data","num":5,"name":"system_time","type":"uint32","array":"[N]" }, + { "message":"obdii_data","num":6,"name":"start_timestamp","type":"date_time" }, + { "message":"obdii_data","num":7,"name":"start_timestamp_ms","type":"uint16","units":"ms" }, + { "message":"nmea_sentence","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"nmea_sentence","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"nmea_sentence","num":1,"name":"sentence","type":"string" }, + { "message":"aviation_attitude","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"aviation_attitude","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"aviation_attitude","num":1,"name":"system_time","type":"uint32","array":"[N]","units":"ms" }, + { "message":"aviation_attitude","num":2,"name":"pitch","type":"sint16","array":"[N]","scale":10430.38,"units":"radians" }, + { "message":"aviation_attitude","num":3,"name":"roll","type":"sint16","array":"[N]","scale":10430.38,"units":"radians" }, + { "message":"aviation_attitude","num":4,"name":"accel_lateral","type":"sint16","array":"[N]","scale":100,"units":"m/s^2" }, + { "message":"aviation_attitude","num":5,"name":"accel_normal","type":"sint16","array":"[N]","scale":100,"units":"m/s^2" }, + { "message":"aviation_attitude","num":6,"name":"turn_rate","type":"sint16","array":"[N]","scale":1024,"units":"radians/second" }, + { "message":"aviation_attitude","num":7,"name":"stage","type":"attitude_stage","array":"[N]" }, + { "message":"aviation_attitude","num":8,"name":"attitude_stage_complete","type":"uint8","array":"[N]","units":"%" }, + { "message":"aviation_attitude","num":9,"name":"track","type":"uint16","array":"[N]","scale":10430.38,"units":"radians" }, + { "message":"aviation_attitude","num":10,"name":"validity","type":"attitude_validity","array":"[N]" }, + { "message":"video","num":0,"name":"url","type":"string" }, + { "message":"video","num":1,"name":"hosting_provider","type":"string" }, + { "message":"video","num":2,"name":"duration","type":"uint32","units":"ms" }, + { "message":"video_title","num":254,"name":"message_index","type":"message_index" }, + { "message":"video_title","num":0,"name":"message_count","type":"uint16" }, + { "message":"video_title","num":1,"name":"text","type":"string" }, + { "message":"video_description","num":254,"name":"message_index","type":"message_index" }, + { "message":"video_description","num":0,"name":"message_count","type":"uint16" }, + { "message":"video_description","num":1,"name":"text","type":"string" }, + { "message":"video_clip","num":0,"name":"clip_number","type":"uint16" }, + { "message":"video_clip","num":1,"name":"start_timestamp","type":"date_time" }, + { "message":"video_clip","num":2,"name":"start_timestamp_ms","type":"uint16" }, + { "message":"video_clip","num":3,"name":"end_timestamp","type":"date_time" }, + { "message":"video_clip","num":4,"name":"end_timestamp_ms","type":"uint16" }, + { "message":"video_clip","num":6,"name":"clip_start","type":"uint32","units":"ms" }, + { "message":"video_clip","num":7,"name":"clip_end","type":"uint32","units":"ms" }, + { "message":"set","num":254,"name":"timestamp","type":"date_time" }, + { "message":"set","num":0,"name":"duration","type":"uint32","scale":1000,"units":"s" }, + { "message":"set","num":3,"name":"repetitions","type":"uint16" }, + { "message":"set","num":4,"name":"weight","type":"uint16","scale":16,"units":"kg" }, + { "message":"set","num":5,"name":"set_type","type":"set_type" }, + { "message":"set","num":6,"name":"start_time","type":"date_time" }, + { "message":"set","num":7,"name":"category","type":"exercise_category","array":"[N]" }, + { "message":"set","num":8,"name":"category_subtype","type":"uint16","array":"[N]" }, + { "message":"set","num":9,"name":"weight_display_unit","type":"fit_base_unit" }, + { "message":"set","num":10,"name":"message_index","type":"message_index" }, + { "message":"set","num":11,"name":"wkt_step_index","type":"message_index" }, + { "message":"jump","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"jump","num":0,"name":"distance","type":"float32","units":"m" }, + { "message":"jump","num":1,"name":"height","type":"float32","units":"m" }, + { "message":"jump","num":2,"name":"rotations","type":"uint8" }, + { "message":"jump","num":3,"name":"hang_time","type":"float32","units":"s" }, + { "message":"jump","num":4,"name":"score","type":"float32" }, + { "message":"jump","num":5,"name":"position_lat","type":"sint32","units":"semicircles" }, + { "message":"jump","num":6,"name":"position_long","type":"sint32","units":"semicircles" }, + { "message":"jump","num":7,"name":"speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"jump","num":8,"name":"enhanced_speed","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"split","num":0,"name":"split_type","type":"split_type" }, + { "message":"split","num":1,"name":"total_elapsed_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"split","num":2,"name":"total_timer_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"split","num":3,"name":"total_distance","type":"uint32","scale":100,"units":"m" }, + { "message":"split","num":9,"name":"start_time","type":"date_time" }, + { "message":"climb_pro","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"climb_pro","num":0,"name":"position_lat","type":"sint32","units":"semicircles" }, + { "message":"climb_pro","num":1,"name":"position_long","type":"sint32","units":"semicircles" }, + { "message":"climb_pro","num":2,"name":"climb_pro_event","type":"climb_pro_event" }, + { "message":"climb_pro","num":3,"name":"climb_number","type":"uint16" }, + { "message":"climb_pro","num":4,"name":"climb_category","type":"uint8" }, + { "message":"climb_pro","num":5,"name":"current_dist","type":"float32","units":"m" }, + { "message":"field_description","num":0,"name":"developer_data_index","type":"uint8" }, + { "message":"field_description","num":1,"name":"field_definition_number","type":"uint8" }, + { "message":"field_description","num":2,"name":"fit_base_type_id","type":"fit_base_type" }, + { "message":"field_description","num":3,"name":"field_name","type":"string","array":"[N]" }, + { "message":"field_description","num":4,"name":"array","type":"uint8" }, + { "message":"field_description","num":5,"name":"components","type":"string" }, + { "message":"field_description","num":6,"name":"scale","type":"uint8" }, + { "message":"field_description","num":7,"name":"offset","type":"sint8" }, + { "message":"field_description","num":8,"name":"units","type":"string","array":"[N]" }, + { "message":"field_description","num":9,"name":"bits","type":"string" }, + { "message":"field_description","num":10,"name":"accumulate","type":"string" }, + { "message":"field_description","num":13,"name":"fit_base_unit_id","type":"fit_base_unit" }, + { "message":"field_description","num":14,"name":"native_mesg_num","type":"mesg_num" }, + { "message":"field_description","num":15,"name":"native_field_num","type":"uint8" }, + { "message":"developer_data_id","num":0,"name":"developer_id","type":"byte","array":"[N]" }, + { "message":"developer_data_id","num":1,"name":"application_id","type":"byte","array":"[N]" }, + { "message":"developer_data_id","num":2,"name":"manufacturer_id","type":"manufacturer" }, + { "message":"developer_data_id","num":3,"name":"developer_data_index","type":"uint8" }, + { "message":"developer_data_id","num":4,"name":"application_version","type":"uint32" }, + { "message":"course","num":4,"name":"sport","type":"sport" }, + { "message":"course","num":5,"name":"name","type":"string" }, + { "message":"course","num":6,"name":"capabilities","type":"course_capabilities" }, + { "message":"course","num":7,"name":"sub_sport","type":"sub_sport" }, + { "message":"course_point","num":254,"name":"message_index","type":"message_index" }, + { "message":"course_point","num":1,"name":"timestamp","type":"date_time" }, + { "message":"course_point","num":2,"name":"position_lat","type":"sint32","units":"semicircles" }, + { "message":"course_point","num":3,"name":"position_long","type":"sint32","units":"semicircles" }, + { "message":"course_point","num":4,"name":"distance","type":"uint32","scale":100,"units":"m" }, + { "message":"course_point","num":5,"name":"type","type":"course_point" }, + { "message":"course_point","num":6,"name":"name","type":"string" }, + { "message":"course_point","num":8,"name":"favorite","type":"bool" }, + { "message":"segment_id","num":0,"name":"name","type":"string" }, + { "message":"segment_id","num":1,"name":"uuid","type":"string" }, + { "message":"segment_id","num":2,"name":"sport","type":"sport" }, + { "message":"segment_id","num":3,"name":"enabled","type":"bool" }, + { "message":"segment_id","num":4,"name":"user_profile_primary_key","type":"uint32" }, + { "message":"segment_id","num":5,"name":"device_id","type":"uint32" }, + { "message":"segment_id","num":6,"name":"default_race_leader","type":"uint8" }, + { "message":"segment_id","num":7,"name":"delete_status","type":"segment_delete_status" }, + { "message":"segment_id","num":8,"name":"selection_type","type":"segment_selection_type" }, + { "message":"segment_leaderboard_entry","num":254,"name":"message_index","type":"message_index" }, + { "message":"segment_leaderboard_entry","num":0,"name":"name","type":"string" }, + { "message":"segment_leaderboard_entry","num":1,"name":"type","type":"segment_leaderboard_type" }, + { "message":"segment_leaderboard_entry","num":2,"name":"group_primary_key","type":"uint32" }, + { "message":"segment_leaderboard_entry","num":3,"name":"activity_id","type":"uint32" }, + { "message":"segment_leaderboard_entry","num":4,"name":"segment_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"segment_leaderboard_entry","num":5,"name":"activity_id_string","type":"string" }, + { "message":"segment_point","num":254,"name":"message_index","type":"message_index" }, + { "message":"segment_point","num":1,"name":"position_lat","type":"sint32","units":"semicircles" }, + { "message":"segment_point","num":2,"name":"position_long","type":"sint32","units":"semicircles" }, + { "message":"segment_point","num":3,"name":"distance","type":"uint32","scale":100,"units":"m" }, + { "message":"segment_point","num":4,"name":"altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"segment_point","num":5,"name":"leader_time","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"segment_point","num":6,"name":"enhanced_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"segment_lap","num":254,"name":"message_index","type":"message_index" }, + { "message":"segment_lap","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"segment_lap","num":0,"name":"event","type":"event" }, + { "message":"segment_lap","num":1,"name":"event_type","type":"event_type" }, + { "message":"segment_lap","num":2,"name":"start_time","type":"date_time" }, + { "message":"segment_lap","num":3,"name":"start_position_lat","type":"sint32","units":"semicircles" }, + { "message":"segment_lap","num":4,"name":"start_position_long","type":"sint32","units":"semicircles" }, + { "message":"segment_lap","num":5,"name":"end_position_lat","type":"sint32","units":"semicircles" }, + { "message":"segment_lap","num":6,"name":"end_position_long","type":"sint32","units":"semicircles" }, + { "message":"segment_lap","num":7,"name":"total_elapsed_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"segment_lap","num":8,"name":"total_timer_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"segment_lap","num":9,"name":"total_distance","type":"uint32","scale":100,"units":"m" }, + { "message":"segment_lap","num":10,"name":"total_cycles","type":"uint32","units":"cycles" }, + { "message":"segment_lap","num":11,"name":"total_calories","type":"uint16","units":"kcal" }, + { "message":"segment_lap","num":12,"name":"total_fat_calories","type":"uint16","units":"kcal" }, + { "message":"segment_lap","num":13,"name":"avg_speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"segment_lap","num":14,"name":"max_speed","type":"uint16","scale":1000,"units":"m/s" }, + { "message":"segment_lap","num":15,"name":"avg_heart_rate","type":"uint8","units":"bpm" }, + { "message":"segment_lap","num":16,"name":"max_heart_rate","type":"uint8","units":"bpm" }, + { "message":"segment_lap","num":17,"name":"avg_cadence","type":"uint8","units":"rpm" }, + { "message":"segment_lap","num":18,"name":"max_cadence","type":"uint8","units":"rpm" }, + { "message":"segment_lap","num":19,"name":"avg_power","type":"uint16","units":"watts" }, + { "message":"segment_lap","num":20,"name":"max_power","type":"uint16","units":"watts" }, + { "message":"segment_lap","num":21,"name":"total_ascent","type":"uint16","units":"m" }, + { "message":"segment_lap","num":22,"name":"total_descent","type":"uint16","units":"m" }, + { "message":"segment_lap","num":23,"name":"sport","type":"sport" }, + { "message":"segment_lap","num":24,"name":"event_group","type":"uint8" }, + { "message":"segment_lap","num":25,"name":"nec_lat","type":"sint32","units":"semicircles" }, + { "message":"segment_lap","num":26,"name":"nec_long","type":"sint32","units":"semicircles" }, + { "message":"segment_lap","num":27,"name":"swc_lat","type":"sint32","units":"semicircles" }, + { "message":"segment_lap","num":28,"name":"swc_long","type":"sint32","units":"semicircles" }, + { "message":"segment_lap","num":29,"name":"name","type":"string" }, + { "message":"segment_lap","num":30,"name":"normalized_power","type":"uint16","units":"watts" }, + { "message":"segment_lap","num":31,"name":"left_right_balance","type":"left_right_balance_100" }, + { "message":"segment_lap","num":32,"name":"sub_sport","type":"sub_sport" }, + { "message":"segment_lap","num":33,"name":"total_work","type":"uint32","units":"J" }, + { "message":"segment_lap","num":34,"name":"avg_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"segment_lap","num":35,"name":"max_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"segment_lap","num":36,"name":"gps_accuracy","type":"uint8","units":"m" }, + { "message":"segment_lap","num":37,"name":"avg_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"segment_lap","num":38,"name":"avg_pos_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"segment_lap","num":39,"name":"avg_neg_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"segment_lap","num":40,"name":"max_pos_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"segment_lap","num":41,"name":"max_neg_grade","type":"sint16","scale":100,"units":"%" }, + { "message":"segment_lap","num":42,"name":"avg_temperature","type":"sint8","units":"C" }, + { "message":"segment_lap","num":43,"name":"max_temperature","type":"sint8","units":"C" }, + { "message":"segment_lap","num":44,"name":"total_moving_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"segment_lap","num":45,"name":"avg_pos_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"segment_lap","num":46,"name":"avg_neg_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"segment_lap","num":47,"name":"max_pos_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"segment_lap","num":48,"name":"max_neg_vertical_speed","type":"sint16","scale":1000,"units":"m/s" }, + { "message":"segment_lap","num":49,"name":"time_in_hr_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"segment_lap","num":50,"name":"time_in_speed_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"segment_lap","num":51,"name":"time_in_cadence_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"segment_lap","num":52,"name":"time_in_power_zone","type":"uint32","array":"[N]","scale":1000,"units":"s" }, + { "message":"segment_lap","num":53,"name":"repetition_num","type":"uint16" }, + { "message":"segment_lap","num":54,"name":"min_altitude","type":"uint16","scale":5,"offset":500,"units":"m" }, + { "message":"segment_lap","num":55,"name":"min_heart_rate","type":"uint8","units":"bpm" }, + { "message":"segment_lap","num":56,"name":"active_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"segment_lap","num":57,"name":"wkt_step_index","type":"message_index" }, + { "message":"segment_lap","num":58,"name":"sport_event","type":"sport_event" }, + { "message":"segment_lap","num":59,"name":"avg_left_torque_effectiveness","type":"uint8","scale":2,"units":"percent" }, + { "message":"segment_lap","num":60,"name":"avg_right_torque_effectiveness","type":"uint8","scale":2,"units":"percent" }, + { "message":"segment_lap","num":61,"name":"avg_left_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"segment_lap","num":62,"name":"avg_right_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"segment_lap","num":63,"name":"avg_combined_pedal_smoothness","type":"uint8","scale":2,"units":"percent" }, + { "message":"segment_lap","num":64,"name":"status","type":"segment_lap_status" }, + { "message":"segment_lap","num":65,"name":"uuid","type":"string" }, + { "message":"segment_lap","num":66,"name":"avg_fractional_cadence","type":"uint8","scale":128,"units":"rpm" }, + { "message":"segment_lap","num":67,"name":"max_fractional_cadence","type":"uint8","scale":128,"units":"rpm" }, + { "message":"segment_lap","num":68,"name":"total_fractional_cycles","type":"uint8","scale":128,"units":"cycles" }, + { "message":"segment_lap","num":69,"name":"front_gear_shift_count","type":"uint16" }, + { "message":"segment_lap","num":70,"name":"rear_gear_shift_count","type":"uint16" }, + { "message":"segment_lap","num":71,"name":"time_standing","type":"uint32","scale":1000,"units":"s" }, + { "message":"segment_lap","num":72,"name":"stand_count","type":"uint16" }, + { "message":"segment_lap","num":73,"name":"avg_left_pco","type":"sint8","units":"mm" }, + { "message":"segment_lap","num":74,"name":"avg_right_pco","type":"sint8","units":"mm" }, + { "message":"segment_lap","num":75,"name":"avg_left_power_phase","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"segment_lap","num":76,"name":"avg_left_power_phase_peak","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"segment_lap","num":77,"name":"avg_right_power_phase","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"segment_lap","num":78,"name":"avg_right_power_phase_peak","type":"uint8","array":"[N]","scale":"0.7111111","units":"degrees" }, + { "message":"segment_lap","num":79,"name":"avg_power_position","type":"uint16","array":"[N]","units":"watts" }, + { "message":"segment_lap","num":80,"name":"max_power_position","type":"uint16","array":"[N]","units":"watts" }, + { "message":"segment_lap","num":81,"name":"avg_cadence_position","type":"uint8","array":"[N]","units":"rpm" }, + { "message":"segment_lap","num":82,"name":"max_cadence_position","type":"uint8","array":"[N]","units":"rpm" }, + { "message":"segment_lap","num":83,"name":"manufacturer","type":"manufacturer" }, + { "message":"segment_lap","num":84,"name":"total_grit","type":"float32","units":"kGrit" }, + { "message":"segment_lap","num":85,"name":"total_flow","type":"float32","units":"Flow" }, + { "message":"segment_lap","num":86,"name":"avg_grit","type":"float32","units":"kGrit" }, + { "message":"segment_lap","num":87,"name":"avg_flow","type":"float32","units":"Flow" }, + { "message":"segment_lap","num":89,"name":"total_fractional_ascent","type":"uint8","scale":100,"units":"m" }, + { "message":"segment_lap","num":90,"name":"total_fractional_descent","type":"uint8","scale":100,"units":"m" }, + { "message":"segment_lap","num":91,"name":"enhanced_avg_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"segment_lap","num":92,"name":"enhanced_max_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"segment_lap","num":93,"name":"enhanced_min_altitude","type":"uint32","scale":5,"offset":500,"units":"m" }, + { "message":"segment_file","num":254,"name":"message_index","type":"message_index" }, + { "message":"segment_file","num":1,"name":"file_uuid","type":"string" }, + { "message":"segment_file","num":3,"name":"enabled","type":"bool" }, + { "message":"segment_file","num":4,"name":"user_profile_primary_key","type":"uint32" }, + { "message":"segment_file","num":7,"name":"leader_type","type":"segment_leaderboard_type","array":"[N]" }, + { "message":"segment_file","num":8,"name":"leader_group_primary_key","type":"uint32","array":"[N]" }, + { "message":"segment_file","num":9,"name":"leader_activity_id","type":"uint32","array":"[N]" }, + { "message":"segment_file","num":10,"name":"leader_activity_id_string","type":"string","array":"[N]" }, + { "message":"segment_file","num":11,"name":"default_race_leader","type":"uint8" }, + { "message":"workout","num":254,"name":"message_index","type":"message_index" }, + { "message":"workout","num":4,"name":"sport","type":"sport" }, + { "message":"workout","num":5,"name":"capabilities","type":"workout_capabilities" }, + { "message":"workout","num":6,"name":"num_valid_steps","type":"uint16" }, + { "message":"workout","num":8,"name":"wkt_name","type":"string" }, + { "message":"workout","num":11,"name":"sub_sport","type":"sub_sport" }, + { "message":"workout","num":14,"name":"pool_length","type":"uint16","scale":100,"units":"m" }, + { "message":"workout","num":15,"name":"pool_length_unit","type":"display_measure" }, + { "message":"workout_session","num":254,"name":"message_index","type":"message_index" }, + { "message":"workout_session","num":0,"name":"sport","type":"sport" }, + { "message":"workout_session","num":1,"name":"sub_sport","type":"sub_sport" }, + { "message":"workout_session","num":2,"name":"num_valid_steps","type":"uint16" }, + { "message":"workout_session","num":3,"name":"first_step_index","type":"uint16" }, + { "message":"workout_session","num":4,"name":"pool_length","type":"uint16","scale":100,"units":"m" }, + { "message":"workout_session","num":5,"name":"pool_length_unit","type":"display_measure" }, + { "message":"workout_step","num":254,"name":"message_index","type":"message_index" }, + { "message":"workout_step","num":0,"name":"wkt_step_name","type":"string" }, + { "message":"workout_step","num":1,"name":"duration_type","type":"wkt_step_duration" }, + { "message":"workout_step","num":2,"name":"duration_value","type":"uint32" }, + { "message":"workout_step","num":3,"name":"target_type","type":"wkt_step_target" }, + { "message":"workout_step","num":4,"name":"target_value","type":"uint32" }, + { "message":"workout_step","num":5,"name":"custom_target_value_low","type":"uint32" }, + { "message":"workout_step","num":6,"name":"custom_target_value_high","type":"uint32" }, + { "message":"workout_step","num":7,"name":"intensity","type":"intensity" }, + { "message":"workout_step","num":8,"name":"notes","type":"string" }, + { "message":"workout_step","num":9,"name":"equipment","type":"workout_equipment" }, + { "message":"workout_step","num":10,"name":"exercise_category","type":"exercise_category" }, + { "message":"workout_step","num":11,"name":"exercise_name","type":"uint16" }, + { "message":"workout_step","num":12,"name":"exercise_weight","type":"uint16","scale":100,"units":"kg" }, + { "message":"workout_step","num":13,"name":"weight_display_unit","type":"fit_base_unit" }, + { "message":"workout_step","num":19,"name":"secondary_target_type","type":"wkt_step_target" }, + { "message":"workout_step","num":20,"name":"secondary_target_value","type":"uint32" }, + { "message":"workout_step","num":21,"name":"secondary_custom_target_value_low","type":"uint32" }, + { "message":"workout_step","num":22,"name":"secondary_custom_target_value_high","type":"uint32" }, + { "message":"exercise_title","num":254,"name":"message_index","type":"message_index" }, + { "message":"exercise_title","num":0,"name":"exercise_category","type":"exercise_category" }, + { "message":"exercise_title","num":1,"name":"exercise_name","type":"uint16" }, + { "message":"exercise_title","num":2,"name":"wkt_step_name","type":"string","array":"[N]" }, + { "message":"schedule","num":0,"name":"manufacturer","type":"manufacturer" }, + { "message":"schedule","num":1,"name":"product","type":"uint16" }, + { "message":"schedule","num":2,"name":"serial_number","type":"uint32z" }, + { "message":"schedule","num":3,"name":"time_created","type":"date_time" }, + { "message":"schedule","num":4,"name":"completed","type":"bool" }, + { "message":"schedule","num":5,"name":"type","type":"schedule" }, + { "message":"schedule","num":6,"name":"scheduled_time","type":"local_date_time" }, + { "message":"totals","num":254,"name":"message_index","type":"message_index" }, + { "message":"totals","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"totals","num":0,"name":"timer_time","type":"uint32","units":"s" }, + { "message":"totals","num":1,"name":"distance","type":"uint32","units":"m" }, + { "message":"totals","num":2,"name":"calories","type":"uint32","units":"kcal" }, + { "message":"totals","num":3,"name":"sport","type":"sport" }, + { "message":"totals","num":4,"name":"elapsed_time","type":"uint32","units":"s" }, + { "message":"totals","num":5,"name":"sessions","type":"uint16" }, + { "message":"totals","num":6,"name":"active_time","type":"uint32","units":"s" }, + { "message":"totals","num":9,"name":"sport_index","type":"uint8" }, + { "message":"weight_scale","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"weight_scale","num":0,"name":"weight","type":"weight","scale":100,"units":"kg" }, + { "message":"weight_scale","num":1,"name":"percent_fat","type":"uint16","scale":100,"units":"%" }, + { "message":"weight_scale","num":2,"name":"percent_hydration","type":"uint16","scale":100,"units":"%" }, + { "message":"weight_scale","num":3,"name":"visceral_fat_mass","type":"uint16","scale":100,"units":"kg" }, + { "message":"weight_scale","num":4,"name":"bone_mass","type":"uint16","scale":100,"units":"kg" }, + { "message":"weight_scale","num":5,"name":"muscle_mass","type":"uint16","scale":100,"units":"kg" }, + { "message":"weight_scale","num":7,"name":"basal_met","type":"uint16","scale":4,"units":"kcal/day" }, + { "message":"weight_scale","num":8,"name":"physique_rating","type":"uint8" }, + { "message":"weight_scale","num":9,"name":"active_met","type":"uint16","scale":4,"units":"kcal/day" }, + { "message":"weight_scale","num":10,"name":"metabolic_age","type":"uint8","units":"years" }, + { "message":"weight_scale","num":11,"name":"visceral_fat_rating","type":"uint8" }, + { "message":"weight_scale","num":12,"name":"user_profile_index","type":"message_index" }, + { "message":"weight_scale","num":13,"name":"bmi","type":"uint16","scale":10,"units":"kg/m^2" }, + { "message":"blood_pressure","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"blood_pressure","num":0,"name":"systolic_pressure","type":"uint16","units":"mmHg" }, + { "message":"blood_pressure","num":1,"name":"diastolic_pressure","type":"uint16","units":"mmHg" }, + { "message":"blood_pressure","num":2,"name":"mean_arterial_pressure","type":"uint16","units":"mmHg" }, + { "message":"blood_pressure","num":3,"name":"map_3_sample_mean","type":"uint16","units":"mmHg" }, + { "message":"blood_pressure","num":4,"name":"map_morning_values","type":"uint16","units":"mmHg" }, + { "message":"blood_pressure","num":5,"name":"map_evening_values","type":"uint16","units":"mmHg" }, + { "message":"blood_pressure","num":6,"name":"heart_rate","type":"uint8","units":"bpm" }, + { "message":"blood_pressure","num":7,"name":"heart_rate_type","type":"hr_type" }, + { "message":"blood_pressure","num":8,"name":"status","type":"bp_status" }, + { "message":"blood_pressure","num":9,"name":"user_profile_index","type":"message_index" }, + { "message":"monitoring_info","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"monitoring_info","num":0,"name":"local_timestamp","type":"local_date_time","units":"s" }, + { "message":"monitoring_info","num":1,"name":"activity_type","type":"activity_type","array":"[N]" }, + { "message":"monitoring_info","num":3,"name":"cycles_to_distance","type":"uint16","array":"[N]","scale":5000,"units":"m/cycle" }, + { "message":"monitoring_info","num":4,"name":"cycles_to_calories","type":"uint16","array":"[N]","scale":5000,"units":"kcal/cycle" }, + { "message":"monitoring_info","num":5,"name":"resting_metabolic_rate","type":"uint16","units":"kcal / day" }, + { "message":"monitoring","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"monitoring","num":0,"name":"device_index","type":"device_index" }, + { "message":"monitoring","num":1,"name":"calories","type":"uint16","units":"kcal" }, + { "message":"monitoring","num":2,"name":"distance","type":"uint32","scale":100,"units":"m" }, + { "message":"monitoring","num":3,"name":"cycles","type":"uint32","scale":2,"units":"cycles" }, + { "message":"monitoring","num":4,"name":"active_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"monitoring","num":5,"name":"activity_type","type":"activity_type" }, + { "message":"monitoring","num":6,"name":"activity_subtype","type":"activity_subtype" }, + { "message":"monitoring","num":7,"name":"activity_level","type":"activity_level" }, + { "message":"monitoring","num":8,"name":"distance_16","type":"uint16","units":"100 * m" }, + { "message":"monitoring","num":9,"name":"cycles_16","type":"uint16","units":"2 * cycles (steps)" }, + { "message":"monitoring","num":10,"name":"active_time_16","type":"uint16","units":"s" }, + { "message":"monitoring","num":11,"name":"local_timestamp","type":"local_date_time" }, + { "message":"monitoring","num":12,"name":"temperature","type":"sint16","scale":100,"units":"C" }, + { "message":"monitoring","num":14,"name":"temperature_min","type":"sint16","scale":100,"units":"C" }, + { "message":"monitoring","num":15,"name":"temperature_max","type":"sint16","scale":100,"units":"C" }, + { "message":"monitoring","num":16,"name":"activity_time","type":"uint16","array":"[8]","units":"minutes" }, + { "message":"monitoring","num":19,"name":"active_calories","type":"uint16","units":"kcal" }, + { "message":"monitoring","num":24,"name":"current_activity_type_intensity","type":"byte" }, + { "message":"monitoring","num":25,"name":"timestamp_min_8","type":"uint8","units":"min" }, + { "message":"monitoring","num":26,"name":"timestamp_16","type":"uint16","units":"s" }, + { "message":"monitoring","num":27,"name":"heart_rate","type":"uint8","units":"bpm" }, + { "message":"monitoring","num":28,"name":"intensity","type":"uint8","scale":10 }, + { "message":"monitoring","num":29,"name":"duration_min","type":"uint16","units":"min" }, + { "message":"monitoring","num":30,"name":"duration","type":"uint32","units":"s" }, + { "message":"monitoring","num":31,"name":"ascent","type":"uint32","scale":1000,"units":"m" }, + { "message":"monitoring","num":32,"name":"descent","type":"uint32","scale":1000,"units":"m" }, + { "message":"monitoring","num":33,"name":"moderate_activity_minutes","type":"uint16","units":"minutes" }, + { "message":"monitoring","num":34,"name":"vigorous_activity_minutes","type":"uint16","units":"minutes" }, + { "message":"monitoring_hr_data","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"monitoring_hr_data","num":0,"name":"resting_heart_rate","type":"uint8","units":"bpm" }, + { "message":"monitoring_hr_data","num":1,"name":"current_day_resting_heart_rate","type":"uint8","units":"bpm" }, + { "message":"spo2_data","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"spo2_data","num":0,"name":"reading_spo2","type":"uint8","scale":1,"units":"percent" }, + { "message":"spo2_data","num":1,"name":"reading_confidence","type":"uint8","scale":1 }, + { "message":"spo2_data","num":2,"name":"mode","type":"spo2_measurement_type" }, + { "message":"hr","num":253,"name":"timestamp","type":"date_time" }, + { "message":"hr","num":0,"name":"fractional_timestamp","type":"uint16","scale":32768,"units":"s" }, + { "message":"hr","num":1,"name":"time256","type":"uint8","scale":256,"units":"s" }, + { "message":"hr","num":6,"name":"filtered_bpm","type":"uint8","array":"[N]","units":"bpm" }, + { "message":"hr","num":9,"name":"event_timestamp","type":"uint32","array":"[N]","scale":1024,"units":"s" }, + { "message":"stress_level","num":0,"name":"stress_level_value","type":"sint16" }, + { "message":"stress_level","num":1,"name":"stress_level_time","type":"date_time","units":"s" }, + { "message":"max_met_data","num":0,"name":"update_time","type":"date_time" }, + { "message":"max_met_data","num":2,"name":"vo2_max","type":"uint16","scale":10,"units":"mL/kg/min" }, + { "message":"max_met_data","num":5,"name":"sport","type":"sport" }, + { "message":"max_met_data","num":6,"name":"sub_sport","type":"sub_sport" }, + { "message":"max_met_data","num":8,"name":"max_met_category","type":"max_met_category" }, + { "message":"max_met_data","num":9,"name":"calibrated_data","type":"bool" }, + { "message":"max_met_data","num":12,"name":"hr_source","type":"max_met_heart_rate_source" }, + { "message":"max_met_data","num":13,"name":"speed_source","type":"max_met_speed_source" }, + { "message":"memo_glob","num":250,"name":"part_index","type":"uint32" }, + { "message":"memo_glob","num":0,"name":"memo","type":"byte","array":"[N]" }, + { "message":"memo_glob","num":1,"name":"mesg_num","type":"mesg_num" }, + { "message":"memo_glob","num":2,"name":"parent_index","type":"message_index" }, + { "message":"memo_glob","num":3,"name":"field_num","type":"uint8" }, + { "message":"memo_glob","num":4,"name":"data","type":"uint8z","array":"[N]" }, + { "message":"sleep_level","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"sleep_level","num":0,"name":"sleep_level","type":"sleep_level" }, + { "message":"ant_channel_id","num":0,"name":"channel_number","type":"uint8" }, + { "message":"ant_channel_id","num":1,"name":"device_type","type":"uint8z" }, + { "message":"ant_channel_id","num":2,"name":"device_number","type":"uint16z" }, + { "message":"ant_channel_id","num":3,"name":"transmission_type","type":"uint8z" }, + { "message":"ant_channel_id","num":4,"name":"device_index","type":"device_index" }, + { "message":"ant_rx","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"ant_rx","num":0,"name":"fractional_timestamp","type":"uint16","scale":32768,"units":"s" }, + { "message":"ant_rx","num":1,"name":"mesg_id","type":"byte" }, + { "message":"ant_rx","num":3,"name":"channel_number","type":"uint8" }, + { "message":"ant_rx","num":4,"name":"data","type":"byte","array":"[N]" }, + { "message":"ant_tx","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"ant_tx","num":0,"name":"fractional_timestamp","type":"uint16","scale":32768,"units":"s" }, + { "message":"ant_tx","num":1,"name":"mesg_id","type":"byte" }, + { "message":"ant_tx","num":3,"name":"channel_number","type":"uint8" }, + { "message":"ant_tx","num":4,"name":"data","type":"byte","array":"[N]" }, + { "message":"exd_screen_configuration","num":0,"name":"screen_index","type":"uint8" }, + { "message":"exd_screen_configuration","num":1,"name":"field_count","type":"uint8" }, + { "message":"exd_screen_configuration","num":2,"name":"layout","type":"exd_layout" }, + { "message":"exd_screen_configuration","num":3,"name":"screen_enabled","type":"bool" }, + { "message":"exd_data_field_configuration","num":0,"name":"screen_index","type":"uint8" }, + { "message":"exd_data_field_configuration","num":1,"name":"concept_field","type":"byte" }, + { "message":"exd_data_field_configuration","num":2,"name":"field_id","type":"uint8" }, + { "message":"exd_data_field_configuration","num":3,"name":"concept_count","type":"uint8" }, + { "message":"exd_data_field_configuration","num":4,"name":"display_type","type":"exd_display_type" }, + { "message":"exd_data_field_configuration","num":5,"name":"title","type":"string","array":"[32]" }, + { "message":"exd_data_concept_configuration","num":0,"name":"screen_index","type":"uint8" }, + { "message":"exd_data_concept_configuration","num":1,"name":"concept_field","type":"byte" }, + { "message":"exd_data_concept_configuration","num":2,"name":"field_id","type":"uint8" }, + { "message":"exd_data_concept_configuration","num":3,"name":"concept_index","type":"uint8" }, + { "message":"exd_data_concept_configuration","num":4,"name":"data_page","type":"uint8" }, + { "message":"exd_data_concept_configuration","num":5,"name":"concept_key","type":"uint8" }, + { "message":"exd_data_concept_configuration","num":6,"name":"scaling","type":"uint8" }, + { "message":"exd_data_concept_configuration","num":8,"name":"data_units","type":"exd_data_units" }, + { "message":"exd_data_concept_configuration","num":9,"name":"qualifier","type":"exd_qualifiers" }, + { "message":"exd_data_concept_configuration","num":10,"name":"descriptor","type":"exd_descriptors" }, + { "message":"exd_data_concept_configuration","num":11,"name":"is_signed","type":"bool" }, + { "message":"dive_summary","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"dive_summary","num":0,"name":"reference_mesg","type":"mesg_num" }, + { "message":"dive_summary","num":1,"name":"reference_index","type":"message_index" }, + { "message":"dive_summary","num":2,"name":"avg_depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"dive_summary","num":3,"name":"max_depth","type":"uint32","scale":1000,"units":"m" }, + { "message":"dive_summary","num":4,"name":"surface_interval","type":"uint32","scale":1,"units":"s" }, + { "message":"dive_summary","num":5,"name":"start_cns","type":"uint8","scale":1,"units":"percent" }, + { "message":"dive_summary","num":6,"name":"end_cns","type":"uint8","scale":1,"units":"percent" }, + { "message":"dive_summary","num":7,"name":"start_n2","type":"uint16","scale":1,"units":"percent" }, + { "message":"dive_summary","num":8,"name":"end_n2","type":"uint16","scale":1,"units":"percent" }, + { "message":"dive_summary","num":9,"name":"o2_toxicity","type":"uint16","units":"OTUs" }, + { "message":"dive_summary","num":10,"name":"dive_number","type":"uint32" }, + { "message":"dive_summary","num":11,"name":"bottom_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"dive_summary","num":12,"name":"avg_pressure_sac","type":"uint16","scale":100,"units":"bar/min" }, + { "message":"dive_summary","num":13,"name":"avg_volume_sac","type":"uint16","scale":100,"units":"L/min" }, + { "message":"dive_summary","num":14,"name":"avg_rmv","type":"uint16","scale":100,"units":"L/min" }, + { "message":"dive_summary","num":15,"name":"descent_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"dive_summary","num":16,"name":"ascent_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"dive_summary","num":17,"name":"avg_ascent_rate","type":"sint32","scale":1000,"units":"m/s" }, + { "message":"dive_summary","num":22,"name":"avg_descent_rate","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"dive_summary","num":23,"name":"max_ascent_rate","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"dive_summary","num":24,"name":"max_descent_rate","type":"uint32","scale":1000,"units":"m/s" }, + { "message":"dive_summary","num":25,"name":"hang_time","type":"uint32","scale":1000,"units":"s" }, + { "message":"hrv","num":0,"name":"time","type":"uint16","array":"[N]","scale":1000,"units":"s" }, + { "message":"beat_intervals","num":253,"name":"timestamp","type":"date_time" }, + { "message":"beat_intervals","num":0,"name":"timestamp_ms","type":"uint16","units":"ms" }, + { "message":"beat_intervals","num":1,"name":"time","type":"uint16","array":"[N]","units":"ms" }, + { "message":"hrv_status_summary","num":253,"name":"timestamp","type":"date_time" }, + { "message":"hrv_status_summary","num":0,"name":"weekly_average","type":"uint16","scale":128,"units":"ms" }, + { "message":"hrv_status_summary","num":1,"name":"last_night_average","type":"uint16","scale":128,"units":"ms" }, + { "message":"hrv_status_summary","num":2,"name":"last_night_5_min_high","type":"uint16","scale":128,"units":"ms" }, + { "message":"hrv_status_summary","num":3,"name":"baseline_low_upper","type":"uint16","scale":128,"units":"ms" }, + { "message":"hrv_status_summary","num":4,"name":"baseline_balanced_lower","type":"uint16","scale":128,"units":"ms" }, + { "message":"hrv_status_summary","num":5,"name":"baseline_balanced_upper","type":"uint16","scale":128,"units":"ms" }, + { "message":"hrv_status_summary","num":6,"name":"status","type":"hrv_status" }, + { "message":"hrv_value","num":253,"name":"timestamp","type":"date_time" }, + { "message":"hrv_value","num":0,"name":"value","type":"uint16","scale":128,"units":"ms" }, + { "message":"respiration_rate","num":253,"name":"timestamp","type":"date_time" }, + { "message":"respiration_rate","num":0,"name":"respiration_rate","type":"sint16","scale":100,"units":"breaths/min" }, + { "message":"tank_update","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"tank_update","num":0,"name":"sensor","type":"ant_channel_id" }, + { "message":"tank_update","num":1,"name":"pressure","type":"uint16","scale":100,"units":"bar" }, + { "message":"tank_summary","num":253,"name":"timestamp","type":"date_time","units":"s" }, + { "message":"tank_summary","num":0,"name":"sensor","type":"ant_channel_id" }, + { "message":"tank_summary","num":1,"name":"start_pressure","type":"uint16","scale":100,"units":"bar" }, + { "message":"tank_summary","num":2,"name":"end_pressure","type":"uint16","scale":100,"units":"bar" }, + { "message":"tank_summary","num":3,"name":"volume_used","type":"uint32","scale":100,"units":"L" }, + { "message":"sleep_assessment","num":0,"name":"combined_awake_score","type":"uint8" }, + { "message":"sleep_assessment","num":1,"name":"awake_time_score","type":"uint8" }, + { "message":"sleep_assessment","num":2,"name":"awakenings_count_score","type":"uint8" }, + { "message":"sleep_assessment","num":3,"name":"deep_sleep_score","type":"uint8" }, + { "message":"sleep_assessment","num":4,"name":"sleep_duration_score","type":"uint8" }, + { "message":"sleep_assessment","num":5,"name":"light_sleep_score","type":"uint8" }, + { "message":"sleep_assessment","num":6,"name":"overall_sleep_score","type":"uint8" }, + { "message":"sleep_assessment","num":7,"name":"sleep_quality_score","type":"uint8" }, + { "message":"sleep_assessment","num":8,"name":"sleep_recovery_score","type":"uint8" }, + { "message":"sleep_assessment","num":9,"name":"rem_sleep_score","type":"uint8" }, + { "message":"sleep_assessment","num":10,"name":"sleep_restlessness_score","type":"uint8" }, + { "message":"sleep_assessment","num":11,"name":"awakenings_count","type":"uint8" }, + { "message":"sleep_assessment","num":14,"name":"interruptions_score","type":"uint8" }, + { "message":"sleep_assessment","num":15,"name":"average_stress_during_sleep","type":"uint16","scale":100 } + +], + diff --git a/util/fit/fit_example.h b/util/fit/fit_example.h index 1539605da..a781e0cd6 100644 --- a/util/fit/fit_example.h +++ b/util/fit/fit_example.h @@ -1,8629 +1,8629 @@ -///////////////////////////////////////////////////////////////////////////////////////////// -// Copyright 2023 Garmin International, Inc. -// Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -// may not use this file except in compliance with the Flexible and Interoperable Data -// Transfer (FIT) Protocol License. -///////////////////////////////////////////////////////////////////////////////////////////// -// ****WARNING**** This file is auto-generated! Do NOT edit this file. -// Profile Version = 21.115Release -// Tag = production/release/21.115.00-0-gfe0a7f8 -// Product = EXAMPLE -// Alignment = 4 bytes, padding disabled. -///////////////////////////////////////////////////////////////////////////////////////////// - - -#if !defined(FIT_EXAMPLE_H) -#define FIT_EXAMPLE_H - -#include "fit.h" - -#if defined(__cplusplus) - extern "C" { -#endif - - -/////////////////////////////////////////////////////////////////////// -// Public Definitions -/////////////////////////////////////////////////////////////////////// - -#define FIT_ALIGNMENT 4 - -/////////////////////////////////////////////////////////////////////// -// Types -/////////////////////////////////////////////////////////////////////// - - -typedef FIT_ENUM FIT_FILE; -#define FIT_FILE_INVALID FIT_ENUM_INVALID -#define FIT_FILE_DEVICE ((FIT_FILE)1) // Read only, single file. Must be in root directory. -#define FIT_FILE_SETTINGS ((FIT_FILE)2) // Read/write, single file. Directory=Settings -#define FIT_FILE_SPORT ((FIT_FILE)3) // Read/write, multiple files, file number = sport type. Directory=Sports -#define FIT_FILE_ACTIVITY ((FIT_FILE)4) // Read/erase, multiple files. Directory=Activities -#define FIT_FILE_WORKOUT ((FIT_FILE)5) // Read/write/erase, multiple files. Directory=Workouts -#define FIT_FILE_COURSE ((FIT_FILE)6) // Read/write/erase, multiple files. Directory=Courses -#define FIT_FILE_SCHEDULES ((FIT_FILE)7) // Read/write, single file. Directory=Schedules -#define FIT_FILE_WEIGHT ((FIT_FILE)9) // Read only, single file. Circular buffer. All message definitions at start of file. Directory=Weight -#define FIT_FILE_TOTALS ((FIT_FILE)10) // Read only, single file. Directory=Totals -#define FIT_FILE_GOALS ((FIT_FILE)11) // Read/write, single file. Directory=Goals -#define FIT_FILE_BLOOD_PRESSURE ((FIT_FILE)14) // Read only. Directory=Blood Pressure -#define FIT_FILE_MONITORING_A ((FIT_FILE)15) // Read only. Directory=Monitoring. File number=sub type. -#define FIT_FILE_ACTIVITY_SUMMARY ((FIT_FILE)20) // Read/erase, multiple files. Directory=Activities -#define FIT_FILE_MONITORING_DAILY ((FIT_FILE)28) -#define FIT_FILE_MONITORING_B ((FIT_FILE)32) // Read only. Directory=Monitoring. File number=identifier -#define FIT_FILE_SEGMENT ((FIT_FILE)34) // Read/write/erase. Multiple Files. Directory=Segments -#define FIT_FILE_SEGMENT_LIST ((FIT_FILE)35) // Read/write/erase. Single File. Directory=Segments -#define FIT_FILE_EXD_CONFIGURATION ((FIT_FILE)40) // Read/write/erase. Single File. Directory=Settings -#define FIT_FILE_MFG_RANGE_MIN ((FIT_FILE)0xF7) // 0xF7 - 0xFE reserved for manufacturer specific file types -#define FIT_FILE_MFG_RANGE_MAX ((FIT_FILE)0xFE) // 0xF7 - 0xFE reserved for manufacturer specific file types -#define FIT_FILE_COUNT 20 - -typedef FIT_UINT16 FIT_MESG_NUM; -#define FIT_MESG_NUM_INVALID FIT_UINT16_INVALID -#define FIT_MESG_NUM_FILE_ID ((FIT_MESG_NUM)0) -#define FIT_MESG_NUM_CAPABILITIES ((FIT_MESG_NUM)1) -#define FIT_MESG_NUM_DEVICE_SETTINGS ((FIT_MESG_NUM)2) -#define FIT_MESG_NUM_USER_PROFILE ((FIT_MESG_NUM)3) -#define FIT_MESG_NUM_HRM_PROFILE ((FIT_MESG_NUM)4) -#define FIT_MESG_NUM_SDM_PROFILE ((FIT_MESG_NUM)5) -#define FIT_MESG_NUM_BIKE_PROFILE ((FIT_MESG_NUM)6) -#define FIT_MESG_NUM_ZONES_TARGET ((FIT_MESG_NUM)7) -#define FIT_MESG_NUM_HR_ZONE ((FIT_MESG_NUM)8) -#define FIT_MESG_NUM_POWER_ZONE ((FIT_MESG_NUM)9) -#define FIT_MESG_NUM_MET_ZONE ((FIT_MESG_NUM)10) -#define FIT_MESG_NUM_SPORT ((FIT_MESG_NUM)12) -#define FIT_MESG_NUM_GOAL ((FIT_MESG_NUM)15) -#define FIT_MESG_NUM_SESSION ((FIT_MESG_NUM)18) -#define FIT_MESG_NUM_LAP ((FIT_MESG_NUM)19) -#define FIT_MESG_NUM_RECORD ((FIT_MESG_NUM)20) -#define FIT_MESG_NUM_EVENT ((FIT_MESG_NUM)21) -#define FIT_MESG_NUM_DEVICE_INFO ((FIT_MESG_NUM)23) -#define FIT_MESG_NUM_WORKOUT ((FIT_MESG_NUM)26) -#define FIT_MESG_NUM_WORKOUT_STEP ((FIT_MESG_NUM)27) -#define FIT_MESG_NUM_SCHEDULE ((FIT_MESG_NUM)28) -#define FIT_MESG_NUM_WEIGHT_SCALE ((FIT_MESG_NUM)30) -#define FIT_MESG_NUM_COURSE ((FIT_MESG_NUM)31) -#define FIT_MESG_NUM_COURSE_POINT ((FIT_MESG_NUM)32) -#define FIT_MESG_NUM_TOTALS ((FIT_MESG_NUM)33) -#define FIT_MESG_NUM_ACTIVITY ((FIT_MESG_NUM)34) -#define FIT_MESG_NUM_SOFTWARE ((FIT_MESG_NUM)35) -#define FIT_MESG_NUM_FILE_CAPABILITIES ((FIT_MESG_NUM)37) -#define FIT_MESG_NUM_MESG_CAPABILITIES ((FIT_MESG_NUM)38) -#define FIT_MESG_NUM_FIELD_CAPABILITIES ((FIT_MESG_NUM)39) -#define FIT_MESG_NUM_FILE_CREATOR ((FIT_MESG_NUM)49) -#define FIT_MESG_NUM_BLOOD_PRESSURE ((FIT_MESG_NUM)51) -#define FIT_MESG_NUM_SPEED_ZONE ((FIT_MESG_NUM)53) -#define FIT_MESG_NUM_MONITORING ((FIT_MESG_NUM)55) -#define FIT_MESG_NUM_TRAINING_FILE ((FIT_MESG_NUM)72) -#define FIT_MESG_NUM_HRV ((FIT_MESG_NUM)78) -#define FIT_MESG_NUM_ANT_RX ((FIT_MESG_NUM)80) -#define FIT_MESG_NUM_ANT_TX ((FIT_MESG_NUM)81) -#define FIT_MESG_NUM_ANT_CHANNEL_ID ((FIT_MESG_NUM)82) -#define FIT_MESG_NUM_LENGTH ((FIT_MESG_NUM)101) -#define FIT_MESG_NUM_MONITORING_INFO ((FIT_MESG_NUM)103) -#define FIT_MESG_NUM_PAD ((FIT_MESG_NUM)105) -#define FIT_MESG_NUM_SLAVE_DEVICE ((FIT_MESG_NUM)106) -#define FIT_MESG_NUM_CONNECTIVITY ((FIT_MESG_NUM)127) -#define FIT_MESG_NUM_WEATHER_CONDITIONS ((FIT_MESG_NUM)128) -#define FIT_MESG_NUM_WEATHER_ALERT ((FIT_MESG_NUM)129) -#define FIT_MESG_NUM_CADENCE_ZONE ((FIT_MESG_NUM)131) -#define FIT_MESG_NUM_HR ((FIT_MESG_NUM)132) -#define FIT_MESG_NUM_SEGMENT_LAP ((FIT_MESG_NUM)142) -#define FIT_MESG_NUM_MEMO_GLOB ((FIT_MESG_NUM)145) -#define FIT_MESG_NUM_SEGMENT_ID ((FIT_MESG_NUM)148) -#define FIT_MESG_NUM_SEGMENT_LEADERBOARD_ENTRY ((FIT_MESG_NUM)149) -#define FIT_MESG_NUM_SEGMENT_POINT ((FIT_MESG_NUM)150) -#define FIT_MESG_NUM_SEGMENT_FILE ((FIT_MESG_NUM)151) -#define FIT_MESG_NUM_WORKOUT_SESSION ((FIT_MESG_NUM)158) -#define FIT_MESG_NUM_WATCHFACE_SETTINGS ((FIT_MESG_NUM)159) -#define FIT_MESG_NUM_GPS_METADATA ((FIT_MESG_NUM)160) -#define FIT_MESG_NUM_CAMERA_EVENT ((FIT_MESG_NUM)161) -#define FIT_MESG_NUM_TIMESTAMP_CORRELATION ((FIT_MESG_NUM)162) -#define FIT_MESG_NUM_GYROSCOPE_DATA ((FIT_MESG_NUM)164) -#define FIT_MESG_NUM_ACCELEROMETER_DATA ((FIT_MESG_NUM)165) -#define FIT_MESG_NUM_THREE_D_SENSOR_CALIBRATION ((FIT_MESG_NUM)167) -#define FIT_MESG_NUM_VIDEO_FRAME ((FIT_MESG_NUM)169) -#define FIT_MESG_NUM_OBDII_DATA ((FIT_MESG_NUM)174) -#define FIT_MESG_NUM_NMEA_SENTENCE ((FIT_MESG_NUM)177) -#define FIT_MESG_NUM_AVIATION_ATTITUDE ((FIT_MESG_NUM)178) -#define FIT_MESG_NUM_VIDEO ((FIT_MESG_NUM)184) -#define FIT_MESG_NUM_VIDEO_TITLE ((FIT_MESG_NUM)185) -#define FIT_MESG_NUM_VIDEO_DESCRIPTION ((FIT_MESG_NUM)186) -#define FIT_MESG_NUM_VIDEO_CLIP ((FIT_MESG_NUM)187) -#define FIT_MESG_NUM_OHR_SETTINGS ((FIT_MESG_NUM)188) -#define FIT_MESG_NUM_EXD_SCREEN_CONFIGURATION ((FIT_MESG_NUM)200) -#define FIT_MESG_NUM_EXD_DATA_FIELD_CONFIGURATION ((FIT_MESG_NUM)201) -#define FIT_MESG_NUM_EXD_DATA_CONCEPT_CONFIGURATION ((FIT_MESG_NUM)202) -#define FIT_MESG_NUM_FIELD_DESCRIPTION ((FIT_MESG_NUM)206) -#define FIT_MESG_NUM_DEVELOPER_DATA_ID ((FIT_MESG_NUM)207) -#define FIT_MESG_NUM_MAGNETOMETER_DATA ((FIT_MESG_NUM)208) -#define FIT_MESG_NUM_BAROMETER_DATA ((FIT_MESG_NUM)209) -#define FIT_MESG_NUM_ONE_D_SENSOR_CALIBRATION ((FIT_MESG_NUM)210) -#define FIT_MESG_NUM_MONITORING_HR_DATA ((FIT_MESG_NUM)211) -#define FIT_MESG_NUM_TIME_IN_ZONE ((FIT_MESG_NUM)216) -#define FIT_MESG_NUM_SET ((FIT_MESG_NUM)225) -#define FIT_MESG_NUM_STRESS_LEVEL ((FIT_MESG_NUM)227) -#define FIT_MESG_NUM_MAX_MET_DATA ((FIT_MESG_NUM)229) -#define FIT_MESG_NUM_DIVE_SETTINGS ((FIT_MESG_NUM)258) -#define FIT_MESG_NUM_DIVE_GAS ((FIT_MESG_NUM)259) -#define FIT_MESG_NUM_DIVE_ALARM ((FIT_MESG_NUM)262) -#define FIT_MESG_NUM_EXERCISE_TITLE ((FIT_MESG_NUM)264) -#define FIT_MESG_NUM_DIVE_SUMMARY ((FIT_MESG_NUM)268) -#define FIT_MESG_NUM_SPO2_DATA ((FIT_MESG_NUM)269) -#define FIT_MESG_NUM_SLEEP_LEVEL ((FIT_MESG_NUM)275) -#define FIT_MESG_NUM_JUMP ((FIT_MESG_NUM)285) -#define FIT_MESG_NUM_BEAT_INTERVALS ((FIT_MESG_NUM)290) -#define FIT_MESG_NUM_RESPIRATION_RATE ((FIT_MESG_NUM)297) -#define FIT_MESG_NUM_SPLIT ((FIT_MESG_NUM)312) -#define FIT_MESG_NUM_CLIMB_PRO ((FIT_MESG_NUM)317) -#define FIT_MESG_NUM_TANK_UPDATE ((FIT_MESG_NUM)319) -#define FIT_MESG_NUM_TANK_SUMMARY ((FIT_MESG_NUM)323) -#define FIT_MESG_NUM_SLEEP_ASSESSMENT ((FIT_MESG_NUM)346) -#define FIT_MESG_NUM_HRV_STATUS_SUMMARY ((FIT_MESG_NUM)370) -#define FIT_MESG_NUM_HRV_VALUE ((FIT_MESG_NUM)371) -#define FIT_MESG_NUM_DEVICE_AUX_BATTERY_INFO ((FIT_MESG_NUM)375) -#define FIT_MESG_NUM_DIVE_APNEA_ALARM ((FIT_MESG_NUM)393) -#define FIT_MESG_NUM_MFG_RANGE_MIN ((FIT_MESG_NUM)0xFF00) // 0xFF00 - 0xFFFE reserved for manufacturer specific messages -#define FIT_MESG_NUM_MFG_RANGE_MAX ((FIT_MESG_NUM)0xFFFE) // 0xFF00 - 0xFFFE reserved for manufacturer specific messages -#define FIT_MESG_NUM_COUNT 105 - -typedef FIT_UINT8 FIT_CHECKSUM; -#define FIT_CHECKSUM_INVALID FIT_UINT8_INVALID -#define FIT_CHECKSUM_CLEAR ((FIT_CHECKSUM)0) // Allows clear of checksum for flash memory where can only write 1 to 0 without erasing sector. -#define FIT_CHECKSUM_OK ((FIT_CHECKSUM)1) // Set to mark checksum as valid if computes to invalid values 0 or 0xFF. Checksum can also be set to ok to save encoding computation time. -#define FIT_CHECKSUM_COUNT 2 - -typedef FIT_UINT8Z FIT_FILE_FLAGS; -#define FIT_FILE_FLAGS_INVALID FIT_UINT8Z_INVALID -#define FIT_FILE_FLAGS_READ ((FIT_FILE_FLAGS)0x02) -#define FIT_FILE_FLAGS_WRITE ((FIT_FILE_FLAGS)0x04) -#define FIT_FILE_FLAGS_ERASE ((FIT_FILE_FLAGS)0x08) -#define FIT_FILE_FLAGS_COUNT 3 - -typedef FIT_ENUM FIT_MESG_COUNT; -#define FIT_MESG_COUNT_INVALID FIT_ENUM_INVALID -#define FIT_MESG_COUNT_NUM_PER_FILE ((FIT_MESG_COUNT)0) -#define FIT_MESG_COUNT_MAX_PER_FILE ((FIT_MESG_COUNT)1) -#define FIT_MESG_COUNT_MAX_PER_FILE_TYPE ((FIT_MESG_COUNT)2) -#define FIT_MESG_COUNT_COUNT 3 - -typedef FIT_UINT32 FIT_DATE_TIME; // seconds since UTC 00:00 Dec 31 1989 -#define FIT_DATE_TIME_INVALID FIT_UINT32_INVALID -#define FIT_DATE_TIME_MIN ((FIT_DATE_TIME)0x10000000) // if date_time is < 0x10000000 then it is system time (seconds from device power on) -#define FIT_DATE_TIME_COUNT 1 - -typedef FIT_UINT32 FIT_LOCAL_DATE_TIME; // seconds since 00:00 Dec 31 1989 in local time zone -#define FIT_LOCAL_DATE_TIME_INVALID FIT_UINT32_INVALID -#define FIT_LOCAL_DATE_TIME_MIN ((FIT_LOCAL_DATE_TIME)0x10000000) // if date_time is < 0x10000000 then it is system time (seconds from device power on) -#define FIT_LOCAL_DATE_TIME_COUNT 1 - -typedef FIT_UINT16 FIT_MESSAGE_INDEX; -#define FIT_MESSAGE_INDEX_INVALID FIT_UINT16_INVALID -#define FIT_MESSAGE_INDEX_SELECTED ((FIT_MESSAGE_INDEX)0x8000) // message is selected if set -#define FIT_MESSAGE_INDEX_RESERVED ((FIT_MESSAGE_INDEX)0x7000) // reserved (default 0) -#define FIT_MESSAGE_INDEX_MASK ((FIT_MESSAGE_INDEX)0x0FFF) // index -#define FIT_MESSAGE_INDEX_COUNT 3 - -typedef FIT_UINT8 FIT_DEVICE_INDEX; -#define FIT_DEVICE_INDEX_INVALID FIT_UINT8_INVALID -#define FIT_DEVICE_INDEX_CREATOR ((FIT_DEVICE_INDEX)0) // Creator of the file is always device index 0. -#define FIT_DEVICE_INDEX_COUNT 1 - -typedef FIT_ENUM FIT_GENDER; -#define FIT_GENDER_INVALID FIT_ENUM_INVALID -#define FIT_GENDER_FEMALE ((FIT_GENDER)0) -#define FIT_GENDER_MALE ((FIT_GENDER)1) -#define FIT_GENDER_COUNT 2 - -typedef FIT_ENUM FIT_LANGUAGE; -#define FIT_LANGUAGE_INVALID FIT_ENUM_INVALID -#define FIT_LANGUAGE_ENGLISH ((FIT_LANGUAGE)0) -#define FIT_LANGUAGE_FRENCH ((FIT_LANGUAGE)1) -#define FIT_LANGUAGE_ITALIAN ((FIT_LANGUAGE)2) -#define FIT_LANGUAGE_GERMAN ((FIT_LANGUAGE)3) -#define FIT_LANGUAGE_SPANISH ((FIT_LANGUAGE)4) -#define FIT_LANGUAGE_CROATIAN ((FIT_LANGUAGE)5) -#define FIT_LANGUAGE_CZECH ((FIT_LANGUAGE)6) -#define FIT_LANGUAGE_DANISH ((FIT_LANGUAGE)7) -#define FIT_LANGUAGE_DUTCH ((FIT_LANGUAGE)8) -#define FIT_LANGUAGE_FINNISH ((FIT_LANGUAGE)9) -#define FIT_LANGUAGE_GREEK ((FIT_LANGUAGE)10) -#define FIT_LANGUAGE_HUNGARIAN ((FIT_LANGUAGE)11) -#define FIT_LANGUAGE_NORWEGIAN ((FIT_LANGUAGE)12) -#define FIT_LANGUAGE_POLISH ((FIT_LANGUAGE)13) -#define FIT_LANGUAGE_PORTUGUESE ((FIT_LANGUAGE)14) -#define FIT_LANGUAGE_SLOVAKIAN ((FIT_LANGUAGE)15) -#define FIT_LANGUAGE_SLOVENIAN ((FIT_LANGUAGE)16) -#define FIT_LANGUAGE_SWEDISH ((FIT_LANGUAGE)17) -#define FIT_LANGUAGE_RUSSIAN ((FIT_LANGUAGE)18) -#define FIT_LANGUAGE_TURKISH ((FIT_LANGUAGE)19) -#define FIT_LANGUAGE_LATVIAN ((FIT_LANGUAGE)20) -#define FIT_LANGUAGE_UKRAINIAN ((FIT_LANGUAGE)21) -#define FIT_LANGUAGE_ARABIC ((FIT_LANGUAGE)22) -#define FIT_LANGUAGE_FARSI ((FIT_LANGUAGE)23) -#define FIT_LANGUAGE_BULGARIAN ((FIT_LANGUAGE)24) -#define FIT_LANGUAGE_ROMANIAN ((FIT_LANGUAGE)25) -#define FIT_LANGUAGE_CHINESE ((FIT_LANGUAGE)26) -#define FIT_LANGUAGE_JAPANESE ((FIT_LANGUAGE)27) -#define FIT_LANGUAGE_KOREAN ((FIT_LANGUAGE)28) -#define FIT_LANGUAGE_TAIWANESE ((FIT_LANGUAGE)29) -#define FIT_LANGUAGE_THAI ((FIT_LANGUAGE)30) -#define FIT_LANGUAGE_HEBREW ((FIT_LANGUAGE)31) -#define FIT_LANGUAGE_BRAZILIAN_PORTUGUESE ((FIT_LANGUAGE)32) -#define FIT_LANGUAGE_INDONESIAN ((FIT_LANGUAGE)33) -#define FIT_LANGUAGE_MALAYSIAN ((FIT_LANGUAGE)34) -#define FIT_LANGUAGE_VIETNAMESE ((FIT_LANGUAGE)35) -#define FIT_LANGUAGE_BURMESE ((FIT_LANGUAGE)36) -#define FIT_LANGUAGE_MONGOLIAN ((FIT_LANGUAGE)37) -#define FIT_LANGUAGE_CUSTOM ((FIT_LANGUAGE)254) -#define FIT_LANGUAGE_COUNT 39 - -typedef FIT_UINT8Z FIT_LANGUAGE_BITS_0; // Bit field corresponding to language enum type (1 << language). -#define FIT_LANGUAGE_BITS_0_INVALID FIT_UINT8Z_INVALID -#define FIT_LANGUAGE_BITS_0_ENGLISH ((FIT_LANGUAGE_BITS_0)0x01) -#define FIT_LANGUAGE_BITS_0_FRENCH ((FIT_LANGUAGE_BITS_0)0x02) -#define FIT_LANGUAGE_BITS_0_ITALIAN ((FIT_LANGUAGE_BITS_0)0x04) -#define FIT_LANGUAGE_BITS_0_GERMAN ((FIT_LANGUAGE_BITS_0)0x08) -#define FIT_LANGUAGE_BITS_0_SPANISH ((FIT_LANGUAGE_BITS_0)0x10) -#define FIT_LANGUAGE_BITS_0_CROATIAN ((FIT_LANGUAGE_BITS_0)0x20) -#define FIT_LANGUAGE_BITS_0_CZECH ((FIT_LANGUAGE_BITS_0)0x40) -#define FIT_LANGUAGE_BITS_0_DANISH ((FIT_LANGUAGE_BITS_0)0x80) -#define FIT_LANGUAGE_BITS_0_COUNT 8 - -typedef FIT_UINT8Z FIT_LANGUAGE_BITS_1; -#define FIT_LANGUAGE_BITS_1_INVALID FIT_UINT8Z_INVALID -#define FIT_LANGUAGE_BITS_1_DUTCH ((FIT_LANGUAGE_BITS_1)0x01) -#define FIT_LANGUAGE_BITS_1_FINNISH ((FIT_LANGUAGE_BITS_1)0x02) -#define FIT_LANGUAGE_BITS_1_GREEK ((FIT_LANGUAGE_BITS_1)0x04) -#define FIT_LANGUAGE_BITS_1_HUNGARIAN ((FIT_LANGUAGE_BITS_1)0x08) -#define FIT_LANGUAGE_BITS_1_NORWEGIAN ((FIT_LANGUAGE_BITS_1)0x10) -#define FIT_LANGUAGE_BITS_1_POLISH ((FIT_LANGUAGE_BITS_1)0x20) -#define FIT_LANGUAGE_BITS_1_PORTUGUESE ((FIT_LANGUAGE_BITS_1)0x40) -#define FIT_LANGUAGE_BITS_1_SLOVAKIAN ((FIT_LANGUAGE_BITS_1)0x80) -#define FIT_LANGUAGE_BITS_1_COUNT 8 - -typedef FIT_UINT8Z FIT_LANGUAGE_BITS_2; -#define FIT_LANGUAGE_BITS_2_INVALID FIT_UINT8Z_INVALID -#define FIT_LANGUAGE_BITS_2_SLOVENIAN ((FIT_LANGUAGE_BITS_2)0x01) -#define FIT_LANGUAGE_BITS_2_SWEDISH ((FIT_LANGUAGE_BITS_2)0x02) -#define FIT_LANGUAGE_BITS_2_RUSSIAN ((FIT_LANGUAGE_BITS_2)0x04) -#define FIT_LANGUAGE_BITS_2_TURKISH ((FIT_LANGUAGE_BITS_2)0x08) -#define FIT_LANGUAGE_BITS_2_LATVIAN ((FIT_LANGUAGE_BITS_2)0x10) -#define FIT_LANGUAGE_BITS_2_UKRAINIAN ((FIT_LANGUAGE_BITS_2)0x20) -#define FIT_LANGUAGE_BITS_2_ARABIC ((FIT_LANGUAGE_BITS_2)0x40) -#define FIT_LANGUAGE_BITS_2_FARSI ((FIT_LANGUAGE_BITS_2)0x80) -#define FIT_LANGUAGE_BITS_2_COUNT 8 - -typedef FIT_UINT8Z FIT_LANGUAGE_BITS_3; -#define FIT_LANGUAGE_BITS_3_INVALID FIT_UINT8Z_INVALID -#define FIT_LANGUAGE_BITS_3_BULGARIAN ((FIT_LANGUAGE_BITS_3)0x01) -#define FIT_LANGUAGE_BITS_3_ROMANIAN ((FIT_LANGUAGE_BITS_3)0x02) -#define FIT_LANGUAGE_BITS_3_CHINESE ((FIT_LANGUAGE_BITS_3)0x04) -#define FIT_LANGUAGE_BITS_3_JAPANESE ((FIT_LANGUAGE_BITS_3)0x08) -#define FIT_LANGUAGE_BITS_3_KOREAN ((FIT_LANGUAGE_BITS_3)0x10) -#define FIT_LANGUAGE_BITS_3_TAIWANESE ((FIT_LANGUAGE_BITS_3)0x20) -#define FIT_LANGUAGE_BITS_3_THAI ((FIT_LANGUAGE_BITS_3)0x40) -#define FIT_LANGUAGE_BITS_3_HEBREW ((FIT_LANGUAGE_BITS_3)0x80) -#define FIT_LANGUAGE_BITS_3_COUNT 8 - -typedef FIT_UINT8Z FIT_LANGUAGE_BITS_4; -#define FIT_LANGUAGE_BITS_4_INVALID FIT_UINT8Z_INVALID -#define FIT_LANGUAGE_BITS_4_BRAZILIAN_PORTUGUESE ((FIT_LANGUAGE_BITS_4)0x01) -#define FIT_LANGUAGE_BITS_4_INDONESIAN ((FIT_LANGUAGE_BITS_4)0x02) -#define FIT_LANGUAGE_BITS_4_MALAYSIAN ((FIT_LANGUAGE_BITS_4)0x04) -#define FIT_LANGUAGE_BITS_4_VIETNAMESE ((FIT_LANGUAGE_BITS_4)0x08) -#define FIT_LANGUAGE_BITS_4_BURMESE ((FIT_LANGUAGE_BITS_4)0x10) -#define FIT_LANGUAGE_BITS_4_MONGOLIAN ((FIT_LANGUAGE_BITS_4)0x20) -#define FIT_LANGUAGE_BITS_4_COUNT 6 - -typedef FIT_ENUM FIT_TIME_ZONE; -#define FIT_TIME_ZONE_INVALID FIT_ENUM_INVALID -#define FIT_TIME_ZONE_ALMATY ((FIT_TIME_ZONE)0) -#define FIT_TIME_ZONE_BANGKOK ((FIT_TIME_ZONE)1) -#define FIT_TIME_ZONE_BOMBAY ((FIT_TIME_ZONE)2) -#define FIT_TIME_ZONE_BRASILIA ((FIT_TIME_ZONE)3) -#define FIT_TIME_ZONE_CAIRO ((FIT_TIME_ZONE)4) -#define FIT_TIME_ZONE_CAPE_VERDE_IS ((FIT_TIME_ZONE)5) -#define FIT_TIME_ZONE_DARWIN ((FIT_TIME_ZONE)6) -#define FIT_TIME_ZONE_ENIWETOK ((FIT_TIME_ZONE)7) -#define FIT_TIME_ZONE_FIJI ((FIT_TIME_ZONE)8) -#define FIT_TIME_ZONE_HONG_KONG ((FIT_TIME_ZONE)9) -#define FIT_TIME_ZONE_ISLAMABAD ((FIT_TIME_ZONE)10) -#define FIT_TIME_ZONE_KABUL ((FIT_TIME_ZONE)11) -#define FIT_TIME_ZONE_MAGADAN ((FIT_TIME_ZONE)12) -#define FIT_TIME_ZONE_MID_ATLANTIC ((FIT_TIME_ZONE)13) -#define FIT_TIME_ZONE_MOSCOW ((FIT_TIME_ZONE)14) -#define FIT_TIME_ZONE_MUSCAT ((FIT_TIME_ZONE)15) -#define FIT_TIME_ZONE_NEWFOUNDLAND ((FIT_TIME_ZONE)16) -#define FIT_TIME_ZONE_SAMOA ((FIT_TIME_ZONE)17) -#define FIT_TIME_ZONE_SYDNEY ((FIT_TIME_ZONE)18) -#define FIT_TIME_ZONE_TEHRAN ((FIT_TIME_ZONE)19) -#define FIT_TIME_ZONE_TOKYO ((FIT_TIME_ZONE)20) -#define FIT_TIME_ZONE_US_ALASKA ((FIT_TIME_ZONE)21) -#define FIT_TIME_ZONE_US_ATLANTIC ((FIT_TIME_ZONE)22) -#define FIT_TIME_ZONE_US_CENTRAL ((FIT_TIME_ZONE)23) -#define FIT_TIME_ZONE_US_EASTERN ((FIT_TIME_ZONE)24) -#define FIT_TIME_ZONE_US_HAWAII ((FIT_TIME_ZONE)25) -#define FIT_TIME_ZONE_US_MOUNTAIN ((FIT_TIME_ZONE)26) -#define FIT_TIME_ZONE_US_PACIFIC ((FIT_TIME_ZONE)27) -#define FIT_TIME_ZONE_OTHER ((FIT_TIME_ZONE)28) -#define FIT_TIME_ZONE_AUCKLAND ((FIT_TIME_ZONE)29) -#define FIT_TIME_ZONE_KATHMANDU ((FIT_TIME_ZONE)30) -#define FIT_TIME_ZONE_EUROPE_WESTERN_WET ((FIT_TIME_ZONE)31) -#define FIT_TIME_ZONE_EUROPE_CENTRAL_CET ((FIT_TIME_ZONE)32) -#define FIT_TIME_ZONE_EUROPE_EASTERN_EET ((FIT_TIME_ZONE)33) -#define FIT_TIME_ZONE_JAKARTA ((FIT_TIME_ZONE)34) -#define FIT_TIME_ZONE_PERTH ((FIT_TIME_ZONE)35) -#define FIT_TIME_ZONE_ADELAIDE ((FIT_TIME_ZONE)36) -#define FIT_TIME_ZONE_BRISBANE ((FIT_TIME_ZONE)37) -#define FIT_TIME_ZONE_TASMANIA ((FIT_TIME_ZONE)38) -#define FIT_TIME_ZONE_ICELAND ((FIT_TIME_ZONE)39) -#define FIT_TIME_ZONE_AMSTERDAM ((FIT_TIME_ZONE)40) -#define FIT_TIME_ZONE_ATHENS ((FIT_TIME_ZONE)41) -#define FIT_TIME_ZONE_BARCELONA ((FIT_TIME_ZONE)42) -#define FIT_TIME_ZONE_BERLIN ((FIT_TIME_ZONE)43) -#define FIT_TIME_ZONE_BRUSSELS ((FIT_TIME_ZONE)44) -#define FIT_TIME_ZONE_BUDAPEST ((FIT_TIME_ZONE)45) -#define FIT_TIME_ZONE_COPENHAGEN ((FIT_TIME_ZONE)46) -#define FIT_TIME_ZONE_DUBLIN ((FIT_TIME_ZONE)47) -#define FIT_TIME_ZONE_HELSINKI ((FIT_TIME_ZONE)48) -#define FIT_TIME_ZONE_LISBON ((FIT_TIME_ZONE)49) -#define FIT_TIME_ZONE_LONDON ((FIT_TIME_ZONE)50) -#define FIT_TIME_ZONE_MADRID ((FIT_TIME_ZONE)51) -#define FIT_TIME_ZONE_MUNICH ((FIT_TIME_ZONE)52) -#define FIT_TIME_ZONE_OSLO ((FIT_TIME_ZONE)53) -#define FIT_TIME_ZONE_PARIS ((FIT_TIME_ZONE)54) -#define FIT_TIME_ZONE_PRAGUE ((FIT_TIME_ZONE)55) -#define FIT_TIME_ZONE_REYKJAVIK ((FIT_TIME_ZONE)56) -#define FIT_TIME_ZONE_ROME ((FIT_TIME_ZONE)57) -#define FIT_TIME_ZONE_STOCKHOLM ((FIT_TIME_ZONE)58) -#define FIT_TIME_ZONE_VIENNA ((FIT_TIME_ZONE)59) -#define FIT_TIME_ZONE_WARSAW ((FIT_TIME_ZONE)60) -#define FIT_TIME_ZONE_ZURICH ((FIT_TIME_ZONE)61) -#define FIT_TIME_ZONE_QUEBEC ((FIT_TIME_ZONE)62) -#define FIT_TIME_ZONE_ONTARIO ((FIT_TIME_ZONE)63) -#define FIT_TIME_ZONE_MANITOBA ((FIT_TIME_ZONE)64) -#define FIT_TIME_ZONE_SASKATCHEWAN ((FIT_TIME_ZONE)65) -#define FIT_TIME_ZONE_ALBERTA ((FIT_TIME_ZONE)66) -#define FIT_TIME_ZONE_BRITISH_COLUMBIA ((FIT_TIME_ZONE)67) -#define FIT_TIME_ZONE_BOISE ((FIT_TIME_ZONE)68) -#define FIT_TIME_ZONE_BOSTON ((FIT_TIME_ZONE)69) -#define FIT_TIME_ZONE_CHICAGO ((FIT_TIME_ZONE)70) -#define FIT_TIME_ZONE_DALLAS ((FIT_TIME_ZONE)71) -#define FIT_TIME_ZONE_DENVER ((FIT_TIME_ZONE)72) -#define FIT_TIME_ZONE_KANSAS_CITY ((FIT_TIME_ZONE)73) -#define FIT_TIME_ZONE_LAS_VEGAS ((FIT_TIME_ZONE)74) -#define FIT_TIME_ZONE_LOS_ANGELES ((FIT_TIME_ZONE)75) -#define FIT_TIME_ZONE_MIAMI ((FIT_TIME_ZONE)76) -#define FIT_TIME_ZONE_MINNEAPOLIS ((FIT_TIME_ZONE)77) -#define FIT_TIME_ZONE_NEW_YORK ((FIT_TIME_ZONE)78) -#define FIT_TIME_ZONE_NEW_ORLEANS ((FIT_TIME_ZONE)79) -#define FIT_TIME_ZONE_PHOENIX ((FIT_TIME_ZONE)80) -#define FIT_TIME_ZONE_SANTA_FE ((FIT_TIME_ZONE)81) -#define FIT_TIME_ZONE_SEATTLE ((FIT_TIME_ZONE)82) -#define FIT_TIME_ZONE_WASHINGTON_DC ((FIT_TIME_ZONE)83) -#define FIT_TIME_ZONE_US_ARIZONA ((FIT_TIME_ZONE)84) -#define FIT_TIME_ZONE_CHITA ((FIT_TIME_ZONE)85) -#define FIT_TIME_ZONE_EKATERINBURG ((FIT_TIME_ZONE)86) -#define FIT_TIME_ZONE_IRKUTSK ((FIT_TIME_ZONE)87) -#define FIT_TIME_ZONE_KALININGRAD ((FIT_TIME_ZONE)88) -#define FIT_TIME_ZONE_KRASNOYARSK ((FIT_TIME_ZONE)89) -#define FIT_TIME_ZONE_NOVOSIBIRSK ((FIT_TIME_ZONE)90) -#define FIT_TIME_ZONE_PETROPAVLOVSK_KAMCHATSKIY ((FIT_TIME_ZONE)91) -#define FIT_TIME_ZONE_SAMARA ((FIT_TIME_ZONE)92) -#define FIT_TIME_ZONE_VLADIVOSTOK ((FIT_TIME_ZONE)93) -#define FIT_TIME_ZONE_MEXICO_CENTRAL ((FIT_TIME_ZONE)94) -#define FIT_TIME_ZONE_MEXICO_MOUNTAIN ((FIT_TIME_ZONE)95) -#define FIT_TIME_ZONE_MEXICO_PACIFIC ((FIT_TIME_ZONE)96) -#define FIT_TIME_ZONE_CAPE_TOWN ((FIT_TIME_ZONE)97) -#define FIT_TIME_ZONE_WINKHOEK ((FIT_TIME_ZONE)98) -#define FIT_TIME_ZONE_LAGOS ((FIT_TIME_ZONE)99) -#define FIT_TIME_ZONE_RIYAHD ((FIT_TIME_ZONE)100) -#define FIT_TIME_ZONE_VENEZUELA ((FIT_TIME_ZONE)101) -#define FIT_TIME_ZONE_AUSTRALIA_LH ((FIT_TIME_ZONE)102) -#define FIT_TIME_ZONE_SANTIAGO ((FIT_TIME_ZONE)103) -#define FIT_TIME_ZONE_MANUAL ((FIT_TIME_ZONE)253) -#define FIT_TIME_ZONE_AUTOMATIC ((FIT_TIME_ZONE)254) -#define FIT_TIME_ZONE_COUNT 106 - -typedef FIT_ENUM FIT_DISPLAY_MEASURE; -#define FIT_DISPLAY_MEASURE_INVALID FIT_ENUM_INVALID -#define FIT_DISPLAY_MEASURE_METRIC ((FIT_DISPLAY_MEASURE)0) -#define FIT_DISPLAY_MEASURE_STATUTE ((FIT_DISPLAY_MEASURE)1) -#define FIT_DISPLAY_MEASURE_NAUTICAL ((FIT_DISPLAY_MEASURE)2) -#define FIT_DISPLAY_MEASURE_COUNT 3 - -typedef FIT_ENUM FIT_DISPLAY_HEART; -#define FIT_DISPLAY_HEART_INVALID FIT_ENUM_INVALID -#define FIT_DISPLAY_HEART_BPM ((FIT_DISPLAY_HEART)0) -#define FIT_DISPLAY_HEART_MAX ((FIT_DISPLAY_HEART)1) -#define FIT_DISPLAY_HEART_RESERVE ((FIT_DISPLAY_HEART)2) -#define FIT_DISPLAY_HEART_COUNT 3 - -typedef FIT_ENUM FIT_DISPLAY_POWER; -#define FIT_DISPLAY_POWER_INVALID FIT_ENUM_INVALID -#define FIT_DISPLAY_POWER_WATTS ((FIT_DISPLAY_POWER)0) -#define FIT_DISPLAY_POWER_PERCENT_FTP ((FIT_DISPLAY_POWER)1) -#define FIT_DISPLAY_POWER_COUNT 2 - -typedef FIT_ENUM FIT_DISPLAY_POSITION; -#define FIT_DISPLAY_POSITION_INVALID FIT_ENUM_INVALID -#define FIT_DISPLAY_POSITION_DEGREE ((FIT_DISPLAY_POSITION)0) // dd.dddddd -#define FIT_DISPLAY_POSITION_DEGREE_MINUTE ((FIT_DISPLAY_POSITION)1) // dddmm.mmm -#define FIT_DISPLAY_POSITION_DEGREE_MINUTE_SECOND ((FIT_DISPLAY_POSITION)2) // dddmmss -#define FIT_DISPLAY_POSITION_AUSTRIAN_GRID ((FIT_DISPLAY_POSITION)3) // Austrian Grid (BMN) -#define FIT_DISPLAY_POSITION_BRITISH_GRID ((FIT_DISPLAY_POSITION)4) // British National Grid -#define FIT_DISPLAY_POSITION_DUTCH_GRID ((FIT_DISPLAY_POSITION)5) // Dutch grid system -#define FIT_DISPLAY_POSITION_HUNGARIAN_GRID ((FIT_DISPLAY_POSITION)6) // Hungarian grid system -#define FIT_DISPLAY_POSITION_FINNISH_GRID ((FIT_DISPLAY_POSITION)7) // Finnish grid system Zone3 KKJ27 -#define FIT_DISPLAY_POSITION_GERMAN_GRID ((FIT_DISPLAY_POSITION)8) // Gausss Krueger (German) -#define FIT_DISPLAY_POSITION_ICELANDIC_GRID ((FIT_DISPLAY_POSITION)9) // Icelandic Grid -#define FIT_DISPLAY_POSITION_INDONESIAN_EQUATORIAL ((FIT_DISPLAY_POSITION)10) // Indonesian Equatorial LCO -#define FIT_DISPLAY_POSITION_INDONESIAN_IRIAN ((FIT_DISPLAY_POSITION)11) // Indonesian Irian LCO -#define FIT_DISPLAY_POSITION_INDONESIAN_SOUTHERN ((FIT_DISPLAY_POSITION)12) // Indonesian Southern LCO -#define FIT_DISPLAY_POSITION_INDIA_ZONE_0 ((FIT_DISPLAY_POSITION)13) // India zone 0 -#define FIT_DISPLAY_POSITION_INDIA_ZONE_IA ((FIT_DISPLAY_POSITION)14) // India zone IA -#define FIT_DISPLAY_POSITION_INDIA_ZONE_IB ((FIT_DISPLAY_POSITION)15) // India zone IB -#define FIT_DISPLAY_POSITION_INDIA_ZONE_IIA ((FIT_DISPLAY_POSITION)16) // India zone IIA -#define FIT_DISPLAY_POSITION_INDIA_ZONE_IIB ((FIT_DISPLAY_POSITION)17) // India zone IIB -#define FIT_DISPLAY_POSITION_INDIA_ZONE_IIIA ((FIT_DISPLAY_POSITION)18) // India zone IIIA -#define FIT_DISPLAY_POSITION_INDIA_ZONE_IIIB ((FIT_DISPLAY_POSITION)19) // India zone IIIB -#define FIT_DISPLAY_POSITION_INDIA_ZONE_IVA ((FIT_DISPLAY_POSITION)20) // India zone IVA -#define FIT_DISPLAY_POSITION_INDIA_ZONE_IVB ((FIT_DISPLAY_POSITION)21) // India zone IVB -#define FIT_DISPLAY_POSITION_IRISH_TRANSVERSE ((FIT_DISPLAY_POSITION)22) // Irish Transverse Mercator -#define FIT_DISPLAY_POSITION_IRISH_GRID ((FIT_DISPLAY_POSITION)23) // Irish Grid -#define FIT_DISPLAY_POSITION_LORAN ((FIT_DISPLAY_POSITION)24) // Loran TD -#define FIT_DISPLAY_POSITION_MAIDENHEAD_GRID ((FIT_DISPLAY_POSITION)25) // Maidenhead grid system -#define FIT_DISPLAY_POSITION_MGRS_GRID ((FIT_DISPLAY_POSITION)26) // MGRS grid system -#define FIT_DISPLAY_POSITION_NEW_ZEALAND_GRID ((FIT_DISPLAY_POSITION)27) // New Zealand grid system -#define FIT_DISPLAY_POSITION_NEW_ZEALAND_TRANSVERSE ((FIT_DISPLAY_POSITION)28) // New Zealand Transverse Mercator -#define FIT_DISPLAY_POSITION_QATAR_GRID ((FIT_DISPLAY_POSITION)29) // Qatar National Grid -#define FIT_DISPLAY_POSITION_MODIFIED_SWEDISH_GRID ((FIT_DISPLAY_POSITION)30) // Modified RT-90 (Sweden) -#define FIT_DISPLAY_POSITION_SWEDISH_GRID ((FIT_DISPLAY_POSITION)31) // RT-90 (Sweden) -#define FIT_DISPLAY_POSITION_SOUTH_AFRICAN_GRID ((FIT_DISPLAY_POSITION)32) // South African Grid -#define FIT_DISPLAY_POSITION_SWISS_GRID ((FIT_DISPLAY_POSITION)33) // Swiss CH-1903 grid -#define FIT_DISPLAY_POSITION_TAIWAN_GRID ((FIT_DISPLAY_POSITION)34) // Taiwan Grid -#define FIT_DISPLAY_POSITION_UNITED_STATES_GRID ((FIT_DISPLAY_POSITION)35) // United States National Grid -#define FIT_DISPLAY_POSITION_UTM_UPS_GRID ((FIT_DISPLAY_POSITION)36) // UTM/UPS grid system -#define FIT_DISPLAY_POSITION_WEST_MALAYAN ((FIT_DISPLAY_POSITION)37) // West Malayan RSO -#define FIT_DISPLAY_POSITION_BORNEO_RSO ((FIT_DISPLAY_POSITION)38) // Borneo RSO -#define FIT_DISPLAY_POSITION_ESTONIAN_GRID ((FIT_DISPLAY_POSITION)39) // Estonian grid system -#define FIT_DISPLAY_POSITION_LATVIAN_GRID ((FIT_DISPLAY_POSITION)40) // Latvian Transverse Mercator -#define FIT_DISPLAY_POSITION_SWEDISH_REF_99_GRID ((FIT_DISPLAY_POSITION)41) // Reference Grid 99 TM (Swedish) -#define FIT_DISPLAY_POSITION_COUNT 42 - -typedef FIT_ENUM FIT_SWITCH; -#define FIT_SWITCH_INVALID FIT_ENUM_INVALID -#define FIT_SWITCH_OFF ((FIT_SWITCH)0) -#define FIT_SWITCH_ON ((FIT_SWITCH)1) -#define FIT_SWITCH_AUTO ((FIT_SWITCH)2) -#define FIT_SWITCH_COUNT 3 - -typedef FIT_ENUM FIT_SPORT; -#define FIT_SPORT_INVALID FIT_ENUM_INVALID -#define FIT_SPORT_GENERIC ((FIT_SPORT)0) -#define FIT_SPORT_RUNNING ((FIT_SPORT)1) -#define FIT_SPORT_CYCLING ((FIT_SPORT)2) -#define FIT_SPORT_TRANSITION ((FIT_SPORT)3) // Mulitsport transition -#define FIT_SPORT_FITNESS_EQUIPMENT ((FIT_SPORT)4) -#define FIT_SPORT_SWIMMING ((FIT_SPORT)5) -#define FIT_SPORT_BASKETBALL ((FIT_SPORT)6) -#define FIT_SPORT_SOCCER ((FIT_SPORT)7) -#define FIT_SPORT_TENNIS ((FIT_SPORT)8) -#define FIT_SPORT_AMERICAN_FOOTBALL ((FIT_SPORT)9) -#define FIT_SPORT_TRAINING ((FIT_SPORT)10) -#define FIT_SPORT_WALKING ((FIT_SPORT)11) -#define FIT_SPORT_CROSS_COUNTRY_SKIING ((FIT_SPORT)12) -#define FIT_SPORT_ALPINE_SKIING ((FIT_SPORT)13) -#define FIT_SPORT_SNOWBOARDING ((FIT_SPORT)14) -#define FIT_SPORT_ROWING ((FIT_SPORT)15) -#define FIT_SPORT_MOUNTAINEERING ((FIT_SPORT)16) -#define FIT_SPORT_HIKING ((FIT_SPORT)17) -#define FIT_SPORT_MULTISPORT ((FIT_SPORT)18) -#define FIT_SPORT_PADDLING ((FIT_SPORT)19) -#define FIT_SPORT_FLYING ((FIT_SPORT)20) -#define FIT_SPORT_E_BIKING ((FIT_SPORT)21) -#define FIT_SPORT_MOTORCYCLING ((FIT_SPORT)22) -#define FIT_SPORT_BOATING ((FIT_SPORT)23) -#define FIT_SPORT_DRIVING ((FIT_SPORT)24) -#define FIT_SPORT_GOLF ((FIT_SPORT)25) -#define FIT_SPORT_HANG_GLIDING ((FIT_SPORT)26) -#define FIT_SPORT_HORSEBACK_RIDING ((FIT_SPORT)27) -#define FIT_SPORT_HUNTING ((FIT_SPORT)28) -#define FIT_SPORT_FISHING ((FIT_SPORT)29) -#define FIT_SPORT_INLINE_SKATING ((FIT_SPORT)30) -#define FIT_SPORT_ROCK_CLIMBING ((FIT_SPORT)31) -#define FIT_SPORT_SAILING ((FIT_SPORT)32) -#define FIT_SPORT_ICE_SKATING ((FIT_SPORT)33) -#define FIT_SPORT_SKY_DIVING ((FIT_SPORT)34) -#define FIT_SPORT_SNOWSHOEING ((FIT_SPORT)35) -#define FIT_SPORT_SNOWMOBILING ((FIT_SPORT)36) -#define FIT_SPORT_STAND_UP_PADDLEBOARDING ((FIT_SPORT)37) -#define FIT_SPORT_SURFING ((FIT_SPORT)38) -#define FIT_SPORT_WAKEBOARDING ((FIT_SPORT)39) -#define FIT_SPORT_WATER_SKIING ((FIT_SPORT)40) -#define FIT_SPORT_KAYAKING ((FIT_SPORT)41) -#define FIT_SPORT_RAFTING ((FIT_SPORT)42) -#define FIT_SPORT_WINDSURFING ((FIT_SPORT)43) -#define FIT_SPORT_KITESURFING ((FIT_SPORT)44) -#define FIT_SPORT_TACTICAL ((FIT_SPORT)45) -#define FIT_SPORT_JUMPMASTER ((FIT_SPORT)46) -#define FIT_SPORT_BOXING ((FIT_SPORT)47) -#define FIT_SPORT_FLOOR_CLIMBING ((FIT_SPORT)48) -#define FIT_SPORT_DIVING ((FIT_SPORT)53) -#define FIT_SPORT_HIIT ((FIT_SPORT)62) -#define FIT_SPORT_RACKET ((FIT_SPORT)64) -#define FIT_SPORT_WATER_TUBING ((FIT_SPORT)76) -#define FIT_SPORT_WAKESURFING ((FIT_SPORT)77) -#define FIT_SPORT_ALL ((FIT_SPORT)254) // All is for goals only to include all sports. -#define FIT_SPORT_COUNT 55 - -typedef FIT_UINT8Z FIT_SPORT_BITS_0; // Bit field corresponding to sport enum type (1 << sport). -#define FIT_SPORT_BITS_0_INVALID FIT_UINT8Z_INVALID -#define FIT_SPORT_BITS_0_GENERIC ((FIT_SPORT_BITS_0)0x01) -#define FIT_SPORT_BITS_0_RUNNING ((FIT_SPORT_BITS_0)0x02) -#define FIT_SPORT_BITS_0_CYCLING ((FIT_SPORT_BITS_0)0x04) -#define FIT_SPORT_BITS_0_TRANSITION ((FIT_SPORT_BITS_0)0x08) // Mulitsport transition -#define FIT_SPORT_BITS_0_FITNESS_EQUIPMENT ((FIT_SPORT_BITS_0)0x10) -#define FIT_SPORT_BITS_0_SWIMMING ((FIT_SPORT_BITS_0)0x20) -#define FIT_SPORT_BITS_0_BASKETBALL ((FIT_SPORT_BITS_0)0x40) -#define FIT_SPORT_BITS_0_SOCCER ((FIT_SPORT_BITS_0)0x80) -#define FIT_SPORT_BITS_0_COUNT 8 - -typedef FIT_UINT8Z FIT_SPORT_BITS_1; // Bit field corresponding to sport enum type (1 << (sport-8)). -#define FIT_SPORT_BITS_1_INVALID FIT_UINT8Z_INVALID -#define FIT_SPORT_BITS_1_TENNIS ((FIT_SPORT_BITS_1)0x01) -#define FIT_SPORT_BITS_1_AMERICAN_FOOTBALL ((FIT_SPORT_BITS_1)0x02) -#define FIT_SPORT_BITS_1_TRAINING ((FIT_SPORT_BITS_1)0x04) -#define FIT_SPORT_BITS_1_WALKING ((FIT_SPORT_BITS_1)0x08) -#define FIT_SPORT_BITS_1_CROSS_COUNTRY_SKIING ((FIT_SPORT_BITS_1)0x10) -#define FIT_SPORT_BITS_1_ALPINE_SKIING ((FIT_SPORT_BITS_1)0x20) -#define FIT_SPORT_BITS_1_SNOWBOARDING ((FIT_SPORT_BITS_1)0x40) -#define FIT_SPORT_BITS_1_ROWING ((FIT_SPORT_BITS_1)0x80) -#define FIT_SPORT_BITS_1_COUNT 8 - -typedef FIT_UINT8Z FIT_SPORT_BITS_2; // Bit field corresponding to sport enum type (1 << (sport-16)). -#define FIT_SPORT_BITS_2_INVALID FIT_UINT8Z_INVALID -#define FIT_SPORT_BITS_2_MOUNTAINEERING ((FIT_SPORT_BITS_2)0x01) -#define FIT_SPORT_BITS_2_HIKING ((FIT_SPORT_BITS_2)0x02) -#define FIT_SPORT_BITS_2_MULTISPORT ((FIT_SPORT_BITS_2)0x04) -#define FIT_SPORT_BITS_2_PADDLING ((FIT_SPORT_BITS_2)0x08) -#define FIT_SPORT_BITS_2_FLYING ((FIT_SPORT_BITS_2)0x10) -#define FIT_SPORT_BITS_2_E_BIKING ((FIT_SPORT_BITS_2)0x20) -#define FIT_SPORT_BITS_2_MOTORCYCLING ((FIT_SPORT_BITS_2)0x40) -#define FIT_SPORT_BITS_2_BOATING ((FIT_SPORT_BITS_2)0x80) -#define FIT_SPORT_BITS_2_COUNT 8 - -typedef FIT_UINT8Z FIT_SPORT_BITS_3; // Bit field corresponding to sport enum type (1 << (sport-24)). -#define FIT_SPORT_BITS_3_INVALID FIT_UINT8Z_INVALID -#define FIT_SPORT_BITS_3_DRIVING ((FIT_SPORT_BITS_3)0x01) -#define FIT_SPORT_BITS_3_GOLF ((FIT_SPORT_BITS_3)0x02) -#define FIT_SPORT_BITS_3_HANG_GLIDING ((FIT_SPORT_BITS_3)0x04) -#define FIT_SPORT_BITS_3_HORSEBACK_RIDING ((FIT_SPORT_BITS_3)0x08) -#define FIT_SPORT_BITS_3_HUNTING ((FIT_SPORT_BITS_3)0x10) -#define FIT_SPORT_BITS_3_FISHING ((FIT_SPORT_BITS_3)0x20) -#define FIT_SPORT_BITS_3_INLINE_SKATING ((FIT_SPORT_BITS_3)0x40) -#define FIT_SPORT_BITS_3_ROCK_CLIMBING ((FIT_SPORT_BITS_3)0x80) -#define FIT_SPORT_BITS_3_COUNT 8 - -typedef FIT_UINT8Z FIT_SPORT_BITS_4; // Bit field corresponding to sport enum type (1 << (sport-32)). -#define FIT_SPORT_BITS_4_INVALID FIT_UINT8Z_INVALID -#define FIT_SPORT_BITS_4_SAILING ((FIT_SPORT_BITS_4)0x01) -#define FIT_SPORT_BITS_4_ICE_SKATING ((FIT_SPORT_BITS_4)0x02) -#define FIT_SPORT_BITS_4_SKY_DIVING ((FIT_SPORT_BITS_4)0x04) -#define FIT_SPORT_BITS_4_SNOWSHOEING ((FIT_SPORT_BITS_4)0x08) -#define FIT_SPORT_BITS_4_SNOWMOBILING ((FIT_SPORT_BITS_4)0x10) -#define FIT_SPORT_BITS_4_STAND_UP_PADDLEBOARDING ((FIT_SPORT_BITS_4)0x20) -#define FIT_SPORT_BITS_4_SURFING ((FIT_SPORT_BITS_4)0x40) -#define FIT_SPORT_BITS_4_WAKEBOARDING ((FIT_SPORT_BITS_4)0x80) -#define FIT_SPORT_BITS_4_COUNT 8 - -typedef FIT_UINT8Z FIT_SPORT_BITS_5; // Bit field corresponding to sport enum type (1 << (sport-40)). -#define FIT_SPORT_BITS_5_INVALID FIT_UINT8Z_INVALID -#define FIT_SPORT_BITS_5_WATER_SKIING ((FIT_SPORT_BITS_5)0x01) -#define FIT_SPORT_BITS_5_KAYAKING ((FIT_SPORT_BITS_5)0x02) -#define FIT_SPORT_BITS_5_RAFTING ((FIT_SPORT_BITS_5)0x04) -#define FIT_SPORT_BITS_5_WINDSURFING ((FIT_SPORT_BITS_5)0x08) -#define FIT_SPORT_BITS_5_KITESURFING ((FIT_SPORT_BITS_5)0x10) -#define FIT_SPORT_BITS_5_TACTICAL ((FIT_SPORT_BITS_5)0x20) -#define FIT_SPORT_BITS_5_JUMPMASTER ((FIT_SPORT_BITS_5)0x40) -#define FIT_SPORT_BITS_5_BOXING ((FIT_SPORT_BITS_5)0x80) -#define FIT_SPORT_BITS_5_COUNT 8 - -typedef FIT_UINT8Z FIT_SPORT_BITS_6; // Bit field corresponding to sport enum type (1 << (sport-48)). -#define FIT_SPORT_BITS_6_INVALID FIT_UINT8Z_INVALID -#define FIT_SPORT_BITS_6_FLOOR_CLIMBING ((FIT_SPORT_BITS_6)0x01) -#define FIT_SPORT_BITS_6_COUNT 1 - -typedef FIT_ENUM FIT_SUB_SPORT; -#define FIT_SUB_SPORT_INVALID FIT_ENUM_INVALID -#define FIT_SUB_SPORT_GENERIC ((FIT_SUB_SPORT)0) -#define FIT_SUB_SPORT_TREADMILL ((FIT_SUB_SPORT)1) // Run/Fitness Equipment -#define FIT_SUB_SPORT_STREET ((FIT_SUB_SPORT)2) // Run -#define FIT_SUB_SPORT_TRAIL ((FIT_SUB_SPORT)3) // Run -#define FIT_SUB_SPORT_TRACK ((FIT_SUB_SPORT)4) // Run -#define FIT_SUB_SPORT_SPIN ((FIT_SUB_SPORT)5) // Cycling -#define FIT_SUB_SPORT_INDOOR_CYCLING ((FIT_SUB_SPORT)6) // Cycling/Fitness Equipment -#define FIT_SUB_SPORT_ROAD ((FIT_SUB_SPORT)7) // Cycling -#define FIT_SUB_SPORT_MOUNTAIN ((FIT_SUB_SPORT)8) // Cycling -#define FIT_SUB_SPORT_DOWNHILL ((FIT_SUB_SPORT)9) // Cycling -#define FIT_SUB_SPORT_RECUMBENT ((FIT_SUB_SPORT)10) // Cycling -#define FIT_SUB_SPORT_CYCLOCROSS ((FIT_SUB_SPORT)11) // Cycling -#define FIT_SUB_SPORT_HAND_CYCLING ((FIT_SUB_SPORT)12) // Cycling -#define FIT_SUB_SPORT_TRACK_CYCLING ((FIT_SUB_SPORT)13) // Cycling -#define FIT_SUB_SPORT_INDOOR_ROWING ((FIT_SUB_SPORT)14) // Fitness Equipment -#define FIT_SUB_SPORT_ELLIPTICAL ((FIT_SUB_SPORT)15) // Fitness Equipment -#define FIT_SUB_SPORT_STAIR_CLIMBING ((FIT_SUB_SPORT)16) // Fitness Equipment -#define FIT_SUB_SPORT_LAP_SWIMMING ((FIT_SUB_SPORT)17) // Swimming -#define FIT_SUB_SPORT_OPEN_WATER ((FIT_SUB_SPORT)18) // Swimming -#define FIT_SUB_SPORT_FLEXIBILITY_TRAINING ((FIT_SUB_SPORT)19) // Training -#define FIT_SUB_SPORT_STRENGTH_TRAINING ((FIT_SUB_SPORT)20) // Training -#define FIT_SUB_SPORT_WARM_UP ((FIT_SUB_SPORT)21) // Tennis -#define FIT_SUB_SPORT_MATCH ((FIT_SUB_SPORT)22) // Tennis -#define FIT_SUB_SPORT_EXERCISE ((FIT_SUB_SPORT)23) // Tennis -#define FIT_SUB_SPORT_CHALLENGE ((FIT_SUB_SPORT)24) -#define FIT_SUB_SPORT_INDOOR_SKIING ((FIT_SUB_SPORT)25) // Fitness Equipment -#define FIT_SUB_SPORT_CARDIO_TRAINING ((FIT_SUB_SPORT)26) // Training -#define FIT_SUB_SPORT_INDOOR_WALKING ((FIT_SUB_SPORT)27) // Walking/Fitness Equipment -#define FIT_SUB_SPORT_E_BIKE_FITNESS ((FIT_SUB_SPORT)28) // E-Biking -#define FIT_SUB_SPORT_BMX ((FIT_SUB_SPORT)29) // Cycling -#define FIT_SUB_SPORT_CASUAL_WALKING ((FIT_SUB_SPORT)30) // Walking -#define FIT_SUB_SPORT_SPEED_WALKING ((FIT_SUB_SPORT)31) // Walking -#define FIT_SUB_SPORT_BIKE_TO_RUN_TRANSITION ((FIT_SUB_SPORT)32) // Transition -#define FIT_SUB_SPORT_RUN_TO_BIKE_TRANSITION ((FIT_SUB_SPORT)33) // Transition -#define FIT_SUB_SPORT_SWIM_TO_BIKE_TRANSITION ((FIT_SUB_SPORT)34) // Transition -#define FIT_SUB_SPORT_ATV ((FIT_SUB_SPORT)35) // Motorcycling -#define FIT_SUB_SPORT_MOTOCROSS ((FIT_SUB_SPORT)36) // Motorcycling -#define FIT_SUB_SPORT_BACKCOUNTRY ((FIT_SUB_SPORT)37) // Alpine Skiing/Snowboarding -#define FIT_SUB_SPORT_RESORT ((FIT_SUB_SPORT)38) // Alpine Skiing/Snowboarding -#define FIT_SUB_SPORT_RC_DRONE ((FIT_SUB_SPORT)39) // Flying -#define FIT_SUB_SPORT_WINGSUIT ((FIT_SUB_SPORT)40) // Flying -#define FIT_SUB_SPORT_WHITEWATER ((FIT_SUB_SPORT)41) // Kayaking/Rafting -#define FIT_SUB_SPORT_SKATE_SKIING ((FIT_SUB_SPORT)42) // Cross Country Skiing -#define FIT_SUB_SPORT_YOGA ((FIT_SUB_SPORT)43) // Training -#define FIT_SUB_SPORT_PILATES ((FIT_SUB_SPORT)44) // Fitness Equipment -#define FIT_SUB_SPORT_INDOOR_RUNNING ((FIT_SUB_SPORT)45) // Run -#define FIT_SUB_SPORT_GRAVEL_CYCLING ((FIT_SUB_SPORT)46) // Cycling -#define FIT_SUB_SPORT_E_BIKE_MOUNTAIN ((FIT_SUB_SPORT)47) // Cycling -#define FIT_SUB_SPORT_COMMUTING ((FIT_SUB_SPORT)48) // Cycling -#define FIT_SUB_SPORT_MIXED_SURFACE ((FIT_SUB_SPORT)49) // Cycling -#define FIT_SUB_SPORT_NAVIGATE ((FIT_SUB_SPORT)50) -#define FIT_SUB_SPORT_TRACK_ME ((FIT_SUB_SPORT)51) -#define FIT_SUB_SPORT_MAP ((FIT_SUB_SPORT)52) -#define FIT_SUB_SPORT_SINGLE_GAS_DIVING ((FIT_SUB_SPORT)53) // Diving -#define FIT_SUB_SPORT_MULTI_GAS_DIVING ((FIT_SUB_SPORT)54) // Diving -#define FIT_SUB_SPORT_GAUGE_DIVING ((FIT_SUB_SPORT)55) // Diving -#define FIT_SUB_SPORT_APNEA_DIVING ((FIT_SUB_SPORT)56) // Diving -#define FIT_SUB_SPORT_APNEA_HUNTING ((FIT_SUB_SPORT)57) // Diving -#define FIT_SUB_SPORT_VIRTUAL_ACTIVITY ((FIT_SUB_SPORT)58) -#define FIT_SUB_SPORT_OBSTACLE ((FIT_SUB_SPORT)59) // Used for events where participants run, crawl through mud, climb over walls, etc. -#define FIT_SUB_SPORT_BREATHING ((FIT_SUB_SPORT)62) -#define FIT_SUB_SPORT_SAIL_RACE ((FIT_SUB_SPORT)65) // Sailing -#define FIT_SUB_SPORT_ULTRA ((FIT_SUB_SPORT)67) // Ultramarathon -#define FIT_SUB_SPORT_INDOOR_CLIMBING ((FIT_SUB_SPORT)68) // Climbing -#define FIT_SUB_SPORT_BOULDERING ((FIT_SUB_SPORT)69) // Climbing -#define FIT_SUB_SPORT_HIIT ((FIT_SUB_SPORT)70) // High Intensity Interval Training -#define FIT_SUB_SPORT_AMRAP ((FIT_SUB_SPORT)73) // HIIT -#define FIT_SUB_SPORT_EMOM ((FIT_SUB_SPORT)74) // HIIT -#define FIT_SUB_SPORT_TABATA ((FIT_SUB_SPORT)75) // HIIT -#define FIT_SUB_SPORT_PICKLEBALL ((FIT_SUB_SPORT)84) // Racket -#define FIT_SUB_SPORT_PADEL ((FIT_SUB_SPORT)85) // Racket -#define FIT_SUB_SPORT_FLY_CANOPY ((FIT_SUB_SPORT)110) // Flying -#define FIT_SUB_SPORT_FLY_PARAGLIDE ((FIT_SUB_SPORT)111) // Flying -#define FIT_SUB_SPORT_FLY_PARAMOTOR ((FIT_SUB_SPORT)112) // Flying -#define FIT_SUB_SPORT_FLY_PRESSURIZED ((FIT_SUB_SPORT)113) // Flying -#define FIT_SUB_SPORT_FLY_NAVIGATE ((FIT_SUB_SPORT)114) // Flying -#define FIT_SUB_SPORT_FLY_TIMER ((FIT_SUB_SPORT)115) // Flying -#define FIT_SUB_SPORT_FLY_ALTIMETER ((FIT_SUB_SPORT)116) // Flying -#define FIT_SUB_SPORT_FLY_WX ((FIT_SUB_SPORT)117) // Flying -#define FIT_SUB_SPORT_FLY_VFR ((FIT_SUB_SPORT)118) // Flying -#define FIT_SUB_SPORT_FLY_IFR ((FIT_SUB_SPORT)119) // Flying -#define FIT_SUB_SPORT_ALL ((FIT_SUB_SPORT)254) -#define FIT_SUB_SPORT_COUNT 82 - -typedef FIT_ENUM FIT_SPORT_EVENT; -#define FIT_SPORT_EVENT_INVALID FIT_ENUM_INVALID -#define FIT_SPORT_EVENT_UNCATEGORIZED ((FIT_SPORT_EVENT)0) -#define FIT_SPORT_EVENT_GEOCACHING ((FIT_SPORT_EVENT)1) -#define FIT_SPORT_EVENT_FITNESS ((FIT_SPORT_EVENT)2) -#define FIT_SPORT_EVENT_RECREATION ((FIT_SPORT_EVENT)3) -#define FIT_SPORT_EVENT_RACE ((FIT_SPORT_EVENT)4) -#define FIT_SPORT_EVENT_SPECIAL_EVENT ((FIT_SPORT_EVENT)5) -#define FIT_SPORT_EVENT_TRAINING ((FIT_SPORT_EVENT)6) -#define FIT_SPORT_EVENT_TRANSPORTATION ((FIT_SPORT_EVENT)7) -#define FIT_SPORT_EVENT_TOURING ((FIT_SPORT_EVENT)8) -#define FIT_SPORT_EVENT_COUNT 9 - -typedef FIT_ENUM FIT_ACTIVITY; -#define FIT_ACTIVITY_INVALID FIT_ENUM_INVALID -#define FIT_ACTIVITY_MANUAL ((FIT_ACTIVITY)0) -#define FIT_ACTIVITY_AUTO_MULTI_SPORT ((FIT_ACTIVITY)1) -#define FIT_ACTIVITY_COUNT 2 - -typedef FIT_ENUM FIT_INTENSITY; -#define FIT_INTENSITY_INVALID FIT_ENUM_INVALID -#define FIT_INTENSITY_ACTIVE ((FIT_INTENSITY)0) -#define FIT_INTENSITY_REST ((FIT_INTENSITY)1) -#define FIT_INTENSITY_WARMUP ((FIT_INTENSITY)2) -#define FIT_INTENSITY_COOLDOWN ((FIT_INTENSITY)3) -#define FIT_INTENSITY_RECOVERY ((FIT_INTENSITY)4) -#define FIT_INTENSITY_INTERVAL ((FIT_INTENSITY)5) -#define FIT_INTENSITY_OTHER ((FIT_INTENSITY)6) -#define FIT_INTENSITY_COUNT 7 - -typedef FIT_ENUM FIT_SESSION_TRIGGER; -#define FIT_SESSION_TRIGGER_INVALID FIT_ENUM_INVALID -#define FIT_SESSION_TRIGGER_ACTIVITY_END ((FIT_SESSION_TRIGGER)0) -#define FIT_SESSION_TRIGGER_MANUAL ((FIT_SESSION_TRIGGER)1) // User changed sport. -#define FIT_SESSION_TRIGGER_AUTO_MULTI_SPORT ((FIT_SESSION_TRIGGER)2) // Auto multi-sport feature is enabled and user pressed lap button to advance session. -#define FIT_SESSION_TRIGGER_FITNESS_EQUIPMENT ((FIT_SESSION_TRIGGER)3) // Auto sport change caused by user linking to fitness equipment. -#define FIT_SESSION_TRIGGER_COUNT 4 - -typedef FIT_ENUM FIT_AUTOLAP_TRIGGER; -#define FIT_AUTOLAP_TRIGGER_INVALID FIT_ENUM_INVALID -#define FIT_AUTOLAP_TRIGGER_TIME ((FIT_AUTOLAP_TRIGGER)0) -#define FIT_AUTOLAP_TRIGGER_DISTANCE ((FIT_AUTOLAP_TRIGGER)1) -#define FIT_AUTOLAP_TRIGGER_POSITION_START ((FIT_AUTOLAP_TRIGGER)2) -#define FIT_AUTOLAP_TRIGGER_POSITION_LAP ((FIT_AUTOLAP_TRIGGER)3) -#define FIT_AUTOLAP_TRIGGER_POSITION_WAYPOINT ((FIT_AUTOLAP_TRIGGER)4) -#define FIT_AUTOLAP_TRIGGER_POSITION_MARKED ((FIT_AUTOLAP_TRIGGER)5) -#define FIT_AUTOLAP_TRIGGER_OFF ((FIT_AUTOLAP_TRIGGER)6) -#define FIT_AUTOLAP_TRIGGER_COUNT 7 - -typedef FIT_ENUM FIT_LAP_TRIGGER; -#define FIT_LAP_TRIGGER_INVALID FIT_ENUM_INVALID -#define FIT_LAP_TRIGGER_MANUAL ((FIT_LAP_TRIGGER)0) -#define FIT_LAP_TRIGGER_TIME ((FIT_LAP_TRIGGER)1) -#define FIT_LAP_TRIGGER_DISTANCE ((FIT_LAP_TRIGGER)2) -#define FIT_LAP_TRIGGER_POSITION_START ((FIT_LAP_TRIGGER)3) -#define FIT_LAP_TRIGGER_POSITION_LAP ((FIT_LAP_TRIGGER)4) -#define FIT_LAP_TRIGGER_POSITION_WAYPOINT ((FIT_LAP_TRIGGER)5) -#define FIT_LAP_TRIGGER_POSITION_MARKED ((FIT_LAP_TRIGGER)6) -#define FIT_LAP_TRIGGER_SESSION_END ((FIT_LAP_TRIGGER)7) -#define FIT_LAP_TRIGGER_FITNESS_EQUIPMENT ((FIT_LAP_TRIGGER)8) -#define FIT_LAP_TRIGGER_COUNT 9 - -typedef FIT_ENUM FIT_TIME_MODE; -#define FIT_TIME_MODE_INVALID FIT_ENUM_INVALID -#define FIT_TIME_MODE_HOUR12 ((FIT_TIME_MODE)0) -#define FIT_TIME_MODE_HOUR24 ((FIT_TIME_MODE)1) // Does not use a leading zero and has a colon -#define FIT_TIME_MODE_MILITARY ((FIT_TIME_MODE)2) // Uses a leading zero and does not have a colon -#define FIT_TIME_MODE_HOUR_12_WITH_SECONDS ((FIT_TIME_MODE)3) -#define FIT_TIME_MODE_HOUR_24_WITH_SECONDS ((FIT_TIME_MODE)4) -#define FIT_TIME_MODE_UTC ((FIT_TIME_MODE)5) -#define FIT_TIME_MODE_COUNT 6 - -typedef FIT_ENUM FIT_BACKLIGHT_MODE; -#define FIT_BACKLIGHT_MODE_INVALID FIT_ENUM_INVALID -#define FIT_BACKLIGHT_MODE_OFF ((FIT_BACKLIGHT_MODE)0) -#define FIT_BACKLIGHT_MODE_MANUAL ((FIT_BACKLIGHT_MODE)1) -#define FIT_BACKLIGHT_MODE_KEY_AND_MESSAGES ((FIT_BACKLIGHT_MODE)2) -#define FIT_BACKLIGHT_MODE_AUTO_BRIGHTNESS ((FIT_BACKLIGHT_MODE)3) -#define FIT_BACKLIGHT_MODE_SMART_NOTIFICATIONS ((FIT_BACKLIGHT_MODE)4) -#define FIT_BACKLIGHT_MODE_KEY_AND_MESSAGES_NIGHT ((FIT_BACKLIGHT_MODE)5) -#define FIT_BACKLIGHT_MODE_KEY_AND_MESSAGES_AND_SMART_NOTIFICATIONS ((FIT_BACKLIGHT_MODE)6) -#define FIT_BACKLIGHT_MODE_COUNT 7 - -typedef FIT_ENUM FIT_DATE_MODE; -#define FIT_DATE_MODE_INVALID FIT_ENUM_INVALID -#define FIT_DATE_MODE_DAY_MONTH ((FIT_DATE_MODE)0) -#define FIT_DATE_MODE_MONTH_DAY ((FIT_DATE_MODE)1) -#define FIT_DATE_MODE_COUNT 2 - -typedef FIT_UINT8 FIT_BACKLIGHT_TIMEOUT; // Timeout in seconds. -#define FIT_BACKLIGHT_TIMEOUT_INVALID FIT_UINT8_INVALID -#define FIT_BACKLIGHT_TIMEOUT_INFINITE ((FIT_BACKLIGHT_TIMEOUT)0) // Backlight stays on forever. -#define FIT_BACKLIGHT_TIMEOUT_COUNT 1 - -typedef FIT_ENUM FIT_EVENT; -#define FIT_EVENT_INVALID FIT_ENUM_INVALID -#define FIT_EVENT_TIMER ((FIT_EVENT)0) // Group 0. Start / stop_all -#define FIT_EVENT_WORKOUT ((FIT_EVENT)3) // start / stop -#define FIT_EVENT_WORKOUT_STEP ((FIT_EVENT)4) // Start at beginning of workout. Stop at end of each step. -#define FIT_EVENT_POWER_DOWN ((FIT_EVENT)5) // stop_all group 0 -#define FIT_EVENT_POWER_UP ((FIT_EVENT)6) // stop_all group 0 -#define FIT_EVENT_OFF_COURSE ((FIT_EVENT)7) // start / stop group 0 -#define FIT_EVENT_SESSION ((FIT_EVENT)8) // Stop at end of each session. -#define FIT_EVENT_LAP ((FIT_EVENT)9) // Stop at end of each lap. -#define FIT_EVENT_COURSE_POINT ((FIT_EVENT)10) // marker -#define FIT_EVENT_BATTERY ((FIT_EVENT)11) // marker -#define FIT_EVENT_VIRTUAL_PARTNER_PACE ((FIT_EVENT)12) // Group 1. Start at beginning of activity if VP enabled, when VP pace is changed during activity or VP enabled mid activity. stop_disable when VP disabled. -#define FIT_EVENT_HR_HIGH_ALERT ((FIT_EVENT)13) // Group 0. Start / stop when in alert condition. -#define FIT_EVENT_HR_LOW_ALERT ((FIT_EVENT)14) // Group 0. Start / stop when in alert condition. -#define FIT_EVENT_SPEED_HIGH_ALERT ((FIT_EVENT)15) // Group 0. Start / stop when in alert condition. -#define FIT_EVENT_SPEED_LOW_ALERT ((FIT_EVENT)16) // Group 0. Start / stop when in alert condition. -#define FIT_EVENT_CAD_HIGH_ALERT ((FIT_EVENT)17) // Group 0. Start / stop when in alert condition. -#define FIT_EVENT_CAD_LOW_ALERT ((FIT_EVENT)18) // Group 0. Start / stop when in alert condition. -#define FIT_EVENT_POWER_HIGH_ALERT ((FIT_EVENT)19) // Group 0. Start / stop when in alert condition. -#define FIT_EVENT_POWER_LOW_ALERT ((FIT_EVENT)20) // Group 0. Start / stop when in alert condition. -#define FIT_EVENT_RECOVERY_HR ((FIT_EVENT)21) // marker -#define FIT_EVENT_BATTERY_LOW ((FIT_EVENT)22) // marker -#define FIT_EVENT_TIME_DURATION_ALERT ((FIT_EVENT)23) // Group 1. Start if enabled mid activity (not required at start of activity). Stop when duration is reached. stop_disable if disabled. -#define FIT_EVENT_DISTANCE_DURATION_ALERT ((FIT_EVENT)24) // Group 1. Start if enabled mid activity (not required at start of activity). Stop when duration is reached. stop_disable if disabled. -#define FIT_EVENT_CALORIE_DURATION_ALERT ((FIT_EVENT)25) // Group 1. Start if enabled mid activity (not required at start of activity). Stop when duration is reached. stop_disable if disabled. -#define FIT_EVENT_ACTIVITY ((FIT_EVENT)26) // Group 1.. Stop at end of activity. -#define FIT_EVENT_FITNESS_EQUIPMENT ((FIT_EVENT)27) // marker -#define FIT_EVENT_LENGTH ((FIT_EVENT)28) // Stop at end of each length. -#define FIT_EVENT_USER_MARKER ((FIT_EVENT)32) // marker -#define FIT_EVENT_SPORT_POINT ((FIT_EVENT)33) // marker -#define FIT_EVENT_CALIBRATION ((FIT_EVENT)36) // start/stop/marker -#define FIT_EVENT_FRONT_GEAR_CHANGE ((FIT_EVENT)42) // marker -#define FIT_EVENT_REAR_GEAR_CHANGE ((FIT_EVENT)43) // marker -#define FIT_EVENT_RIDER_POSITION_CHANGE ((FIT_EVENT)44) // marker -#define FIT_EVENT_ELEV_HIGH_ALERT ((FIT_EVENT)45) // Group 0. Start / stop when in alert condition. -#define FIT_EVENT_ELEV_LOW_ALERT ((FIT_EVENT)46) // Group 0. Start / stop when in alert condition. -#define FIT_EVENT_COMM_TIMEOUT ((FIT_EVENT)47) // marker -#define FIT_EVENT_AUTO_ACTIVITY_DETECT ((FIT_EVENT)54) // marker -#define FIT_EVENT_DIVE_ALERT ((FIT_EVENT)56) // marker -#define FIT_EVENT_DIVE_GAS_SWITCHED ((FIT_EVENT)57) // marker -#define FIT_EVENT_TANK_PRESSURE_RESERVE ((FIT_EVENT)71) // marker -#define FIT_EVENT_TANK_PRESSURE_CRITICAL ((FIT_EVENT)72) // marker -#define FIT_EVENT_TANK_LOST ((FIT_EVENT)73) // marker -#define FIT_EVENT_RADAR_THREAT_ALERT ((FIT_EVENT)75) // start/stop/marker -#define FIT_EVENT_TANK_BATTERY_LOW ((FIT_EVENT)76) // marker -#define FIT_EVENT_TANK_POD_CONNECTED ((FIT_EVENT)81) // marker - tank pod has connected -#define FIT_EVENT_TANK_POD_DISCONNECTED ((FIT_EVENT)82) // marker - tank pod has lost connection -#define FIT_EVENT_COUNT 46 - -typedef FIT_ENUM FIT_EVENT_TYPE; -#define FIT_EVENT_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_EVENT_TYPE_START ((FIT_EVENT_TYPE)0) -#define FIT_EVENT_TYPE_STOP ((FIT_EVENT_TYPE)1) -#define FIT_EVENT_TYPE_CONSECUTIVE_DEPRECIATED ((FIT_EVENT_TYPE)2) -#define FIT_EVENT_TYPE_MARKER ((FIT_EVENT_TYPE)3) -#define FIT_EVENT_TYPE_STOP_ALL ((FIT_EVENT_TYPE)4) -#define FIT_EVENT_TYPE_BEGIN_DEPRECIATED ((FIT_EVENT_TYPE)5) -#define FIT_EVENT_TYPE_END_DEPRECIATED ((FIT_EVENT_TYPE)6) -#define FIT_EVENT_TYPE_END_ALL_DEPRECIATED ((FIT_EVENT_TYPE)7) -#define FIT_EVENT_TYPE_STOP_DISABLE ((FIT_EVENT_TYPE)8) -#define FIT_EVENT_TYPE_STOP_DISABLE_ALL ((FIT_EVENT_TYPE)9) -#define FIT_EVENT_TYPE_COUNT 10 - -typedef FIT_ENUM FIT_TIMER_TRIGGER; // timer event data -#define FIT_TIMER_TRIGGER_INVALID FIT_ENUM_INVALID -#define FIT_TIMER_TRIGGER_MANUAL ((FIT_TIMER_TRIGGER)0) -#define FIT_TIMER_TRIGGER_AUTO ((FIT_TIMER_TRIGGER)1) -#define FIT_TIMER_TRIGGER_FITNESS_EQUIPMENT ((FIT_TIMER_TRIGGER)2) -#define FIT_TIMER_TRIGGER_COUNT 3 - -typedef FIT_ENUM FIT_FITNESS_EQUIPMENT_STATE; // fitness equipment event data -#define FIT_FITNESS_EQUIPMENT_STATE_INVALID FIT_ENUM_INVALID -#define FIT_FITNESS_EQUIPMENT_STATE_READY ((FIT_FITNESS_EQUIPMENT_STATE)0) -#define FIT_FITNESS_EQUIPMENT_STATE_IN_USE ((FIT_FITNESS_EQUIPMENT_STATE)1) -#define FIT_FITNESS_EQUIPMENT_STATE_PAUSED ((FIT_FITNESS_EQUIPMENT_STATE)2) -#define FIT_FITNESS_EQUIPMENT_STATE_UNKNOWN ((FIT_FITNESS_EQUIPMENT_STATE)3) // lost connection to fitness equipment -#define FIT_FITNESS_EQUIPMENT_STATE_COUNT 4 - -typedef FIT_ENUM FIT_TONE; -#define FIT_TONE_INVALID FIT_ENUM_INVALID -#define FIT_TONE_OFF ((FIT_TONE)0) -#define FIT_TONE_TONE ((FIT_TONE)1) -#define FIT_TONE_VIBRATE ((FIT_TONE)2) -#define FIT_TONE_TONE_AND_VIBRATE ((FIT_TONE)3) -#define FIT_TONE_COUNT 4 - -typedef FIT_ENUM FIT_AUTOSCROLL; -#define FIT_AUTOSCROLL_INVALID FIT_ENUM_INVALID -#define FIT_AUTOSCROLL_NONE ((FIT_AUTOSCROLL)0) -#define FIT_AUTOSCROLL_SLOW ((FIT_AUTOSCROLL)1) -#define FIT_AUTOSCROLL_MEDIUM ((FIT_AUTOSCROLL)2) -#define FIT_AUTOSCROLL_FAST ((FIT_AUTOSCROLL)3) -#define FIT_AUTOSCROLL_COUNT 4 - -typedef FIT_ENUM FIT_ACTIVITY_CLASS; -#define FIT_ACTIVITY_CLASS_INVALID FIT_ENUM_INVALID -#define FIT_ACTIVITY_CLASS_LEVEL ((FIT_ACTIVITY_CLASS)0x7F) // 0 to 100 -#define FIT_ACTIVITY_CLASS_LEVEL_MAX ((FIT_ACTIVITY_CLASS)100) -#define FIT_ACTIVITY_CLASS_ATHLETE ((FIT_ACTIVITY_CLASS)0x80) -#define FIT_ACTIVITY_CLASS_COUNT 3 - -typedef FIT_ENUM FIT_HR_ZONE_CALC; -#define FIT_HR_ZONE_CALC_INVALID FIT_ENUM_INVALID -#define FIT_HR_ZONE_CALC_CUSTOM ((FIT_HR_ZONE_CALC)0) -#define FIT_HR_ZONE_CALC_PERCENT_MAX_HR ((FIT_HR_ZONE_CALC)1) -#define FIT_HR_ZONE_CALC_PERCENT_HRR ((FIT_HR_ZONE_CALC)2) -#define FIT_HR_ZONE_CALC_PERCENT_LTHR ((FIT_HR_ZONE_CALC)3) -#define FIT_HR_ZONE_CALC_COUNT 4 - -typedef FIT_ENUM FIT_PWR_ZONE_CALC; -#define FIT_PWR_ZONE_CALC_INVALID FIT_ENUM_INVALID -#define FIT_PWR_ZONE_CALC_CUSTOM ((FIT_PWR_ZONE_CALC)0) -#define FIT_PWR_ZONE_CALC_PERCENT_FTP ((FIT_PWR_ZONE_CALC)1) -#define FIT_PWR_ZONE_CALC_COUNT 2 - -typedef FIT_ENUM FIT_WKT_STEP_DURATION; -#define FIT_WKT_STEP_DURATION_INVALID FIT_ENUM_INVALID -#define FIT_WKT_STEP_DURATION_TIME ((FIT_WKT_STEP_DURATION)0) -#define FIT_WKT_STEP_DURATION_DISTANCE ((FIT_WKT_STEP_DURATION)1) -#define FIT_WKT_STEP_DURATION_HR_LESS_THAN ((FIT_WKT_STEP_DURATION)2) -#define FIT_WKT_STEP_DURATION_HR_GREATER_THAN ((FIT_WKT_STEP_DURATION)3) -#define FIT_WKT_STEP_DURATION_CALORIES ((FIT_WKT_STEP_DURATION)4) -#define FIT_WKT_STEP_DURATION_OPEN ((FIT_WKT_STEP_DURATION)5) -#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_STEPS_CMPLT ((FIT_WKT_STEP_DURATION)6) -#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_TIME ((FIT_WKT_STEP_DURATION)7) -#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_DISTANCE ((FIT_WKT_STEP_DURATION)8) -#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_CALORIES ((FIT_WKT_STEP_DURATION)9) -#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_HR_LESS_THAN ((FIT_WKT_STEP_DURATION)10) -#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_HR_GREATER_THAN ((FIT_WKT_STEP_DURATION)11) -#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_POWER_LESS_THAN ((FIT_WKT_STEP_DURATION)12) -#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_POWER_GREATER_THAN ((FIT_WKT_STEP_DURATION)13) -#define FIT_WKT_STEP_DURATION_POWER_LESS_THAN ((FIT_WKT_STEP_DURATION)14) -#define FIT_WKT_STEP_DURATION_POWER_GREATER_THAN ((FIT_WKT_STEP_DURATION)15) -#define FIT_WKT_STEP_DURATION_TRAINING_PEAKS_TSS ((FIT_WKT_STEP_DURATION)16) -#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_POWER_LAST_LAP_LESS_THAN ((FIT_WKT_STEP_DURATION)17) -#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_MAX_POWER_LAST_LAP_LESS_THAN ((FIT_WKT_STEP_DURATION)18) -#define FIT_WKT_STEP_DURATION_POWER_3S_LESS_THAN ((FIT_WKT_STEP_DURATION)19) -#define FIT_WKT_STEP_DURATION_POWER_10S_LESS_THAN ((FIT_WKT_STEP_DURATION)20) -#define FIT_WKT_STEP_DURATION_POWER_30S_LESS_THAN ((FIT_WKT_STEP_DURATION)21) -#define FIT_WKT_STEP_DURATION_POWER_3S_GREATER_THAN ((FIT_WKT_STEP_DURATION)22) -#define FIT_WKT_STEP_DURATION_POWER_10S_GREATER_THAN ((FIT_WKT_STEP_DURATION)23) -#define FIT_WKT_STEP_DURATION_POWER_30S_GREATER_THAN ((FIT_WKT_STEP_DURATION)24) -#define FIT_WKT_STEP_DURATION_POWER_LAP_LESS_THAN ((FIT_WKT_STEP_DURATION)25) -#define FIT_WKT_STEP_DURATION_POWER_LAP_GREATER_THAN ((FIT_WKT_STEP_DURATION)26) -#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_TRAINING_PEAKS_TSS ((FIT_WKT_STEP_DURATION)27) -#define FIT_WKT_STEP_DURATION_REPETITION_TIME ((FIT_WKT_STEP_DURATION)28) -#define FIT_WKT_STEP_DURATION_REPS ((FIT_WKT_STEP_DURATION)29) -#define FIT_WKT_STEP_DURATION_TIME_ONLY ((FIT_WKT_STEP_DURATION)31) -#define FIT_WKT_STEP_DURATION_COUNT 31 - -typedef FIT_ENUM FIT_WKT_STEP_TARGET; -#define FIT_WKT_STEP_TARGET_INVALID FIT_ENUM_INVALID -#define FIT_WKT_STEP_TARGET_SPEED ((FIT_WKT_STEP_TARGET)0) -#define FIT_WKT_STEP_TARGET_HEART_RATE ((FIT_WKT_STEP_TARGET)1) -#define FIT_WKT_STEP_TARGET_OPEN ((FIT_WKT_STEP_TARGET)2) -#define FIT_WKT_STEP_TARGET_CADENCE ((FIT_WKT_STEP_TARGET)3) -#define FIT_WKT_STEP_TARGET_POWER ((FIT_WKT_STEP_TARGET)4) -#define FIT_WKT_STEP_TARGET_GRADE ((FIT_WKT_STEP_TARGET)5) -#define FIT_WKT_STEP_TARGET_RESISTANCE ((FIT_WKT_STEP_TARGET)6) -#define FIT_WKT_STEP_TARGET_POWER_3S ((FIT_WKT_STEP_TARGET)7) -#define FIT_WKT_STEP_TARGET_POWER_10S ((FIT_WKT_STEP_TARGET)8) -#define FIT_WKT_STEP_TARGET_POWER_30S ((FIT_WKT_STEP_TARGET)9) -#define FIT_WKT_STEP_TARGET_POWER_LAP ((FIT_WKT_STEP_TARGET)10) -#define FIT_WKT_STEP_TARGET_SWIM_STROKE ((FIT_WKT_STEP_TARGET)11) -#define FIT_WKT_STEP_TARGET_SPEED_LAP ((FIT_WKT_STEP_TARGET)12) -#define FIT_WKT_STEP_TARGET_HEART_RATE_LAP ((FIT_WKT_STEP_TARGET)13) -#define FIT_WKT_STEP_TARGET_COUNT 14 - -typedef FIT_ENUM FIT_GOAL; -#define FIT_GOAL_INVALID FIT_ENUM_INVALID -#define FIT_GOAL_TIME ((FIT_GOAL)0) -#define FIT_GOAL_DISTANCE ((FIT_GOAL)1) -#define FIT_GOAL_CALORIES ((FIT_GOAL)2) -#define FIT_GOAL_FREQUENCY ((FIT_GOAL)3) -#define FIT_GOAL_STEPS ((FIT_GOAL)4) -#define FIT_GOAL_ASCENT ((FIT_GOAL)5) -#define FIT_GOAL_ACTIVE_MINUTES ((FIT_GOAL)6) -#define FIT_GOAL_COUNT 7 - -typedef FIT_ENUM FIT_GOAL_RECURRENCE; -#define FIT_GOAL_RECURRENCE_INVALID FIT_ENUM_INVALID -#define FIT_GOAL_RECURRENCE_OFF ((FIT_GOAL_RECURRENCE)0) -#define FIT_GOAL_RECURRENCE_DAILY ((FIT_GOAL_RECURRENCE)1) -#define FIT_GOAL_RECURRENCE_WEEKLY ((FIT_GOAL_RECURRENCE)2) -#define FIT_GOAL_RECURRENCE_MONTHLY ((FIT_GOAL_RECURRENCE)3) -#define FIT_GOAL_RECURRENCE_YEARLY ((FIT_GOAL_RECURRENCE)4) -#define FIT_GOAL_RECURRENCE_CUSTOM ((FIT_GOAL_RECURRENCE)5) -#define FIT_GOAL_RECURRENCE_COUNT 6 - -typedef FIT_ENUM FIT_GOAL_SOURCE; -#define FIT_GOAL_SOURCE_INVALID FIT_ENUM_INVALID -#define FIT_GOAL_SOURCE_AUTO ((FIT_GOAL_SOURCE)0) // Device generated -#define FIT_GOAL_SOURCE_COMMUNITY ((FIT_GOAL_SOURCE)1) // Social network sourced goal -#define FIT_GOAL_SOURCE_USER ((FIT_GOAL_SOURCE)2) // Manually generated -#define FIT_GOAL_SOURCE_COUNT 3 - -typedef FIT_ENUM FIT_SCHEDULE; -#define FIT_SCHEDULE_INVALID FIT_ENUM_INVALID -#define FIT_SCHEDULE_WORKOUT ((FIT_SCHEDULE)0) -#define FIT_SCHEDULE_COURSE ((FIT_SCHEDULE)1) -#define FIT_SCHEDULE_COUNT 2 - -typedef FIT_ENUM FIT_COURSE_POINT; -#define FIT_COURSE_POINT_INVALID FIT_ENUM_INVALID -#define FIT_COURSE_POINT_GENERIC ((FIT_COURSE_POINT)0) -#define FIT_COURSE_POINT_SUMMIT ((FIT_COURSE_POINT)1) -#define FIT_COURSE_POINT_VALLEY ((FIT_COURSE_POINT)2) -#define FIT_COURSE_POINT_WATER ((FIT_COURSE_POINT)3) -#define FIT_COURSE_POINT_FOOD ((FIT_COURSE_POINT)4) -#define FIT_COURSE_POINT_DANGER ((FIT_COURSE_POINT)5) -#define FIT_COURSE_POINT_LEFT ((FIT_COURSE_POINT)6) -#define FIT_COURSE_POINT_RIGHT ((FIT_COURSE_POINT)7) -#define FIT_COURSE_POINT_STRAIGHT ((FIT_COURSE_POINT)8) -#define FIT_COURSE_POINT_FIRST_AID ((FIT_COURSE_POINT)9) -#define FIT_COURSE_POINT_FOURTH_CATEGORY ((FIT_COURSE_POINT)10) -#define FIT_COURSE_POINT_THIRD_CATEGORY ((FIT_COURSE_POINT)11) -#define FIT_COURSE_POINT_SECOND_CATEGORY ((FIT_COURSE_POINT)12) -#define FIT_COURSE_POINT_FIRST_CATEGORY ((FIT_COURSE_POINT)13) -#define FIT_COURSE_POINT_HORS_CATEGORY ((FIT_COURSE_POINT)14) -#define FIT_COURSE_POINT_SPRINT ((FIT_COURSE_POINT)15) -#define FIT_COURSE_POINT_LEFT_FORK ((FIT_COURSE_POINT)16) -#define FIT_COURSE_POINT_RIGHT_FORK ((FIT_COURSE_POINT)17) -#define FIT_COURSE_POINT_MIDDLE_FORK ((FIT_COURSE_POINT)18) -#define FIT_COURSE_POINT_SLIGHT_LEFT ((FIT_COURSE_POINT)19) -#define FIT_COURSE_POINT_SHARP_LEFT ((FIT_COURSE_POINT)20) -#define FIT_COURSE_POINT_SLIGHT_RIGHT ((FIT_COURSE_POINT)21) -#define FIT_COURSE_POINT_SHARP_RIGHT ((FIT_COURSE_POINT)22) -#define FIT_COURSE_POINT_U_TURN ((FIT_COURSE_POINT)23) -#define FIT_COURSE_POINT_SEGMENT_START ((FIT_COURSE_POINT)24) -#define FIT_COURSE_POINT_SEGMENT_END ((FIT_COURSE_POINT)25) -#define FIT_COURSE_POINT_CAMPSITE ((FIT_COURSE_POINT)27) -#define FIT_COURSE_POINT_AID_STATION ((FIT_COURSE_POINT)28) -#define FIT_COURSE_POINT_REST_AREA ((FIT_COURSE_POINT)29) -#define FIT_COURSE_POINT_GENERAL_DISTANCE ((FIT_COURSE_POINT)30) // Used with UpAhead -#define FIT_COURSE_POINT_SERVICE ((FIT_COURSE_POINT)31) -#define FIT_COURSE_POINT_ENERGY_GEL ((FIT_COURSE_POINT)32) -#define FIT_COURSE_POINT_SPORTS_DRINK ((FIT_COURSE_POINT)33) -#define FIT_COURSE_POINT_MILE_MARKER ((FIT_COURSE_POINT)34) -#define FIT_COURSE_POINT_CHECKPOINT ((FIT_COURSE_POINT)35) -#define FIT_COURSE_POINT_SHELTER ((FIT_COURSE_POINT)36) -#define FIT_COURSE_POINT_MEETING_SPOT ((FIT_COURSE_POINT)37) -#define FIT_COURSE_POINT_OVERLOOK ((FIT_COURSE_POINT)38) -#define FIT_COURSE_POINT_TOILET ((FIT_COURSE_POINT)39) -#define FIT_COURSE_POINT_SHOWER ((FIT_COURSE_POINT)40) -#define FIT_COURSE_POINT_GEAR ((FIT_COURSE_POINT)41) -#define FIT_COURSE_POINT_SHARP_CURVE ((FIT_COURSE_POINT)42) -#define FIT_COURSE_POINT_STEEP_INCLINE ((FIT_COURSE_POINT)43) -#define FIT_COURSE_POINT_TUNNEL ((FIT_COURSE_POINT)44) -#define FIT_COURSE_POINT_BRIDGE ((FIT_COURSE_POINT)45) -#define FIT_COURSE_POINT_OBSTACLE ((FIT_COURSE_POINT)46) -#define FIT_COURSE_POINT_CROSSING ((FIT_COURSE_POINT)47) -#define FIT_COURSE_POINT_STORE ((FIT_COURSE_POINT)48) -#define FIT_COURSE_POINT_TRANSITION ((FIT_COURSE_POINT)49) -#define FIT_COURSE_POINT_NAVAID ((FIT_COURSE_POINT)50) -#define FIT_COURSE_POINT_TRANSPORT ((FIT_COURSE_POINT)51) -#define FIT_COURSE_POINT_ALERT ((FIT_COURSE_POINT)52) -#define FIT_COURSE_POINT_INFO ((FIT_COURSE_POINT)53) -#define FIT_COURSE_POINT_COUNT 53 - -typedef FIT_UINT16 FIT_MANUFACTURER; -#define FIT_MANUFACTURER_INVALID FIT_UINT16_INVALID -#define FIT_MANUFACTURER_GARMIN ((FIT_MANUFACTURER)1) -#define FIT_MANUFACTURER_GARMIN_FR405_ANTFS ((FIT_MANUFACTURER)2) // Do not use. Used by FR405 for ANTFS man id. -#define FIT_MANUFACTURER_ZEPHYR ((FIT_MANUFACTURER)3) -#define FIT_MANUFACTURER_DAYTON ((FIT_MANUFACTURER)4) -#define FIT_MANUFACTURER_IDT ((FIT_MANUFACTURER)5) -#define FIT_MANUFACTURER_SRM ((FIT_MANUFACTURER)6) -#define FIT_MANUFACTURER_QUARQ ((FIT_MANUFACTURER)7) -#define FIT_MANUFACTURER_IBIKE ((FIT_MANUFACTURER)8) -#define FIT_MANUFACTURER_SARIS ((FIT_MANUFACTURER)9) -#define FIT_MANUFACTURER_SPARK_HK ((FIT_MANUFACTURER)10) -#define FIT_MANUFACTURER_TANITA ((FIT_MANUFACTURER)11) -#define FIT_MANUFACTURER_ECHOWELL ((FIT_MANUFACTURER)12) -#define FIT_MANUFACTURER_DYNASTREAM_OEM ((FIT_MANUFACTURER)13) -#define FIT_MANUFACTURER_NAUTILUS ((FIT_MANUFACTURER)14) -#define FIT_MANUFACTURER_DYNASTREAM ((FIT_MANUFACTURER)15) -#define FIT_MANUFACTURER_TIMEX ((FIT_MANUFACTURER)16) -#define FIT_MANUFACTURER_METRIGEAR ((FIT_MANUFACTURER)17) -#define FIT_MANUFACTURER_XELIC ((FIT_MANUFACTURER)18) -#define FIT_MANUFACTURER_BEURER ((FIT_MANUFACTURER)19) -#define FIT_MANUFACTURER_CARDIOSPORT ((FIT_MANUFACTURER)20) -#define FIT_MANUFACTURER_A_AND_D ((FIT_MANUFACTURER)21) -#define FIT_MANUFACTURER_HMM ((FIT_MANUFACTURER)22) -#define FIT_MANUFACTURER_SUUNTO ((FIT_MANUFACTURER)23) -#define FIT_MANUFACTURER_THITA_ELEKTRONIK ((FIT_MANUFACTURER)24) -#define FIT_MANUFACTURER_GPULSE ((FIT_MANUFACTURER)25) -#define FIT_MANUFACTURER_CLEAN_MOBILE ((FIT_MANUFACTURER)26) -#define FIT_MANUFACTURER_PEDAL_BRAIN ((FIT_MANUFACTURER)27) -#define FIT_MANUFACTURER_PEAKSWARE ((FIT_MANUFACTURER)28) -#define FIT_MANUFACTURER_SAXONAR ((FIT_MANUFACTURER)29) -#define FIT_MANUFACTURER_LEMOND_FITNESS ((FIT_MANUFACTURER)30) -#define FIT_MANUFACTURER_DEXCOM ((FIT_MANUFACTURER)31) -#define FIT_MANUFACTURER_WAHOO_FITNESS ((FIT_MANUFACTURER)32) -#define FIT_MANUFACTURER_OCTANE_FITNESS ((FIT_MANUFACTURER)33) -#define FIT_MANUFACTURER_ARCHINOETICS ((FIT_MANUFACTURER)34) -#define FIT_MANUFACTURER_THE_HURT_BOX ((FIT_MANUFACTURER)35) -#define FIT_MANUFACTURER_CITIZEN_SYSTEMS ((FIT_MANUFACTURER)36) -#define FIT_MANUFACTURER_MAGELLAN ((FIT_MANUFACTURER)37) -#define FIT_MANUFACTURER_OSYNCE ((FIT_MANUFACTURER)38) -#define FIT_MANUFACTURER_HOLUX ((FIT_MANUFACTURER)39) -#define FIT_MANUFACTURER_CONCEPT2 ((FIT_MANUFACTURER)40) -#define FIT_MANUFACTURER_SHIMANO ((FIT_MANUFACTURER)41) -#define FIT_MANUFACTURER_ONE_GIANT_LEAP ((FIT_MANUFACTURER)42) -#define FIT_MANUFACTURER_ACE_SENSOR ((FIT_MANUFACTURER)43) -#define FIT_MANUFACTURER_BRIM_BROTHERS ((FIT_MANUFACTURER)44) -#define FIT_MANUFACTURER_XPLOVA ((FIT_MANUFACTURER)45) -#define FIT_MANUFACTURER_PERCEPTION_DIGITAL ((FIT_MANUFACTURER)46) -#define FIT_MANUFACTURER_BF1SYSTEMS ((FIT_MANUFACTURER)47) -#define FIT_MANUFACTURER_PIONEER ((FIT_MANUFACTURER)48) -#define FIT_MANUFACTURER_SPANTEC ((FIT_MANUFACTURER)49) -#define FIT_MANUFACTURER_METALOGICS ((FIT_MANUFACTURER)50) -#define FIT_MANUFACTURER_4IIIIS ((FIT_MANUFACTURER)51) -#define FIT_MANUFACTURER_SEIKO_EPSON ((FIT_MANUFACTURER)52) -#define FIT_MANUFACTURER_SEIKO_EPSON_OEM ((FIT_MANUFACTURER)53) -#define FIT_MANUFACTURER_IFOR_POWELL ((FIT_MANUFACTURER)54) -#define FIT_MANUFACTURER_MAXWELL_GUIDER ((FIT_MANUFACTURER)55) -#define FIT_MANUFACTURER_STAR_TRAC ((FIT_MANUFACTURER)56) -#define FIT_MANUFACTURER_BREAKAWAY ((FIT_MANUFACTURER)57) -#define FIT_MANUFACTURER_ALATECH_TECHNOLOGY_LTD ((FIT_MANUFACTURER)58) -#define FIT_MANUFACTURER_MIO_TECHNOLOGY_EUROPE ((FIT_MANUFACTURER)59) -#define FIT_MANUFACTURER_ROTOR ((FIT_MANUFACTURER)60) -#define FIT_MANUFACTURER_GEONAUTE ((FIT_MANUFACTURER)61) -#define FIT_MANUFACTURER_ID_BIKE ((FIT_MANUFACTURER)62) -#define FIT_MANUFACTURER_SPECIALIZED ((FIT_MANUFACTURER)63) -#define FIT_MANUFACTURER_WTEK ((FIT_MANUFACTURER)64) -#define FIT_MANUFACTURER_PHYSICAL_ENTERPRISES ((FIT_MANUFACTURER)65) -#define FIT_MANUFACTURER_NORTH_POLE_ENGINEERING ((FIT_MANUFACTURER)66) -#define FIT_MANUFACTURER_BKOOL ((FIT_MANUFACTURER)67) -#define FIT_MANUFACTURER_CATEYE ((FIT_MANUFACTURER)68) -#define FIT_MANUFACTURER_STAGES_CYCLING ((FIT_MANUFACTURER)69) -#define FIT_MANUFACTURER_SIGMASPORT ((FIT_MANUFACTURER)70) -#define FIT_MANUFACTURER_TOMTOM ((FIT_MANUFACTURER)71) -#define FIT_MANUFACTURER_PERIPEDAL ((FIT_MANUFACTURER)72) -#define FIT_MANUFACTURER_WATTBIKE ((FIT_MANUFACTURER)73) -#define FIT_MANUFACTURER_MOXY ((FIT_MANUFACTURER)76) -#define FIT_MANUFACTURER_CICLOSPORT ((FIT_MANUFACTURER)77) -#define FIT_MANUFACTURER_POWERBAHN ((FIT_MANUFACTURER)78) -#define FIT_MANUFACTURER_ACORN_PROJECTS_APS ((FIT_MANUFACTURER)79) -#define FIT_MANUFACTURER_LIFEBEAM ((FIT_MANUFACTURER)80) -#define FIT_MANUFACTURER_BONTRAGER ((FIT_MANUFACTURER)81) -#define FIT_MANUFACTURER_WELLGO ((FIT_MANUFACTURER)82) -#define FIT_MANUFACTURER_SCOSCHE ((FIT_MANUFACTURER)83) -#define FIT_MANUFACTURER_MAGURA ((FIT_MANUFACTURER)84) -#define FIT_MANUFACTURER_WOODWAY ((FIT_MANUFACTURER)85) -#define FIT_MANUFACTURER_ELITE ((FIT_MANUFACTURER)86) -#define FIT_MANUFACTURER_NIELSEN_KELLERMAN ((FIT_MANUFACTURER)87) -#define FIT_MANUFACTURER_DK_CITY ((FIT_MANUFACTURER)88) -#define FIT_MANUFACTURER_TACX ((FIT_MANUFACTURER)89) -#define FIT_MANUFACTURER_DIRECTION_TECHNOLOGY ((FIT_MANUFACTURER)90) -#define FIT_MANUFACTURER_MAGTONIC ((FIT_MANUFACTURER)91) -#define FIT_MANUFACTURER_1PARTCARBON ((FIT_MANUFACTURER)92) -#define FIT_MANUFACTURER_INSIDE_RIDE_TECHNOLOGIES ((FIT_MANUFACTURER)93) -#define FIT_MANUFACTURER_SOUND_OF_MOTION ((FIT_MANUFACTURER)94) -#define FIT_MANUFACTURER_STRYD ((FIT_MANUFACTURER)95) -#define FIT_MANUFACTURER_ICG ((FIT_MANUFACTURER)96) // Indoorcycling Group -#define FIT_MANUFACTURER_MIPULSE ((FIT_MANUFACTURER)97) -#define FIT_MANUFACTURER_BSX_ATHLETICS ((FIT_MANUFACTURER)98) -#define FIT_MANUFACTURER_LOOK ((FIT_MANUFACTURER)99) -#define FIT_MANUFACTURER_CAMPAGNOLO_SRL ((FIT_MANUFACTURER)100) -#define FIT_MANUFACTURER_BODY_BIKE_SMART ((FIT_MANUFACTURER)101) -#define FIT_MANUFACTURER_PRAXISWORKS ((FIT_MANUFACTURER)102) -#define FIT_MANUFACTURER_LIMITS_TECHNOLOGY ((FIT_MANUFACTURER)103) // Limits Technology Ltd. -#define FIT_MANUFACTURER_TOPACTION_TECHNOLOGY ((FIT_MANUFACTURER)104) // TopAction Technology Inc. -#define FIT_MANUFACTURER_COSINUSS ((FIT_MANUFACTURER)105) -#define FIT_MANUFACTURER_FITCARE ((FIT_MANUFACTURER)106) -#define FIT_MANUFACTURER_MAGENE ((FIT_MANUFACTURER)107) -#define FIT_MANUFACTURER_GIANT_MANUFACTURING_CO ((FIT_MANUFACTURER)108) -#define FIT_MANUFACTURER_TIGRASPORT ((FIT_MANUFACTURER)109) // Tigrasport -#define FIT_MANUFACTURER_SALUTRON ((FIT_MANUFACTURER)110) -#define FIT_MANUFACTURER_TECHNOGYM ((FIT_MANUFACTURER)111) -#define FIT_MANUFACTURER_BRYTON_SENSORS ((FIT_MANUFACTURER)112) -#define FIT_MANUFACTURER_LATITUDE_LIMITED ((FIT_MANUFACTURER)113) -#define FIT_MANUFACTURER_SOARING_TECHNOLOGY ((FIT_MANUFACTURER)114) -#define FIT_MANUFACTURER_IGPSPORT ((FIT_MANUFACTURER)115) -#define FIT_MANUFACTURER_THINKRIDER ((FIT_MANUFACTURER)116) -#define FIT_MANUFACTURER_GOPHER_SPORT ((FIT_MANUFACTURER)117) -#define FIT_MANUFACTURER_WATERROWER ((FIT_MANUFACTURER)118) -#define FIT_MANUFACTURER_ORANGETHEORY ((FIT_MANUFACTURER)119) -#define FIT_MANUFACTURER_INPEAK ((FIT_MANUFACTURER)120) -#define FIT_MANUFACTURER_KINETIC ((FIT_MANUFACTURER)121) -#define FIT_MANUFACTURER_JOHNSON_HEALTH_TECH ((FIT_MANUFACTURER)122) -#define FIT_MANUFACTURER_POLAR_ELECTRO ((FIT_MANUFACTURER)123) -#define FIT_MANUFACTURER_SEESENSE ((FIT_MANUFACTURER)124) -#define FIT_MANUFACTURER_NCI_TECHNOLOGY ((FIT_MANUFACTURER)125) -#define FIT_MANUFACTURER_IQSQUARE ((FIT_MANUFACTURER)126) -#define FIT_MANUFACTURER_LEOMO ((FIT_MANUFACTURER)127) -#define FIT_MANUFACTURER_IFIT_COM ((FIT_MANUFACTURER)128) -#define FIT_MANUFACTURER_COROS_BYTE ((FIT_MANUFACTURER)129) -#define FIT_MANUFACTURER_VERSA_DESIGN ((FIT_MANUFACTURER)130) -#define FIT_MANUFACTURER_CHILEAF ((FIT_MANUFACTURER)131) -#define FIT_MANUFACTURER_CYCPLUS ((FIT_MANUFACTURER)132) -#define FIT_MANUFACTURER_GRAVAA_BYTE ((FIT_MANUFACTURER)133) -#define FIT_MANUFACTURER_SIGEYI ((FIT_MANUFACTURER)134) -#define FIT_MANUFACTURER_COOSPO ((FIT_MANUFACTURER)135) -#define FIT_MANUFACTURER_GEOID ((FIT_MANUFACTURER)136) -#define FIT_MANUFACTURER_BOSCH ((FIT_MANUFACTURER)137) -#define FIT_MANUFACTURER_KYTO ((FIT_MANUFACTURER)138) -#define FIT_MANUFACTURER_KINETIC_SPORTS ((FIT_MANUFACTURER)139) -#define FIT_MANUFACTURER_DECATHLON_BYTE ((FIT_MANUFACTURER)140) -#define FIT_MANUFACTURER_TQ_SYSTEMS ((FIT_MANUFACTURER)141) -#define FIT_MANUFACTURER_TAG_HEUER ((FIT_MANUFACTURER)142) -#define FIT_MANUFACTURER_KEISER_FITNESS ((FIT_MANUFACTURER)143) -#define FIT_MANUFACTURER_ZWIFT_BYTE ((FIT_MANUFACTURER)144) -#define FIT_MANUFACTURER_PORSCHE_EP ((FIT_MANUFACTURER)145) -#define FIT_MANUFACTURER_BLACKBIRD ((FIT_MANUFACTURER)146) -#define FIT_MANUFACTURER_MEILAN_BYTE ((FIT_MANUFACTURER)147) -#define FIT_MANUFACTURER_EZON ((FIT_MANUFACTURER)148) -#define FIT_MANUFACTURER_DEVELOPMENT ((FIT_MANUFACTURER)255) -#define FIT_MANUFACTURER_HEALTHANDLIFE ((FIT_MANUFACTURER)257) -#define FIT_MANUFACTURER_LEZYNE ((FIT_MANUFACTURER)258) -#define FIT_MANUFACTURER_SCRIBE_LABS ((FIT_MANUFACTURER)259) -#define FIT_MANUFACTURER_ZWIFT ((FIT_MANUFACTURER)260) -#define FIT_MANUFACTURER_WATTEAM ((FIT_MANUFACTURER)261) -#define FIT_MANUFACTURER_RECON ((FIT_MANUFACTURER)262) -#define FIT_MANUFACTURER_FAVERO_ELECTRONICS ((FIT_MANUFACTURER)263) -#define FIT_MANUFACTURER_DYNOVELO ((FIT_MANUFACTURER)264) -#define FIT_MANUFACTURER_STRAVA ((FIT_MANUFACTURER)265) -#define FIT_MANUFACTURER_PRECOR ((FIT_MANUFACTURER)266) // Amer Sports -#define FIT_MANUFACTURER_BRYTON ((FIT_MANUFACTURER)267) -#define FIT_MANUFACTURER_SRAM ((FIT_MANUFACTURER)268) -#define FIT_MANUFACTURER_NAVMAN ((FIT_MANUFACTURER)269) // MiTAC Global Corporation (Mio Technology) -#define FIT_MANUFACTURER_COBI ((FIT_MANUFACTURER)270) // COBI GmbH -#define FIT_MANUFACTURER_SPIVI ((FIT_MANUFACTURER)271) -#define FIT_MANUFACTURER_MIO_MAGELLAN ((FIT_MANUFACTURER)272) -#define FIT_MANUFACTURER_EVESPORTS ((FIT_MANUFACTURER)273) -#define FIT_MANUFACTURER_SENSITIVUS_GAUGE ((FIT_MANUFACTURER)274) -#define FIT_MANUFACTURER_PODOON ((FIT_MANUFACTURER)275) -#define FIT_MANUFACTURER_LIFE_TIME_FITNESS ((FIT_MANUFACTURER)276) -#define FIT_MANUFACTURER_FALCO_E_MOTORS ((FIT_MANUFACTURER)277) // Falco eMotors Inc. -#define FIT_MANUFACTURER_MINOURA ((FIT_MANUFACTURER)278) -#define FIT_MANUFACTURER_CYCLIQ ((FIT_MANUFACTURER)279) -#define FIT_MANUFACTURER_LUXOTTICA ((FIT_MANUFACTURER)280) -#define FIT_MANUFACTURER_TRAINER_ROAD ((FIT_MANUFACTURER)281) -#define FIT_MANUFACTURER_THE_SUFFERFEST ((FIT_MANUFACTURER)282) -#define FIT_MANUFACTURER_FULLSPEEDAHEAD ((FIT_MANUFACTURER)283) -#define FIT_MANUFACTURER_VIRTUALTRAINING ((FIT_MANUFACTURER)284) -#define FIT_MANUFACTURER_FEEDBACKSPORTS ((FIT_MANUFACTURER)285) -#define FIT_MANUFACTURER_OMATA ((FIT_MANUFACTURER)286) -#define FIT_MANUFACTURER_VDO ((FIT_MANUFACTURER)287) -#define FIT_MANUFACTURER_MAGNETICDAYS ((FIT_MANUFACTURER)288) -#define FIT_MANUFACTURER_HAMMERHEAD ((FIT_MANUFACTURER)289) -#define FIT_MANUFACTURER_KINETIC_BY_KURT ((FIT_MANUFACTURER)290) -#define FIT_MANUFACTURER_SHAPELOG ((FIT_MANUFACTURER)291) -#define FIT_MANUFACTURER_DABUZIDUO ((FIT_MANUFACTURER)292) -#define FIT_MANUFACTURER_JETBLACK ((FIT_MANUFACTURER)293) -#define FIT_MANUFACTURER_COROS ((FIT_MANUFACTURER)294) -#define FIT_MANUFACTURER_VIRTUGO ((FIT_MANUFACTURER)295) -#define FIT_MANUFACTURER_VELOSENSE ((FIT_MANUFACTURER)296) -#define FIT_MANUFACTURER_CYCLIGENTINC ((FIT_MANUFACTURER)297) -#define FIT_MANUFACTURER_TRAILFORKS ((FIT_MANUFACTURER)298) -#define FIT_MANUFACTURER_MAHLE_EBIKEMOTION ((FIT_MANUFACTURER)299) -#define FIT_MANUFACTURER_NURVV ((FIT_MANUFACTURER)300) -#define FIT_MANUFACTURER_MICROPROGRAM ((FIT_MANUFACTURER)301) -#define FIT_MANUFACTURER_ZONE5CLOUD ((FIT_MANUFACTURER)302) -#define FIT_MANUFACTURER_GREENTEG ((FIT_MANUFACTURER)303) -#define FIT_MANUFACTURER_YAMAHA_MOTORS ((FIT_MANUFACTURER)304) -#define FIT_MANUFACTURER_WHOOP ((FIT_MANUFACTURER)305) -#define FIT_MANUFACTURER_GRAVAA ((FIT_MANUFACTURER)306) -#define FIT_MANUFACTURER_ONELAP ((FIT_MANUFACTURER)307) -#define FIT_MANUFACTURER_MONARK_EXERCISE ((FIT_MANUFACTURER)308) -#define FIT_MANUFACTURER_FORM ((FIT_MANUFACTURER)309) -#define FIT_MANUFACTURER_DECATHLON ((FIT_MANUFACTURER)310) -#define FIT_MANUFACTURER_SYNCROS ((FIT_MANUFACTURER)311) -#define FIT_MANUFACTURER_HEATUP ((FIT_MANUFACTURER)312) -#define FIT_MANUFACTURER_CANNONDALE ((FIT_MANUFACTURER)313) -#define FIT_MANUFACTURER_TRUE_FITNESS ((FIT_MANUFACTURER)314) -#define FIT_MANUFACTURER_RGT_CYCLING ((FIT_MANUFACTURER)315) -#define FIT_MANUFACTURER_VASA ((FIT_MANUFACTURER)316) -#define FIT_MANUFACTURER_RACE_REPUBLIC ((FIT_MANUFACTURER)317) -#define FIT_MANUFACTURER_FAZUA ((FIT_MANUFACTURER)318) -#define FIT_MANUFACTURER_OREKA_TRAINING ((FIT_MANUFACTURER)319) -#define FIT_MANUFACTURER_LSEC ((FIT_MANUFACTURER)320) // Lishun Electric & Communication -#define FIT_MANUFACTURER_LULULEMON_STUDIO ((FIT_MANUFACTURER)321) -#define FIT_MANUFACTURER_SHANYUE ((FIT_MANUFACTURER)322) -#define FIT_MANUFACTURER_SPINNING_MDA ((FIT_MANUFACTURER)323) -#define FIT_MANUFACTURER_HILLDATING ((FIT_MANUFACTURER)324) -#define FIT_MANUFACTURER_ACTIGRAPHCORP ((FIT_MANUFACTURER)5759) -#define FIT_MANUFACTURER_COUNT 216 - -typedef FIT_UINT16 FIT_GARMIN_PRODUCT; -#define FIT_GARMIN_PRODUCT_INVALID FIT_UINT16_INVALID -#define FIT_GARMIN_PRODUCT_HRM1 ((FIT_GARMIN_PRODUCT)1) -#define FIT_GARMIN_PRODUCT_AXH01 ((FIT_GARMIN_PRODUCT)2) // AXH01 HRM chipset -#define FIT_GARMIN_PRODUCT_AXB01 ((FIT_GARMIN_PRODUCT)3) -#define FIT_GARMIN_PRODUCT_AXB02 ((FIT_GARMIN_PRODUCT)4) -#define FIT_GARMIN_PRODUCT_HRM2SS ((FIT_GARMIN_PRODUCT)5) -#define FIT_GARMIN_PRODUCT_DSI_ALF02 ((FIT_GARMIN_PRODUCT)6) -#define FIT_GARMIN_PRODUCT_HRM3SS ((FIT_GARMIN_PRODUCT)7) -#define FIT_GARMIN_PRODUCT_HRM_RUN_SINGLE_BYTE_PRODUCT_ID ((FIT_GARMIN_PRODUCT)8) // hrm_run model for HRM ANT+ messaging -#define FIT_GARMIN_PRODUCT_BSM ((FIT_GARMIN_PRODUCT)9) // BSM model for ANT+ messaging -#define FIT_GARMIN_PRODUCT_BCM ((FIT_GARMIN_PRODUCT)10) // BCM model for ANT+ messaging -#define FIT_GARMIN_PRODUCT_AXS01 ((FIT_GARMIN_PRODUCT)11) // AXS01 HRM Bike Chipset model for ANT+ messaging -#define FIT_GARMIN_PRODUCT_HRM_TRI_SINGLE_BYTE_PRODUCT_ID ((FIT_GARMIN_PRODUCT)12) // hrm_tri model for HRM ANT+ messaging -#define FIT_GARMIN_PRODUCT_HRM4_RUN_SINGLE_BYTE_PRODUCT_ID ((FIT_GARMIN_PRODUCT)13) // hrm4 run model for HRM ANT+ messaging -#define FIT_GARMIN_PRODUCT_FR225_SINGLE_BYTE_PRODUCT_ID ((FIT_GARMIN_PRODUCT)14) // fr225 model for HRM ANT+ messaging -#define FIT_GARMIN_PRODUCT_GEN3_BSM_SINGLE_BYTE_PRODUCT_ID ((FIT_GARMIN_PRODUCT)15) // gen3_bsm model for Bike Speed ANT+ messaging -#define FIT_GARMIN_PRODUCT_GEN3_BCM_SINGLE_BYTE_PRODUCT_ID ((FIT_GARMIN_PRODUCT)16) // gen3_bcm model for Bike Cadence ANT+ messaging -#define FIT_GARMIN_PRODUCT_OHR ((FIT_GARMIN_PRODUCT)255) // Garmin Wearable Optical Heart Rate Sensor for ANT+ HR Profile Broadcasting -#define FIT_GARMIN_PRODUCT_FR301_CHINA ((FIT_GARMIN_PRODUCT)473) -#define FIT_GARMIN_PRODUCT_FR301_JAPAN ((FIT_GARMIN_PRODUCT)474) -#define FIT_GARMIN_PRODUCT_FR301_KOREA ((FIT_GARMIN_PRODUCT)475) -#define FIT_GARMIN_PRODUCT_FR301_TAIWAN ((FIT_GARMIN_PRODUCT)494) -#define FIT_GARMIN_PRODUCT_FR405 ((FIT_GARMIN_PRODUCT)717) // Forerunner 405 -#define FIT_GARMIN_PRODUCT_FR50 ((FIT_GARMIN_PRODUCT)782) // Forerunner 50 -#define FIT_GARMIN_PRODUCT_FR405_JAPAN ((FIT_GARMIN_PRODUCT)987) -#define FIT_GARMIN_PRODUCT_FR60 ((FIT_GARMIN_PRODUCT)988) // Forerunner 60 -#define FIT_GARMIN_PRODUCT_DSI_ALF01 ((FIT_GARMIN_PRODUCT)1011) -#define FIT_GARMIN_PRODUCT_FR310XT ((FIT_GARMIN_PRODUCT)1018) // Forerunner 310 -#define FIT_GARMIN_PRODUCT_EDGE500 ((FIT_GARMIN_PRODUCT)1036) -#define FIT_GARMIN_PRODUCT_FR110 ((FIT_GARMIN_PRODUCT)1124) // Forerunner 110 -#define FIT_GARMIN_PRODUCT_EDGE800 ((FIT_GARMIN_PRODUCT)1169) -#define FIT_GARMIN_PRODUCT_EDGE500_TAIWAN ((FIT_GARMIN_PRODUCT)1199) -#define FIT_GARMIN_PRODUCT_EDGE500_JAPAN ((FIT_GARMIN_PRODUCT)1213) -#define FIT_GARMIN_PRODUCT_CHIRP ((FIT_GARMIN_PRODUCT)1253) -#define FIT_GARMIN_PRODUCT_FR110_JAPAN ((FIT_GARMIN_PRODUCT)1274) -#define FIT_GARMIN_PRODUCT_EDGE200 ((FIT_GARMIN_PRODUCT)1325) -#define FIT_GARMIN_PRODUCT_FR910XT ((FIT_GARMIN_PRODUCT)1328) -#define FIT_GARMIN_PRODUCT_EDGE800_TAIWAN ((FIT_GARMIN_PRODUCT)1333) -#define FIT_GARMIN_PRODUCT_EDGE800_JAPAN ((FIT_GARMIN_PRODUCT)1334) -#define FIT_GARMIN_PRODUCT_ALF04 ((FIT_GARMIN_PRODUCT)1341) -#define FIT_GARMIN_PRODUCT_FR610 ((FIT_GARMIN_PRODUCT)1345) -#define FIT_GARMIN_PRODUCT_FR210_JAPAN ((FIT_GARMIN_PRODUCT)1360) -#define FIT_GARMIN_PRODUCT_VECTOR_SS ((FIT_GARMIN_PRODUCT)1380) -#define FIT_GARMIN_PRODUCT_VECTOR_CP ((FIT_GARMIN_PRODUCT)1381) -#define FIT_GARMIN_PRODUCT_EDGE800_CHINA ((FIT_GARMIN_PRODUCT)1386) -#define FIT_GARMIN_PRODUCT_EDGE500_CHINA ((FIT_GARMIN_PRODUCT)1387) -#define FIT_GARMIN_PRODUCT_APPROACH_G10 ((FIT_GARMIN_PRODUCT)1405) -#define FIT_GARMIN_PRODUCT_FR610_JAPAN ((FIT_GARMIN_PRODUCT)1410) -#define FIT_GARMIN_PRODUCT_EDGE500_KOREA ((FIT_GARMIN_PRODUCT)1422) -#define FIT_GARMIN_PRODUCT_FR70 ((FIT_GARMIN_PRODUCT)1436) -#define FIT_GARMIN_PRODUCT_FR310XT_4T ((FIT_GARMIN_PRODUCT)1446) -#define FIT_GARMIN_PRODUCT_AMX ((FIT_GARMIN_PRODUCT)1461) -#define FIT_GARMIN_PRODUCT_FR10 ((FIT_GARMIN_PRODUCT)1482) -#define FIT_GARMIN_PRODUCT_EDGE800_KOREA ((FIT_GARMIN_PRODUCT)1497) -#define FIT_GARMIN_PRODUCT_SWIM ((FIT_GARMIN_PRODUCT)1499) -#define FIT_GARMIN_PRODUCT_FR910XT_CHINA ((FIT_GARMIN_PRODUCT)1537) -#define FIT_GARMIN_PRODUCT_FENIX ((FIT_GARMIN_PRODUCT)1551) -#define FIT_GARMIN_PRODUCT_EDGE200_TAIWAN ((FIT_GARMIN_PRODUCT)1555) -#define FIT_GARMIN_PRODUCT_EDGE510 ((FIT_GARMIN_PRODUCT)1561) -#define FIT_GARMIN_PRODUCT_EDGE810 ((FIT_GARMIN_PRODUCT)1567) -#define FIT_GARMIN_PRODUCT_TEMPE ((FIT_GARMIN_PRODUCT)1570) -#define FIT_GARMIN_PRODUCT_FR910XT_JAPAN ((FIT_GARMIN_PRODUCT)1600) -#define FIT_GARMIN_PRODUCT_FR620 ((FIT_GARMIN_PRODUCT)1623) -#define FIT_GARMIN_PRODUCT_FR220 ((FIT_GARMIN_PRODUCT)1632) -#define FIT_GARMIN_PRODUCT_FR910XT_KOREA ((FIT_GARMIN_PRODUCT)1664) -#define FIT_GARMIN_PRODUCT_FR10_JAPAN ((FIT_GARMIN_PRODUCT)1688) -#define FIT_GARMIN_PRODUCT_EDGE810_JAPAN ((FIT_GARMIN_PRODUCT)1721) -#define FIT_GARMIN_PRODUCT_VIRB_ELITE ((FIT_GARMIN_PRODUCT)1735) -#define FIT_GARMIN_PRODUCT_EDGE_TOURING ((FIT_GARMIN_PRODUCT)1736) // Also Edge Touring Plus -#define FIT_GARMIN_PRODUCT_EDGE510_JAPAN ((FIT_GARMIN_PRODUCT)1742) -#define FIT_GARMIN_PRODUCT_HRM_TRI ((FIT_GARMIN_PRODUCT)1743) // Also HRM-Swim -#define FIT_GARMIN_PRODUCT_HRM_RUN ((FIT_GARMIN_PRODUCT)1752) -#define FIT_GARMIN_PRODUCT_FR920XT ((FIT_GARMIN_PRODUCT)1765) -#define FIT_GARMIN_PRODUCT_EDGE510_ASIA ((FIT_GARMIN_PRODUCT)1821) -#define FIT_GARMIN_PRODUCT_EDGE810_CHINA ((FIT_GARMIN_PRODUCT)1822) -#define FIT_GARMIN_PRODUCT_EDGE810_TAIWAN ((FIT_GARMIN_PRODUCT)1823) -#define FIT_GARMIN_PRODUCT_EDGE1000 ((FIT_GARMIN_PRODUCT)1836) -#define FIT_GARMIN_PRODUCT_VIVO_FIT ((FIT_GARMIN_PRODUCT)1837) -#define FIT_GARMIN_PRODUCT_VIRB_REMOTE ((FIT_GARMIN_PRODUCT)1853) -#define FIT_GARMIN_PRODUCT_VIVO_KI ((FIT_GARMIN_PRODUCT)1885) -#define FIT_GARMIN_PRODUCT_FR15 ((FIT_GARMIN_PRODUCT)1903) -#define FIT_GARMIN_PRODUCT_VIVO_ACTIVE ((FIT_GARMIN_PRODUCT)1907) -#define FIT_GARMIN_PRODUCT_EDGE510_KOREA ((FIT_GARMIN_PRODUCT)1918) -#define FIT_GARMIN_PRODUCT_FR620_JAPAN ((FIT_GARMIN_PRODUCT)1928) -#define FIT_GARMIN_PRODUCT_FR620_CHINA ((FIT_GARMIN_PRODUCT)1929) -#define FIT_GARMIN_PRODUCT_FR220_JAPAN ((FIT_GARMIN_PRODUCT)1930) -#define FIT_GARMIN_PRODUCT_FR220_CHINA ((FIT_GARMIN_PRODUCT)1931) -#define FIT_GARMIN_PRODUCT_APPROACH_S6 ((FIT_GARMIN_PRODUCT)1936) -#define FIT_GARMIN_PRODUCT_VIVO_SMART ((FIT_GARMIN_PRODUCT)1956) -#define FIT_GARMIN_PRODUCT_FENIX2 ((FIT_GARMIN_PRODUCT)1967) -#define FIT_GARMIN_PRODUCT_EPIX ((FIT_GARMIN_PRODUCT)1988) -#define FIT_GARMIN_PRODUCT_FENIX3 ((FIT_GARMIN_PRODUCT)2050) -#define FIT_GARMIN_PRODUCT_EDGE1000_TAIWAN ((FIT_GARMIN_PRODUCT)2052) -#define FIT_GARMIN_PRODUCT_EDGE1000_JAPAN ((FIT_GARMIN_PRODUCT)2053) -#define FIT_GARMIN_PRODUCT_FR15_JAPAN ((FIT_GARMIN_PRODUCT)2061) -#define FIT_GARMIN_PRODUCT_EDGE520 ((FIT_GARMIN_PRODUCT)2067) -#define FIT_GARMIN_PRODUCT_EDGE1000_CHINA ((FIT_GARMIN_PRODUCT)2070) -#define FIT_GARMIN_PRODUCT_FR620_RUSSIA ((FIT_GARMIN_PRODUCT)2072) -#define FIT_GARMIN_PRODUCT_FR220_RUSSIA ((FIT_GARMIN_PRODUCT)2073) -#define FIT_GARMIN_PRODUCT_VECTOR_S ((FIT_GARMIN_PRODUCT)2079) -#define FIT_GARMIN_PRODUCT_EDGE1000_KOREA ((FIT_GARMIN_PRODUCT)2100) -#define FIT_GARMIN_PRODUCT_FR920XT_TAIWAN ((FIT_GARMIN_PRODUCT)2130) -#define FIT_GARMIN_PRODUCT_FR920XT_CHINA ((FIT_GARMIN_PRODUCT)2131) -#define FIT_GARMIN_PRODUCT_FR920XT_JAPAN ((FIT_GARMIN_PRODUCT)2132) -#define FIT_GARMIN_PRODUCT_VIRBX ((FIT_GARMIN_PRODUCT)2134) -#define FIT_GARMIN_PRODUCT_VIVO_SMART_APAC ((FIT_GARMIN_PRODUCT)2135) -#define FIT_GARMIN_PRODUCT_ETREX_TOUCH ((FIT_GARMIN_PRODUCT)2140) -#define FIT_GARMIN_PRODUCT_EDGE25 ((FIT_GARMIN_PRODUCT)2147) -#define FIT_GARMIN_PRODUCT_FR25 ((FIT_GARMIN_PRODUCT)2148) -#define FIT_GARMIN_PRODUCT_VIVO_FIT2 ((FIT_GARMIN_PRODUCT)2150) -#define FIT_GARMIN_PRODUCT_FR225 ((FIT_GARMIN_PRODUCT)2153) -#define FIT_GARMIN_PRODUCT_FR630 ((FIT_GARMIN_PRODUCT)2156) -#define FIT_GARMIN_PRODUCT_FR230 ((FIT_GARMIN_PRODUCT)2157) -#define FIT_GARMIN_PRODUCT_FR735XT ((FIT_GARMIN_PRODUCT)2158) -#define FIT_GARMIN_PRODUCT_VIVO_ACTIVE_APAC ((FIT_GARMIN_PRODUCT)2160) -#define FIT_GARMIN_PRODUCT_VECTOR_2 ((FIT_GARMIN_PRODUCT)2161) -#define FIT_GARMIN_PRODUCT_VECTOR_2S ((FIT_GARMIN_PRODUCT)2162) -#define FIT_GARMIN_PRODUCT_VIRBXE ((FIT_GARMIN_PRODUCT)2172) -#define FIT_GARMIN_PRODUCT_FR620_TAIWAN ((FIT_GARMIN_PRODUCT)2173) -#define FIT_GARMIN_PRODUCT_FR220_TAIWAN ((FIT_GARMIN_PRODUCT)2174) -#define FIT_GARMIN_PRODUCT_TRUSWING ((FIT_GARMIN_PRODUCT)2175) -#define FIT_GARMIN_PRODUCT_D2AIRVENU ((FIT_GARMIN_PRODUCT)2187) -#define FIT_GARMIN_PRODUCT_FENIX3_CHINA ((FIT_GARMIN_PRODUCT)2188) -#define FIT_GARMIN_PRODUCT_FENIX3_TWN ((FIT_GARMIN_PRODUCT)2189) -#define FIT_GARMIN_PRODUCT_VARIA_HEADLIGHT ((FIT_GARMIN_PRODUCT)2192) -#define FIT_GARMIN_PRODUCT_VARIA_TAILLIGHT_OLD ((FIT_GARMIN_PRODUCT)2193) -#define FIT_GARMIN_PRODUCT_EDGE_EXPLORE_1000 ((FIT_GARMIN_PRODUCT)2204) -#define FIT_GARMIN_PRODUCT_FR225_ASIA ((FIT_GARMIN_PRODUCT)2219) -#define FIT_GARMIN_PRODUCT_VARIA_RADAR_TAILLIGHT ((FIT_GARMIN_PRODUCT)2225) -#define FIT_GARMIN_PRODUCT_VARIA_RADAR_DISPLAY ((FIT_GARMIN_PRODUCT)2226) -#define FIT_GARMIN_PRODUCT_EDGE20 ((FIT_GARMIN_PRODUCT)2238) -#define FIT_GARMIN_PRODUCT_EDGE520_ASIA ((FIT_GARMIN_PRODUCT)2260) -#define FIT_GARMIN_PRODUCT_EDGE520_JAPAN ((FIT_GARMIN_PRODUCT)2261) -#define FIT_GARMIN_PRODUCT_D2_BRAVO ((FIT_GARMIN_PRODUCT)2262) -#define FIT_GARMIN_PRODUCT_APPROACH_S20 ((FIT_GARMIN_PRODUCT)2266) -#define FIT_GARMIN_PRODUCT_VIVO_SMART2 ((FIT_GARMIN_PRODUCT)2271) -#define FIT_GARMIN_PRODUCT_EDGE1000_THAI ((FIT_GARMIN_PRODUCT)2274) -#define FIT_GARMIN_PRODUCT_VARIA_REMOTE ((FIT_GARMIN_PRODUCT)2276) -#define FIT_GARMIN_PRODUCT_EDGE25_ASIA ((FIT_GARMIN_PRODUCT)2288) -#define FIT_GARMIN_PRODUCT_EDGE25_JPN ((FIT_GARMIN_PRODUCT)2289) -#define FIT_GARMIN_PRODUCT_EDGE20_ASIA ((FIT_GARMIN_PRODUCT)2290) -#define FIT_GARMIN_PRODUCT_APPROACH_X40 ((FIT_GARMIN_PRODUCT)2292) -#define FIT_GARMIN_PRODUCT_FENIX3_JAPAN ((FIT_GARMIN_PRODUCT)2293) -#define FIT_GARMIN_PRODUCT_VIVO_SMART_EMEA ((FIT_GARMIN_PRODUCT)2294) -#define FIT_GARMIN_PRODUCT_FR630_ASIA ((FIT_GARMIN_PRODUCT)2310) -#define FIT_GARMIN_PRODUCT_FR630_JPN ((FIT_GARMIN_PRODUCT)2311) -#define FIT_GARMIN_PRODUCT_FR230_JPN ((FIT_GARMIN_PRODUCT)2313) -#define FIT_GARMIN_PRODUCT_HRM4_RUN ((FIT_GARMIN_PRODUCT)2327) -#define FIT_GARMIN_PRODUCT_EPIX_JAPAN ((FIT_GARMIN_PRODUCT)2332) -#define FIT_GARMIN_PRODUCT_VIVO_ACTIVE_HR ((FIT_GARMIN_PRODUCT)2337) -#define FIT_GARMIN_PRODUCT_VIVO_SMART_GPS_HR ((FIT_GARMIN_PRODUCT)2347) -#define FIT_GARMIN_PRODUCT_VIVO_SMART_HR ((FIT_GARMIN_PRODUCT)2348) -#define FIT_GARMIN_PRODUCT_VIVO_SMART_HR_ASIA ((FIT_GARMIN_PRODUCT)2361) -#define FIT_GARMIN_PRODUCT_VIVO_SMART_GPS_HR_ASIA ((FIT_GARMIN_PRODUCT)2362) -#define FIT_GARMIN_PRODUCT_VIVO_MOVE ((FIT_GARMIN_PRODUCT)2368) -#define FIT_GARMIN_PRODUCT_VARIA_TAILLIGHT ((FIT_GARMIN_PRODUCT)2379) -#define FIT_GARMIN_PRODUCT_FR235_ASIA ((FIT_GARMIN_PRODUCT)2396) -#define FIT_GARMIN_PRODUCT_FR235_JAPAN ((FIT_GARMIN_PRODUCT)2397) -#define FIT_GARMIN_PRODUCT_VARIA_VISION ((FIT_GARMIN_PRODUCT)2398) -#define FIT_GARMIN_PRODUCT_VIVO_FIT3 ((FIT_GARMIN_PRODUCT)2406) -#define FIT_GARMIN_PRODUCT_FENIX3_KOREA ((FIT_GARMIN_PRODUCT)2407) -#define FIT_GARMIN_PRODUCT_FENIX3_SEA ((FIT_GARMIN_PRODUCT)2408) -#define FIT_GARMIN_PRODUCT_FENIX3_HR ((FIT_GARMIN_PRODUCT)2413) -#define FIT_GARMIN_PRODUCT_VIRB_ULTRA_30 ((FIT_GARMIN_PRODUCT)2417) -#define FIT_GARMIN_PRODUCT_INDEX_SMART_SCALE ((FIT_GARMIN_PRODUCT)2429) -#define FIT_GARMIN_PRODUCT_FR235 ((FIT_GARMIN_PRODUCT)2431) -#define FIT_GARMIN_PRODUCT_FENIX3_CHRONOS ((FIT_GARMIN_PRODUCT)2432) -#define FIT_GARMIN_PRODUCT_OREGON7XX ((FIT_GARMIN_PRODUCT)2441) -#define FIT_GARMIN_PRODUCT_RINO7XX ((FIT_GARMIN_PRODUCT)2444) -#define FIT_GARMIN_PRODUCT_EPIX_KOREA ((FIT_GARMIN_PRODUCT)2457) -#define FIT_GARMIN_PRODUCT_FENIX3_HR_CHN ((FIT_GARMIN_PRODUCT)2473) -#define FIT_GARMIN_PRODUCT_FENIX3_HR_TWN ((FIT_GARMIN_PRODUCT)2474) -#define FIT_GARMIN_PRODUCT_FENIX3_HR_JPN ((FIT_GARMIN_PRODUCT)2475) -#define FIT_GARMIN_PRODUCT_FENIX3_HR_SEA ((FIT_GARMIN_PRODUCT)2476) -#define FIT_GARMIN_PRODUCT_FENIX3_HR_KOR ((FIT_GARMIN_PRODUCT)2477) -#define FIT_GARMIN_PRODUCT_NAUTIX ((FIT_GARMIN_PRODUCT)2496) -#define FIT_GARMIN_PRODUCT_VIVO_ACTIVE_HR_APAC ((FIT_GARMIN_PRODUCT)2497) -#define FIT_GARMIN_PRODUCT_FR35 ((FIT_GARMIN_PRODUCT)2503) -#define FIT_GARMIN_PRODUCT_OREGON7XX_WW ((FIT_GARMIN_PRODUCT)2512) -#define FIT_GARMIN_PRODUCT_EDGE_820 ((FIT_GARMIN_PRODUCT)2530) -#define FIT_GARMIN_PRODUCT_EDGE_EXPLORE_820 ((FIT_GARMIN_PRODUCT)2531) -#define FIT_GARMIN_PRODUCT_FR735XT_APAC ((FIT_GARMIN_PRODUCT)2533) -#define FIT_GARMIN_PRODUCT_FR735XT_JAPAN ((FIT_GARMIN_PRODUCT)2534) -#define FIT_GARMIN_PRODUCT_FENIX5S ((FIT_GARMIN_PRODUCT)2544) -#define FIT_GARMIN_PRODUCT_D2_BRAVO_TITANIUM ((FIT_GARMIN_PRODUCT)2547) -#define FIT_GARMIN_PRODUCT_VARIA_UT800 ((FIT_GARMIN_PRODUCT)2567) // Varia UT 800 SW -#define FIT_GARMIN_PRODUCT_RUNNING_DYNAMICS_POD ((FIT_GARMIN_PRODUCT)2593) -#define FIT_GARMIN_PRODUCT_EDGE_820_CHINA ((FIT_GARMIN_PRODUCT)2599) -#define FIT_GARMIN_PRODUCT_EDGE_820_JAPAN ((FIT_GARMIN_PRODUCT)2600) -#define FIT_GARMIN_PRODUCT_FENIX5X ((FIT_GARMIN_PRODUCT)2604) -#define FIT_GARMIN_PRODUCT_VIVO_FIT_JR ((FIT_GARMIN_PRODUCT)2606) -#define FIT_GARMIN_PRODUCT_VIVO_SMART3 ((FIT_GARMIN_PRODUCT)2622) -#define FIT_GARMIN_PRODUCT_VIVO_SPORT ((FIT_GARMIN_PRODUCT)2623) -#define FIT_GARMIN_PRODUCT_EDGE_820_TAIWAN ((FIT_GARMIN_PRODUCT)2628) -#define FIT_GARMIN_PRODUCT_EDGE_820_KOREA ((FIT_GARMIN_PRODUCT)2629) -#define FIT_GARMIN_PRODUCT_EDGE_820_SEA ((FIT_GARMIN_PRODUCT)2630) -#define FIT_GARMIN_PRODUCT_FR35_HEBREW ((FIT_GARMIN_PRODUCT)2650) -#define FIT_GARMIN_PRODUCT_APPROACH_S60 ((FIT_GARMIN_PRODUCT)2656) -#define FIT_GARMIN_PRODUCT_FR35_APAC ((FIT_GARMIN_PRODUCT)2667) -#define FIT_GARMIN_PRODUCT_FR35_JAPAN ((FIT_GARMIN_PRODUCT)2668) -#define FIT_GARMIN_PRODUCT_FENIX3_CHRONOS_ASIA ((FIT_GARMIN_PRODUCT)2675) -#define FIT_GARMIN_PRODUCT_VIRB_360 ((FIT_GARMIN_PRODUCT)2687) -#define FIT_GARMIN_PRODUCT_FR935 ((FIT_GARMIN_PRODUCT)2691) -#define FIT_GARMIN_PRODUCT_FENIX5 ((FIT_GARMIN_PRODUCT)2697) -#define FIT_GARMIN_PRODUCT_VIVOACTIVE3 ((FIT_GARMIN_PRODUCT)2700) -#define FIT_GARMIN_PRODUCT_FR235_CHINA_NFC ((FIT_GARMIN_PRODUCT)2733) -#define FIT_GARMIN_PRODUCT_FORETREX_601_701 ((FIT_GARMIN_PRODUCT)2769) -#define FIT_GARMIN_PRODUCT_VIVO_MOVE_HR ((FIT_GARMIN_PRODUCT)2772) -#define FIT_GARMIN_PRODUCT_EDGE_1030 ((FIT_GARMIN_PRODUCT)2713) -#define FIT_GARMIN_PRODUCT_FR35_SEA ((FIT_GARMIN_PRODUCT)2727) -#define FIT_GARMIN_PRODUCT_VECTOR_3 ((FIT_GARMIN_PRODUCT)2787) -#define FIT_GARMIN_PRODUCT_FENIX5_ASIA ((FIT_GARMIN_PRODUCT)2796) -#define FIT_GARMIN_PRODUCT_FENIX5S_ASIA ((FIT_GARMIN_PRODUCT)2797) -#define FIT_GARMIN_PRODUCT_FENIX5X_ASIA ((FIT_GARMIN_PRODUCT)2798) -#define FIT_GARMIN_PRODUCT_APPROACH_Z80 ((FIT_GARMIN_PRODUCT)2806) -#define FIT_GARMIN_PRODUCT_FR35_KOREA ((FIT_GARMIN_PRODUCT)2814) -#define FIT_GARMIN_PRODUCT_D2CHARLIE ((FIT_GARMIN_PRODUCT)2819) -#define FIT_GARMIN_PRODUCT_VIVO_SMART3_APAC ((FIT_GARMIN_PRODUCT)2831) -#define FIT_GARMIN_PRODUCT_VIVO_SPORT_APAC ((FIT_GARMIN_PRODUCT)2832) -#define FIT_GARMIN_PRODUCT_FR935_ASIA ((FIT_GARMIN_PRODUCT)2833) -#define FIT_GARMIN_PRODUCT_DESCENT ((FIT_GARMIN_PRODUCT)2859) -#define FIT_GARMIN_PRODUCT_VIVO_FIT4 ((FIT_GARMIN_PRODUCT)2878) -#define FIT_GARMIN_PRODUCT_FR645 ((FIT_GARMIN_PRODUCT)2886) -#define FIT_GARMIN_PRODUCT_FR645M ((FIT_GARMIN_PRODUCT)2888) -#define FIT_GARMIN_PRODUCT_FR30 ((FIT_GARMIN_PRODUCT)2891) -#define FIT_GARMIN_PRODUCT_FENIX5S_PLUS ((FIT_GARMIN_PRODUCT)2900) -#define FIT_GARMIN_PRODUCT_EDGE_130 ((FIT_GARMIN_PRODUCT)2909) -#define FIT_GARMIN_PRODUCT_EDGE_1030_ASIA ((FIT_GARMIN_PRODUCT)2924) -#define FIT_GARMIN_PRODUCT_VIVOSMART_4 ((FIT_GARMIN_PRODUCT)2927) -#define FIT_GARMIN_PRODUCT_VIVO_MOVE_HR_ASIA ((FIT_GARMIN_PRODUCT)2945) -#define FIT_GARMIN_PRODUCT_APPROACH_X10 ((FIT_GARMIN_PRODUCT)2962) -#define FIT_GARMIN_PRODUCT_FR30_ASIA ((FIT_GARMIN_PRODUCT)2977) -#define FIT_GARMIN_PRODUCT_VIVOACTIVE3M_W ((FIT_GARMIN_PRODUCT)2988) -#define FIT_GARMIN_PRODUCT_FR645_ASIA ((FIT_GARMIN_PRODUCT)3003) -#define FIT_GARMIN_PRODUCT_FR645M_ASIA ((FIT_GARMIN_PRODUCT)3004) -#define FIT_GARMIN_PRODUCT_EDGE_EXPLORE ((FIT_GARMIN_PRODUCT)3011) -#define FIT_GARMIN_PRODUCT_GPSMAP66 ((FIT_GARMIN_PRODUCT)3028) -#define FIT_GARMIN_PRODUCT_APPROACH_S10 ((FIT_GARMIN_PRODUCT)3049) -#define FIT_GARMIN_PRODUCT_VIVOACTIVE3M_L ((FIT_GARMIN_PRODUCT)3066) -#define FIT_GARMIN_PRODUCT_APPROACH_G80 ((FIT_GARMIN_PRODUCT)3085) -#define FIT_GARMIN_PRODUCT_EDGE_130_ASIA ((FIT_GARMIN_PRODUCT)3092) -#define FIT_GARMIN_PRODUCT_EDGE_1030_BONTRAGER ((FIT_GARMIN_PRODUCT)3095) -#define FIT_GARMIN_PRODUCT_FENIX5_PLUS ((FIT_GARMIN_PRODUCT)3110) -#define FIT_GARMIN_PRODUCT_FENIX5X_PLUS ((FIT_GARMIN_PRODUCT)3111) -#define FIT_GARMIN_PRODUCT_EDGE_520_PLUS ((FIT_GARMIN_PRODUCT)3112) -#define FIT_GARMIN_PRODUCT_FR945 ((FIT_GARMIN_PRODUCT)3113) -#define FIT_GARMIN_PRODUCT_EDGE_530 ((FIT_GARMIN_PRODUCT)3121) -#define FIT_GARMIN_PRODUCT_EDGE_830 ((FIT_GARMIN_PRODUCT)3122) -#define FIT_GARMIN_PRODUCT_INSTINCT_ESPORTS ((FIT_GARMIN_PRODUCT)3126) -#define FIT_GARMIN_PRODUCT_FENIX5S_PLUS_APAC ((FIT_GARMIN_PRODUCT)3134) -#define FIT_GARMIN_PRODUCT_FENIX5X_PLUS_APAC ((FIT_GARMIN_PRODUCT)3135) -#define FIT_GARMIN_PRODUCT_EDGE_520_PLUS_APAC ((FIT_GARMIN_PRODUCT)3142) -#define FIT_GARMIN_PRODUCT_DESCENT_T1 ((FIT_GARMIN_PRODUCT)3143) -#define FIT_GARMIN_PRODUCT_FR235L_ASIA ((FIT_GARMIN_PRODUCT)3144) -#define FIT_GARMIN_PRODUCT_FR245_ASIA ((FIT_GARMIN_PRODUCT)3145) -#define FIT_GARMIN_PRODUCT_VIVO_ACTIVE3M_APAC ((FIT_GARMIN_PRODUCT)3163) -#define FIT_GARMIN_PRODUCT_GEN3_BSM ((FIT_GARMIN_PRODUCT)3192) // gen3 bike speed sensor -#define FIT_GARMIN_PRODUCT_GEN3_BCM ((FIT_GARMIN_PRODUCT)3193) // gen3 bike cadence sensor -#define FIT_GARMIN_PRODUCT_VIVO_SMART4_ASIA ((FIT_GARMIN_PRODUCT)3218) -#define FIT_GARMIN_PRODUCT_VIVOACTIVE4_SMALL ((FIT_GARMIN_PRODUCT)3224) -#define FIT_GARMIN_PRODUCT_VIVOACTIVE4_LARGE ((FIT_GARMIN_PRODUCT)3225) -#define FIT_GARMIN_PRODUCT_VENU ((FIT_GARMIN_PRODUCT)3226) -#define FIT_GARMIN_PRODUCT_MARQ_DRIVER ((FIT_GARMIN_PRODUCT)3246) -#define FIT_GARMIN_PRODUCT_MARQ_AVIATOR ((FIT_GARMIN_PRODUCT)3247) -#define FIT_GARMIN_PRODUCT_MARQ_CAPTAIN ((FIT_GARMIN_PRODUCT)3248) -#define FIT_GARMIN_PRODUCT_MARQ_COMMANDER ((FIT_GARMIN_PRODUCT)3249) -#define FIT_GARMIN_PRODUCT_MARQ_EXPEDITION ((FIT_GARMIN_PRODUCT)3250) -#define FIT_GARMIN_PRODUCT_MARQ_ATHLETE ((FIT_GARMIN_PRODUCT)3251) -#define FIT_GARMIN_PRODUCT_DESCENT_MK2 ((FIT_GARMIN_PRODUCT)3258) -#define FIT_GARMIN_PRODUCT_GPSMAP66I ((FIT_GARMIN_PRODUCT)3284) -#define FIT_GARMIN_PRODUCT_FENIX6S_SPORT ((FIT_GARMIN_PRODUCT)3287) -#define FIT_GARMIN_PRODUCT_FENIX6S ((FIT_GARMIN_PRODUCT)3288) -#define FIT_GARMIN_PRODUCT_FENIX6_SPORT ((FIT_GARMIN_PRODUCT)3289) -#define FIT_GARMIN_PRODUCT_FENIX6 ((FIT_GARMIN_PRODUCT)3290) -#define FIT_GARMIN_PRODUCT_FENIX6X ((FIT_GARMIN_PRODUCT)3291) -#define FIT_GARMIN_PRODUCT_HRM_DUAL ((FIT_GARMIN_PRODUCT)3299) // HRM-Dual -#define FIT_GARMIN_PRODUCT_HRM_PRO ((FIT_GARMIN_PRODUCT)3300) // HRM-Pro -#define FIT_GARMIN_PRODUCT_VIVO_MOVE3_PREMIUM ((FIT_GARMIN_PRODUCT)3308) -#define FIT_GARMIN_PRODUCT_APPROACH_S40 ((FIT_GARMIN_PRODUCT)3314) -#define FIT_GARMIN_PRODUCT_FR245M_ASIA ((FIT_GARMIN_PRODUCT)3321) -#define FIT_GARMIN_PRODUCT_EDGE_530_APAC ((FIT_GARMIN_PRODUCT)3349) -#define FIT_GARMIN_PRODUCT_EDGE_830_APAC ((FIT_GARMIN_PRODUCT)3350) -#define FIT_GARMIN_PRODUCT_VIVO_MOVE3 ((FIT_GARMIN_PRODUCT)3378) -#define FIT_GARMIN_PRODUCT_VIVO_ACTIVE4_SMALL_ASIA ((FIT_GARMIN_PRODUCT)3387) -#define FIT_GARMIN_PRODUCT_VIVO_ACTIVE4_LARGE_ASIA ((FIT_GARMIN_PRODUCT)3388) -#define FIT_GARMIN_PRODUCT_VIVO_ACTIVE4_OLED_ASIA ((FIT_GARMIN_PRODUCT)3389) -#define FIT_GARMIN_PRODUCT_SWIM2 ((FIT_GARMIN_PRODUCT)3405) -#define FIT_GARMIN_PRODUCT_MARQ_DRIVER_ASIA ((FIT_GARMIN_PRODUCT)3420) -#define FIT_GARMIN_PRODUCT_MARQ_AVIATOR_ASIA ((FIT_GARMIN_PRODUCT)3421) -#define FIT_GARMIN_PRODUCT_VIVO_MOVE3_ASIA ((FIT_GARMIN_PRODUCT)3422) -#define FIT_GARMIN_PRODUCT_FR945_ASIA ((FIT_GARMIN_PRODUCT)3441) -#define FIT_GARMIN_PRODUCT_VIVO_ACTIVE3T_CHN ((FIT_GARMIN_PRODUCT)3446) -#define FIT_GARMIN_PRODUCT_MARQ_CAPTAIN_ASIA ((FIT_GARMIN_PRODUCT)3448) -#define FIT_GARMIN_PRODUCT_MARQ_COMMANDER_ASIA ((FIT_GARMIN_PRODUCT)3449) -#define FIT_GARMIN_PRODUCT_MARQ_EXPEDITION_ASIA ((FIT_GARMIN_PRODUCT)3450) -#define FIT_GARMIN_PRODUCT_MARQ_ATHLETE_ASIA ((FIT_GARMIN_PRODUCT)3451) -#define FIT_GARMIN_PRODUCT_INSTINCT_SOLAR ((FIT_GARMIN_PRODUCT)3466) -#define FIT_GARMIN_PRODUCT_FR45_ASIA ((FIT_GARMIN_PRODUCT)3469) -#define FIT_GARMIN_PRODUCT_VIVOACTIVE3_DAIMLER ((FIT_GARMIN_PRODUCT)3473) -#define FIT_GARMIN_PRODUCT_LEGACY_REY ((FIT_GARMIN_PRODUCT)3498) -#define FIT_GARMIN_PRODUCT_LEGACY_DARTH_VADER ((FIT_GARMIN_PRODUCT)3499) -#define FIT_GARMIN_PRODUCT_LEGACY_CAPTAIN_MARVEL ((FIT_GARMIN_PRODUCT)3500) -#define FIT_GARMIN_PRODUCT_LEGACY_FIRST_AVENGER ((FIT_GARMIN_PRODUCT)3501) -#define FIT_GARMIN_PRODUCT_FENIX6S_SPORT_ASIA ((FIT_GARMIN_PRODUCT)3512) -#define FIT_GARMIN_PRODUCT_FENIX6S_ASIA ((FIT_GARMIN_PRODUCT)3513) -#define FIT_GARMIN_PRODUCT_FENIX6_SPORT_ASIA ((FIT_GARMIN_PRODUCT)3514) -#define FIT_GARMIN_PRODUCT_FENIX6_ASIA ((FIT_GARMIN_PRODUCT)3515) -#define FIT_GARMIN_PRODUCT_FENIX6X_ASIA ((FIT_GARMIN_PRODUCT)3516) -#define FIT_GARMIN_PRODUCT_LEGACY_CAPTAIN_MARVEL_ASIA ((FIT_GARMIN_PRODUCT)3535) -#define FIT_GARMIN_PRODUCT_LEGACY_FIRST_AVENGER_ASIA ((FIT_GARMIN_PRODUCT)3536) -#define FIT_GARMIN_PRODUCT_LEGACY_REY_ASIA ((FIT_GARMIN_PRODUCT)3537) -#define FIT_GARMIN_PRODUCT_LEGACY_DARTH_VADER_ASIA ((FIT_GARMIN_PRODUCT)3538) -#define FIT_GARMIN_PRODUCT_DESCENT_MK2S ((FIT_GARMIN_PRODUCT)3542) -#define FIT_GARMIN_PRODUCT_EDGE_130_PLUS ((FIT_GARMIN_PRODUCT)3558) -#define FIT_GARMIN_PRODUCT_EDGE_1030_PLUS ((FIT_GARMIN_PRODUCT)3570) -#define FIT_GARMIN_PRODUCT_RALLY_200 ((FIT_GARMIN_PRODUCT)3578) // Rally 100/200 Power Meter Series -#define FIT_GARMIN_PRODUCT_FR745 ((FIT_GARMIN_PRODUCT)3589) -#define FIT_GARMIN_PRODUCT_VENUSQ ((FIT_GARMIN_PRODUCT)3600) -#define FIT_GARMIN_PRODUCT_LILY ((FIT_GARMIN_PRODUCT)3615) -#define FIT_GARMIN_PRODUCT_MARQ_ADVENTURER ((FIT_GARMIN_PRODUCT)3624) -#define FIT_GARMIN_PRODUCT_ENDURO ((FIT_GARMIN_PRODUCT)3638) -#define FIT_GARMIN_PRODUCT_SWIM2_APAC ((FIT_GARMIN_PRODUCT)3639) -#define FIT_GARMIN_PRODUCT_MARQ_ADVENTURER_ASIA ((FIT_GARMIN_PRODUCT)3648) -#define FIT_GARMIN_PRODUCT_FR945_LTE ((FIT_GARMIN_PRODUCT)3652) -#define FIT_GARMIN_PRODUCT_DESCENT_MK2_ASIA ((FIT_GARMIN_PRODUCT)3702) // Mk2 and Mk2i -#define FIT_GARMIN_PRODUCT_VENU2 ((FIT_GARMIN_PRODUCT)3703) -#define FIT_GARMIN_PRODUCT_VENU2S ((FIT_GARMIN_PRODUCT)3704) -#define FIT_GARMIN_PRODUCT_VENU_DAIMLER_ASIA ((FIT_GARMIN_PRODUCT)3737) -#define FIT_GARMIN_PRODUCT_MARQ_GOLFER ((FIT_GARMIN_PRODUCT)3739) -#define FIT_GARMIN_PRODUCT_VENU_DAIMLER ((FIT_GARMIN_PRODUCT)3740) -#define FIT_GARMIN_PRODUCT_FR745_ASIA ((FIT_GARMIN_PRODUCT)3794) -#define FIT_GARMIN_PRODUCT_LILY_ASIA ((FIT_GARMIN_PRODUCT)3809) -#define FIT_GARMIN_PRODUCT_EDGE_1030_PLUS_ASIA ((FIT_GARMIN_PRODUCT)3812) -#define FIT_GARMIN_PRODUCT_EDGE_130_PLUS_ASIA ((FIT_GARMIN_PRODUCT)3813) -#define FIT_GARMIN_PRODUCT_APPROACH_S12 ((FIT_GARMIN_PRODUCT)3823) -#define FIT_GARMIN_PRODUCT_ENDURO_ASIA ((FIT_GARMIN_PRODUCT)3872) -#define FIT_GARMIN_PRODUCT_VENUSQ_ASIA ((FIT_GARMIN_PRODUCT)3837) -#define FIT_GARMIN_PRODUCT_EDGE_1040 ((FIT_GARMIN_PRODUCT)3843) -#define FIT_GARMIN_PRODUCT_MARQ_GOLFER_ASIA ((FIT_GARMIN_PRODUCT)3850) -#define FIT_GARMIN_PRODUCT_VENU2_PLUS ((FIT_GARMIN_PRODUCT)3851) -#define FIT_GARMIN_PRODUCT_GNSS ((FIT_GARMIN_PRODUCT)3865) -#define FIT_GARMIN_PRODUCT_FR55 ((FIT_GARMIN_PRODUCT)3869) -#define FIT_GARMIN_PRODUCT_INSTINCT_2 ((FIT_GARMIN_PRODUCT)3888) -#define FIT_GARMIN_PRODUCT_FENIX7S ((FIT_GARMIN_PRODUCT)3905) -#define FIT_GARMIN_PRODUCT_FENIX7 ((FIT_GARMIN_PRODUCT)3906) -#define FIT_GARMIN_PRODUCT_FENIX7X ((FIT_GARMIN_PRODUCT)3907) -#define FIT_GARMIN_PRODUCT_FENIX7S_APAC ((FIT_GARMIN_PRODUCT)3908) -#define FIT_GARMIN_PRODUCT_FENIX7_APAC ((FIT_GARMIN_PRODUCT)3909) -#define FIT_GARMIN_PRODUCT_FENIX7X_APAC ((FIT_GARMIN_PRODUCT)3910) -#define FIT_GARMIN_PRODUCT_APPROACH_G12 ((FIT_GARMIN_PRODUCT) 3927) -#define FIT_GARMIN_PRODUCT_DESCENT_MK2S_ASIA ((FIT_GARMIN_PRODUCT)3930) -#define FIT_GARMIN_PRODUCT_APPROACH_S42 ((FIT_GARMIN_PRODUCT)3934) -#define FIT_GARMIN_PRODUCT_EPIX_GEN2 ((FIT_GARMIN_PRODUCT)3943) -#define FIT_GARMIN_PRODUCT_EPIX_GEN2_APAC ((FIT_GARMIN_PRODUCT)3944) -#define FIT_GARMIN_PRODUCT_VENU2S_ASIA ((FIT_GARMIN_PRODUCT)3949) -#define FIT_GARMIN_PRODUCT_VENU2_ASIA ((FIT_GARMIN_PRODUCT)3950) -#define FIT_GARMIN_PRODUCT_FR945_LTE_ASIA ((FIT_GARMIN_PRODUCT)3978) -#define FIT_GARMIN_PRODUCT_VIVO_MOVE_SPORT ((FIT_GARMIN_PRODUCT)3982) -#define FIT_GARMIN_PRODUCT_VIVOMOVE_TREND ((FIT_GARMIN_PRODUCT)3983) -#define FIT_GARMIN_PRODUCT_APPROACH_S12_ASIA ((FIT_GARMIN_PRODUCT)3986) -#define FIT_GARMIN_PRODUCT_FR255_MUSIC ((FIT_GARMIN_PRODUCT)3990) -#define FIT_GARMIN_PRODUCT_FR255_SMALL_MUSIC ((FIT_GARMIN_PRODUCT)3991) -#define FIT_GARMIN_PRODUCT_FR255 ((FIT_GARMIN_PRODUCT)3992) -#define FIT_GARMIN_PRODUCT_FR255_SMALL ((FIT_GARMIN_PRODUCT)3993) -#define FIT_GARMIN_PRODUCT_APPROACH_G12_ASIA ((FIT_GARMIN_PRODUCT) 4001) -#define FIT_GARMIN_PRODUCT_APPROACH_S42_ASIA ((FIT_GARMIN_PRODUCT)4002) -#define FIT_GARMIN_PRODUCT_DESCENT_G1 ((FIT_GARMIN_PRODUCT)4005) -#define FIT_GARMIN_PRODUCT_VENU2_PLUS_ASIA ((FIT_GARMIN_PRODUCT)4017) -#define FIT_GARMIN_PRODUCT_FR955 ((FIT_GARMIN_PRODUCT)4024) -#define FIT_GARMIN_PRODUCT_FR55_ASIA ((FIT_GARMIN_PRODUCT)4033) -#define FIT_GARMIN_PRODUCT_EDGE_540 ((FIT_GARMIN_PRODUCT)4061) -#define FIT_GARMIN_PRODUCT_EDGE_840 ((FIT_GARMIN_PRODUCT)4062) -#define FIT_GARMIN_PRODUCT_VIVOSMART_5 ((FIT_GARMIN_PRODUCT)4063) -#define FIT_GARMIN_PRODUCT_INSTINCT_2_ASIA ((FIT_GARMIN_PRODUCT)4071) -#define FIT_GARMIN_PRODUCT_MARQ_GEN2 ((FIT_GARMIN_PRODUCT)4105) // Adventurer, Athlete, Captain, Golfer -#define FIT_GARMIN_PRODUCT_VENUSQ2 ((FIT_GARMIN_PRODUCT)4115) -#define FIT_GARMIN_PRODUCT_VENUSQ2MUSIC ((FIT_GARMIN_PRODUCT)4116) -#define FIT_GARMIN_PRODUCT_MARQ_GEN2_AVIATOR ((FIT_GARMIN_PRODUCT)4124) -#define FIT_GARMIN_PRODUCT_D2_AIR_X10 ((FIT_GARMIN_PRODUCT)4125) -#define FIT_GARMIN_PRODUCT_HRM_PRO_PLUS ((FIT_GARMIN_PRODUCT)4130) -#define FIT_GARMIN_PRODUCT_DESCENT_G1_ASIA ((FIT_GARMIN_PRODUCT)4132) -#define FIT_GARMIN_PRODUCT_TACTIX7 ((FIT_GARMIN_PRODUCT)4135) -#define FIT_GARMIN_PRODUCT_INSTINCT_CROSSOVER ((FIT_GARMIN_PRODUCT)4155) -#define FIT_GARMIN_PRODUCT_EDGE_EXPLORE2 ((FIT_GARMIN_PRODUCT)4169) -#define FIT_GARMIN_PRODUCT_APPROACH_S70 ((FIT_GARMIN_PRODUCT)4233) -#define FIT_GARMIN_PRODUCT_FR265_LARGE ((FIT_GARMIN_PRODUCT)4257) -#define FIT_GARMIN_PRODUCT_FR265_SMALL ((FIT_GARMIN_PRODUCT)4258) -#define FIT_GARMIN_PRODUCT_TACX_NEO_SMART ((FIT_GARMIN_PRODUCT)4265) // Neo Smart, Tacx -#define FIT_GARMIN_PRODUCT_TACX_NEO2_SMART ((FIT_GARMIN_PRODUCT)4266) // Neo 2 Smart, Tacx -#define FIT_GARMIN_PRODUCT_TACX_NEO2_T_SMART ((FIT_GARMIN_PRODUCT)4267) // Neo 2T Smart, Tacx -#define FIT_GARMIN_PRODUCT_TACX_NEO_SMART_BIKE ((FIT_GARMIN_PRODUCT)4268) // Neo Smart Bike, Tacx -#define FIT_GARMIN_PRODUCT_TACX_SATORI_SMART ((FIT_GARMIN_PRODUCT)4269) // Satori Smart, Tacx -#define FIT_GARMIN_PRODUCT_TACX_FLOW_SMART ((FIT_GARMIN_PRODUCT)4270) // Flow Smart, Tacx -#define FIT_GARMIN_PRODUCT_TACX_VORTEX_SMART ((FIT_GARMIN_PRODUCT)4271) // Vortex Smart, Tacx -#define FIT_GARMIN_PRODUCT_TACX_BUSHIDO_SMART ((FIT_GARMIN_PRODUCT)4272) // Bushido Smart, Tacx -#define FIT_GARMIN_PRODUCT_TACX_GENIUS_SMART ((FIT_GARMIN_PRODUCT)4273) // Genius Smart, Tacx -#define FIT_GARMIN_PRODUCT_TACX_FLUX_FLUX_S_SMART ((FIT_GARMIN_PRODUCT)4274) // Flux/Flux S Smart, Tacx -#define FIT_GARMIN_PRODUCT_TACX_FLUX2_SMART ((FIT_GARMIN_PRODUCT)4275) // Flux 2 Smart, Tacx -#define FIT_GARMIN_PRODUCT_TACX_MAGNUM ((FIT_GARMIN_PRODUCT)4276) // Magnum, Tacx -#define FIT_GARMIN_PRODUCT_EDGE_1040_ASIA ((FIT_GARMIN_PRODUCT)4305) -#define FIT_GARMIN_PRODUCT_EPIX_GEN2_PRO_42 ((FIT_GARMIN_PRODUCT)4312) -#define FIT_GARMIN_PRODUCT_EPIX_GEN2_PRO_47 ((FIT_GARMIN_PRODUCT)4313) -#define FIT_GARMIN_PRODUCT_EPIX_GEN2_PRO_51 ((FIT_GARMIN_PRODUCT)4314) -#define FIT_GARMIN_PRODUCT_FR965 ((FIT_GARMIN_PRODUCT)4315) -#define FIT_GARMIN_PRODUCT_ENDURO2 ((FIT_GARMIN_PRODUCT)4341) -#define FIT_GARMIN_PRODUCT_FENIX7_PRO_SOLAR ((FIT_GARMIN_PRODUCT)4375) -#define FIT_GARMIN_PRODUCT_INSTINCT_2X ((FIT_GARMIN_PRODUCT)4394) -#define FIT_GARMIN_PRODUCT_DESCENT_T2 ((FIT_GARMIN_PRODUCT)4442) -#define FIT_GARMIN_PRODUCT_SDM4 ((FIT_GARMIN_PRODUCT)10007) // SDM4 footpod -#define FIT_GARMIN_PRODUCT_EDGE_REMOTE ((FIT_GARMIN_PRODUCT)10014) -#define FIT_GARMIN_PRODUCT_TACX_TRAINING_APP_WIN ((FIT_GARMIN_PRODUCT)20533) -#define FIT_GARMIN_PRODUCT_TACX_TRAINING_APP_MAC ((FIT_GARMIN_PRODUCT)20534) -#define FIT_GARMIN_PRODUCT_TACX_TRAINING_APP_MAC_CATALYST ((FIT_GARMIN_PRODUCT)20565) -#define FIT_GARMIN_PRODUCT_TRAINING_CENTER ((FIT_GARMIN_PRODUCT)20119) -#define FIT_GARMIN_PRODUCT_TACX_TRAINING_APP_ANDROID ((FIT_GARMIN_PRODUCT)30045) -#define FIT_GARMIN_PRODUCT_TACX_TRAINING_APP_IOS ((FIT_GARMIN_PRODUCT)30046) -#define FIT_GARMIN_PRODUCT_TACX_TRAINING_APP_LEGACY ((FIT_GARMIN_PRODUCT)30047) -#define FIT_GARMIN_PRODUCT_CONNECTIQ_SIMULATOR ((FIT_GARMIN_PRODUCT)65531) -#define FIT_GARMIN_PRODUCT_ANDROID_ANTPLUS_PLUGIN ((FIT_GARMIN_PRODUCT)65532) -#define FIT_GARMIN_PRODUCT_CONNECT ((FIT_GARMIN_PRODUCT)65534) // Garmin Connect website -#define FIT_GARMIN_PRODUCT_COUNT 419 - -typedef FIT_UINT8 FIT_ANTPLUS_DEVICE_TYPE; -#define FIT_ANTPLUS_DEVICE_TYPE_INVALID FIT_UINT8_INVALID -#define FIT_ANTPLUS_DEVICE_TYPE_ANTFS ((FIT_ANTPLUS_DEVICE_TYPE)1) -#define FIT_ANTPLUS_DEVICE_TYPE_BIKE_POWER ((FIT_ANTPLUS_DEVICE_TYPE)11) -#define FIT_ANTPLUS_DEVICE_TYPE_ENVIRONMENT_SENSOR_LEGACY ((FIT_ANTPLUS_DEVICE_TYPE)12) -#define FIT_ANTPLUS_DEVICE_TYPE_MULTI_SPORT_SPEED_DISTANCE ((FIT_ANTPLUS_DEVICE_TYPE)15) -#define FIT_ANTPLUS_DEVICE_TYPE_CONTROL ((FIT_ANTPLUS_DEVICE_TYPE)16) -#define FIT_ANTPLUS_DEVICE_TYPE_FITNESS_EQUIPMENT ((FIT_ANTPLUS_DEVICE_TYPE)17) -#define FIT_ANTPLUS_DEVICE_TYPE_BLOOD_PRESSURE ((FIT_ANTPLUS_DEVICE_TYPE)18) -#define FIT_ANTPLUS_DEVICE_TYPE_GEOCACHE_NODE ((FIT_ANTPLUS_DEVICE_TYPE)19) -#define FIT_ANTPLUS_DEVICE_TYPE_LIGHT_ELECTRIC_VEHICLE ((FIT_ANTPLUS_DEVICE_TYPE)20) -#define FIT_ANTPLUS_DEVICE_TYPE_ENV_SENSOR ((FIT_ANTPLUS_DEVICE_TYPE)25) -#define FIT_ANTPLUS_DEVICE_TYPE_RACQUET ((FIT_ANTPLUS_DEVICE_TYPE)26) -#define FIT_ANTPLUS_DEVICE_TYPE_CONTROL_HUB ((FIT_ANTPLUS_DEVICE_TYPE)27) -#define FIT_ANTPLUS_DEVICE_TYPE_MUSCLE_OXYGEN ((FIT_ANTPLUS_DEVICE_TYPE)31) -#define FIT_ANTPLUS_DEVICE_TYPE_SHIFTING ((FIT_ANTPLUS_DEVICE_TYPE)34) -#define FIT_ANTPLUS_DEVICE_TYPE_BIKE_LIGHT_MAIN ((FIT_ANTPLUS_DEVICE_TYPE)35) -#define FIT_ANTPLUS_DEVICE_TYPE_BIKE_LIGHT_SHARED ((FIT_ANTPLUS_DEVICE_TYPE)36) -#define FIT_ANTPLUS_DEVICE_TYPE_EXD ((FIT_ANTPLUS_DEVICE_TYPE)38) -#define FIT_ANTPLUS_DEVICE_TYPE_BIKE_RADAR ((FIT_ANTPLUS_DEVICE_TYPE)40) -#define FIT_ANTPLUS_DEVICE_TYPE_BIKE_AERO ((FIT_ANTPLUS_DEVICE_TYPE)46) -#define FIT_ANTPLUS_DEVICE_TYPE_WEIGHT_SCALE ((FIT_ANTPLUS_DEVICE_TYPE)119) -#define FIT_ANTPLUS_DEVICE_TYPE_HEART_RATE ((FIT_ANTPLUS_DEVICE_TYPE)120) -#define FIT_ANTPLUS_DEVICE_TYPE_BIKE_SPEED_CADENCE ((FIT_ANTPLUS_DEVICE_TYPE)121) -#define FIT_ANTPLUS_DEVICE_TYPE_BIKE_CADENCE ((FIT_ANTPLUS_DEVICE_TYPE)122) -#define FIT_ANTPLUS_DEVICE_TYPE_BIKE_SPEED ((FIT_ANTPLUS_DEVICE_TYPE)123) -#define FIT_ANTPLUS_DEVICE_TYPE_STRIDE_SPEED_DISTANCE ((FIT_ANTPLUS_DEVICE_TYPE)124) -#define FIT_ANTPLUS_DEVICE_TYPE_COUNT 25 - -typedef FIT_ENUM FIT_ANT_NETWORK; -#define FIT_ANT_NETWORK_INVALID FIT_ENUM_INVALID -#define FIT_ANT_NETWORK_PUBLIC ((FIT_ANT_NETWORK)0) -#define FIT_ANT_NETWORK_ANTPLUS ((FIT_ANT_NETWORK)1) -#define FIT_ANT_NETWORK_ANTFS ((FIT_ANT_NETWORK)2) -#define FIT_ANT_NETWORK_PRIVATE ((FIT_ANT_NETWORK)3) -#define FIT_ANT_NETWORK_COUNT 4 - -typedef FIT_UINT32Z FIT_WORKOUT_CAPABILITIES; -#define FIT_WORKOUT_CAPABILITIES_INVALID FIT_UINT32Z_INVALID -#define FIT_WORKOUT_CAPABILITIES_INTERVAL ((FIT_WORKOUT_CAPABILITIES)0x00000001) -#define FIT_WORKOUT_CAPABILITIES_CUSTOM ((FIT_WORKOUT_CAPABILITIES)0x00000002) -#define FIT_WORKOUT_CAPABILITIES_FITNESS_EQUIPMENT ((FIT_WORKOUT_CAPABILITIES)0x00000004) -#define FIT_WORKOUT_CAPABILITIES_FIRSTBEAT ((FIT_WORKOUT_CAPABILITIES)0x00000008) -#define FIT_WORKOUT_CAPABILITIES_NEW_LEAF ((FIT_WORKOUT_CAPABILITIES)0x00000010) -#define FIT_WORKOUT_CAPABILITIES_TCX ((FIT_WORKOUT_CAPABILITIES)0x00000020) // For backwards compatibility. Watch should add missing id fields then clear flag. -#define FIT_WORKOUT_CAPABILITIES_SPEED ((FIT_WORKOUT_CAPABILITIES)0x00000080) // Speed source required for workout step. -#define FIT_WORKOUT_CAPABILITIES_HEART_RATE ((FIT_WORKOUT_CAPABILITIES)0x00000100) // Heart rate source required for workout step. -#define FIT_WORKOUT_CAPABILITIES_DISTANCE ((FIT_WORKOUT_CAPABILITIES)0x00000200) // Distance source required for workout step. -#define FIT_WORKOUT_CAPABILITIES_CADENCE ((FIT_WORKOUT_CAPABILITIES)0x00000400) // Cadence source required for workout step. -#define FIT_WORKOUT_CAPABILITIES_POWER ((FIT_WORKOUT_CAPABILITIES)0x00000800) // Power source required for workout step. -#define FIT_WORKOUT_CAPABILITIES_GRADE ((FIT_WORKOUT_CAPABILITIES)0x00001000) // Grade source required for workout step. -#define FIT_WORKOUT_CAPABILITIES_RESISTANCE ((FIT_WORKOUT_CAPABILITIES)0x00002000) // Resistance source required for workout step. -#define FIT_WORKOUT_CAPABILITIES_PROTECTED ((FIT_WORKOUT_CAPABILITIES)0x00004000) -#define FIT_WORKOUT_CAPABILITIES_COUNT 14 - -typedef FIT_UINT8 FIT_BATTERY_STATUS; -#define FIT_BATTERY_STATUS_INVALID FIT_UINT8_INVALID -#define FIT_BATTERY_STATUS_NEW ((FIT_BATTERY_STATUS)1) -#define FIT_BATTERY_STATUS_GOOD ((FIT_BATTERY_STATUS)2) -#define FIT_BATTERY_STATUS_OK ((FIT_BATTERY_STATUS)3) -#define FIT_BATTERY_STATUS_LOW ((FIT_BATTERY_STATUS)4) -#define FIT_BATTERY_STATUS_CRITICAL ((FIT_BATTERY_STATUS)5) -#define FIT_BATTERY_STATUS_CHARGING ((FIT_BATTERY_STATUS)6) -#define FIT_BATTERY_STATUS_UNKNOWN ((FIT_BATTERY_STATUS)7) -#define FIT_BATTERY_STATUS_COUNT 7 - -typedef FIT_ENUM FIT_HR_TYPE; -#define FIT_HR_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_HR_TYPE_NORMAL ((FIT_HR_TYPE)0) -#define FIT_HR_TYPE_IRREGULAR ((FIT_HR_TYPE)1) -#define FIT_HR_TYPE_COUNT 2 - -typedef FIT_UINT32Z FIT_COURSE_CAPABILITIES; -#define FIT_COURSE_CAPABILITIES_INVALID FIT_UINT32Z_INVALID -#define FIT_COURSE_CAPABILITIES_PROCESSED ((FIT_COURSE_CAPABILITIES)0x00000001) -#define FIT_COURSE_CAPABILITIES_VALID ((FIT_COURSE_CAPABILITIES)0x00000002) -#define FIT_COURSE_CAPABILITIES_TIME ((FIT_COURSE_CAPABILITIES)0x00000004) -#define FIT_COURSE_CAPABILITIES_DISTANCE ((FIT_COURSE_CAPABILITIES)0x00000008) -#define FIT_COURSE_CAPABILITIES_POSITION ((FIT_COURSE_CAPABILITIES)0x00000010) -#define FIT_COURSE_CAPABILITIES_HEART_RATE ((FIT_COURSE_CAPABILITIES)0x00000020) -#define FIT_COURSE_CAPABILITIES_POWER ((FIT_COURSE_CAPABILITIES)0x00000040) -#define FIT_COURSE_CAPABILITIES_CADENCE ((FIT_COURSE_CAPABILITIES)0x00000080) -#define FIT_COURSE_CAPABILITIES_TRAINING ((FIT_COURSE_CAPABILITIES)0x00000100) -#define FIT_COURSE_CAPABILITIES_NAVIGATION ((FIT_COURSE_CAPABILITIES)0x00000200) -#define FIT_COURSE_CAPABILITIES_BIKEWAY ((FIT_COURSE_CAPABILITIES)0x00000400) -#define FIT_COURSE_CAPABILITIES_AVIATION ((FIT_COURSE_CAPABILITIES)0x00001000) // Denote course files to be used as flight plans -#define FIT_COURSE_CAPABILITIES_COUNT 12 - -typedef FIT_UINT16 FIT_WEIGHT; -#define FIT_WEIGHT_INVALID FIT_UINT16_INVALID -#define FIT_WEIGHT_CALCULATING ((FIT_WEIGHT)0xFFFE) -#define FIT_WEIGHT_COUNT 1 - -typedef FIT_UINT32 FIT_WORKOUT_HR; // 0 - 100 indicates% of max hr; >100 indicates bpm (255 max) plus 100 -#define FIT_WORKOUT_HR_INVALID FIT_UINT32_INVALID -#define FIT_WORKOUT_HR_BPM_OFFSET ((FIT_WORKOUT_HR)100) -#define FIT_WORKOUT_HR_COUNT 1 - -typedef FIT_UINT32 FIT_WORKOUT_POWER; // 0 - 1000 indicates % of functional threshold power; >1000 indicates watts plus 1000. -#define FIT_WORKOUT_POWER_INVALID FIT_UINT32_INVALID -#define FIT_WORKOUT_POWER_WATTS_OFFSET ((FIT_WORKOUT_POWER)1000) -#define FIT_WORKOUT_POWER_COUNT 1 - -typedef FIT_ENUM FIT_BP_STATUS; -#define FIT_BP_STATUS_INVALID FIT_ENUM_INVALID -#define FIT_BP_STATUS_NO_ERROR ((FIT_BP_STATUS)0) -#define FIT_BP_STATUS_ERROR_INCOMPLETE_DATA ((FIT_BP_STATUS)1) -#define FIT_BP_STATUS_ERROR_NO_MEASUREMENT ((FIT_BP_STATUS)2) -#define FIT_BP_STATUS_ERROR_DATA_OUT_OF_RANGE ((FIT_BP_STATUS)3) -#define FIT_BP_STATUS_ERROR_IRREGULAR_HEART_RATE ((FIT_BP_STATUS)4) -#define FIT_BP_STATUS_COUNT 5 - -typedef FIT_UINT16 FIT_USER_LOCAL_ID; -#define FIT_USER_LOCAL_ID_INVALID FIT_UINT16_INVALID -#define FIT_USER_LOCAL_ID_LOCAL_MIN ((FIT_USER_LOCAL_ID)0x0000) -#define FIT_USER_LOCAL_ID_LOCAL_MAX ((FIT_USER_LOCAL_ID)0x000F) -#define FIT_USER_LOCAL_ID_STATIONARY_MIN ((FIT_USER_LOCAL_ID)0x0010) -#define FIT_USER_LOCAL_ID_STATIONARY_MAX ((FIT_USER_LOCAL_ID)0x00FF) -#define FIT_USER_LOCAL_ID_PORTABLE_MIN ((FIT_USER_LOCAL_ID)0x0100) -#define FIT_USER_LOCAL_ID_PORTABLE_MAX ((FIT_USER_LOCAL_ID)0xFFFE) -#define FIT_USER_LOCAL_ID_COUNT 6 - -typedef FIT_ENUM FIT_SWIM_STROKE; -#define FIT_SWIM_STROKE_INVALID FIT_ENUM_INVALID -#define FIT_SWIM_STROKE_FREESTYLE ((FIT_SWIM_STROKE)0) -#define FIT_SWIM_STROKE_BACKSTROKE ((FIT_SWIM_STROKE)1) -#define FIT_SWIM_STROKE_BREASTSTROKE ((FIT_SWIM_STROKE)2) -#define FIT_SWIM_STROKE_BUTTERFLY ((FIT_SWIM_STROKE)3) -#define FIT_SWIM_STROKE_DRILL ((FIT_SWIM_STROKE)4) -#define FIT_SWIM_STROKE_MIXED ((FIT_SWIM_STROKE)5) -#define FIT_SWIM_STROKE_IM ((FIT_SWIM_STROKE)6) // IM is a mixed interval containing the same number of lengths for each of: Butterfly, Backstroke, Breaststroke, Freestyle, swam in that order. -#define FIT_SWIM_STROKE_COUNT 7 - -typedef FIT_ENUM FIT_ACTIVITY_TYPE; -#define FIT_ACTIVITY_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_ACTIVITY_TYPE_GENERIC ((FIT_ACTIVITY_TYPE)0) -#define FIT_ACTIVITY_TYPE_RUNNING ((FIT_ACTIVITY_TYPE)1) -#define FIT_ACTIVITY_TYPE_CYCLING ((FIT_ACTIVITY_TYPE)2) -#define FIT_ACTIVITY_TYPE_TRANSITION ((FIT_ACTIVITY_TYPE)3) // Mulitsport transition -#define FIT_ACTIVITY_TYPE_FITNESS_EQUIPMENT ((FIT_ACTIVITY_TYPE)4) -#define FIT_ACTIVITY_TYPE_SWIMMING ((FIT_ACTIVITY_TYPE)5) -#define FIT_ACTIVITY_TYPE_WALKING ((FIT_ACTIVITY_TYPE)6) -#define FIT_ACTIVITY_TYPE_SEDENTARY ((FIT_ACTIVITY_TYPE)8) -#define FIT_ACTIVITY_TYPE_ALL ((FIT_ACTIVITY_TYPE)254) // All is for goals only to include all sports. -#define FIT_ACTIVITY_TYPE_COUNT 9 - -typedef FIT_ENUM FIT_ACTIVITY_SUBTYPE; -#define FIT_ACTIVITY_SUBTYPE_INVALID FIT_ENUM_INVALID -#define FIT_ACTIVITY_SUBTYPE_GENERIC ((FIT_ACTIVITY_SUBTYPE)0) -#define FIT_ACTIVITY_SUBTYPE_TREADMILL ((FIT_ACTIVITY_SUBTYPE)1) // Run -#define FIT_ACTIVITY_SUBTYPE_STREET ((FIT_ACTIVITY_SUBTYPE)2) // Run -#define FIT_ACTIVITY_SUBTYPE_TRAIL ((FIT_ACTIVITY_SUBTYPE)3) // Run -#define FIT_ACTIVITY_SUBTYPE_TRACK ((FIT_ACTIVITY_SUBTYPE)4) // Run -#define FIT_ACTIVITY_SUBTYPE_SPIN ((FIT_ACTIVITY_SUBTYPE)5) // Cycling -#define FIT_ACTIVITY_SUBTYPE_INDOOR_CYCLING ((FIT_ACTIVITY_SUBTYPE)6) // Cycling -#define FIT_ACTIVITY_SUBTYPE_ROAD ((FIT_ACTIVITY_SUBTYPE)7) // Cycling -#define FIT_ACTIVITY_SUBTYPE_MOUNTAIN ((FIT_ACTIVITY_SUBTYPE)8) // Cycling -#define FIT_ACTIVITY_SUBTYPE_DOWNHILL ((FIT_ACTIVITY_SUBTYPE)9) // Cycling -#define FIT_ACTIVITY_SUBTYPE_RECUMBENT ((FIT_ACTIVITY_SUBTYPE)10) // Cycling -#define FIT_ACTIVITY_SUBTYPE_CYCLOCROSS ((FIT_ACTIVITY_SUBTYPE)11) // Cycling -#define FIT_ACTIVITY_SUBTYPE_HAND_CYCLING ((FIT_ACTIVITY_SUBTYPE)12) // Cycling -#define FIT_ACTIVITY_SUBTYPE_TRACK_CYCLING ((FIT_ACTIVITY_SUBTYPE)13) // Cycling -#define FIT_ACTIVITY_SUBTYPE_INDOOR_ROWING ((FIT_ACTIVITY_SUBTYPE)14) // Fitness Equipment -#define FIT_ACTIVITY_SUBTYPE_ELLIPTICAL ((FIT_ACTIVITY_SUBTYPE)15) // Fitness Equipment -#define FIT_ACTIVITY_SUBTYPE_STAIR_CLIMBING ((FIT_ACTIVITY_SUBTYPE)16) // Fitness Equipment -#define FIT_ACTIVITY_SUBTYPE_LAP_SWIMMING ((FIT_ACTIVITY_SUBTYPE)17) // Swimming -#define FIT_ACTIVITY_SUBTYPE_OPEN_WATER ((FIT_ACTIVITY_SUBTYPE)18) // Swimming -#define FIT_ACTIVITY_SUBTYPE_ALL ((FIT_ACTIVITY_SUBTYPE)254) -#define FIT_ACTIVITY_SUBTYPE_COUNT 20 - -typedef FIT_ENUM FIT_ACTIVITY_LEVEL; -#define FIT_ACTIVITY_LEVEL_INVALID FIT_ENUM_INVALID -#define FIT_ACTIVITY_LEVEL_LOW ((FIT_ACTIVITY_LEVEL)0) -#define FIT_ACTIVITY_LEVEL_MEDIUM ((FIT_ACTIVITY_LEVEL)1) -#define FIT_ACTIVITY_LEVEL_HIGH ((FIT_ACTIVITY_LEVEL)2) -#define FIT_ACTIVITY_LEVEL_COUNT 3 - -typedef FIT_ENUM FIT_SIDE; -#define FIT_SIDE_INVALID FIT_ENUM_INVALID -#define FIT_SIDE_RIGHT ((FIT_SIDE)0) -#define FIT_SIDE_LEFT ((FIT_SIDE)1) -#define FIT_SIDE_COUNT 2 - -typedef FIT_UINT8 FIT_LEFT_RIGHT_BALANCE; -#define FIT_LEFT_RIGHT_BALANCE_INVALID FIT_UINT8_INVALID -#define FIT_LEFT_RIGHT_BALANCE_MASK ((FIT_LEFT_RIGHT_BALANCE)0x7F) // % contribution -#define FIT_LEFT_RIGHT_BALANCE_RIGHT ((FIT_LEFT_RIGHT_BALANCE)0x80) // data corresponds to right if set, otherwise unknown -#define FIT_LEFT_RIGHT_BALANCE_COUNT 2 - -typedef FIT_UINT16 FIT_LEFT_RIGHT_BALANCE_100; -#define FIT_LEFT_RIGHT_BALANCE_100_INVALID FIT_UINT16_INVALID -#define FIT_LEFT_RIGHT_BALANCE_100_MASK ((FIT_LEFT_RIGHT_BALANCE_100)0x3FFF) // % contribution scaled by 100 -#define FIT_LEFT_RIGHT_BALANCE_100_RIGHT ((FIT_LEFT_RIGHT_BALANCE_100)0x8000) // data corresponds to right if set, otherwise unknown -#define FIT_LEFT_RIGHT_BALANCE_100_COUNT 2 - -typedef FIT_ENUM FIT_LENGTH_TYPE; -#define FIT_LENGTH_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_LENGTH_TYPE_IDLE ((FIT_LENGTH_TYPE)0) // Rest period. Length with no strokes -#define FIT_LENGTH_TYPE_ACTIVE ((FIT_LENGTH_TYPE)1) // Length with strokes. -#define FIT_LENGTH_TYPE_COUNT 2 - -typedef FIT_ENUM FIT_DAY_OF_WEEK; -#define FIT_DAY_OF_WEEK_INVALID FIT_ENUM_INVALID -#define FIT_DAY_OF_WEEK_SUNDAY ((FIT_DAY_OF_WEEK)0) -#define FIT_DAY_OF_WEEK_MONDAY ((FIT_DAY_OF_WEEK)1) -#define FIT_DAY_OF_WEEK_TUESDAY ((FIT_DAY_OF_WEEK)2) -#define FIT_DAY_OF_WEEK_WEDNESDAY ((FIT_DAY_OF_WEEK)3) -#define FIT_DAY_OF_WEEK_THURSDAY ((FIT_DAY_OF_WEEK)4) -#define FIT_DAY_OF_WEEK_FRIDAY ((FIT_DAY_OF_WEEK)5) -#define FIT_DAY_OF_WEEK_SATURDAY ((FIT_DAY_OF_WEEK)6) -#define FIT_DAY_OF_WEEK_COUNT 7 - -typedef FIT_UINT32Z FIT_CONNECTIVITY_CAPABILITIES; -#define FIT_CONNECTIVITY_CAPABILITIES_INVALID FIT_UINT32Z_INVALID -#define FIT_CONNECTIVITY_CAPABILITIES_BLUETOOTH ((FIT_CONNECTIVITY_CAPABILITIES)0x00000001) -#define FIT_CONNECTIVITY_CAPABILITIES_BLUETOOTH_LE ((FIT_CONNECTIVITY_CAPABILITIES)0x00000002) -#define FIT_CONNECTIVITY_CAPABILITIES_ANT ((FIT_CONNECTIVITY_CAPABILITIES)0x00000004) -#define FIT_CONNECTIVITY_CAPABILITIES_ACTIVITY_UPLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00000008) -#define FIT_CONNECTIVITY_CAPABILITIES_COURSE_DOWNLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00000010) -#define FIT_CONNECTIVITY_CAPABILITIES_WORKOUT_DOWNLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00000020) -#define FIT_CONNECTIVITY_CAPABILITIES_LIVE_TRACK ((FIT_CONNECTIVITY_CAPABILITIES)0x00000040) -#define FIT_CONNECTIVITY_CAPABILITIES_WEATHER_CONDITIONS ((FIT_CONNECTIVITY_CAPABILITIES)0x00000080) -#define FIT_CONNECTIVITY_CAPABILITIES_WEATHER_ALERTS ((FIT_CONNECTIVITY_CAPABILITIES)0x00000100) -#define FIT_CONNECTIVITY_CAPABILITIES_GPS_EPHEMERIS_DOWNLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00000200) -#define FIT_CONNECTIVITY_CAPABILITIES_EXPLICIT_ARCHIVE ((FIT_CONNECTIVITY_CAPABILITIES)0x00000400) -#define FIT_CONNECTIVITY_CAPABILITIES_SETUP_INCOMPLETE ((FIT_CONNECTIVITY_CAPABILITIES)0x00000800) -#define FIT_CONNECTIVITY_CAPABILITIES_CONTINUE_SYNC_AFTER_SOFTWARE_UPDATE ((FIT_CONNECTIVITY_CAPABILITIES)0x00001000) -#define FIT_CONNECTIVITY_CAPABILITIES_CONNECT_IQ_APP_DOWNLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00002000) -#define FIT_CONNECTIVITY_CAPABILITIES_GOLF_COURSE_DOWNLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00004000) -#define FIT_CONNECTIVITY_CAPABILITIES_DEVICE_INITIATES_SYNC ((FIT_CONNECTIVITY_CAPABILITIES)0x00008000) // Indicates device is in control of initiating all syncs -#define FIT_CONNECTIVITY_CAPABILITIES_CONNECT_IQ_WATCH_APP_DOWNLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00010000) -#define FIT_CONNECTIVITY_CAPABILITIES_CONNECT_IQ_WIDGET_DOWNLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00020000) -#define FIT_CONNECTIVITY_CAPABILITIES_CONNECT_IQ_WATCH_FACE_DOWNLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00040000) -#define FIT_CONNECTIVITY_CAPABILITIES_CONNECT_IQ_DATA_FIELD_DOWNLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00080000) -#define FIT_CONNECTIVITY_CAPABILITIES_CONNECT_IQ_APP_MANAGMENT ((FIT_CONNECTIVITY_CAPABILITIES)0x00100000) // Device supports delete and reorder of apps via GCM -#define FIT_CONNECTIVITY_CAPABILITIES_SWING_SENSOR ((FIT_CONNECTIVITY_CAPABILITIES)0x00200000) -#define FIT_CONNECTIVITY_CAPABILITIES_SWING_SENSOR_REMOTE ((FIT_CONNECTIVITY_CAPABILITIES)0x00400000) -#define FIT_CONNECTIVITY_CAPABILITIES_INCIDENT_DETECTION ((FIT_CONNECTIVITY_CAPABILITIES)0x00800000) // Device supports incident detection -#define FIT_CONNECTIVITY_CAPABILITIES_AUDIO_PROMPTS ((FIT_CONNECTIVITY_CAPABILITIES)0x01000000) -#define FIT_CONNECTIVITY_CAPABILITIES_WIFI_VERIFICATION ((FIT_CONNECTIVITY_CAPABILITIES)0x02000000) // Device supports reporting wifi verification via GCM -#define FIT_CONNECTIVITY_CAPABILITIES_TRUE_UP ((FIT_CONNECTIVITY_CAPABILITIES)0x04000000) // Device supports True Up -#define FIT_CONNECTIVITY_CAPABILITIES_FIND_MY_WATCH ((FIT_CONNECTIVITY_CAPABILITIES)0x08000000) // Device supports Find My Watch -#define FIT_CONNECTIVITY_CAPABILITIES_REMOTE_MANUAL_SYNC ((FIT_CONNECTIVITY_CAPABILITIES)0x10000000) -#define FIT_CONNECTIVITY_CAPABILITIES_LIVE_TRACK_AUTO_START ((FIT_CONNECTIVITY_CAPABILITIES)0x20000000) // Device supports LiveTrack auto start -#define FIT_CONNECTIVITY_CAPABILITIES_LIVE_TRACK_MESSAGING ((FIT_CONNECTIVITY_CAPABILITIES)0x40000000) // Device supports LiveTrack Messaging -#define FIT_CONNECTIVITY_CAPABILITIES_INSTANT_INPUT ((FIT_CONNECTIVITY_CAPABILITIES)0x80000000) // Device supports instant input feature -#define FIT_CONNECTIVITY_CAPABILITIES_COUNT 32 - -typedef FIT_ENUM FIT_WEATHER_REPORT; -#define FIT_WEATHER_REPORT_INVALID FIT_ENUM_INVALID -#define FIT_WEATHER_REPORT_CURRENT ((FIT_WEATHER_REPORT)0) -#define FIT_WEATHER_REPORT_FORECAST ((FIT_WEATHER_REPORT)1) // Deprecated use hourly_forecast instead -#define FIT_WEATHER_REPORT_HOURLY_FORECAST ((FIT_WEATHER_REPORT)1) -#define FIT_WEATHER_REPORT_DAILY_FORECAST ((FIT_WEATHER_REPORT)2) -#define FIT_WEATHER_REPORT_COUNT 4 - -typedef FIT_ENUM FIT_WEATHER_STATUS; -#define FIT_WEATHER_STATUS_INVALID FIT_ENUM_INVALID -#define FIT_WEATHER_STATUS_CLEAR ((FIT_WEATHER_STATUS)0) -#define FIT_WEATHER_STATUS_PARTLY_CLOUDY ((FIT_WEATHER_STATUS)1) -#define FIT_WEATHER_STATUS_MOSTLY_CLOUDY ((FIT_WEATHER_STATUS)2) -#define FIT_WEATHER_STATUS_RAIN ((FIT_WEATHER_STATUS)3) -#define FIT_WEATHER_STATUS_SNOW ((FIT_WEATHER_STATUS)4) -#define FIT_WEATHER_STATUS_WINDY ((FIT_WEATHER_STATUS)5) -#define FIT_WEATHER_STATUS_THUNDERSTORMS ((FIT_WEATHER_STATUS)6) -#define FIT_WEATHER_STATUS_WINTRY_MIX ((FIT_WEATHER_STATUS)7) -#define FIT_WEATHER_STATUS_FOG ((FIT_WEATHER_STATUS)8) -#define FIT_WEATHER_STATUS_HAZY ((FIT_WEATHER_STATUS)11) -#define FIT_WEATHER_STATUS_HAIL ((FIT_WEATHER_STATUS)12) -#define FIT_WEATHER_STATUS_SCATTERED_SHOWERS ((FIT_WEATHER_STATUS)13) -#define FIT_WEATHER_STATUS_SCATTERED_THUNDERSTORMS ((FIT_WEATHER_STATUS)14) -#define FIT_WEATHER_STATUS_UNKNOWN_PRECIPITATION ((FIT_WEATHER_STATUS)15) -#define FIT_WEATHER_STATUS_LIGHT_RAIN ((FIT_WEATHER_STATUS)16) -#define FIT_WEATHER_STATUS_HEAVY_RAIN ((FIT_WEATHER_STATUS)17) -#define FIT_WEATHER_STATUS_LIGHT_SNOW ((FIT_WEATHER_STATUS)18) -#define FIT_WEATHER_STATUS_HEAVY_SNOW ((FIT_WEATHER_STATUS)19) -#define FIT_WEATHER_STATUS_LIGHT_RAIN_SNOW ((FIT_WEATHER_STATUS)20) -#define FIT_WEATHER_STATUS_HEAVY_RAIN_SNOW ((FIT_WEATHER_STATUS)21) -#define FIT_WEATHER_STATUS_CLOUDY ((FIT_WEATHER_STATUS)22) -#define FIT_WEATHER_STATUS_COUNT 21 - -typedef FIT_ENUM FIT_WEATHER_SEVERITY; -#define FIT_WEATHER_SEVERITY_INVALID FIT_ENUM_INVALID -#define FIT_WEATHER_SEVERITY_UNKNOWN ((FIT_WEATHER_SEVERITY)0) -#define FIT_WEATHER_SEVERITY_WARNING ((FIT_WEATHER_SEVERITY)1) -#define FIT_WEATHER_SEVERITY_WATCH ((FIT_WEATHER_SEVERITY)2) -#define FIT_WEATHER_SEVERITY_ADVISORY ((FIT_WEATHER_SEVERITY)3) -#define FIT_WEATHER_SEVERITY_STATEMENT ((FIT_WEATHER_SEVERITY)4) -#define FIT_WEATHER_SEVERITY_COUNT 5 - -typedef FIT_ENUM FIT_WEATHER_SEVERE_TYPE; -#define FIT_WEATHER_SEVERE_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_WEATHER_SEVERE_TYPE_UNSPECIFIED ((FIT_WEATHER_SEVERE_TYPE)0) -#define FIT_WEATHER_SEVERE_TYPE_TORNADO ((FIT_WEATHER_SEVERE_TYPE)1) -#define FIT_WEATHER_SEVERE_TYPE_TSUNAMI ((FIT_WEATHER_SEVERE_TYPE)2) -#define FIT_WEATHER_SEVERE_TYPE_HURRICANE ((FIT_WEATHER_SEVERE_TYPE)3) -#define FIT_WEATHER_SEVERE_TYPE_EXTREME_WIND ((FIT_WEATHER_SEVERE_TYPE)4) -#define FIT_WEATHER_SEVERE_TYPE_TYPHOON ((FIT_WEATHER_SEVERE_TYPE)5) -#define FIT_WEATHER_SEVERE_TYPE_INLAND_HURRICANE ((FIT_WEATHER_SEVERE_TYPE)6) -#define FIT_WEATHER_SEVERE_TYPE_HURRICANE_FORCE_WIND ((FIT_WEATHER_SEVERE_TYPE)7) -#define FIT_WEATHER_SEVERE_TYPE_WATERSPOUT ((FIT_WEATHER_SEVERE_TYPE)8) -#define FIT_WEATHER_SEVERE_TYPE_SEVERE_THUNDERSTORM ((FIT_WEATHER_SEVERE_TYPE)9) -#define FIT_WEATHER_SEVERE_TYPE_WRECKHOUSE_WINDS ((FIT_WEATHER_SEVERE_TYPE)10) -#define FIT_WEATHER_SEVERE_TYPE_LES_SUETES_WIND ((FIT_WEATHER_SEVERE_TYPE)11) -#define FIT_WEATHER_SEVERE_TYPE_AVALANCHE ((FIT_WEATHER_SEVERE_TYPE)12) -#define FIT_WEATHER_SEVERE_TYPE_FLASH_FLOOD ((FIT_WEATHER_SEVERE_TYPE)13) -#define FIT_WEATHER_SEVERE_TYPE_TROPICAL_STORM ((FIT_WEATHER_SEVERE_TYPE)14) -#define FIT_WEATHER_SEVERE_TYPE_INLAND_TROPICAL_STORM ((FIT_WEATHER_SEVERE_TYPE)15) -#define FIT_WEATHER_SEVERE_TYPE_BLIZZARD ((FIT_WEATHER_SEVERE_TYPE)16) -#define FIT_WEATHER_SEVERE_TYPE_ICE_STORM ((FIT_WEATHER_SEVERE_TYPE)17) -#define FIT_WEATHER_SEVERE_TYPE_FREEZING_RAIN ((FIT_WEATHER_SEVERE_TYPE)18) -#define FIT_WEATHER_SEVERE_TYPE_DEBRIS_FLOW ((FIT_WEATHER_SEVERE_TYPE)19) -#define FIT_WEATHER_SEVERE_TYPE_FLASH_FREEZE ((FIT_WEATHER_SEVERE_TYPE)20) -#define FIT_WEATHER_SEVERE_TYPE_DUST_STORM ((FIT_WEATHER_SEVERE_TYPE)21) -#define FIT_WEATHER_SEVERE_TYPE_HIGH_WIND ((FIT_WEATHER_SEVERE_TYPE)22) -#define FIT_WEATHER_SEVERE_TYPE_WINTER_STORM ((FIT_WEATHER_SEVERE_TYPE)23) -#define FIT_WEATHER_SEVERE_TYPE_HEAVY_FREEZING_SPRAY ((FIT_WEATHER_SEVERE_TYPE)24) -#define FIT_WEATHER_SEVERE_TYPE_EXTREME_COLD ((FIT_WEATHER_SEVERE_TYPE)25) -#define FIT_WEATHER_SEVERE_TYPE_WIND_CHILL ((FIT_WEATHER_SEVERE_TYPE)26) -#define FIT_WEATHER_SEVERE_TYPE_COLD_WAVE ((FIT_WEATHER_SEVERE_TYPE)27) -#define FIT_WEATHER_SEVERE_TYPE_HEAVY_SNOW_ALERT ((FIT_WEATHER_SEVERE_TYPE)28) -#define FIT_WEATHER_SEVERE_TYPE_LAKE_EFFECT_BLOWING_SNOW ((FIT_WEATHER_SEVERE_TYPE)29) -#define FIT_WEATHER_SEVERE_TYPE_SNOW_SQUALL ((FIT_WEATHER_SEVERE_TYPE)30) -#define FIT_WEATHER_SEVERE_TYPE_LAKE_EFFECT_SNOW ((FIT_WEATHER_SEVERE_TYPE)31) -#define FIT_WEATHER_SEVERE_TYPE_WINTER_WEATHER ((FIT_WEATHER_SEVERE_TYPE)32) -#define FIT_WEATHER_SEVERE_TYPE_SLEET ((FIT_WEATHER_SEVERE_TYPE)33) -#define FIT_WEATHER_SEVERE_TYPE_SNOWFALL ((FIT_WEATHER_SEVERE_TYPE)34) -#define FIT_WEATHER_SEVERE_TYPE_SNOW_AND_BLOWING_SNOW ((FIT_WEATHER_SEVERE_TYPE)35) -#define FIT_WEATHER_SEVERE_TYPE_BLOWING_SNOW ((FIT_WEATHER_SEVERE_TYPE)36) -#define FIT_WEATHER_SEVERE_TYPE_SNOW_ALERT ((FIT_WEATHER_SEVERE_TYPE)37) -#define FIT_WEATHER_SEVERE_TYPE_ARCTIC_OUTFLOW ((FIT_WEATHER_SEVERE_TYPE)38) -#define FIT_WEATHER_SEVERE_TYPE_FREEZING_DRIZZLE ((FIT_WEATHER_SEVERE_TYPE)39) -#define FIT_WEATHER_SEVERE_TYPE_STORM ((FIT_WEATHER_SEVERE_TYPE)40) -#define FIT_WEATHER_SEVERE_TYPE_STORM_SURGE ((FIT_WEATHER_SEVERE_TYPE)41) -#define FIT_WEATHER_SEVERE_TYPE_RAINFALL ((FIT_WEATHER_SEVERE_TYPE)42) -#define FIT_WEATHER_SEVERE_TYPE_AREAL_FLOOD ((FIT_WEATHER_SEVERE_TYPE)43) -#define FIT_WEATHER_SEVERE_TYPE_COASTAL_FLOOD ((FIT_WEATHER_SEVERE_TYPE)44) -#define FIT_WEATHER_SEVERE_TYPE_LAKESHORE_FLOOD ((FIT_WEATHER_SEVERE_TYPE)45) -#define FIT_WEATHER_SEVERE_TYPE_EXCESSIVE_HEAT ((FIT_WEATHER_SEVERE_TYPE)46) -#define FIT_WEATHER_SEVERE_TYPE_HEAT ((FIT_WEATHER_SEVERE_TYPE)47) -#define FIT_WEATHER_SEVERE_TYPE_WEATHER ((FIT_WEATHER_SEVERE_TYPE)48) -#define FIT_WEATHER_SEVERE_TYPE_HIGH_HEAT_AND_HUMIDITY ((FIT_WEATHER_SEVERE_TYPE)49) -#define FIT_WEATHER_SEVERE_TYPE_HUMIDEX_AND_HEALTH ((FIT_WEATHER_SEVERE_TYPE)50) -#define FIT_WEATHER_SEVERE_TYPE_HUMIDEX ((FIT_WEATHER_SEVERE_TYPE)51) -#define FIT_WEATHER_SEVERE_TYPE_GALE ((FIT_WEATHER_SEVERE_TYPE)52) -#define FIT_WEATHER_SEVERE_TYPE_FREEZING_SPRAY ((FIT_WEATHER_SEVERE_TYPE)53) -#define FIT_WEATHER_SEVERE_TYPE_SPECIAL_MARINE ((FIT_WEATHER_SEVERE_TYPE)54) -#define FIT_WEATHER_SEVERE_TYPE_SQUALL ((FIT_WEATHER_SEVERE_TYPE)55) -#define FIT_WEATHER_SEVERE_TYPE_STRONG_WIND ((FIT_WEATHER_SEVERE_TYPE)56) -#define FIT_WEATHER_SEVERE_TYPE_LAKE_WIND ((FIT_WEATHER_SEVERE_TYPE)57) -#define FIT_WEATHER_SEVERE_TYPE_MARINE_WEATHER ((FIT_WEATHER_SEVERE_TYPE)58) -#define FIT_WEATHER_SEVERE_TYPE_WIND ((FIT_WEATHER_SEVERE_TYPE)59) -#define FIT_WEATHER_SEVERE_TYPE_SMALL_CRAFT_HAZARDOUS_SEAS ((FIT_WEATHER_SEVERE_TYPE)60) -#define FIT_WEATHER_SEVERE_TYPE_HAZARDOUS_SEAS ((FIT_WEATHER_SEVERE_TYPE)61) -#define FIT_WEATHER_SEVERE_TYPE_SMALL_CRAFT ((FIT_WEATHER_SEVERE_TYPE)62) -#define FIT_WEATHER_SEVERE_TYPE_SMALL_CRAFT_WINDS ((FIT_WEATHER_SEVERE_TYPE)63) -#define FIT_WEATHER_SEVERE_TYPE_SMALL_CRAFT_ROUGH_BAR ((FIT_WEATHER_SEVERE_TYPE)64) -#define FIT_WEATHER_SEVERE_TYPE_HIGH_WATER_LEVEL ((FIT_WEATHER_SEVERE_TYPE)65) -#define FIT_WEATHER_SEVERE_TYPE_ASHFALL ((FIT_WEATHER_SEVERE_TYPE)66) -#define FIT_WEATHER_SEVERE_TYPE_FREEZING_FOG ((FIT_WEATHER_SEVERE_TYPE)67) -#define FIT_WEATHER_SEVERE_TYPE_DENSE_FOG ((FIT_WEATHER_SEVERE_TYPE)68) -#define FIT_WEATHER_SEVERE_TYPE_DENSE_SMOKE ((FIT_WEATHER_SEVERE_TYPE)69) -#define FIT_WEATHER_SEVERE_TYPE_BLOWING_DUST ((FIT_WEATHER_SEVERE_TYPE)70) -#define FIT_WEATHER_SEVERE_TYPE_HARD_FREEZE ((FIT_WEATHER_SEVERE_TYPE)71) -#define FIT_WEATHER_SEVERE_TYPE_FREEZE ((FIT_WEATHER_SEVERE_TYPE)72) -#define FIT_WEATHER_SEVERE_TYPE_FROST ((FIT_WEATHER_SEVERE_TYPE)73) -#define FIT_WEATHER_SEVERE_TYPE_FIRE_WEATHER ((FIT_WEATHER_SEVERE_TYPE)74) -#define FIT_WEATHER_SEVERE_TYPE_FLOOD ((FIT_WEATHER_SEVERE_TYPE)75) -#define FIT_WEATHER_SEVERE_TYPE_RIP_TIDE ((FIT_WEATHER_SEVERE_TYPE)76) -#define FIT_WEATHER_SEVERE_TYPE_HIGH_SURF ((FIT_WEATHER_SEVERE_TYPE)77) -#define FIT_WEATHER_SEVERE_TYPE_SMOG ((FIT_WEATHER_SEVERE_TYPE)78) -#define FIT_WEATHER_SEVERE_TYPE_AIR_QUALITY ((FIT_WEATHER_SEVERE_TYPE)79) -#define FIT_WEATHER_SEVERE_TYPE_BRISK_WIND ((FIT_WEATHER_SEVERE_TYPE)80) -#define FIT_WEATHER_SEVERE_TYPE_AIR_STAGNATION ((FIT_WEATHER_SEVERE_TYPE)81) -#define FIT_WEATHER_SEVERE_TYPE_LOW_WATER ((FIT_WEATHER_SEVERE_TYPE)82) -#define FIT_WEATHER_SEVERE_TYPE_HYDROLOGICAL ((FIT_WEATHER_SEVERE_TYPE)83) -#define FIT_WEATHER_SEVERE_TYPE_SPECIAL_WEATHER ((FIT_WEATHER_SEVERE_TYPE)84) -#define FIT_WEATHER_SEVERE_TYPE_COUNT 85 - -typedef FIT_UINT32 FIT_TIME_INTO_DAY; // number of seconds into the day since 00:00:00 UTC -#define FIT_TIME_INTO_DAY_INVALID FIT_UINT32_INVALID -#define FIT_TIME_INTO_DAY_COUNT 0 - -typedef FIT_UINT32 FIT_LOCALTIME_INTO_DAY; // number of seconds into the day since local 00:00:00 -#define FIT_LOCALTIME_INTO_DAY_INVALID FIT_UINT32_INVALID -#define FIT_LOCALTIME_INTO_DAY_COUNT 0 - -typedef FIT_ENUM FIT_STROKE_TYPE; -#define FIT_STROKE_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_STROKE_TYPE_NO_EVENT ((FIT_STROKE_TYPE)0) -#define FIT_STROKE_TYPE_OTHER ((FIT_STROKE_TYPE)1) // stroke was detected but cannot be identified -#define FIT_STROKE_TYPE_SERVE ((FIT_STROKE_TYPE)2) -#define FIT_STROKE_TYPE_FOREHAND ((FIT_STROKE_TYPE)3) -#define FIT_STROKE_TYPE_BACKHAND ((FIT_STROKE_TYPE)4) -#define FIT_STROKE_TYPE_SMASH ((FIT_STROKE_TYPE)5) -#define FIT_STROKE_TYPE_COUNT 6 - -typedef FIT_ENUM FIT_BODY_LOCATION; -#define FIT_BODY_LOCATION_INVALID FIT_ENUM_INVALID -#define FIT_BODY_LOCATION_LEFT_LEG ((FIT_BODY_LOCATION)0) -#define FIT_BODY_LOCATION_LEFT_CALF ((FIT_BODY_LOCATION)1) -#define FIT_BODY_LOCATION_LEFT_SHIN ((FIT_BODY_LOCATION)2) -#define FIT_BODY_LOCATION_LEFT_HAMSTRING ((FIT_BODY_LOCATION)3) -#define FIT_BODY_LOCATION_LEFT_QUAD ((FIT_BODY_LOCATION)4) -#define FIT_BODY_LOCATION_LEFT_GLUTE ((FIT_BODY_LOCATION)5) -#define FIT_BODY_LOCATION_RIGHT_LEG ((FIT_BODY_LOCATION)6) -#define FIT_BODY_LOCATION_RIGHT_CALF ((FIT_BODY_LOCATION)7) -#define FIT_BODY_LOCATION_RIGHT_SHIN ((FIT_BODY_LOCATION)8) -#define FIT_BODY_LOCATION_RIGHT_HAMSTRING ((FIT_BODY_LOCATION)9) -#define FIT_BODY_LOCATION_RIGHT_QUAD ((FIT_BODY_LOCATION)10) -#define FIT_BODY_LOCATION_RIGHT_GLUTE ((FIT_BODY_LOCATION)11) -#define FIT_BODY_LOCATION_TORSO_BACK ((FIT_BODY_LOCATION)12) -#define FIT_BODY_LOCATION_LEFT_LOWER_BACK ((FIT_BODY_LOCATION)13) -#define FIT_BODY_LOCATION_LEFT_UPPER_BACK ((FIT_BODY_LOCATION)14) -#define FIT_BODY_LOCATION_RIGHT_LOWER_BACK ((FIT_BODY_LOCATION)15) -#define FIT_BODY_LOCATION_RIGHT_UPPER_BACK ((FIT_BODY_LOCATION)16) -#define FIT_BODY_LOCATION_TORSO_FRONT ((FIT_BODY_LOCATION)17) -#define FIT_BODY_LOCATION_LEFT_ABDOMEN ((FIT_BODY_LOCATION)18) -#define FIT_BODY_LOCATION_LEFT_CHEST ((FIT_BODY_LOCATION)19) -#define FIT_BODY_LOCATION_RIGHT_ABDOMEN ((FIT_BODY_LOCATION)20) -#define FIT_BODY_LOCATION_RIGHT_CHEST ((FIT_BODY_LOCATION)21) -#define FIT_BODY_LOCATION_LEFT_ARM ((FIT_BODY_LOCATION)22) -#define FIT_BODY_LOCATION_LEFT_SHOULDER ((FIT_BODY_LOCATION)23) -#define FIT_BODY_LOCATION_LEFT_BICEP ((FIT_BODY_LOCATION)24) -#define FIT_BODY_LOCATION_LEFT_TRICEP ((FIT_BODY_LOCATION)25) -#define FIT_BODY_LOCATION_LEFT_BRACHIORADIALIS ((FIT_BODY_LOCATION)26) // Left anterior forearm -#define FIT_BODY_LOCATION_LEFT_FOREARM_EXTENSORS ((FIT_BODY_LOCATION)27) // Left posterior forearm -#define FIT_BODY_LOCATION_RIGHT_ARM ((FIT_BODY_LOCATION)28) -#define FIT_BODY_LOCATION_RIGHT_SHOULDER ((FIT_BODY_LOCATION)29) -#define FIT_BODY_LOCATION_RIGHT_BICEP ((FIT_BODY_LOCATION)30) -#define FIT_BODY_LOCATION_RIGHT_TRICEP ((FIT_BODY_LOCATION)31) -#define FIT_BODY_LOCATION_RIGHT_BRACHIORADIALIS ((FIT_BODY_LOCATION)32) // Right anterior forearm -#define FIT_BODY_LOCATION_RIGHT_FOREARM_EXTENSORS ((FIT_BODY_LOCATION)33) // Right posterior forearm -#define FIT_BODY_LOCATION_NECK ((FIT_BODY_LOCATION)34) -#define FIT_BODY_LOCATION_THROAT ((FIT_BODY_LOCATION)35) -#define FIT_BODY_LOCATION_WAIST_MID_BACK ((FIT_BODY_LOCATION)36) -#define FIT_BODY_LOCATION_WAIST_FRONT ((FIT_BODY_LOCATION)37) -#define FIT_BODY_LOCATION_WAIST_LEFT ((FIT_BODY_LOCATION)38) -#define FIT_BODY_LOCATION_WAIST_RIGHT ((FIT_BODY_LOCATION)39) -#define FIT_BODY_LOCATION_COUNT 40 - -typedef FIT_ENUM FIT_SEGMENT_LAP_STATUS; -#define FIT_SEGMENT_LAP_STATUS_INVALID FIT_ENUM_INVALID -#define FIT_SEGMENT_LAP_STATUS_END ((FIT_SEGMENT_LAP_STATUS)0) -#define FIT_SEGMENT_LAP_STATUS_FAIL ((FIT_SEGMENT_LAP_STATUS)1) -#define FIT_SEGMENT_LAP_STATUS_COUNT 2 - -typedef FIT_ENUM FIT_SEGMENT_LEADERBOARD_TYPE; -#define FIT_SEGMENT_LEADERBOARD_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_SEGMENT_LEADERBOARD_TYPE_OVERALL ((FIT_SEGMENT_LEADERBOARD_TYPE)0) -#define FIT_SEGMENT_LEADERBOARD_TYPE_PERSONAL_BEST ((FIT_SEGMENT_LEADERBOARD_TYPE)1) -#define FIT_SEGMENT_LEADERBOARD_TYPE_CONNECTIONS ((FIT_SEGMENT_LEADERBOARD_TYPE)2) -#define FIT_SEGMENT_LEADERBOARD_TYPE_GROUP ((FIT_SEGMENT_LEADERBOARD_TYPE)3) -#define FIT_SEGMENT_LEADERBOARD_TYPE_CHALLENGER ((FIT_SEGMENT_LEADERBOARD_TYPE)4) -#define FIT_SEGMENT_LEADERBOARD_TYPE_KOM ((FIT_SEGMENT_LEADERBOARD_TYPE)5) -#define FIT_SEGMENT_LEADERBOARD_TYPE_QOM ((FIT_SEGMENT_LEADERBOARD_TYPE)6) -#define FIT_SEGMENT_LEADERBOARD_TYPE_PR ((FIT_SEGMENT_LEADERBOARD_TYPE)7) -#define FIT_SEGMENT_LEADERBOARD_TYPE_GOAL ((FIT_SEGMENT_LEADERBOARD_TYPE)8) -#define FIT_SEGMENT_LEADERBOARD_TYPE_RIVAL ((FIT_SEGMENT_LEADERBOARD_TYPE)9) -#define FIT_SEGMENT_LEADERBOARD_TYPE_CLUB_LEADER ((FIT_SEGMENT_LEADERBOARD_TYPE)10) -#define FIT_SEGMENT_LEADERBOARD_TYPE_COUNT 11 - -typedef FIT_ENUM FIT_SEGMENT_DELETE_STATUS; -#define FIT_SEGMENT_DELETE_STATUS_INVALID FIT_ENUM_INVALID -#define FIT_SEGMENT_DELETE_STATUS_DO_NOT_DELETE ((FIT_SEGMENT_DELETE_STATUS)0) -#define FIT_SEGMENT_DELETE_STATUS_DELETE_ONE ((FIT_SEGMENT_DELETE_STATUS)1) -#define FIT_SEGMENT_DELETE_STATUS_DELETE_ALL ((FIT_SEGMENT_DELETE_STATUS)2) -#define FIT_SEGMENT_DELETE_STATUS_COUNT 3 - -typedef FIT_ENUM FIT_SEGMENT_SELECTION_TYPE; -#define FIT_SEGMENT_SELECTION_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_SEGMENT_SELECTION_TYPE_STARRED ((FIT_SEGMENT_SELECTION_TYPE)0) -#define FIT_SEGMENT_SELECTION_TYPE_SUGGESTED ((FIT_SEGMENT_SELECTION_TYPE)1) -#define FIT_SEGMENT_SELECTION_TYPE_COUNT 2 - -typedef FIT_ENUM FIT_SOURCE_TYPE; -#define FIT_SOURCE_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_SOURCE_TYPE_ANT ((FIT_SOURCE_TYPE)0) // External device connected with ANT -#define FIT_SOURCE_TYPE_ANTPLUS ((FIT_SOURCE_TYPE)1) // External device connected with ANT+ -#define FIT_SOURCE_TYPE_BLUETOOTH ((FIT_SOURCE_TYPE)2) // External device connected with BT -#define FIT_SOURCE_TYPE_BLUETOOTH_LOW_ENERGY ((FIT_SOURCE_TYPE)3) // External device connected with BLE -#define FIT_SOURCE_TYPE_WIFI ((FIT_SOURCE_TYPE)4) // External device connected with Wifi -#define FIT_SOURCE_TYPE_LOCAL ((FIT_SOURCE_TYPE)5) // Onboard device -#define FIT_SOURCE_TYPE_COUNT 6 - -typedef FIT_UINT8 FIT_LOCAL_DEVICE_TYPE; -#define FIT_LOCAL_DEVICE_TYPE_INVALID FIT_UINT8_INVALID -#define FIT_LOCAL_DEVICE_TYPE_GPS ((FIT_LOCAL_DEVICE_TYPE)0) // Onboard gps receiver -#define FIT_LOCAL_DEVICE_TYPE_GLONASS ((FIT_LOCAL_DEVICE_TYPE)1) // Onboard glonass receiver -#define FIT_LOCAL_DEVICE_TYPE_GPS_GLONASS ((FIT_LOCAL_DEVICE_TYPE)2) // Onboard gps glonass receiver -#define FIT_LOCAL_DEVICE_TYPE_ACCELEROMETER ((FIT_LOCAL_DEVICE_TYPE)3) // Onboard sensor -#define FIT_LOCAL_DEVICE_TYPE_BAROMETER ((FIT_LOCAL_DEVICE_TYPE)4) // Onboard sensor -#define FIT_LOCAL_DEVICE_TYPE_TEMPERATURE ((FIT_LOCAL_DEVICE_TYPE)5) // Onboard sensor -#define FIT_LOCAL_DEVICE_TYPE_WHR ((FIT_LOCAL_DEVICE_TYPE)10) // Onboard wrist HR sensor -#define FIT_LOCAL_DEVICE_TYPE_SENSOR_HUB ((FIT_LOCAL_DEVICE_TYPE)12) // Onboard software package -#define FIT_LOCAL_DEVICE_TYPE_COUNT 8 - -typedef FIT_UINT8 FIT_BLE_DEVICE_TYPE; -#define FIT_BLE_DEVICE_TYPE_INVALID FIT_UINT8_INVALID -#define FIT_BLE_DEVICE_TYPE_CONNECTED_GPS ((FIT_BLE_DEVICE_TYPE)0) // GPS that is provided over a proprietary bluetooth service -#define FIT_BLE_DEVICE_TYPE_HEART_RATE ((FIT_BLE_DEVICE_TYPE)1) -#define FIT_BLE_DEVICE_TYPE_BIKE_POWER ((FIT_BLE_DEVICE_TYPE)2) -#define FIT_BLE_DEVICE_TYPE_BIKE_SPEED_CADENCE ((FIT_BLE_DEVICE_TYPE)3) -#define FIT_BLE_DEVICE_TYPE_BIKE_SPEED ((FIT_BLE_DEVICE_TYPE)4) -#define FIT_BLE_DEVICE_TYPE_BIKE_CADENCE ((FIT_BLE_DEVICE_TYPE)5) -#define FIT_BLE_DEVICE_TYPE_FOOTPOD ((FIT_BLE_DEVICE_TYPE)6) -#define FIT_BLE_DEVICE_TYPE_BIKE_TRAINER ((FIT_BLE_DEVICE_TYPE)7) // Indoor-Bike FTMS protocol -#define FIT_BLE_DEVICE_TYPE_COUNT 8 - -typedef FIT_UINT32Z FIT_ANT_CHANNEL_ID; -#define FIT_ANT_CHANNEL_ID_INVALID FIT_UINT32Z_INVALID -#define FIT_ANT_CHANNEL_ID_ANT_EXTENDED_DEVICE_NUMBER_UPPER_NIBBLE ((FIT_ANT_CHANNEL_ID)0xF0000000) -#define FIT_ANT_CHANNEL_ID_ANT_TRANSMISSION_TYPE_LOWER_NIBBLE ((FIT_ANT_CHANNEL_ID)0x0F000000) -#define FIT_ANT_CHANNEL_ID_ANT_DEVICE_TYPE ((FIT_ANT_CHANNEL_ID)0x00FF0000) -#define FIT_ANT_CHANNEL_ID_ANT_DEVICE_NUMBER ((FIT_ANT_CHANNEL_ID)0x0000FFFF) -#define FIT_ANT_CHANNEL_ID_COUNT 4 - -typedef FIT_ENUM FIT_DISPLAY_ORIENTATION; -#define FIT_DISPLAY_ORIENTATION_INVALID FIT_ENUM_INVALID -#define FIT_DISPLAY_ORIENTATION_AUTO ((FIT_DISPLAY_ORIENTATION)0) // automatic if the device supports it -#define FIT_DISPLAY_ORIENTATION_PORTRAIT ((FIT_DISPLAY_ORIENTATION)1) -#define FIT_DISPLAY_ORIENTATION_LANDSCAPE ((FIT_DISPLAY_ORIENTATION)2) -#define FIT_DISPLAY_ORIENTATION_PORTRAIT_FLIPPED ((FIT_DISPLAY_ORIENTATION)3) // portrait mode but rotated 180 degrees -#define FIT_DISPLAY_ORIENTATION_LANDSCAPE_FLIPPED ((FIT_DISPLAY_ORIENTATION)4) // landscape mode but rotated 180 degrees -#define FIT_DISPLAY_ORIENTATION_COUNT 5 - -typedef FIT_ENUM FIT_WORKOUT_EQUIPMENT; -#define FIT_WORKOUT_EQUIPMENT_INVALID FIT_ENUM_INVALID -#define FIT_WORKOUT_EQUIPMENT_NONE ((FIT_WORKOUT_EQUIPMENT)0) -#define FIT_WORKOUT_EQUIPMENT_SWIM_FINS ((FIT_WORKOUT_EQUIPMENT)1) -#define FIT_WORKOUT_EQUIPMENT_SWIM_KICKBOARD ((FIT_WORKOUT_EQUIPMENT)2) -#define FIT_WORKOUT_EQUIPMENT_SWIM_PADDLES ((FIT_WORKOUT_EQUIPMENT)3) -#define FIT_WORKOUT_EQUIPMENT_SWIM_PULL_BUOY ((FIT_WORKOUT_EQUIPMENT)4) -#define FIT_WORKOUT_EQUIPMENT_SWIM_SNORKEL ((FIT_WORKOUT_EQUIPMENT)5) -#define FIT_WORKOUT_EQUIPMENT_COUNT 6 - -typedef FIT_ENUM FIT_WATCHFACE_MODE; -#define FIT_WATCHFACE_MODE_INVALID FIT_ENUM_INVALID -#define FIT_WATCHFACE_MODE_DIGITAL ((FIT_WATCHFACE_MODE)0) -#define FIT_WATCHFACE_MODE_ANALOG ((FIT_WATCHFACE_MODE)1) -#define FIT_WATCHFACE_MODE_CONNECT_IQ ((FIT_WATCHFACE_MODE)2) -#define FIT_WATCHFACE_MODE_DISABLED ((FIT_WATCHFACE_MODE)3) -#define FIT_WATCHFACE_MODE_COUNT 4 - -typedef FIT_ENUM FIT_DIGITAL_WATCHFACE_LAYOUT; -#define FIT_DIGITAL_WATCHFACE_LAYOUT_INVALID FIT_ENUM_INVALID -#define FIT_DIGITAL_WATCHFACE_LAYOUT_TRADITIONAL ((FIT_DIGITAL_WATCHFACE_LAYOUT)0) -#define FIT_DIGITAL_WATCHFACE_LAYOUT_MODERN ((FIT_DIGITAL_WATCHFACE_LAYOUT)1) -#define FIT_DIGITAL_WATCHFACE_LAYOUT_BOLD ((FIT_DIGITAL_WATCHFACE_LAYOUT)2) -#define FIT_DIGITAL_WATCHFACE_LAYOUT_COUNT 3 - -typedef FIT_ENUM FIT_ANALOG_WATCHFACE_LAYOUT; -#define FIT_ANALOG_WATCHFACE_LAYOUT_INVALID FIT_ENUM_INVALID -#define FIT_ANALOG_WATCHFACE_LAYOUT_MINIMAL ((FIT_ANALOG_WATCHFACE_LAYOUT)0) -#define FIT_ANALOG_WATCHFACE_LAYOUT_TRADITIONAL ((FIT_ANALOG_WATCHFACE_LAYOUT)1) -#define FIT_ANALOG_WATCHFACE_LAYOUT_MODERN ((FIT_ANALOG_WATCHFACE_LAYOUT)2) -#define FIT_ANALOG_WATCHFACE_LAYOUT_COUNT 3 - -typedef FIT_ENUM FIT_RIDER_POSITION_TYPE; -#define FIT_RIDER_POSITION_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_RIDER_POSITION_TYPE_SEATED ((FIT_RIDER_POSITION_TYPE)0) -#define FIT_RIDER_POSITION_TYPE_STANDING ((FIT_RIDER_POSITION_TYPE)1) -#define FIT_RIDER_POSITION_TYPE_TRANSITION_TO_SEATED ((FIT_RIDER_POSITION_TYPE)2) -#define FIT_RIDER_POSITION_TYPE_TRANSITION_TO_STANDING ((FIT_RIDER_POSITION_TYPE)3) -#define FIT_RIDER_POSITION_TYPE_COUNT 4 - -typedef FIT_ENUM FIT_POWER_PHASE_TYPE; -#define FIT_POWER_PHASE_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_POWER_PHASE_TYPE_POWER_PHASE_START_ANGLE ((FIT_POWER_PHASE_TYPE)0) -#define FIT_POWER_PHASE_TYPE_POWER_PHASE_END_ANGLE ((FIT_POWER_PHASE_TYPE)1) -#define FIT_POWER_PHASE_TYPE_POWER_PHASE_ARC_LENGTH ((FIT_POWER_PHASE_TYPE)2) -#define FIT_POWER_PHASE_TYPE_POWER_PHASE_CENTER ((FIT_POWER_PHASE_TYPE)3) -#define FIT_POWER_PHASE_TYPE_COUNT 4 - -typedef FIT_ENUM FIT_CAMERA_EVENT_TYPE; -#define FIT_CAMERA_EVENT_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_CAMERA_EVENT_TYPE_VIDEO_START ((FIT_CAMERA_EVENT_TYPE)0) // Start of video recording -#define FIT_CAMERA_EVENT_TYPE_VIDEO_SPLIT ((FIT_CAMERA_EVENT_TYPE)1) // Mark of video file split (end of one file, beginning of the other) -#define FIT_CAMERA_EVENT_TYPE_VIDEO_END ((FIT_CAMERA_EVENT_TYPE)2) // End of video recording -#define FIT_CAMERA_EVENT_TYPE_PHOTO_TAKEN ((FIT_CAMERA_EVENT_TYPE)3) // Still photo taken -#define FIT_CAMERA_EVENT_TYPE_VIDEO_SECOND_STREAM_START ((FIT_CAMERA_EVENT_TYPE)4) -#define FIT_CAMERA_EVENT_TYPE_VIDEO_SECOND_STREAM_SPLIT ((FIT_CAMERA_EVENT_TYPE)5) -#define FIT_CAMERA_EVENT_TYPE_VIDEO_SECOND_STREAM_END ((FIT_CAMERA_EVENT_TYPE)6) -#define FIT_CAMERA_EVENT_TYPE_VIDEO_SPLIT_START ((FIT_CAMERA_EVENT_TYPE)7) // Mark of video file split start -#define FIT_CAMERA_EVENT_TYPE_VIDEO_SECOND_STREAM_SPLIT_START ((FIT_CAMERA_EVENT_TYPE)8) -#define FIT_CAMERA_EVENT_TYPE_VIDEO_PAUSE ((FIT_CAMERA_EVENT_TYPE)11) // Mark when a video recording has been paused -#define FIT_CAMERA_EVENT_TYPE_VIDEO_SECOND_STREAM_PAUSE ((FIT_CAMERA_EVENT_TYPE)12) -#define FIT_CAMERA_EVENT_TYPE_VIDEO_RESUME ((FIT_CAMERA_EVENT_TYPE)13) // Mark when a video recording has been resumed -#define FIT_CAMERA_EVENT_TYPE_VIDEO_SECOND_STREAM_RESUME ((FIT_CAMERA_EVENT_TYPE)14) -#define FIT_CAMERA_EVENT_TYPE_COUNT 13 - -typedef FIT_ENUM FIT_SENSOR_TYPE; -#define FIT_SENSOR_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_SENSOR_TYPE_ACCELEROMETER ((FIT_SENSOR_TYPE)0) -#define FIT_SENSOR_TYPE_GYROSCOPE ((FIT_SENSOR_TYPE)1) -#define FIT_SENSOR_TYPE_COMPASS ((FIT_SENSOR_TYPE)2) // Magnetometer -#define FIT_SENSOR_TYPE_BAROMETER ((FIT_SENSOR_TYPE)3) -#define FIT_SENSOR_TYPE_COUNT 4 - -typedef FIT_ENUM FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE; -#define FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE_AUTO ((FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE)0) -#define FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE_INDIVIDUAL ((FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE)4) -#define FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE_HIGH_VISIBILITY ((FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE)5) -#define FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE_TRAIL ((FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE)6) -#define FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE_COUNT 4 - -typedef FIT_UINT16 FIT_COMM_TIMEOUT_TYPE; -#define FIT_COMM_TIMEOUT_TYPE_INVALID FIT_UINT16_INVALID -#define FIT_COMM_TIMEOUT_TYPE_WILDCARD_PAIRING_TIMEOUT ((FIT_COMM_TIMEOUT_TYPE)0) // Timeout pairing to any device -#define FIT_COMM_TIMEOUT_TYPE_PAIRING_TIMEOUT ((FIT_COMM_TIMEOUT_TYPE)1) // Timeout pairing to previously paired device -#define FIT_COMM_TIMEOUT_TYPE_CONNECTION_LOST ((FIT_COMM_TIMEOUT_TYPE)2) // Temporary loss of communications -#define FIT_COMM_TIMEOUT_TYPE_CONNECTION_TIMEOUT ((FIT_COMM_TIMEOUT_TYPE)3) // Connection closed due to extended bad communications -#define FIT_COMM_TIMEOUT_TYPE_COUNT 4 - -typedef FIT_ENUM FIT_CAMERA_ORIENTATION_TYPE; -#define FIT_CAMERA_ORIENTATION_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_CAMERA_ORIENTATION_TYPE_CAMERA_ORIENTATION_0 ((FIT_CAMERA_ORIENTATION_TYPE)0) -#define FIT_CAMERA_ORIENTATION_TYPE_CAMERA_ORIENTATION_90 ((FIT_CAMERA_ORIENTATION_TYPE)1) -#define FIT_CAMERA_ORIENTATION_TYPE_CAMERA_ORIENTATION_180 ((FIT_CAMERA_ORIENTATION_TYPE)2) -#define FIT_CAMERA_ORIENTATION_TYPE_CAMERA_ORIENTATION_270 ((FIT_CAMERA_ORIENTATION_TYPE)3) -#define FIT_CAMERA_ORIENTATION_TYPE_COUNT 4 - -typedef FIT_ENUM FIT_ATTITUDE_STAGE; -#define FIT_ATTITUDE_STAGE_INVALID FIT_ENUM_INVALID -#define FIT_ATTITUDE_STAGE_FAILED ((FIT_ATTITUDE_STAGE)0) -#define FIT_ATTITUDE_STAGE_ALIGNING ((FIT_ATTITUDE_STAGE)1) -#define FIT_ATTITUDE_STAGE_DEGRADED ((FIT_ATTITUDE_STAGE)2) -#define FIT_ATTITUDE_STAGE_VALID ((FIT_ATTITUDE_STAGE)3) -#define FIT_ATTITUDE_STAGE_COUNT 4 - -typedef FIT_UINT16 FIT_ATTITUDE_VALIDITY; -#define FIT_ATTITUDE_VALIDITY_INVALID FIT_UINT16_INVALID -#define FIT_ATTITUDE_VALIDITY_TRACK_ANGLE_HEADING_VALID ((FIT_ATTITUDE_VALIDITY)0x0001) -#define FIT_ATTITUDE_VALIDITY_PITCH_VALID ((FIT_ATTITUDE_VALIDITY)0x0002) -#define FIT_ATTITUDE_VALIDITY_ROLL_VALID ((FIT_ATTITUDE_VALIDITY)0x0004) -#define FIT_ATTITUDE_VALIDITY_LATERAL_BODY_ACCEL_VALID ((FIT_ATTITUDE_VALIDITY)0x0008) -#define FIT_ATTITUDE_VALIDITY_NORMAL_BODY_ACCEL_VALID ((FIT_ATTITUDE_VALIDITY)0x0010) -#define FIT_ATTITUDE_VALIDITY_TURN_RATE_VALID ((FIT_ATTITUDE_VALIDITY)0x0020) -#define FIT_ATTITUDE_VALIDITY_HW_FAIL ((FIT_ATTITUDE_VALIDITY)0x0040) -#define FIT_ATTITUDE_VALIDITY_MAG_INVALID ((FIT_ATTITUDE_VALIDITY)0x0080) -#define FIT_ATTITUDE_VALIDITY_NO_GPS ((FIT_ATTITUDE_VALIDITY)0x0100) -#define FIT_ATTITUDE_VALIDITY_GPS_INVALID ((FIT_ATTITUDE_VALIDITY)0x0200) -#define FIT_ATTITUDE_VALIDITY_SOLUTION_COASTING ((FIT_ATTITUDE_VALIDITY)0x0400) -#define FIT_ATTITUDE_VALIDITY_TRUE_TRACK_ANGLE ((FIT_ATTITUDE_VALIDITY)0x0800) -#define FIT_ATTITUDE_VALIDITY_MAGNETIC_HEADING ((FIT_ATTITUDE_VALIDITY)0x1000) -#define FIT_ATTITUDE_VALIDITY_COUNT 13 - -typedef FIT_ENUM FIT_AUTO_SYNC_FREQUENCY; -#define FIT_AUTO_SYNC_FREQUENCY_INVALID FIT_ENUM_INVALID -#define FIT_AUTO_SYNC_FREQUENCY_NEVER ((FIT_AUTO_SYNC_FREQUENCY)0) -#define FIT_AUTO_SYNC_FREQUENCY_OCCASIONALLY ((FIT_AUTO_SYNC_FREQUENCY)1) -#define FIT_AUTO_SYNC_FREQUENCY_FREQUENT ((FIT_AUTO_SYNC_FREQUENCY)2) -#define FIT_AUTO_SYNC_FREQUENCY_ONCE_A_DAY ((FIT_AUTO_SYNC_FREQUENCY)3) -#define FIT_AUTO_SYNC_FREQUENCY_REMOTE ((FIT_AUTO_SYNC_FREQUENCY)4) -#define FIT_AUTO_SYNC_FREQUENCY_COUNT 5 - -typedef FIT_ENUM FIT_EXD_LAYOUT; -#define FIT_EXD_LAYOUT_INVALID FIT_ENUM_INVALID -#define FIT_EXD_LAYOUT_FULL_SCREEN ((FIT_EXD_LAYOUT)0) -#define FIT_EXD_LAYOUT_HALF_VERTICAL ((FIT_EXD_LAYOUT)1) -#define FIT_EXD_LAYOUT_HALF_HORIZONTAL ((FIT_EXD_LAYOUT)2) -#define FIT_EXD_LAYOUT_HALF_VERTICAL_RIGHT_SPLIT ((FIT_EXD_LAYOUT)3) -#define FIT_EXD_LAYOUT_HALF_HORIZONTAL_BOTTOM_SPLIT ((FIT_EXD_LAYOUT)4) -#define FIT_EXD_LAYOUT_FULL_QUARTER_SPLIT ((FIT_EXD_LAYOUT)5) -#define FIT_EXD_LAYOUT_HALF_VERTICAL_LEFT_SPLIT ((FIT_EXD_LAYOUT)6) -#define FIT_EXD_LAYOUT_HALF_HORIZONTAL_TOP_SPLIT ((FIT_EXD_LAYOUT)7) -#define FIT_EXD_LAYOUT_DYNAMIC ((FIT_EXD_LAYOUT)8) // The EXD may display the configured concepts in any layout it sees fit. -#define FIT_EXD_LAYOUT_COUNT 9 - -typedef FIT_ENUM FIT_EXD_DISPLAY_TYPE; -#define FIT_EXD_DISPLAY_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_EXD_DISPLAY_TYPE_NUMERICAL ((FIT_EXD_DISPLAY_TYPE)0) -#define FIT_EXD_DISPLAY_TYPE_SIMPLE ((FIT_EXD_DISPLAY_TYPE)1) -#define FIT_EXD_DISPLAY_TYPE_GRAPH ((FIT_EXD_DISPLAY_TYPE)2) -#define FIT_EXD_DISPLAY_TYPE_BAR ((FIT_EXD_DISPLAY_TYPE)3) -#define FIT_EXD_DISPLAY_TYPE_CIRCLE_GRAPH ((FIT_EXD_DISPLAY_TYPE)4) -#define FIT_EXD_DISPLAY_TYPE_VIRTUAL_PARTNER ((FIT_EXD_DISPLAY_TYPE)5) -#define FIT_EXD_DISPLAY_TYPE_BALANCE ((FIT_EXD_DISPLAY_TYPE)6) -#define FIT_EXD_DISPLAY_TYPE_STRING_LIST ((FIT_EXD_DISPLAY_TYPE)7) -#define FIT_EXD_DISPLAY_TYPE_STRING ((FIT_EXD_DISPLAY_TYPE)8) -#define FIT_EXD_DISPLAY_TYPE_SIMPLE_DYNAMIC_ICON ((FIT_EXD_DISPLAY_TYPE)9) -#define FIT_EXD_DISPLAY_TYPE_GAUGE ((FIT_EXD_DISPLAY_TYPE)10) -#define FIT_EXD_DISPLAY_TYPE_COUNT 11 - -typedef FIT_ENUM FIT_EXD_DATA_UNITS; -#define FIT_EXD_DATA_UNITS_INVALID FIT_ENUM_INVALID -#define FIT_EXD_DATA_UNITS_NO_UNITS ((FIT_EXD_DATA_UNITS)0) -#define FIT_EXD_DATA_UNITS_LAPS ((FIT_EXD_DATA_UNITS)1) -#define FIT_EXD_DATA_UNITS_MILES_PER_HOUR ((FIT_EXD_DATA_UNITS)2) -#define FIT_EXD_DATA_UNITS_KILOMETERS_PER_HOUR ((FIT_EXD_DATA_UNITS)3) -#define FIT_EXD_DATA_UNITS_FEET_PER_HOUR ((FIT_EXD_DATA_UNITS)4) -#define FIT_EXD_DATA_UNITS_METERS_PER_HOUR ((FIT_EXD_DATA_UNITS)5) -#define FIT_EXD_DATA_UNITS_DEGREES_CELSIUS ((FIT_EXD_DATA_UNITS)6) -#define FIT_EXD_DATA_UNITS_DEGREES_FARENHEIT ((FIT_EXD_DATA_UNITS)7) -#define FIT_EXD_DATA_UNITS_ZONE ((FIT_EXD_DATA_UNITS)8) -#define FIT_EXD_DATA_UNITS_GEAR ((FIT_EXD_DATA_UNITS)9) -#define FIT_EXD_DATA_UNITS_RPM ((FIT_EXD_DATA_UNITS)10) -#define FIT_EXD_DATA_UNITS_BPM ((FIT_EXD_DATA_UNITS)11) -#define FIT_EXD_DATA_UNITS_DEGREES ((FIT_EXD_DATA_UNITS)12) -#define FIT_EXD_DATA_UNITS_MILLIMETERS ((FIT_EXD_DATA_UNITS)13) -#define FIT_EXD_DATA_UNITS_METERS ((FIT_EXD_DATA_UNITS)14) -#define FIT_EXD_DATA_UNITS_KILOMETERS ((FIT_EXD_DATA_UNITS)15) -#define FIT_EXD_DATA_UNITS_FEET ((FIT_EXD_DATA_UNITS)16) -#define FIT_EXD_DATA_UNITS_YARDS ((FIT_EXD_DATA_UNITS)17) -#define FIT_EXD_DATA_UNITS_KILOFEET ((FIT_EXD_DATA_UNITS)18) -#define FIT_EXD_DATA_UNITS_MILES ((FIT_EXD_DATA_UNITS)19) -#define FIT_EXD_DATA_UNITS_TIME ((FIT_EXD_DATA_UNITS)20) -#define FIT_EXD_DATA_UNITS_ENUM_TURN_TYPE ((FIT_EXD_DATA_UNITS)21) -#define FIT_EXD_DATA_UNITS_PERCENT ((FIT_EXD_DATA_UNITS)22) -#define FIT_EXD_DATA_UNITS_WATTS ((FIT_EXD_DATA_UNITS)23) -#define FIT_EXD_DATA_UNITS_WATTS_PER_KILOGRAM ((FIT_EXD_DATA_UNITS)24) -#define FIT_EXD_DATA_UNITS_ENUM_BATTERY_STATUS ((FIT_EXD_DATA_UNITS)25) -#define FIT_EXD_DATA_UNITS_ENUM_BIKE_LIGHT_BEAM_ANGLE_MODE ((FIT_EXD_DATA_UNITS)26) -#define FIT_EXD_DATA_UNITS_ENUM_BIKE_LIGHT_BATTERY_STATUS ((FIT_EXD_DATA_UNITS)27) -#define FIT_EXD_DATA_UNITS_ENUM_BIKE_LIGHT_NETWORK_CONFIG_TYPE ((FIT_EXD_DATA_UNITS)28) -#define FIT_EXD_DATA_UNITS_LIGHTS ((FIT_EXD_DATA_UNITS)29) -#define FIT_EXD_DATA_UNITS_SECONDS ((FIT_EXD_DATA_UNITS)30) -#define FIT_EXD_DATA_UNITS_MINUTES ((FIT_EXD_DATA_UNITS)31) -#define FIT_EXD_DATA_UNITS_HOURS ((FIT_EXD_DATA_UNITS)32) -#define FIT_EXD_DATA_UNITS_CALORIES ((FIT_EXD_DATA_UNITS)33) -#define FIT_EXD_DATA_UNITS_KILOJOULES ((FIT_EXD_DATA_UNITS)34) -#define FIT_EXD_DATA_UNITS_MILLISECONDS ((FIT_EXD_DATA_UNITS)35) -#define FIT_EXD_DATA_UNITS_SECOND_PER_MILE ((FIT_EXD_DATA_UNITS)36) -#define FIT_EXD_DATA_UNITS_SECOND_PER_KILOMETER ((FIT_EXD_DATA_UNITS)37) -#define FIT_EXD_DATA_UNITS_CENTIMETER ((FIT_EXD_DATA_UNITS)38) -#define FIT_EXD_DATA_UNITS_ENUM_COURSE_POINT ((FIT_EXD_DATA_UNITS)39) -#define FIT_EXD_DATA_UNITS_BRADIANS ((FIT_EXD_DATA_UNITS)40) -#define FIT_EXD_DATA_UNITS_ENUM_SPORT ((FIT_EXD_DATA_UNITS)41) -#define FIT_EXD_DATA_UNITS_INCHES_HG ((FIT_EXD_DATA_UNITS)42) -#define FIT_EXD_DATA_UNITS_MM_HG ((FIT_EXD_DATA_UNITS)43) -#define FIT_EXD_DATA_UNITS_MBARS ((FIT_EXD_DATA_UNITS)44) -#define FIT_EXD_DATA_UNITS_HECTO_PASCALS ((FIT_EXD_DATA_UNITS)45) -#define FIT_EXD_DATA_UNITS_FEET_PER_MIN ((FIT_EXD_DATA_UNITS)46) -#define FIT_EXD_DATA_UNITS_METERS_PER_MIN ((FIT_EXD_DATA_UNITS)47) -#define FIT_EXD_DATA_UNITS_METERS_PER_SEC ((FIT_EXD_DATA_UNITS)48) -#define FIT_EXD_DATA_UNITS_EIGHT_CARDINAL ((FIT_EXD_DATA_UNITS)49) -#define FIT_EXD_DATA_UNITS_COUNT 50 - -typedef FIT_ENUM FIT_EXD_QUALIFIERS; -#define FIT_EXD_QUALIFIERS_INVALID FIT_ENUM_INVALID -#define FIT_EXD_QUALIFIERS_NO_QUALIFIER ((FIT_EXD_QUALIFIERS)0) -#define FIT_EXD_QUALIFIERS_INSTANTANEOUS ((FIT_EXD_QUALIFIERS)1) -#define FIT_EXD_QUALIFIERS_AVERAGE ((FIT_EXD_QUALIFIERS)2) -#define FIT_EXD_QUALIFIERS_LAP ((FIT_EXD_QUALIFIERS)3) -#define FIT_EXD_QUALIFIERS_MAXIMUM ((FIT_EXD_QUALIFIERS)4) -#define FIT_EXD_QUALIFIERS_MAXIMUM_AVERAGE ((FIT_EXD_QUALIFIERS)5) -#define FIT_EXD_QUALIFIERS_MAXIMUM_LAP ((FIT_EXD_QUALIFIERS)6) -#define FIT_EXD_QUALIFIERS_LAST_LAP ((FIT_EXD_QUALIFIERS)7) -#define FIT_EXD_QUALIFIERS_AVERAGE_LAP ((FIT_EXD_QUALIFIERS)8) -#define FIT_EXD_QUALIFIERS_TO_DESTINATION ((FIT_EXD_QUALIFIERS)9) -#define FIT_EXD_QUALIFIERS_TO_GO ((FIT_EXD_QUALIFIERS)10) -#define FIT_EXD_QUALIFIERS_TO_NEXT ((FIT_EXD_QUALIFIERS)11) -#define FIT_EXD_QUALIFIERS_NEXT_COURSE_POINT ((FIT_EXD_QUALIFIERS)12) -#define FIT_EXD_QUALIFIERS_TOTAL ((FIT_EXD_QUALIFIERS)13) -#define FIT_EXD_QUALIFIERS_THREE_SECOND_AVERAGE ((FIT_EXD_QUALIFIERS)14) -#define FIT_EXD_QUALIFIERS_TEN_SECOND_AVERAGE ((FIT_EXD_QUALIFIERS)15) -#define FIT_EXD_QUALIFIERS_THIRTY_SECOND_AVERAGE ((FIT_EXD_QUALIFIERS)16) -#define FIT_EXD_QUALIFIERS_PERCENT_MAXIMUM ((FIT_EXD_QUALIFIERS)17) -#define FIT_EXD_QUALIFIERS_PERCENT_MAXIMUM_AVERAGE ((FIT_EXD_QUALIFIERS)18) -#define FIT_EXD_QUALIFIERS_LAP_PERCENT_MAXIMUM ((FIT_EXD_QUALIFIERS)19) -#define FIT_EXD_QUALIFIERS_ELAPSED ((FIT_EXD_QUALIFIERS)20) -#define FIT_EXD_QUALIFIERS_SUNRISE ((FIT_EXD_QUALIFIERS)21) -#define FIT_EXD_QUALIFIERS_SUNSET ((FIT_EXD_QUALIFIERS)22) -#define FIT_EXD_QUALIFIERS_COMPARED_TO_VIRTUAL_PARTNER ((FIT_EXD_QUALIFIERS)23) -#define FIT_EXD_QUALIFIERS_MAXIMUM_24H ((FIT_EXD_QUALIFIERS)24) -#define FIT_EXD_QUALIFIERS_MINIMUM_24H ((FIT_EXD_QUALIFIERS)25) -#define FIT_EXD_QUALIFIERS_MINIMUM ((FIT_EXD_QUALIFIERS)26) -#define FIT_EXD_QUALIFIERS_FIRST ((FIT_EXD_QUALIFIERS)27) -#define FIT_EXD_QUALIFIERS_SECOND ((FIT_EXD_QUALIFIERS)28) -#define FIT_EXD_QUALIFIERS_THIRD ((FIT_EXD_QUALIFIERS)29) -#define FIT_EXD_QUALIFIERS_SHIFTER ((FIT_EXD_QUALIFIERS)30) -#define FIT_EXD_QUALIFIERS_LAST_SPORT ((FIT_EXD_QUALIFIERS)31) -#define FIT_EXD_QUALIFIERS_MOVING ((FIT_EXD_QUALIFIERS)32) -#define FIT_EXD_QUALIFIERS_STOPPED ((FIT_EXD_QUALIFIERS)33) -#define FIT_EXD_QUALIFIERS_ESTIMATED_TOTAL ((FIT_EXD_QUALIFIERS)34) -#define FIT_EXD_QUALIFIERS_ZONE_9 ((FIT_EXD_QUALIFIERS)242) -#define FIT_EXD_QUALIFIERS_ZONE_8 ((FIT_EXD_QUALIFIERS)243) -#define FIT_EXD_QUALIFIERS_ZONE_7 ((FIT_EXD_QUALIFIERS)244) -#define FIT_EXD_QUALIFIERS_ZONE_6 ((FIT_EXD_QUALIFIERS)245) -#define FIT_EXD_QUALIFIERS_ZONE_5 ((FIT_EXD_QUALIFIERS)246) -#define FIT_EXD_QUALIFIERS_ZONE_4 ((FIT_EXD_QUALIFIERS)247) -#define FIT_EXD_QUALIFIERS_ZONE_3 ((FIT_EXD_QUALIFIERS)248) -#define FIT_EXD_QUALIFIERS_ZONE_2 ((FIT_EXD_QUALIFIERS)249) -#define FIT_EXD_QUALIFIERS_ZONE_1 ((FIT_EXD_QUALIFIERS)250) -#define FIT_EXD_QUALIFIERS_COUNT 44 - -typedef FIT_ENUM FIT_EXD_DESCRIPTORS; -#define FIT_EXD_DESCRIPTORS_INVALID FIT_ENUM_INVALID -#define FIT_EXD_DESCRIPTORS_BIKE_LIGHT_BATTERY_STATUS ((FIT_EXD_DESCRIPTORS)0) -#define FIT_EXD_DESCRIPTORS_BEAM_ANGLE_STATUS ((FIT_EXD_DESCRIPTORS)1) -#define FIT_EXD_DESCRIPTORS_BATERY_LEVEL ((FIT_EXD_DESCRIPTORS)2) -#define FIT_EXD_DESCRIPTORS_LIGHT_NETWORK_MODE ((FIT_EXD_DESCRIPTORS)3) -#define FIT_EXD_DESCRIPTORS_NUMBER_LIGHTS_CONNECTED ((FIT_EXD_DESCRIPTORS)4) -#define FIT_EXD_DESCRIPTORS_CADENCE ((FIT_EXD_DESCRIPTORS)5) -#define FIT_EXD_DESCRIPTORS_DISTANCE ((FIT_EXD_DESCRIPTORS)6) -#define FIT_EXD_DESCRIPTORS_ESTIMATED_TIME_OF_ARRIVAL ((FIT_EXD_DESCRIPTORS)7) -#define FIT_EXD_DESCRIPTORS_HEADING ((FIT_EXD_DESCRIPTORS)8) -#define FIT_EXD_DESCRIPTORS_TIME ((FIT_EXD_DESCRIPTORS)9) -#define FIT_EXD_DESCRIPTORS_BATTERY_LEVEL ((FIT_EXD_DESCRIPTORS)10) -#define FIT_EXD_DESCRIPTORS_TRAINER_RESISTANCE ((FIT_EXD_DESCRIPTORS)11) -#define FIT_EXD_DESCRIPTORS_TRAINER_TARGET_POWER ((FIT_EXD_DESCRIPTORS)12) -#define FIT_EXD_DESCRIPTORS_TIME_SEATED ((FIT_EXD_DESCRIPTORS)13) -#define FIT_EXD_DESCRIPTORS_TIME_STANDING ((FIT_EXD_DESCRIPTORS)14) -#define FIT_EXD_DESCRIPTORS_ELEVATION ((FIT_EXD_DESCRIPTORS)15) -#define FIT_EXD_DESCRIPTORS_GRADE ((FIT_EXD_DESCRIPTORS)16) -#define FIT_EXD_DESCRIPTORS_ASCENT ((FIT_EXD_DESCRIPTORS)17) -#define FIT_EXD_DESCRIPTORS_DESCENT ((FIT_EXD_DESCRIPTORS)18) -#define FIT_EXD_DESCRIPTORS_VERTICAL_SPEED ((FIT_EXD_DESCRIPTORS)19) -#define FIT_EXD_DESCRIPTORS_DI2_BATTERY_LEVEL ((FIT_EXD_DESCRIPTORS)20) -#define FIT_EXD_DESCRIPTORS_FRONT_GEAR ((FIT_EXD_DESCRIPTORS)21) -#define FIT_EXD_DESCRIPTORS_REAR_GEAR ((FIT_EXD_DESCRIPTORS)22) -#define FIT_EXD_DESCRIPTORS_GEAR_RATIO ((FIT_EXD_DESCRIPTORS)23) -#define FIT_EXD_DESCRIPTORS_HEART_RATE ((FIT_EXD_DESCRIPTORS)24) -#define FIT_EXD_DESCRIPTORS_HEART_RATE_ZONE ((FIT_EXD_DESCRIPTORS)25) -#define FIT_EXD_DESCRIPTORS_TIME_IN_HEART_RATE_ZONE ((FIT_EXD_DESCRIPTORS)26) -#define FIT_EXD_DESCRIPTORS_HEART_RATE_RESERVE ((FIT_EXD_DESCRIPTORS)27) -#define FIT_EXD_DESCRIPTORS_CALORIES ((FIT_EXD_DESCRIPTORS)28) -#define FIT_EXD_DESCRIPTORS_GPS_ACCURACY ((FIT_EXD_DESCRIPTORS)29) -#define FIT_EXD_DESCRIPTORS_GPS_SIGNAL_STRENGTH ((FIT_EXD_DESCRIPTORS)30) -#define FIT_EXD_DESCRIPTORS_TEMPERATURE ((FIT_EXD_DESCRIPTORS)31) -#define FIT_EXD_DESCRIPTORS_TIME_OF_DAY ((FIT_EXD_DESCRIPTORS)32) -#define FIT_EXD_DESCRIPTORS_BALANCE ((FIT_EXD_DESCRIPTORS)33) -#define FIT_EXD_DESCRIPTORS_PEDAL_SMOOTHNESS ((FIT_EXD_DESCRIPTORS)34) -#define FIT_EXD_DESCRIPTORS_POWER ((FIT_EXD_DESCRIPTORS)35) -#define FIT_EXD_DESCRIPTORS_FUNCTIONAL_THRESHOLD_POWER ((FIT_EXD_DESCRIPTORS)36) -#define FIT_EXD_DESCRIPTORS_INTENSITY_FACTOR ((FIT_EXD_DESCRIPTORS)37) -#define FIT_EXD_DESCRIPTORS_WORK ((FIT_EXD_DESCRIPTORS)38) -#define FIT_EXD_DESCRIPTORS_POWER_RATIO ((FIT_EXD_DESCRIPTORS)39) -#define FIT_EXD_DESCRIPTORS_NORMALIZED_POWER ((FIT_EXD_DESCRIPTORS)40) -#define FIT_EXD_DESCRIPTORS_TRAINING_STRESS_SCORE ((FIT_EXD_DESCRIPTORS)41) -#define FIT_EXD_DESCRIPTORS_TIME_ON_ZONE ((FIT_EXD_DESCRIPTORS)42) -#define FIT_EXD_DESCRIPTORS_SPEED ((FIT_EXD_DESCRIPTORS)43) -#define FIT_EXD_DESCRIPTORS_LAPS ((FIT_EXD_DESCRIPTORS)44) -#define FIT_EXD_DESCRIPTORS_REPS ((FIT_EXD_DESCRIPTORS)45) -#define FIT_EXD_DESCRIPTORS_WORKOUT_STEP ((FIT_EXD_DESCRIPTORS)46) -#define FIT_EXD_DESCRIPTORS_COURSE_DISTANCE ((FIT_EXD_DESCRIPTORS)47) -#define FIT_EXD_DESCRIPTORS_NAVIGATION_DISTANCE ((FIT_EXD_DESCRIPTORS)48) -#define FIT_EXD_DESCRIPTORS_COURSE_ESTIMATED_TIME_OF_ARRIVAL ((FIT_EXD_DESCRIPTORS)49) -#define FIT_EXD_DESCRIPTORS_NAVIGATION_ESTIMATED_TIME_OF_ARRIVAL ((FIT_EXD_DESCRIPTORS)50) -#define FIT_EXD_DESCRIPTORS_COURSE_TIME ((FIT_EXD_DESCRIPTORS)51) -#define FIT_EXD_DESCRIPTORS_NAVIGATION_TIME ((FIT_EXD_DESCRIPTORS)52) -#define FIT_EXD_DESCRIPTORS_COURSE_HEADING ((FIT_EXD_DESCRIPTORS)53) -#define FIT_EXD_DESCRIPTORS_NAVIGATION_HEADING ((FIT_EXD_DESCRIPTORS)54) -#define FIT_EXD_DESCRIPTORS_POWER_ZONE ((FIT_EXD_DESCRIPTORS)55) -#define FIT_EXD_DESCRIPTORS_TORQUE_EFFECTIVENESS ((FIT_EXD_DESCRIPTORS)56) -#define FIT_EXD_DESCRIPTORS_TIMER_TIME ((FIT_EXD_DESCRIPTORS)57) -#define FIT_EXD_DESCRIPTORS_POWER_WEIGHT_RATIO ((FIT_EXD_DESCRIPTORS)58) -#define FIT_EXD_DESCRIPTORS_LEFT_PLATFORM_CENTER_OFFSET ((FIT_EXD_DESCRIPTORS)59) -#define FIT_EXD_DESCRIPTORS_RIGHT_PLATFORM_CENTER_OFFSET ((FIT_EXD_DESCRIPTORS)60) -#define FIT_EXD_DESCRIPTORS_LEFT_POWER_PHASE_START_ANGLE ((FIT_EXD_DESCRIPTORS)61) -#define FIT_EXD_DESCRIPTORS_RIGHT_POWER_PHASE_START_ANGLE ((FIT_EXD_DESCRIPTORS)62) -#define FIT_EXD_DESCRIPTORS_LEFT_POWER_PHASE_FINISH_ANGLE ((FIT_EXD_DESCRIPTORS)63) -#define FIT_EXD_DESCRIPTORS_RIGHT_POWER_PHASE_FINISH_ANGLE ((FIT_EXD_DESCRIPTORS)64) -#define FIT_EXD_DESCRIPTORS_GEARS ((FIT_EXD_DESCRIPTORS)65) // Combined gear information -#define FIT_EXD_DESCRIPTORS_PACE ((FIT_EXD_DESCRIPTORS)66) -#define FIT_EXD_DESCRIPTORS_TRAINING_EFFECT ((FIT_EXD_DESCRIPTORS)67) -#define FIT_EXD_DESCRIPTORS_VERTICAL_OSCILLATION ((FIT_EXD_DESCRIPTORS)68) -#define FIT_EXD_DESCRIPTORS_VERTICAL_RATIO ((FIT_EXD_DESCRIPTORS)69) -#define FIT_EXD_DESCRIPTORS_GROUND_CONTACT_TIME ((FIT_EXD_DESCRIPTORS)70) -#define FIT_EXD_DESCRIPTORS_LEFT_GROUND_CONTACT_TIME_BALANCE ((FIT_EXD_DESCRIPTORS)71) -#define FIT_EXD_DESCRIPTORS_RIGHT_GROUND_CONTACT_TIME_BALANCE ((FIT_EXD_DESCRIPTORS)72) -#define FIT_EXD_DESCRIPTORS_STRIDE_LENGTH ((FIT_EXD_DESCRIPTORS)73) -#define FIT_EXD_DESCRIPTORS_RUNNING_CADENCE ((FIT_EXD_DESCRIPTORS)74) -#define FIT_EXD_DESCRIPTORS_PERFORMANCE_CONDITION ((FIT_EXD_DESCRIPTORS)75) -#define FIT_EXD_DESCRIPTORS_COURSE_TYPE ((FIT_EXD_DESCRIPTORS)76) -#define FIT_EXD_DESCRIPTORS_TIME_IN_POWER_ZONE ((FIT_EXD_DESCRIPTORS)77) -#define FIT_EXD_DESCRIPTORS_NAVIGATION_TURN ((FIT_EXD_DESCRIPTORS)78) -#define FIT_EXD_DESCRIPTORS_COURSE_LOCATION ((FIT_EXD_DESCRIPTORS)79) -#define FIT_EXD_DESCRIPTORS_NAVIGATION_LOCATION ((FIT_EXD_DESCRIPTORS)80) -#define FIT_EXD_DESCRIPTORS_COMPASS ((FIT_EXD_DESCRIPTORS)81) -#define FIT_EXD_DESCRIPTORS_GEAR_COMBO ((FIT_EXD_DESCRIPTORS)82) -#define FIT_EXD_DESCRIPTORS_MUSCLE_OXYGEN ((FIT_EXD_DESCRIPTORS)83) -#define FIT_EXD_DESCRIPTORS_ICON ((FIT_EXD_DESCRIPTORS)84) -#define FIT_EXD_DESCRIPTORS_COMPASS_HEADING ((FIT_EXD_DESCRIPTORS)85) -#define FIT_EXD_DESCRIPTORS_GPS_HEADING ((FIT_EXD_DESCRIPTORS)86) -#define FIT_EXD_DESCRIPTORS_GPS_ELEVATION ((FIT_EXD_DESCRIPTORS)87) -#define FIT_EXD_DESCRIPTORS_ANAEROBIC_TRAINING_EFFECT ((FIT_EXD_DESCRIPTORS)88) -#define FIT_EXD_DESCRIPTORS_COURSE ((FIT_EXD_DESCRIPTORS)89) -#define FIT_EXD_DESCRIPTORS_OFF_COURSE ((FIT_EXD_DESCRIPTORS)90) -#define FIT_EXD_DESCRIPTORS_GLIDE_RATIO ((FIT_EXD_DESCRIPTORS)91) -#define FIT_EXD_DESCRIPTORS_VERTICAL_DISTANCE ((FIT_EXD_DESCRIPTORS)92) -#define FIT_EXD_DESCRIPTORS_VMG ((FIT_EXD_DESCRIPTORS)93) -#define FIT_EXD_DESCRIPTORS_AMBIENT_PRESSURE ((FIT_EXD_DESCRIPTORS)94) -#define FIT_EXD_DESCRIPTORS_PRESSURE ((FIT_EXD_DESCRIPTORS)95) -#define FIT_EXD_DESCRIPTORS_VAM ((FIT_EXD_DESCRIPTORS)96) -#define FIT_EXD_DESCRIPTORS_COUNT 97 - -typedef FIT_UINT32 FIT_AUTO_ACTIVITY_DETECT; -#define FIT_AUTO_ACTIVITY_DETECT_INVALID FIT_UINT32_INVALID -#define FIT_AUTO_ACTIVITY_DETECT_NONE ((FIT_AUTO_ACTIVITY_DETECT)0x00000000) -#define FIT_AUTO_ACTIVITY_DETECT_RUNNING ((FIT_AUTO_ACTIVITY_DETECT)0x00000001) -#define FIT_AUTO_ACTIVITY_DETECT_CYCLING ((FIT_AUTO_ACTIVITY_DETECT)0x00000002) -#define FIT_AUTO_ACTIVITY_DETECT_SWIMMING ((FIT_AUTO_ACTIVITY_DETECT)0x00000004) -#define FIT_AUTO_ACTIVITY_DETECT_WALKING ((FIT_AUTO_ACTIVITY_DETECT)0x00000008) -#define FIT_AUTO_ACTIVITY_DETECT_ELLIPTICAL ((FIT_AUTO_ACTIVITY_DETECT)0x00000020) -#define FIT_AUTO_ACTIVITY_DETECT_SEDENTARY ((FIT_AUTO_ACTIVITY_DETECT)0x00000400) -#define FIT_AUTO_ACTIVITY_DETECT_COUNT 7 - -typedef FIT_UINT32Z FIT_SUPPORTED_EXD_SCREEN_LAYOUTS; -#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_INVALID FIT_UINT32Z_INVALID -#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_FULL_SCREEN ((FIT_SUPPORTED_EXD_SCREEN_LAYOUTS)0x00000001) -#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_HALF_VERTICAL ((FIT_SUPPORTED_EXD_SCREEN_LAYOUTS)0x00000002) -#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_HALF_HORIZONTAL ((FIT_SUPPORTED_EXD_SCREEN_LAYOUTS)0x00000004) -#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_HALF_VERTICAL_RIGHT_SPLIT ((FIT_SUPPORTED_EXD_SCREEN_LAYOUTS)0x00000008) -#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_HALF_HORIZONTAL_BOTTOM_SPLIT ((FIT_SUPPORTED_EXD_SCREEN_LAYOUTS)0x00000010) -#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_FULL_QUARTER_SPLIT ((FIT_SUPPORTED_EXD_SCREEN_LAYOUTS)0x00000020) -#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_HALF_VERTICAL_LEFT_SPLIT ((FIT_SUPPORTED_EXD_SCREEN_LAYOUTS)0x00000040) -#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_HALF_HORIZONTAL_TOP_SPLIT ((FIT_SUPPORTED_EXD_SCREEN_LAYOUTS)0x00000080) -#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_COUNT 8 - -typedef FIT_UINT8 FIT_FIT_BASE_TYPE; -#define FIT_FIT_BASE_TYPE_INVALID FIT_UINT8_INVALID -#define FIT_FIT_BASE_TYPE_ENUM ((FIT_FIT_BASE_TYPE)0) -#define FIT_FIT_BASE_TYPE_SINT8 ((FIT_FIT_BASE_TYPE)1) -#define FIT_FIT_BASE_TYPE_UINT8 ((FIT_FIT_BASE_TYPE)2) -#define FIT_FIT_BASE_TYPE_SINT16 ((FIT_FIT_BASE_TYPE)131) -#define FIT_FIT_BASE_TYPE_UINT16 ((FIT_FIT_BASE_TYPE)132) -#define FIT_FIT_BASE_TYPE_SINT32 ((FIT_FIT_BASE_TYPE)133) -#define FIT_FIT_BASE_TYPE_UINT32 ((FIT_FIT_BASE_TYPE)134) -#define FIT_FIT_BASE_TYPE_STRING ((FIT_FIT_BASE_TYPE)7) -#define FIT_FIT_BASE_TYPE_FLOAT32 ((FIT_FIT_BASE_TYPE)136) -#define FIT_FIT_BASE_TYPE_FLOAT64 ((FIT_FIT_BASE_TYPE)137) -#define FIT_FIT_BASE_TYPE_UINT8Z ((FIT_FIT_BASE_TYPE)10) -#define FIT_FIT_BASE_TYPE_UINT16Z ((FIT_FIT_BASE_TYPE)139) -#define FIT_FIT_BASE_TYPE_UINT32Z ((FIT_FIT_BASE_TYPE)140) -#define FIT_FIT_BASE_TYPE_BYTE ((FIT_FIT_BASE_TYPE)13) -#define FIT_FIT_BASE_TYPE_SINT64 ((FIT_FIT_BASE_TYPE)142) -#define FIT_FIT_BASE_TYPE_UINT64 ((FIT_FIT_BASE_TYPE)143) -#define FIT_FIT_BASE_TYPE_UINT64Z ((FIT_FIT_BASE_TYPE)144) -#define FIT_FIT_BASE_TYPE_COUNT 17 - -typedef FIT_ENUM FIT_TURN_TYPE; -#define FIT_TURN_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_TURN_TYPE_ARRIVING_IDX ((FIT_TURN_TYPE)0) -#define FIT_TURN_TYPE_ARRIVING_LEFT_IDX ((FIT_TURN_TYPE)1) -#define FIT_TURN_TYPE_ARRIVING_RIGHT_IDX ((FIT_TURN_TYPE)2) -#define FIT_TURN_TYPE_ARRIVING_VIA_IDX ((FIT_TURN_TYPE)3) -#define FIT_TURN_TYPE_ARRIVING_VIA_LEFT_IDX ((FIT_TURN_TYPE)4) -#define FIT_TURN_TYPE_ARRIVING_VIA_RIGHT_IDX ((FIT_TURN_TYPE)5) -#define FIT_TURN_TYPE_BEAR_KEEP_LEFT_IDX ((FIT_TURN_TYPE)6) -#define FIT_TURN_TYPE_BEAR_KEEP_RIGHT_IDX ((FIT_TURN_TYPE)7) -#define FIT_TURN_TYPE_CONTINUE_IDX ((FIT_TURN_TYPE)8) -#define FIT_TURN_TYPE_EXIT_LEFT_IDX ((FIT_TURN_TYPE)9) -#define FIT_TURN_TYPE_EXIT_RIGHT_IDX ((FIT_TURN_TYPE)10) -#define FIT_TURN_TYPE_FERRY_IDX ((FIT_TURN_TYPE)11) -#define FIT_TURN_TYPE_ROUNDABOUT_45_IDX ((FIT_TURN_TYPE)12) -#define FIT_TURN_TYPE_ROUNDABOUT_90_IDX ((FIT_TURN_TYPE)13) -#define FIT_TURN_TYPE_ROUNDABOUT_135_IDX ((FIT_TURN_TYPE)14) -#define FIT_TURN_TYPE_ROUNDABOUT_180_IDX ((FIT_TURN_TYPE)15) -#define FIT_TURN_TYPE_ROUNDABOUT_225_IDX ((FIT_TURN_TYPE)16) -#define FIT_TURN_TYPE_ROUNDABOUT_270_IDX ((FIT_TURN_TYPE)17) -#define FIT_TURN_TYPE_ROUNDABOUT_315_IDX ((FIT_TURN_TYPE)18) -#define FIT_TURN_TYPE_ROUNDABOUT_360_IDX ((FIT_TURN_TYPE)19) -#define FIT_TURN_TYPE_ROUNDABOUT_NEG_45_IDX ((FIT_TURN_TYPE)20) -#define FIT_TURN_TYPE_ROUNDABOUT_NEG_90_IDX ((FIT_TURN_TYPE)21) -#define FIT_TURN_TYPE_ROUNDABOUT_NEG_135_IDX ((FIT_TURN_TYPE)22) -#define FIT_TURN_TYPE_ROUNDABOUT_NEG_180_IDX ((FIT_TURN_TYPE)23) -#define FIT_TURN_TYPE_ROUNDABOUT_NEG_225_IDX ((FIT_TURN_TYPE)24) -#define FIT_TURN_TYPE_ROUNDABOUT_NEG_270_IDX ((FIT_TURN_TYPE)25) -#define FIT_TURN_TYPE_ROUNDABOUT_NEG_315_IDX ((FIT_TURN_TYPE)26) -#define FIT_TURN_TYPE_ROUNDABOUT_NEG_360_IDX ((FIT_TURN_TYPE)27) -#define FIT_TURN_TYPE_ROUNDABOUT_GENERIC_IDX ((FIT_TURN_TYPE)28) -#define FIT_TURN_TYPE_ROUNDABOUT_NEG_GENERIC_IDX ((FIT_TURN_TYPE)29) -#define FIT_TURN_TYPE_SHARP_TURN_LEFT_IDX ((FIT_TURN_TYPE)30) -#define FIT_TURN_TYPE_SHARP_TURN_RIGHT_IDX ((FIT_TURN_TYPE)31) -#define FIT_TURN_TYPE_TURN_LEFT_IDX ((FIT_TURN_TYPE)32) -#define FIT_TURN_TYPE_TURN_RIGHT_IDX ((FIT_TURN_TYPE)33) -#define FIT_TURN_TYPE_UTURN_LEFT_IDX ((FIT_TURN_TYPE)34) -#define FIT_TURN_TYPE_UTURN_RIGHT_IDX ((FIT_TURN_TYPE)35) -#define FIT_TURN_TYPE_ICON_INV_IDX ((FIT_TURN_TYPE)36) -#define FIT_TURN_TYPE_ICON_IDX_CNT ((FIT_TURN_TYPE)37) -#define FIT_TURN_TYPE_COUNT 38 - -typedef FIT_UINT8 FIT_BIKE_LIGHT_BEAM_ANGLE_MODE; -#define FIT_BIKE_LIGHT_BEAM_ANGLE_MODE_INVALID FIT_UINT8_INVALID -#define FIT_BIKE_LIGHT_BEAM_ANGLE_MODE_MANUAL ((FIT_BIKE_LIGHT_BEAM_ANGLE_MODE)0) -#define FIT_BIKE_LIGHT_BEAM_ANGLE_MODE_AUTO ((FIT_BIKE_LIGHT_BEAM_ANGLE_MODE)1) -#define FIT_BIKE_LIGHT_BEAM_ANGLE_MODE_COUNT 2 - -typedef FIT_UINT16 FIT_FIT_BASE_UNIT; -#define FIT_FIT_BASE_UNIT_INVALID FIT_UINT16_INVALID -#define FIT_FIT_BASE_UNIT_OTHER ((FIT_FIT_BASE_UNIT)0) -#define FIT_FIT_BASE_UNIT_KILOGRAM ((FIT_FIT_BASE_UNIT)1) -#define FIT_FIT_BASE_UNIT_POUND ((FIT_FIT_BASE_UNIT)2) -#define FIT_FIT_BASE_UNIT_COUNT 3 - -typedef FIT_UINT8 FIT_SET_TYPE; -#define FIT_SET_TYPE_INVALID FIT_UINT8_INVALID -#define FIT_SET_TYPE_REST ((FIT_SET_TYPE)0) -#define FIT_SET_TYPE_ACTIVE ((FIT_SET_TYPE)1) -#define FIT_SET_TYPE_COUNT 2 - -typedef FIT_ENUM FIT_MAX_MET_CATEGORY; -#define FIT_MAX_MET_CATEGORY_INVALID FIT_ENUM_INVALID -#define FIT_MAX_MET_CATEGORY_GENERIC ((FIT_MAX_MET_CATEGORY)0) -#define FIT_MAX_MET_CATEGORY_CYCLING ((FIT_MAX_MET_CATEGORY)1) -#define FIT_MAX_MET_CATEGORY_COUNT 2 - -typedef FIT_UINT16 FIT_EXERCISE_CATEGORY; -#define FIT_EXERCISE_CATEGORY_INVALID FIT_UINT16_INVALID -#define FIT_EXERCISE_CATEGORY_BENCH_PRESS ((FIT_EXERCISE_CATEGORY)0) -#define FIT_EXERCISE_CATEGORY_CALF_RAISE ((FIT_EXERCISE_CATEGORY)1) -#define FIT_EXERCISE_CATEGORY_CARDIO ((FIT_EXERCISE_CATEGORY)2) -#define FIT_EXERCISE_CATEGORY_CARRY ((FIT_EXERCISE_CATEGORY)3) -#define FIT_EXERCISE_CATEGORY_CHOP ((FIT_EXERCISE_CATEGORY)4) -#define FIT_EXERCISE_CATEGORY_CORE ((FIT_EXERCISE_CATEGORY)5) -#define FIT_EXERCISE_CATEGORY_CRUNCH ((FIT_EXERCISE_CATEGORY)6) -#define FIT_EXERCISE_CATEGORY_CURL ((FIT_EXERCISE_CATEGORY)7) -#define FIT_EXERCISE_CATEGORY_DEADLIFT ((FIT_EXERCISE_CATEGORY)8) -#define FIT_EXERCISE_CATEGORY_FLYE ((FIT_EXERCISE_CATEGORY)9) -#define FIT_EXERCISE_CATEGORY_HIP_RAISE ((FIT_EXERCISE_CATEGORY)10) -#define FIT_EXERCISE_CATEGORY_HIP_STABILITY ((FIT_EXERCISE_CATEGORY)11) -#define FIT_EXERCISE_CATEGORY_HIP_SWING ((FIT_EXERCISE_CATEGORY)12) -#define FIT_EXERCISE_CATEGORY_HYPEREXTENSION ((FIT_EXERCISE_CATEGORY)13) -#define FIT_EXERCISE_CATEGORY_LATERAL_RAISE ((FIT_EXERCISE_CATEGORY)14) -#define FIT_EXERCISE_CATEGORY_LEG_CURL ((FIT_EXERCISE_CATEGORY)15) -#define FIT_EXERCISE_CATEGORY_LEG_RAISE ((FIT_EXERCISE_CATEGORY)16) -#define FIT_EXERCISE_CATEGORY_LUNGE ((FIT_EXERCISE_CATEGORY)17) -#define FIT_EXERCISE_CATEGORY_OLYMPIC_LIFT ((FIT_EXERCISE_CATEGORY)18) -#define FIT_EXERCISE_CATEGORY_PLANK ((FIT_EXERCISE_CATEGORY)19) -#define FIT_EXERCISE_CATEGORY_PLYO ((FIT_EXERCISE_CATEGORY)20) -#define FIT_EXERCISE_CATEGORY_PULL_UP ((FIT_EXERCISE_CATEGORY)21) -#define FIT_EXERCISE_CATEGORY_PUSH_UP ((FIT_EXERCISE_CATEGORY)22) -#define FIT_EXERCISE_CATEGORY_ROW ((FIT_EXERCISE_CATEGORY)23) -#define FIT_EXERCISE_CATEGORY_SHOULDER_PRESS ((FIT_EXERCISE_CATEGORY)24) -#define FIT_EXERCISE_CATEGORY_SHOULDER_STABILITY ((FIT_EXERCISE_CATEGORY)25) -#define FIT_EXERCISE_CATEGORY_SHRUG ((FIT_EXERCISE_CATEGORY)26) -#define FIT_EXERCISE_CATEGORY_SIT_UP ((FIT_EXERCISE_CATEGORY)27) -#define FIT_EXERCISE_CATEGORY_SQUAT ((FIT_EXERCISE_CATEGORY)28) -#define FIT_EXERCISE_CATEGORY_TOTAL_BODY ((FIT_EXERCISE_CATEGORY)29) -#define FIT_EXERCISE_CATEGORY_TRICEPS_EXTENSION ((FIT_EXERCISE_CATEGORY)30) -#define FIT_EXERCISE_CATEGORY_WARM_UP ((FIT_EXERCISE_CATEGORY)31) -#define FIT_EXERCISE_CATEGORY_RUN ((FIT_EXERCISE_CATEGORY)32) -#define FIT_EXERCISE_CATEGORY_UNKNOWN ((FIT_EXERCISE_CATEGORY)65534) -#define FIT_EXERCISE_CATEGORY_COUNT 34 - -typedef FIT_UINT16 FIT_BENCH_PRESS_EXERCISE_NAME; -#define FIT_BENCH_PRESS_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_BENCH_PRESS_EXERCISE_NAME_ALTERNATING_DUMBBELL_CHEST_PRESS_ON_SWISS_BALL ((FIT_BENCH_PRESS_EXERCISE_NAME)0) -#define FIT_BENCH_PRESS_EXERCISE_NAME_BARBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)1) -#define FIT_BENCH_PRESS_EXERCISE_NAME_BARBELL_BOARD_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)2) -#define FIT_BENCH_PRESS_EXERCISE_NAME_BARBELL_FLOOR_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)3) -#define FIT_BENCH_PRESS_EXERCISE_NAME_CLOSE_GRIP_BARBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)4) -#define FIT_BENCH_PRESS_EXERCISE_NAME_DECLINE_DUMBBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)5) -#define FIT_BENCH_PRESS_EXERCISE_NAME_DUMBBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)6) -#define FIT_BENCH_PRESS_EXERCISE_NAME_DUMBBELL_FLOOR_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)7) -#define FIT_BENCH_PRESS_EXERCISE_NAME_INCLINE_BARBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)8) -#define FIT_BENCH_PRESS_EXERCISE_NAME_INCLINE_DUMBBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)9) -#define FIT_BENCH_PRESS_EXERCISE_NAME_INCLINE_SMITH_MACHINE_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)10) -#define FIT_BENCH_PRESS_EXERCISE_NAME_ISOMETRIC_BARBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)11) -#define FIT_BENCH_PRESS_EXERCISE_NAME_KETTLEBELL_CHEST_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)12) -#define FIT_BENCH_PRESS_EXERCISE_NAME_NEUTRAL_GRIP_DUMBBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)13) -#define FIT_BENCH_PRESS_EXERCISE_NAME_NEUTRAL_GRIP_DUMBBELL_INCLINE_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)14) -#define FIT_BENCH_PRESS_EXERCISE_NAME_ONE_ARM_FLOOR_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)15) -#define FIT_BENCH_PRESS_EXERCISE_NAME_WEIGHTED_ONE_ARM_FLOOR_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)16) -#define FIT_BENCH_PRESS_EXERCISE_NAME_PARTIAL_LOCKOUT ((FIT_BENCH_PRESS_EXERCISE_NAME)17) -#define FIT_BENCH_PRESS_EXERCISE_NAME_REVERSE_GRIP_BARBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)18) -#define FIT_BENCH_PRESS_EXERCISE_NAME_REVERSE_GRIP_INCLINE_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)19) -#define FIT_BENCH_PRESS_EXERCISE_NAME_SINGLE_ARM_CABLE_CHEST_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)20) -#define FIT_BENCH_PRESS_EXERCISE_NAME_SINGLE_ARM_DUMBBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)21) -#define FIT_BENCH_PRESS_EXERCISE_NAME_SMITH_MACHINE_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)22) -#define FIT_BENCH_PRESS_EXERCISE_NAME_SWISS_BALL_DUMBBELL_CHEST_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)23) -#define FIT_BENCH_PRESS_EXERCISE_NAME_TRIPLE_STOP_BARBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)24) -#define FIT_BENCH_PRESS_EXERCISE_NAME_WIDE_GRIP_BARBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)25) -#define FIT_BENCH_PRESS_EXERCISE_NAME_ALTERNATING_DUMBBELL_CHEST_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)26) -#define FIT_BENCH_PRESS_EXERCISE_NAME_COUNT 27 - -typedef FIT_UINT16 FIT_CALF_RAISE_EXERCISE_NAME; -#define FIT_CALF_RAISE_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_CALF_RAISE_EXERCISE_NAME_3_WAY_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)0) -#define FIT_CALF_RAISE_EXERCISE_NAME_3_WAY_WEIGHTED_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)1) -#define FIT_CALF_RAISE_EXERCISE_NAME_3_WAY_SINGLE_LEG_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)2) -#define FIT_CALF_RAISE_EXERCISE_NAME_3_WAY_WEIGHTED_SINGLE_LEG_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)3) -#define FIT_CALF_RAISE_EXERCISE_NAME_DONKEY_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)4) -#define FIT_CALF_RAISE_EXERCISE_NAME_WEIGHTED_DONKEY_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)5) -#define FIT_CALF_RAISE_EXERCISE_NAME_SEATED_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)6) -#define FIT_CALF_RAISE_EXERCISE_NAME_WEIGHTED_SEATED_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)7) -#define FIT_CALF_RAISE_EXERCISE_NAME_SEATED_DUMBBELL_TOE_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)8) -#define FIT_CALF_RAISE_EXERCISE_NAME_SINGLE_LEG_BENT_KNEE_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)9) -#define FIT_CALF_RAISE_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_BENT_KNEE_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)10) -#define FIT_CALF_RAISE_EXERCISE_NAME_SINGLE_LEG_DECLINE_PUSH_UP ((FIT_CALF_RAISE_EXERCISE_NAME)11) -#define FIT_CALF_RAISE_EXERCISE_NAME_SINGLE_LEG_DONKEY_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)12) -#define FIT_CALF_RAISE_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_DONKEY_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)13) -#define FIT_CALF_RAISE_EXERCISE_NAME_SINGLE_LEG_HIP_RAISE_WITH_KNEE_HOLD ((FIT_CALF_RAISE_EXERCISE_NAME)14) -#define FIT_CALF_RAISE_EXERCISE_NAME_SINGLE_LEG_STANDING_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)15) -#define FIT_CALF_RAISE_EXERCISE_NAME_SINGLE_LEG_STANDING_DUMBBELL_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)16) -#define FIT_CALF_RAISE_EXERCISE_NAME_STANDING_BARBELL_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)17) -#define FIT_CALF_RAISE_EXERCISE_NAME_STANDING_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)18) -#define FIT_CALF_RAISE_EXERCISE_NAME_WEIGHTED_STANDING_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)19) -#define FIT_CALF_RAISE_EXERCISE_NAME_STANDING_DUMBBELL_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)20) -#define FIT_CALF_RAISE_EXERCISE_NAME_COUNT 21 - -typedef FIT_UINT16 FIT_CARDIO_EXERCISE_NAME; -#define FIT_CARDIO_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_CARDIO_EXERCISE_NAME_BOB_AND_WEAVE_CIRCLE ((FIT_CARDIO_EXERCISE_NAME)0) -#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_BOB_AND_WEAVE_CIRCLE ((FIT_CARDIO_EXERCISE_NAME)1) -#define FIT_CARDIO_EXERCISE_NAME_CARDIO_CORE_CRAWL ((FIT_CARDIO_EXERCISE_NAME)2) -#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_CARDIO_CORE_CRAWL ((FIT_CARDIO_EXERCISE_NAME)3) -#define FIT_CARDIO_EXERCISE_NAME_DOUBLE_UNDER ((FIT_CARDIO_EXERCISE_NAME)4) -#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_DOUBLE_UNDER ((FIT_CARDIO_EXERCISE_NAME)5) -#define FIT_CARDIO_EXERCISE_NAME_JUMP_ROPE ((FIT_CARDIO_EXERCISE_NAME)6) -#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_JUMP_ROPE ((FIT_CARDIO_EXERCISE_NAME)7) -#define FIT_CARDIO_EXERCISE_NAME_JUMP_ROPE_CROSSOVER ((FIT_CARDIO_EXERCISE_NAME)8) -#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_JUMP_ROPE_CROSSOVER ((FIT_CARDIO_EXERCISE_NAME)9) -#define FIT_CARDIO_EXERCISE_NAME_JUMP_ROPE_JOG ((FIT_CARDIO_EXERCISE_NAME)10) -#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_JUMP_ROPE_JOG ((FIT_CARDIO_EXERCISE_NAME)11) -#define FIT_CARDIO_EXERCISE_NAME_JUMPING_JACKS ((FIT_CARDIO_EXERCISE_NAME)12) -#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_JUMPING_JACKS ((FIT_CARDIO_EXERCISE_NAME)13) -#define FIT_CARDIO_EXERCISE_NAME_SKI_MOGULS ((FIT_CARDIO_EXERCISE_NAME)14) -#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_SKI_MOGULS ((FIT_CARDIO_EXERCISE_NAME)15) -#define FIT_CARDIO_EXERCISE_NAME_SPLIT_JACKS ((FIT_CARDIO_EXERCISE_NAME)16) -#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_SPLIT_JACKS ((FIT_CARDIO_EXERCISE_NAME)17) -#define FIT_CARDIO_EXERCISE_NAME_SQUAT_JACKS ((FIT_CARDIO_EXERCISE_NAME)18) -#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_SQUAT_JACKS ((FIT_CARDIO_EXERCISE_NAME)19) -#define FIT_CARDIO_EXERCISE_NAME_TRIPLE_UNDER ((FIT_CARDIO_EXERCISE_NAME)20) -#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_TRIPLE_UNDER ((FIT_CARDIO_EXERCISE_NAME)21) -#define FIT_CARDIO_EXERCISE_NAME_COUNT 22 - -typedef FIT_UINT16 FIT_CARRY_EXERCISE_NAME; -#define FIT_CARRY_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_CARRY_EXERCISE_NAME_BAR_HOLDS ((FIT_CARRY_EXERCISE_NAME)0) -#define FIT_CARRY_EXERCISE_NAME_FARMERS_WALK ((FIT_CARRY_EXERCISE_NAME)1) -#define FIT_CARRY_EXERCISE_NAME_FARMERS_WALK_ON_TOES ((FIT_CARRY_EXERCISE_NAME)2) -#define FIT_CARRY_EXERCISE_NAME_HEX_DUMBBELL_HOLD ((FIT_CARRY_EXERCISE_NAME)3) -#define FIT_CARRY_EXERCISE_NAME_OVERHEAD_CARRY ((FIT_CARRY_EXERCISE_NAME)4) -#define FIT_CARRY_EXERCISE_NAME_COUNT 5 - -typedef FIT_UINT16 FIT_CHOP_EXERCISE_NAME; -#define FIT_CHOP_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_CHOP_EXERCISE_NAME_CABLE_PULL_THROUGH ((FIT_CHOP_EXERCISE_NAME)0) -#define FIT_CHOP_EXERCISE_NAME_CABLE_ROTATIONAL_LIFT ((FIT_CHOP_EXERCISE_NAME)1) -#define FIT_CHOP_EXERCISE_NAME_CABLE_WOODCHOP ((FIT_CHOP_EXERCISE_NAME)2) -#define FIT_CHOP_EXERCISE_NAME_CROSS_CHOP_TO_KNEE ((FIT_CHOP_EXERCISE_NAME)3) -#define FIT_CHOP_EXERCISE_NAME_WEIGHTED_CROSS_CHOP_TO_KNEE ((FIT_CHOP_EXERCISE_NAME)4) -#define FIT_CHOP_EXERCISE_NAME_DUMBBELL_CHOP ((FIT_CHOP_EXERCISE_NAME)5) -#define FIT_CHOP_EXERCISE_NAME_HALF_KNEELING_ROTATION ((FIT_CHOP_EXERCISE_NAME)6) -#define FIT_CHOP_EXERCISE_NAME_WEIGHTED_HALF_KNEELING_ROTATION ((FIT_CHOP_EXERCISE_NAME)7) -#define FIT_CHOP_EXERCISE_NAME_HALF_KNEELING_ROTATIONAL_CHOP ((FIT_CHOP_EXERCISE_NAME)8) -#define FIT_CHOP_EXERCISE_NAME_HALF_KNEELING_ROTATIONAL_REVERSE_CHOP ((FIT_CHOP_EXERCISE_NAME)9) -#define FIT_CHOP_EXERCISE_NAME_HALF_KNEELING_STABILITY_CHOP ((FIT_CHOP_EXERCISE_NAME)10) -#define FIT_CHOP_EXERCISE_NAME_HALF_KNEELING_STABILITY_REVERSE_CHOP ((FIT_CHOP_EXERCISE_NAME)11) -#define FIT_CHOP_EXERCISE_NAME_KNEELING_ROTATIONAL_CHOP ((FIT_CHOP_EXERCISE_NAME)12) -#define FIT_CHOP_EXERCISE_NAME_KNEELING_ROTATIONAL_REVERSE_CHOP ((FIT_CHOP_EXERCISE_NAME)13) -#define FIT_CHOP_EXERCISE_NAME_KNEELING_STABILITY_CHOP ((FIT_CHOP_EXERCISE_NAME)14) -#define FIT_CHOP_EXERCISE_NAME_KNEELING_WOODCHOPPER ((FIT_CHOP_EXERCISE_NAME)15) -#define FIT_CHOP_EXERCISE_NAME_MEDICINE_BALL_WOOD_CHOPS ((FIT_CHOP_EXERCISE_NAME)16) -#define FIT_CHOP_EXERCISE_NAME_POWER_SQUAT_CHOPS ((FIT_CHOP_EXERCISE_NAME)17) -#define FIT_CHOP_EXERCISE_NAME_WEIGHTED_POWER_SQUAT_CHOPS ((FIT_CHOP_EXERCISE_NAME)18) -#define FIT_CHOP_EXERCISE_NAME_STANDING_ROTATIONAL_CHOP ((FIT_CHOP_EXERCISE_NAME)19) -#define FIT_CHOP_EXERCISE_NAME_STANDING_SPLIT_ROTATIONAL_CHOP ((FIT_CHOP_EXERCISE_NAME)20) -#define FIT_CHOP_EXERCISE_NAME_STANDING_SPLIT_ROTATIONAL_REVERSE_CHOP ((FIT_CHOP_EXERCISE_NAME)21) -#define FIT_CHOP_EXERCISE_NAME_STANDING_STABILITY_REVERSE_CHOP ((FIT_CHOP_EXERCISE_NAME)22) -#define FIT_CHOP_EXERCISE_NAME_COUNT 23 - -typedef FIT_UINT16 FIT_CORE_EXERCISE_NAME; -#define FIT_CORE_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_CORE_EXERCISE_NAME_ABS_JABS ((FIT_CORE_EXERCISE_NAME)0) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_ABS_JABS ((FIT_CORE_EXERCISE_NAME)1) -#define FIT_CORE_EXERCISE_NAME_ALTERNATING_PLATE_REACH ((FIT_CORE_EXERCISE_NAME)2) -#define FIT_CORE_EXERCISE_NAME_BARBELL_ROLLOUT ((FIT_CORE_EXERCISE_NAME)3) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_BARBELL_ROLLOUT ((FIT_CORE_EXERCISE_NAME)4) -#define FIT_CORE_EXERCISE_NAME_BODY_BAR_OBLIQUE_TWIST ((FIT_CORE_EXERCISE_NAME)5) -#define FIT_CORE_EXERCISE_NAME_CABLE_CORE_PRESS ((FIT_CORE_EXERCISE_NAME)6) -#define FIT_CORE_EXERCISE_NAME_CABLE_SIDE_BEND ((FIT_CORE_EXERCISE_NAME)7) -#define FIT_CORE_EXERCISE_NAME_SIDE_BEND ((FIT_CORE_EXERCISE_NAME)8) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_SIDE_BEND ((FIT_CORE_EXERCISE_NAME)9) -#define FIT_CORE_EXERCISE_NAME_CRESCENT_CIRCLE ((FIT_CORE_EXERCISE_NAME)10) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_CRESCENT_CIRCLE ((FIT_CORE_EXERCISE_NAME)11) -#define FIT_CORE_EXERCISE_NAME_CYCLING_RUSSIAN_TWIST ((FIT_CORE_EXERCISE_NAME)12) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_CYCLING_RUSSIAN_TWIST ((FIT_CORE_EXERCISE_NAME)13) -#define FIT_CORE_EXERCISE_NAME_ELEVATED_FEET_RUSSIAN_TWIST ((FIT_CORE_EXERCISE_NAME)14) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_ELEVATED_FEET_RUSSIAN_TWIST ((FIT_CORE_EXERCISE_NAME)15) -#define FIT_CORE_EXERCISE_NAME_HALF_TURKISH_GET_UP ((FIT_CORE_EXERCISE_NAME)16) -#define FIT_CORE_EXERCISE_NAME_KETTLEBELL_WINDMILL ((FIT_CORE_EXERCISE_NAME)17) -#define FIT_CORE_EXERCISE_NAME_KNEELING_AB_WHEEL ((FIT_CORE_EXERCISE_NAME)18) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_KNEELING_AB_WHEEL ((FIT_CORE_EXERCISE_NAME)19) -#define FIT_CORE_EXERCISE_NAME_MODIFIED_FRONT_LEVER ((FIT_CORE_EXERCISE_NAME)20) -#define FIT_CORE_EXERCISE_NAME_OPEN_KNEE_TUCKS ((FIT_CORE_EXERCISE_NAME)21) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_OPEN_KNEE_TUCKS ((FIT_CORE_EXERCISE_NAME)22) -#define FIT_CORE_EXERCISE_NAME_SIDE_ABS_LEG_LIFT ((FIT_CORE_EXERCISE_NAME)23) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_SIDE_ABS_LEG_LIFT ((FIT_CORE_EXERCISE_NAME)24) -#define FIT_CORE_EXERCISE_NAME_SWISS_BALL_JACKKNIFE ((FIT_CORE_EXERCISE_NAME)25) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_SWISS_BALL_JACKKNIFE ((FIT_CORE_EXERCISE_NAME)26) -#define FIT_CORE_EXERCISE_NAME_SWISS_BALL_PIKE ((FIT_CORE_EXERCISE_NAME)27) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_SWISS_BALL_PIKE ((FIT_CORE_EXERCISE_NAME)28) -#define FIT_CORE_EXERCISE_NAME_SWISS_BALL_ROLLOUT ((FIT_CORE_EXERCISE_NAME)29) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_SWISS_BALL_ROLLOUT ((FIT_CORE_EXERCISE_NAME)30) -#define FIT_CORE_EXERCISE_NAME_TRIANGLE_HIP_PRESS ((FIT_CORE_EXERCISE_NAME)31) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_TRIANGLE_HIP_PRESS ((FIT_CORE_EXERCISE_NAME)32) -#define FIT_CORE_EXERCISE_NAME_TRX_SUSPENDED_JACKKNIFE ((FIT_CORE_EXERCISE_NAME)33) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_TRX_SUSPENDED_JACKKNIFE ((FIT_CORE_EXERCISE_NAME)34) -#define FIT_CORE_EXERCISE_NAME_U_BOAT ((FIT_CORE_EXERCISE_NAME)35) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_U_BOAT ((FIT_CORE_EXERCISE_NAME)36) -#define FIT_CORE_EXERCISE_NAME_WINDMILL_SWITCHES ((FIT_CORE_EXERCISE_NAME)37) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_WINDMILL_SWITCHES ((FIT_CORE_EXERCISE_NAME)38) -#define FIT_CORE_EXERCISE_NAME_ALTERNATING_SLIDE_OUT ((FIT_CORE_EXERCISE_NAME)39) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_ALTERNATING_SLIDE_OUT ((FIT_CORE_EXERCISE_NAME)40) -#define FIT_CORE_EXERCISE_NAME_GHD_BACK_EXTENSIONS ((FIT_CORE_EXERCISE_NAME)41) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_GHD_BACK_EXTENSIONS ((FIT_CORE_EXERCISE_NAME)42) -#define FIT_CORE_EXERCISE_NAME_OVERHEAD_WALK ((FIT_CORE_EXERCISE_NAME)43) -#define FIT_CORE_EXERCISE_NAME_INCHWORM ((FIT_CORE_EXERCISE_NAME)44) -#define FIT_CORE_EXERCISE_NAME_WEIGHTED_MODIFIED_FRONT_LEVER ((FIT_CORE_EXERCISE_NAME)45) -#define FIT_CORE_EXERCISE_NAME_RUSSIAN_TWIST ((FIT_CORE_EXERCISE_NAME)46) -#define FIT_CORE_EXERCISE_NAME_ABDOMINAL_LEG_ROTATIONS ((FIT_CORE_EXERCISE_NAME)47) // Deprecated do not use -#define FIT_CORE_EXERCISE_NAME_ARM_AND_LEG_EXTENSION_ON_KNEES ((FIT_CORE_EXERCISE_NAME)48) -#define FIT_CORE_EXERCISE_NAME_BICYCLE ((FIT_CORE_EXERCISE_NAME)49) -#define FIT_CORE_EXERCISE_NAME_BICEP_CURL_WITH_LEG_EXTENSION ((FIT_CORE_EXERCISE_NAME)50) -#define FIT_CORE_EXERCISE_NAME_CAT_COW ((FIT_CORE_EXERCISE_NAME)51) -#define FIT_CORE_EXERCISE_NAME_CORKSCREW ((FIT_CORE_EXERCISE_NAME)52) -#define FIT_CORE_EXERCISE_NAME_CRISS_CROSS ((FIT_CORE_EXERCISE_NAME)53) -#define FIT_CORE_EXERCISE_NAME_CRISS_CROSS_WITH_BALL ((FIT_CORE_EXERCISE_NAME)54) // Deprecated do not use -#define FIT_CORE_EXERCISE_NAME_DOUBLE_LEG_STRETCH ((FIT_CORE_EXERCISE_NAME)55) -#define FIT_CORE_EXERCISE_NAME_KNEE_FOLDS ((FIT_CORE_EXERCISE_NAME)56) -#define FIT_CORE_EXERCISE_NAME_LOWER_LIFT ((FIT_CORE_EXERCISE_NAME)57) -#define FIT_CORE_EXERCISE_NAME_NECK_PULL ((FIT_CORE_EXERCISE_NAME)58) -#define FIT_CORE_EXERCISE_NAME_PELVIC_CLOCKS ((FIT_CORE_EXERCISE_NAME)59) -#define FIT_CORE_EXERCISE_NAME_ROLL_OVER ((FIT_CORE_EXERCISE_NAME)60) -#define FIT_CORE_EXERCISE_NAME_ROLL_UP ((FIT_CORE_EXERCISE_NAME)61) -#define FIT_CORE_EXERCISE_NAME_ROLLING ((FIT_CORE_EXERCISE_NAME)62) -#define FIT_CORE_EXERCISE_NAME_ROWING_1 ((FIT_CORE_EXERCISE_NAME)63) -#define FIT_CORE_EXERCISE_NAME_ROWING_2 ((FIT_CORE_EXERCISE_NAME)64) -#define FIT_CORE_EXERCISE_NAME_SCISSORS ((FIT_CORE_EXERCISE_NAME)65) -#define FIT_CORE_EXERCISE_NAME_SINGLE_LEG_CIRCLES ((FIT_CORE_EXERCISE_NAME)66) -#define FIT_CORE_EXERCISE_NAME_SINGLE_LEG_STRETCH ((FIT_CORE_EXERCISE_NAME)67) -#define FIT_CORE_EXERCISE_NAME_SNAKE_TWIST_1_AND_2 ((FIT_CORE_EXERCISE_NAME)68) // Deprecated do not use -#define FIT_CORE_EXERCISE_NAME_SWAN ((FIT_CORE_EXERCISE_NAME)69) -#define FIT_CORE_EXERCISE_NAME_SWIMMING ((FIT_CORE_EXERCISE_NAME)70) -#define FIT_CORE_EXERCISE_NAME_TEASER ((FIT_CORE_EXERCISE_NAME)71) -#define FIT_CORE_EXERCISE_NAME_THE_HUNDRED ((FIT_CORE_EXERCISE_NAME)72) -#define FIT_CORE_EXERCISE_NAME_COUNT 73 - -typedef FIT_UINT16 FIT_CRUNCH_EXERCISE_NAME; -#define FIT_CRUNCH_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_CRUNCH_EXERCISE_NAME_BICYCLE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)0) -#define FIT_CRUNCH_EXERCISE_NAME_CABLE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)1) -#define FIT_CRUNCH_EXERCISE_NAME_CIRCULAR_ARM_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)2) -#define FIT_CRUNCH_EXERCISE_NAME_CROSSED_ARMS_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)3) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_CROSSED_ARMS_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)4) -#define FIT_CRUNCH_EXERCISE_NAME_CROSS_LEG_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)5) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_CROSS_LEG_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)6) -#define FIT_CRUNCH_EXERCISE_NAME_CRUNCH_CHOP ((FIT_CRUNCH_EXERCISE_NAME)7) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_CRUNCH_CHOP ((FIT_CRUNCH_EXERCISE_NAME)8) -#define FIT_CRUNCH_EXERCISE_NAME_DOUBLE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)9) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_DOUBLE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)10) -#define FIT_CRUNCH_EXERCISE_NAME_ELBOW_TO_KNEE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)11) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_ELBOW_TO_KNEE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)12) -#define FIT_CRUNCH_EXERCISE_NAME_FLUTTER_KICKS ((FIT_CRUNCH_EXERCISE_NAME)13) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_FLUTTER_KICKS ((FIT_CRUNCH_EXERCISE_NAME)14) -#define FIT_CRUNCH_EXERCISE_NAME_FOAM_ROLLER_REVERSE_CRUNCH_ON_BENCH ((FIT_CRUNCH_EXERCISE_NAME)15) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_FOAM_ROLLER_REVERSE_CRUNCH_ON_BENCH ((FIT_CRUNCH_EXERCISE_NAME)16) -#define FIT_CRUNCH_EXERCISE_NAME_FOAM_ROLLER_REVERSE_CRUNCH_WITH_DUMBBELL ((FIT_CRUNCH_EXERCISE_NAME)17) -#define FIT_CRUNCH_EXERCISE_NAME_FOAM_ROLLER_REVERSE_CRUNCH_WITH_MEDICINE_BALL ((FIT_CRUNCH_EXERCISE_NAME)18) -#define FIT_CRUNCH_EXERCISE_NAME_FROG_PRESS ((FIT_CRUNCH_EXERCISE_NAME)19) -#define FIT_CRUNCH_EXERCISE_NAME_HANGING_KNEE_RAISE_OBLIQUE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)20) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_HANGING_KNEE_RAISE_OBLIQUE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)21) -#define FIT_CRUNCH_EXERCISE_NAME_HIP_CROSSOVER ((FIT_CRUNCH_EXERCISE_NAME)22) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_HIP_CROSSOVER ((FIT_CRUNCH_EXERCISE_NAME)23) -#define FIT_CRUNCH_EXERCISE_NAME_HOLLOW_ROCK ((FIT_CRUNCH_EXERCISE_NAME)24) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_HOLLOW_ROCK ((FIT_CRUNCH_EXERCISE_NAME)25) -#define FIT_CRUNCH_EXERCISE_NAME_INCLINE_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)26) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_INCLINE_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)27) -#define FIT_CRUNCH_EXERCISE_NAME_KNEELING_CABLE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)28) -#define FIT_CRUNCH_EXERCISE_NAME_KNEELING_CROSS_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)29) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_KNEELING_CROSS_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)30) -#define FIT_CRUNCH_EXERCISE_NAME_KNEELING_OBLIQUE_CABLE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)31) -#define FIT_CRUNCH_EXERCISE_NAME_KNEES_TO_ELBOW ((FIT_CRUNCH_EXERCISE_NAME)32) -#define FIT_CRUNCH_EXERCISE_NAME_LEG_EXTENSIONS ((FIT_CRUNCH_EXERCISE_NAME)33) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_LEG_EXTENSIONS ((FIT_CRUNCH_EXERCISE_NAME)34) -#define FIT_CRUNCH_EXERCISE_NAME_LEG_LEVERS ((FIT_CRUNCH_EXERCISE_NAME)35) -#define FIT_CRUNCH_EXERCISE_NAME_MCGILL_CURL_UP ((FIT_CRUNCH_EXERCISE_NAME)36) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_MCGILL_CURL_UP ((FIT_CRUNCH_EXERCISE_NAME)37) -#define FIT_CRUNCH_EXERCISE_NAME_MODIFIED_PILATES_ROLL_UP_WITH_BALL ((FIT_CRUNCH_EXERCISE_NAME)38) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_MODIFIED_PILATES_ROLL_UP_WITH_BALL ((FIT_CRUNCH_EXERCISE_NAME)39) -#define FIT_CRUNCH_EXERCISE_NAME_PILATES_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)40) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_PILATES_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)41) -#define FIT_CRUNCH_EXERCISE_NAME_PILATES_ROLL_UP_WITH_BALL ((FIT_CRUNCH_EXERCISE_NAME)42) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_PILATES_ROLL_UP_WITH_BALL ((FIT_CRUNCH_EXERCISE_NAME)43) -#define FIT_CRUNCH_EXERCISE_NAME_RAISED_LEGS_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)44) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_RAISED_LEGS_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)45) -#define FIT_CRUNCH_EXERCISE_NAME_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)46) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)47) -#define FIT_CRUNCH_EXERCISE_NAME_REVERSE_CRUNCH_ON_A_BENCH ((FIT_CRUNCH_EXERCISE_NAME)48) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_REVERSE_CRUNCH_ON_A_BENCH ((FIT_CRUNCH_EXERCISE_NAME)49) -#define FIT_CRUNCH_EXERCISE_NAME_REVERSE_CURL_AND_LIFT ((FIT_CRUNCH_EXERCISE_NAME)50) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_REVERSE_CURL_AND_LIFT ((FIT_CRUNCH_EXERCISE_NAME)51) -#define FIT_CRUNCH_EXERCISE_NAME_ROTATIONAL_LIFT ((FIT_CRUNCH_EXERCISE_NAME)52) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_ROTATIONAL_LIFT ((FIT_CRUNCH_EXERCISE_NAME)53) -#define FIT_CRUNCH_EXERCISE_NAME_SEATED_ALTERNATING_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)54) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_SEATED_ALTERNATING_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)55) -#define FIT_CRUNCH_EXERCISE_NAME_SEATED_LEG_U ((FIT_CRUNCH_EXERCISE_NAME)56) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_SEATED_LEG_U ((FIT_CRUNCH_EXERCISE_NAME)57) -#define FIT_CRUNCH_EXERCISE_NAME_SIDE_TO_SIDE_CRUNCH_AND_WEAVE ((FIT_CRUNCH_EXERCISE_NAME)58) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_SIDE_TO_SIDE_CRUNCH_AND_WEAVE ((FIT_CRUNCH_EXERCISE_NAME)59) -#define FIT_CRUNCH_EXERCISE_NAME_SINGLE_LEG_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)60) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)61) -#define FIT_CRUNCH_EXERCISE_NAME_SKATER_CRUNCH_CROSS ((FIT_CRUNCH_EXERCISE_NAME)62) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_SKATER_CRUNCH_CROSS ((FIT_CRUNCH_EXERCISE_NAME)63) -#define FIT_CRUNCH_EXERCISE_NAME_STANDING_CABLE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)64) -#define FIT_CRUNCH_EXERCISE_NAME_STANDING_SIDE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)65) -#define FIT_CRUNCH_EXERCISE_NAME_STEP_CLIMB ((FIT_CRUNCH_EXERCISE_NAME)66) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_STEP_CLIMB ((FIT_CRUNCH_EXERCISE_NAME)67) -#define FIT_CRUNCH_EXERCISE_NAME_SWISS_BALL_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)68) -#define FIT_CRUNCH_EXERCISE_NAME_SWISS_BALL_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)69) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_SWISS_BALL_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)70) -#define FIT_CRUNCH_EXERCISE_NAME_SWISS_BALL_RUSSIAN_TWIST ((FIT_CRUNCH_EXERCISE_NAME)71) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_SWISS_BALL_RUSSIAN_TWIST ((FIT_CRUNCH_EXERCISE_NAME)72) -#define FIT_CRUNCH_EXERCISE_NAME_SWISS_BALL_SIDE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)73) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_SWISS_BALL_SIDE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)74) -#define FIT_CRUNCH_EXERCISE_NAME_THORACIC_CRUNCHES_ON_FOAM_ROLLER ((FIT_CRUNCH_EXERCISE_NAME)75) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_THORACIC_CRUNCHES_ON_FOAM_ROLLER ((FIT_CRUNCH_EXERCISE_NAME)76) -#define FIT_CRUNCH_EXERCISE_NAME_TRICEPS_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)77) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_BICYCLE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)78) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)79) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_SWISS_BALL_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)80) -#define FIT_CRUNCH_EXERCISE_NAME_TOES_TO_BAR ((FIT_CRUNCH_EXERCISE_NAME)81) -#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_TOES_TO_BAR ((FIT_CRUNCH_EXERCISE_NAME)82) -#define FIT_CRUNCH_EXERCISE_NAME_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)83) -#define FIT_CRUNCH_EXERCISE_NAME_STRAIGHT_LEG_CRUNCH_WITH_BALL ((FIT_CRUNCH_EXERCISE_NAME)84) -#define FIT_CRUNCH_EXERCISE_NAME_COUNT 85 - -typedef FIT_UINT16 FIT_CURL_EXERCISE_NAME; -#define FIT_CURL_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_CURL_EXERCISE_NAME_ALTERNATING_DUMBBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)0) -#define FIT_CURL_EXERCISE_NAME_ALTERNATING_DUMBBELL_BICEPS_CURL_ON_SWISS_BALL ((FIT_CURL_EXERCISE_NAME)1) -#define FIT_CURL_EXERCISE_NAME_ALTERNATING_INCLINE_DUMBBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)2) -#define FIT_CURL_EXERCISE_NAME_BARBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)3) -#define FIT_CURL_EXERCISE_NAME_BARBELL_REVERSE_WRIST_CURL ((FIT_CURL_EXERCISE_NAME)4) -#define FIT_CURL_EXERCISE_NAME_BARBELL_WRIST_CURL ((FIT_CURL_EXERCISE_NAME)5) -#define FIT_CURL_EXERCISE_NAME_BEHIND_THE_BACK_BARBELL_REVERSE_WRIST_CURL ((FIT_CURL_EXERCISE_NAME)6) -#define FIT_CURL_EXERCISE_NAME_BEHIND_THE_BACK_ONE_ARM_CABLE_CURL ((FIT_CURL_EXERCISE_NAME)7) -#define FIT_CURL_EXERCISE_NAME_CABLE_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)8) -#define FIT_CURL_EXERCISE_NAME_CABLE_HAMMER_CURL ((FIT_CURL_EXERCISE_NAME)9) -#define FIT_CURL_EXERCISE_NAME_CHEATING_BARBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)10) -#define FIT_CURL_EXERCISE_NAME_CLOSE_GRIP_EZ_BAR_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)11) -#define FIT_CURL_EXERCISE_NAME_CROSS_BODY_DUMBBELL_HAMMER_CURL ((FIT_CURL_EXERCISE_NAME)12) -#define FIT_CURL_EXERCISE_NAME_DEAD_HANG_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)13) -#define FIT_CURL_EXERCISE_NAME_DECLINE_HAMMER_CURL ((FIT_CURL_EXERCISE_NAME)14) -#define FIT_CURL_EXERCISE_NAME_DUMBBELL_BICEPS_CURL_WITH_STATIC_HOLD ((FIT_CURL_EXERCISE_NAME)15) -#define FIT_CURL_EXERCISE_NAME_DUMBBELL_HAMMER_CURL ((FIT_CURL_EXERCISE_NAME)16) -#define FIT_CURL_EXERCISE_NAME_DUMBBELL_REVERSE_WRIST_CURL ((FIT_CURL_EXERCISE_NAME)17) -#define FIT_CURL_EXERCISE_NAME_DUMBBELL_WRIST_CURL ((FIT_CURL_EXERCISE_NAME)18) -#define FIT_CURL_EXERCISE_NAME_EZ_BAR_PREACHER_CURL ((FIT_CURL_EXERCISE_NAME)19) -#define FIT_CURL_EXERCISE_NAME_FORWARD_BEND_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)20) -#define FIT_CURL_EXERCISE_NAME_HAMMER_CURL_TO_PRESS ((FIT_CURL_EXERCISE_NAME)21) -#define FIT_CURL_EXERCISE_NAME_INCLINE_DUMBBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)22) -#define FIT_CURL_EXERCISE_NAME_INCLINE_OFFSET_THUMB_DUMBBELL_CURL ((FIT_CURL_EXERCISE_NAME)23) -#define FIT_CURL_EXERCISE_NAME_KETTLEBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)24) -#define FIT_CURL_EXERCISE_NAME_LYING_CONCENTRATION_CABLE_CURL ((FIT_CURL_EXERCISE_NAME)25) -#define FIT_CURL_EXERCISE_NAME_ONE_ARM_PREACHER_CURL ((FIT_CURL_EXERCISE_NAME)26) -#define FIT_CURL_EXERCISE_NAME_PLATE_PINCH_CURL ((FIT_CURL_EXERCISE_NAME)27) -#define FIT_CURL_EXERCISE_NAME_PREACHER_CURL_WITH_CABLE ((FIT_CURL_EXERCISE_NAME)28) -#define FIT_CURL_EXERCISE_NAME_REVERSE_EZ_BAR_CURL ((FIT_CURL_EXERCISE_NAME)29) -#define FIT_CURL_EXERCISE_NAME_REVERSE_GRIP_WRIST_CURL ((FIT_CURL_EXERCISE_NAME)30) -#define FIT_CURL_EXERCISE_NAME_REVERSE_GRIP_BARBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)31) -#define FIT_CURL_EXERCISE_NAME_SEATED_ALTERNATING_DUMBBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)32) -#define FIT_CURL_EXERCISE_NAME_SEATED_DUMBBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)33) -#define FIT_CURL_EXERCISE_NAME_SEATED_REVERSE_DUMBBELL_CURL ((FIT_CURL_EXERCISE_NAME)34) -#define FIT_CURL_EXERCISE_NAME_SPLIT_STANCE_OFFSET_PINKY_DUMBBELL_CURL ((FIT_CURL_EXERCISE_NAME)35) -#define FIT_CURL_EXERCISE_NAME_STANDING_ALTERNATING_DUMBBELL_CURLS ((FIT_CURL_EXERCISE_NAME)36) -#define FIT_CURL_EXERCISE_NAME_STANDING_DUMBBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)37) -#define FIT_CURL_EXERCISE_NAME_STANDING_EZ_BAR_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)38) -#define FIT_CURL_EXERCISE_NAME_STATIC_CURL ((FIT_CURL_EXERCISE_NAME)39) -#define FIT_CURL_EXERCISE_NAME_SWISS_BALL_DUMBBELL_OVERHEAD_TRICEPS_EXTENSION ((FIT_CURL_EXERCISE_NAME)40) -#define FIT_CURL_EXERCISE_NAME_SWISS_BALL_EZ_BAR_PREACHER_CURL ((FIT_CURL_EXERCISE_NAME)41) -#define FIT_CURL_EXERCISE_NAME_TWISTING_STANDING_DUMBBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)42) -#define FIT_CURL_EXERCISE_NAME_WIDE_GRIP_EZ_BAR_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)43) -#define FIT_CURL_EXERCISE_NAME_COUNT 44 - -typedef FIT_UINT16 FIT_DEADLIFT_EXERCISE_NAME; -#define FIT_DEADLIFT_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_DEADLIFT_EXERCISE_NAME_BARBELL_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)0) -#define FIT_DEADLIFT_EXERCISE_NAME_BARBELL_STRAIGHT_LEG_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)1) -#define FIT_DEADLIFT_EXERCISE_NAME_DUMBBELL_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)2) -#define FIT_DEADLIFT_EXERCISE_NAME_DUMBBELL_SINGLE_LEG_DEADLIFT_TO_ROW ((FIT_DEADLIFT_EXERCISE_NAME)3) -#define FIT_DEADLIFT_EXERCISE_NAME_DUMBBELL_STRAIGHT_LEG_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)4) -#define FIT_DEADLIFT_EXERCISE_NAME_KETTLEBELL_FLOOR_TO_SHELF ((FIT_DEADLIFT_EXERCISE_NAME)5) -#define FIT_DEADLIFT_EXERCISE_NAME_ONE_ARM_ONE_LEG_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)6) -#define FIT_DEADLIFT_EXERCISE_NAME_RACK_PULL ((FIT_DEADLIFT_EXERCISE_NAME)7) -#define FIT_DEADLIFT_EXERCISE_NAME_ROTATIONAL_DUMBBELL_STRAIGHT_LEG_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)8) -#define FIT_DEADLIFT_EXERCISE_NAME_SINGLE_ARM_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)9) -#define FIT_DEADLIFT_EXERCISE_NAME_SINGLE_LEG_BARBELL_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)10) -#define FIT_DEADLIFT_EXERCISE_NAME_SINGLE_LEG_BARBELL_STRAIGHT_LEG_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)11) -#define FIT_DEADLIFT_EXERCISE_NAME_SINGLE_LEG_DEADLIFT_WITH_BARBELL ((FIT_DEADLIFT_EXERCISE_NAME)12) -#define FIT_DEADLIFT_EXERCISE_NAME_SINGLE_LEG_RDL_CIRCUIT ((FIT_DEADLIFT_EXERCISE_NAME)13) -#define FIT_DEADLIFT_EXERCISE_NAME_SINGLE_LEG_ROMANIAN_DEADLIFT_WITH_DUMBBELL ((FIT_DEADLIFT_EXERCISE_NAME)14) -#define FIT_DEADLIFT_EXERCISE_NAME_SUMO_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)15) -#define FIT_DEADLIFT_EXERCISE_NAME_SUMO_DEADLIFT_HIGH_PULL ((FIT_DEADLIFT_EXERCISE_NAME)16) -#define FIT_DEADLIFT_EXERCISE_NAME_TRAP_BAR_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)17) -#define FIT_DEADLIFT_EXERCISE_NAME_WIDE_GRIP_BARBELL_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)18) -#define FIT_DEADLIFT_EXERCISE_NAME_COUNT 19 - -typedef FIT_UINT16 FIT_FLYE_EXERCISE_NAME; -#define FIT_FLYE_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_FLYE_EXERCISE_NAME_CABLE_CROSSOVER ((FIT_FLYE_EXERCISE_NAME)0) -#define FIT_FLYE_EXERCISE_NAME_DECLINE_DUMBBELL_FLYE ((FIT_FLYE_EXERCISE_NAME)1) -#define FIT_FLYE_EXERCISE_NAME_DUMBBELL_FLYE ((FIT_FLYE_EXERCISE_NAME)2) -#define FIT_FLYE_EXERCISE_NAME_INCLINE_DUMBBELL_FLYE ((FIT_FLYE_EXERCISE_NAME)3) -#define FIT_FLYE_EXERCISE_NAME_KETTLEBELL_FLYE ((FIT_FLYE_EXERCISE_NAME)4) -#define FIT_FLYE_EXERCISE_NAME_KNEELING_REAR_FLYE ((FIT_FLYE_EXERCISE_NAME)5) -#define FIT_FLYE_EXERCISE_NAME_SINGLE_ARM_STANDING_CABLE_REVERSE_FLYE ((FIT_FLYE_EXERCISE_NAME)6) -#define FIT_FLYE_EXERCISE_NAME_SWISS_BALL_DUMBBELL_FLYE ((FIT_FLYE_EXERCISE_NAME)7) -#define FIT_FLYE_EXERCISE_NAME_ARM_ROTATIONS ((FIT_FLYE_EXERCISE_NAME)8) -#define FIT_FLYE_EXERCISE_NAME_HUG_A_TREE ((FIT_FLYE_EXERCISE_NAME)9) -#define FIT_FLYE_EXERCISE_NAME_COUNT 10 - -typedef FIT_UINT16 FIT_HIP_RAISE_EXERCISE_NAME; -#define FIT_HIP_RAISE_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_HIP_RAISE_EXERCISE_NAME_BARBELL_HIP_THRUST_ON_FLOOR ((FIT_HIP_RAISE_EXERCISE_NAME)0) -#define FIT_HIP_RAISE_EXERCISE_NAME_BARBELL_HIP_THRUST_WITH_BENCH ((FIT_HIP_RAISE_EXERCISE_NAME)1) -#define FIT_HIP_RAISE_EXERCISE_NAME_BENT_KNEE_SWISS_BALL_REVERSE_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)2) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_BENT_KNEE_SWISS_BALL_REVERSE_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)3) -#define FIT_HIP_RAISE_EXERCISE_NAME_BRIDGE_WITH_LEG_EXTENSION ((FIT_HIP_RAISE_EXERCISE_NAME)4) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_BRIDGE_WITH_LEG_EXTENSION ((FIT_HIP_RAISE_EXERCISE_NAME)5) -#define FIT_HIP_RAISE_EXERCISE_NAME_CLAM_BRIDGE ((FIT_HIP_RAISE_EXERCISE_NAME)6) -#define FIT_HIP_RAISE_EXERCISE_NAME_FRONT_KICK_TABLETOP ((FIT_HIP_RAISE_EXERCISE_NAME)7) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_FRONT_KICK_TABLETOP ((FIT_HIP_RAISE_EXERCISE_NAME)8) -#define FIT_HIP_RAISE_EXERCISE_NAME_HIP_EXTENSION_AND_CROSS ((FIT_HIP_RAISE_EXERCISE_NAME)9) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_HIP_EXTENSION_AND_CROSS ((FIT_HIP_RAISE_EXERCISE_NAME)10) -#define FIT_HIP_RAISE_EXERCISE_NAME_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)11) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)12) -#define FIT_HIP_RAISE_EXERCISE_NAME_HIP_RAISE_WITH_FEET_ON_SWISS_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)13) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_HIP_RAISE_WITH_FEET_ON_SWISS_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)14) -#define FIT_HIP_RAISE_EXERCISE_NAME_HIP_RAISE_WITH_HEAD_ON_BOSU_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)15) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_HIP_RAISE_WITH_HEAD_ON_BOSU_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)16) -#define FIT_HIP_RAISE_EXERCISE_NAME_HIP_RAISE_WITH_HEAD_ON_SWISS_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)17) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_HIP_RAISE_WITH_HEAD_ON_SWISS_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)18) -#define FIT_HIP_RAISE_EXERCISE_NAME_HIP_RAISE_WITH_KNEE_SQUEEZE ((FIT_HIP_RAISE_EXERCISE_NAME)19) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_HIP_RAISE_WITH_KNEE_SQUEEZE ((FIT_HIP_RAISE_EXERCISE_NAME)20) -#define FIT_HIP_RAISE_EXERCISE_NAME_INCLINE_REAR_LEG_EXTENSION ((FIT_HIP_RAISE_EXERCISE_NAME)21) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_INCLINE_REAR_LEG_EXTENSION ((FIT_HIP_RAISE_EXERCISE_NAME)22) -#define FIT_HIP_RAISE_EXERCISE_NAME_KETTLEBELL_SWING ((FIT_HIP_RAISE_EXERCISE_NAME)23) -#define FIT_HIP_RAISE_EXERCISE_NAME_MARCHING_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)24) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_MARCHING_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)25) -#define FIT_HIP_RAISE_EXERCISE_NAME_MARCHING_HIP_RAISE_WITH_FEET_ON_A_SWISS_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)26) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_MARCHING_HIP_RAISE_WITH_FEET_ON_A_SWISS_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)27) -#define FIT_HIP_RAISE_EXERCISE_NAME_REVERSE_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)28) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_REVERSE_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)29) -#define FIT_HIP_RAISE_EXERCISE_NAME_SINGLE_LEG_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)30) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)31) -#define FIT_HIP_RAISE_EXERCISE_NAME_SINGLE_LEG_HIP_RAISE_WITH_FOOT_ON_BENCH ((FIT_HIP_RAISE_EXERCISE_NAME)32) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_HIP_RAISE_WITH_FOOT_ON_BENCH ((FIT_HIP_RAISE_EXERCISE_NAME)33) -#define FIT_HIP_RAISE_EXERCISE_NAME_SINGLE_LEG_HIP_RAISE_WITH_FOOT_ON_BOSU_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)34) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_HIP_RAISE_WITH_FOOT_ON_BOSU_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)35) -#define FIT_HIP_RAISE_EXERCISE_NAME_SINGLE_LEG_HIP_RAISE_WITH_FOOT_ON_FOAM_ROLLER ((FIT_HIP_RAISE_EXERCISE_NAME)36) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_HIP_RAISE_WITH_FOOT_ON_FOAM_ROLLER ((FIT_HIP_RAISE_EXERCISE_NAME)37) -#define FIT_HIP_RAISE_EXERCISE_NAME_SINGLE_LEG_HIP_RAISE_WITH_FOOT_ON_MEDICINE_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)38) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_HIP_RAISE_WITH_FOOT_ON_MEDICINE_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)39) -#define FIT_HIP_RAISE_EXERCISE_NAME_SINGLE_LEG_HIP_RAISE_WITH_HEAD_ON_BOSU_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)40) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_HIP_RAISE_WITH_HEAD_ON_BOSU_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)41) -#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_CLAM_BRIDGE ((FIT_HIP_RAISE_EXERCISE_NAME)42) -#define FIT_HIP_RAISE_EXERCISE_NAME_SINGLE_LEG_SWISS_BALL_HIP_RAISE_AND_LEG_CURL ((FIT_HIP_RAISE_EXERCISE_NAME)43) -#define FIT_HIP_RAISE_EXERCISE_NAME_CLAMS ((FIT_HIP_RAISE_EXERCISE_NAME)44) -#define FIT_HIP_RAISE_EXERCISE_NAME_INNER_THIGH_CIRCLES ((FIT_HIP_RAISE_EXERCISE_NAME)45) // Deprecated do not use -#define FIT_HIP_RAISE_EXERCISE_NAME_INNER_THIGH_SIDE_LIFT ((FIT_HIP_RAISE_EXERCISE_NAME)46) // Deprecated do not use -#define FIT_HIP_RAISE_EXERCISE_NAME_LEG_CIRCLES ((FIT_HIP_RAISE_EXERCISE_NAME)47) -#define FIT_HIP_RAISE_EXERCISE_NAME_LEG_LIFT ((FIT_HIP_RAISE_EXERCISE_NAME)48) -#define FIT_HIP_RAISE_EXERCISE_NAME_LEG_LIFT_IN_EXTERNAL_ROTATION ((FIT_HIP_RAISE_EXERCISE_NAME)49) -#define FIT_HIP_RAISE_EXERCISE_NAME_COUNT 50 - -typedef FIT_UINT16 FIT_HIP_STABILITY_EXERCISE_NAME; -#define FIT_HIP_STABILITY_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_HIP_STABILITY_EXERCISE_NAME_BAND_SIDE_LYING_LEG_RAISE ((FIT_HIP_STABILITY_EXERCISE_NAME)0) -#define FIT_HIP_STABILITY_EXERCISE_NAME_DEAD_BUG ((FIT_HIP_STABILITY_EXERCISE_NAME)1) -#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_DEAD_BUG ((FIT_HIP_STABILITY_EXERCISE_NAME)2) -#define FIT_HIP_STABILITY_EXERCISE_NAME_EXTERNAL_HIP_RAISE ((FIT_HIP_STABILITY_EXERCISE_NAME)3) -#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_EXTERNAL_HIP_RAISE ((FIT_HIP_STABILITY_EXERCISE_NAME)4) -#define FIT_HIP_STABILITY_EXERCISE_NAME_FIRE_HYDRANT_KICKS ((FIT_HIP_STABILITY_EXERCISE_NAME)5) -#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_FIRE_HYDRANT_KICKS ((FIT_HIP_STABILITY_EXERCISE_NAME)6) -#define FIT_HIP_STABILITY_EXERCISE_NAME_HIP_CIRCLES ((FIT_HIP_STABILITY_EXERCISE_NAME)7) -#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_HIP_CIRCLES ((FIT_HIP_STABILITY_EXERCISE_NAME)8) -#define FIT_HIP_STABILITY_EXERCISE_NAME_INNER_THIGH_LIFT ((FIT_HIP_STABILITY_EXERCISE_NAME)9) -#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_INNER_THIGH_LIFT ((FIT_HIP_STABILITY_EXERCISE_NAME)10) -#define FIT_HIP_STABILITY_EXERCISE_NAME_LATERAL_WALKS_WITH_BAND_AT_ANKLES ((FIT_HIP_STABILITY_EXERCISE_NAME)11) -#define FIT_HIP_STABILITY_EXERCISE_NAME_PRETZEL_SIDE_KICK ((FIT_HIP_STABILITY_EXERCISE_NAME)12) -#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_PRETZEL_SIDE_KICK ((FIT_HIP_STABILITY_EXERCISE_NAME)13) -#define FIT_HIP_STABILITY_EXERCISE_NAME_PRONE_HIP_INTERNAL_ROTATION ((FIT_HIP_STABILITY_EXERCISE_NAME)14) -#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_PRONE_HIP_INTERNAL_ROTATION ((FIT_HIP_STABILITY_EXERCISE_NAME)15) -#define FIT_HIP_STABILITY_EXERCISE_NAME_QUADRUPED ((FIT_HIP_STABILITY_EXERCISE_NAME)16) -#define FIT_HIP_STABILITY_EXERCISE_NAME_QUADRUPED_HIP_EXTENSION ((FIT_HIP_STABILITY_EXERCISE_NAME)17) -#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_QUADRUPED_HIP_EXTENSION ((FIT_HIP_STABILITY_EXERCISE_NAME)18) -#define FIT_HIP_STABILITY_EXERCISE_NAME_QUADRUPED_WITH_LEG_LIFT ((FIT_HIP_STABILITY_EXERCISE_NAME)19) -#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_QUADRUPED_WITH_LEG_LIFT ((FIT_HIP_STABILITY_EXERCISE_NAME)20) -#define FIT_HIP_STABILITY_EXERCISE_NAME_SIDE_LYING_LEG_RAISE ((FIT_HIP_STABILITY_EXERCISE_NAME)21) -#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_SIDE_LYING_LEG_RAISE ((FIT_HIP_STABILITY_EXERCISE_NAME)22) -#define FIT_HIP_STABILITY_EXERCISE_NAME_SLIDING_HIP_ADDUCTION ((FIT_HIP_STABILITY_EXERCISE_NAME)23) -#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_SLIDING_HIP_ADDUCTION ((FIT_HIP_STABILITY_EXERCISE_NAME)24) -#define FIT_HIP_STABILITY_EXERCISE_NAME_STANDING_ADDUCTION ((FIT_HIP_STABILITY_EXERCISE_NAME)25) -#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_STANDING_ADDUCTION ((FIT_HIP_STABILITY_EXERCISE_NAME)26) -#define FIT_HIP_STABILITY_EXERCISE_NAME_STANDING_CABLE_HIP_ABDUCTION ((FIT_HIP_STABILITY_EXERCISE_NAME)27) -#define FIT_HIP_STABILITY_EXERCISE_NAME_STANDING_HIP_ABDUCTION ((FIT_HIP_STABILITY_EXERCISE_NAME)28) -#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_STANDING_HIP_ABDUCTION ((FIT_HIP_STABILITY_EXERCISE_NAME)29) -#define FIT_HIP_STABILITY_EXERCISE_NAME_STANDING_REAR_LEG_RAISE ((FIT_HIP_STABILITY_EXERCISE_NAME)30) -#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_STANDING_REAR_LEG_RAISE ((FIT_HIP_STABILITY_EXERCISE_NAME)31) -#define FIT_HIP_STABILITY_EXERCISE_NAME_SUPINE_HIP_INTERNAL_ROTATION ((FIT_HIP_STABILITY_EXERCISE_NAME)32) -#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_SUPINE_HIP_INTERNAL_ROTATION ((FIT_HIP_STABILITY_EXERCISE_NAME)33) -#define FIT_HIP_STABILITY_EXERCISE_NAME_COUNT 34 - -typedef FIT_UINT16 FIT_HIP_SWING_EXERCISE_NAME; -#define FIT_HIP_SWING_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_HIP_SWING_EXERCISE_NAME_SINGLE_ARM_KETTLEBELL_SWING ((FIT_HIP_SWING_EXERCISE_NAME)0) -#define FIT_HIP_SWING_EXERCISE_NAME_SINGLE_ARM_DUMBBELL_SWING ((FIT_HIP_SWING_EXERCISE_NAME)1) -#define FIT_HIP_SWING_EXERCISE_NAME_STEP_OUT_SWING ((FIT_HIP_SWING_EXERCISE_NAME)2) -#define FIT_HIP_SWING_EXERCISE_NAME_COUNT 3 - -typedef FIT_UINT16 FIT_HYPEREXTENSION_EXERCISE_NAME; -#define FIT_HYPEREXTENSION_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_HYPEREXTENSION_EXERCISE_NAME_BACK_EXTENSION_WITH_OPPOSITE_ARM_AND_LEG_REACH ((FIT_HYPEREXTENSION_EXERCISE_NAME)0) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_BACK_EXTENSION_WITH_OPPOSITE_ARM_AND_LEG_REACH ((FIT_HYPEREXTENSION_EXERCISE_NAME)1) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_BASE_ROTATIONS ((FIT_HYPEREXTENSION_EXERCISE_NAME)2) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_BASE_ROTATIONS ((FIT_HYPEREXTENSION_EXERCISE_NAME)3) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_BENT_KNEE_REVERSE_HYPEREXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)4) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_BENT_KNEE_REVERSE_HYPEREXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)5) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_HOLLOW_HOLD_AND_ROLL ((FIT_HYPEREXTENSION_EXERCISE_NAME)6) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_HOLLOW_HOLD_AND_ROLL ((FIT_HYPEREXTENSION_EXERCISE_NAME)7) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_KICKS ((FIT_HYPEREXTENSION_EXERCISE_NAME)8) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_KICKS ((FIT_HYPEREXTENSION_EXERCISE_NAME)9) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_KNEE_RAISES ((FIT_HYPEREXTENSION_EXERCISE_NAME)10) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_KNEE_RAISES ((FIT_HYPEREXTENSION_EXERCISE_NAME)11) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_KNEELING_SUPERMAN ((FIT_HYPEREXTENSION_EXERCISE_NAME)12) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_KNEELING_SUPERMAN ((FIT_HYPEREXTENSION_EXERCISE_NAME)13) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_LAT_PULL_DOWN_WITH_ROW ((FIT_HYPEREXTENSION_EXERCISE_NAME)14) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_MEDICINE_BALL_DEADLIFT_TO_REACH ((FIT_HYPEREXTENSION_EXERCISE_NAME)15) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_ONE_ARM_ONE_LEG_ROW ((FIT_HYPEREXTENSION_EXERCISE_NAME)16) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_ONE_ARM_ROW_WITH_BAND ((FIT_HYPEREXTENSION_EXERCISE_NAME)17) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_OVERHEAD_LUNGE_WITH_MEDICINE_BALL ((FIT_HYPEREXTENSION_EXERCISE_NAME)18) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_PLANK_KNEE_TUCKS ((FIT_HYPEREXTENSION_EXERCISE_NAME)19) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_PLANK_KNEE_TUCKS ((FIT_HYPEREXTENSION_EXERCISE_NAME)20) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_SIDE_STEP ((FIT_HYPEREXTENSION_EXERCISE_NAME)21) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_SIDE_STEP ((FIT_HYPEREXTENSION_EXERCISE_NAME)22) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_SINGLE_LEG_BACK_EXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)23) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_BACK_EXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)24) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_SPINE_EXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)25) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_SPINE_EXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)26) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_STATIC_BACK_EXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)27) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_STATIC_BACK_EXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)28) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_SUPERMAN_FROM_FLOOR ((FIT_HYPEREXTENSION_EXERCISE_NAME)29) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_SUPERMAN_FROM_FLOOR ((FIT_HYPEREXTENSION_EXERCISE_NAME)30) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_SWISS_BALL_BACK_EXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)31) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_SWISS_BALL_BACK_EXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)32) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_SWISS_BALL_HYPEREXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)33) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_SWISS_BALL_HYPEREXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)34) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_SWISS_BALL_OPPOSITE_ARM_AND_LEG_LIFT ((FIT_HYPEREXTENSION_EXERCISE_NAME)35) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_SWISS_BALL_OPPOSITE_ARM_AND_LEG_LIFT ((FIT_HYPEREXTENSION_EXERCISE_NAME)36) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_SUPERMAN_ON_SWISS_BALL ((FIT_HYPEREXTENSION_EXERCISE_NAME)37) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_COBRA ((FIT_HYPEREXTENSION_EXERCISE_NAME)38) -#define FIT_HYPEREXTENSION_EXERCISE_NAME_SUPINE_FLOOR_BARRE ((FIT_HYPEREXTENSION_EXERCISE_NAME)39) // Deprecated do not use -#define FIT_HYPEREXTENSION_EXERCISE_NAME_COUNT 40 - -typedef FIT_UINT16 FIT_LATERAL_RAISE_EXERCISE_NAME; -#define FIT_LATERAL_RAISE_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_LATERAL_RAISE_EXERCISE_NAME_45_DEGREE_CABLE_EXTERNAL_ROTATION ((FIT_LATERAL_RAISE_EXERCISE_NAME)0) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_ALTERNATING_LATERAL_RAISE_WITH_STATIC_HOLD ((FIT_LATERAL_RAISE_EXERCISE_NAME)1) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_BAR_MUSCLE_UP ((FIT_LATERAL_RAISE_EXERCISE_NAME)2) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_BENT_OVER_LATERAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)3) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_CABLE_DIAGONAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)4) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_CABLE_FRONT_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)5) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_CALORIE_ROW ((FIT_LATERAL_RAISE_EXERCISE_NAME)6) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_COMBO_SHOULDER_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)7) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_DUMBBELL_DIAGONAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)8) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_DUMBBELL_V_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)9) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_FRONT_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)10) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_LEANING_DUMBBELL_LATERAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)11) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_LYING_DUMBBELL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)12) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_MUSCLE_UP ((FIT_LATERAL_RAISE_EXERCISE_NAME)13) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_ONE_ARM_CABLE_LATERAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)14) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_OVERHAND_GRIP_REAR_LATERAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)15) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_PLATE_RAISES ((FIT_LATERAL_RAISE_EXERCISE_NAME)16) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_RING_DIP ((FIT_LATERAL_RAISE_EXERCISE_NAME)17) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_WEIGHTED_RING_DIP ((FIT_LATERAL_RAISE_EXERCISE_NAME)18) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_RING_MUSCLE_UP ((FIT_LATERAL_RAISE_EXERCISE_NAME)19) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_WEIGHTED_RING_MUSCLE_UP ((FIT_LATERAL_RAISE_EXERCISE_NAME)20) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_ROPE_CLIMB ((FIT_LATERAL_RAISE_EXERCISE_NAME)21) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_WEIGHTED_ROPE_CLIMB ((FIT_LATERAL_RAISE_EXERCISE_NAME)22) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_SCAPTION ((FIT_LATERAL_RAISE_EXERCISE_NAME)23) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_SEATED_LATERAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)24) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_SEATED_REAR_LATERAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)25) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_SIDE_LYING_LATERAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)26) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_STANDING_LIFT ((FIT_LATERAL_RAISE_EXERCISE_NAME)27) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_SUSPENDED_ROW ((FIT_LATERAL_RAISE_EXERCISE_NAME)28) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_UNDERHAND_GRIP_REAR_LATERAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)29) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_WALL_SLIDE ((FIT_LATERAL_RAISE_EXERCISE_NAME)30) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_WEIGHTED_WALL_SLIDE ((FIT_LATERAL_RAISE_EXERCISE_NAME)31) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_ARM_CIRCLES ((FIT_LATERAL_RAISE_EXERCISE_NAME)32) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_SHAVING_THE_HEAD ((FIT_LATERAL_RAISE_EXERCISE_NAME)33) -#define FIT_LATERAL_RAISE_EXERCISE_NAME_COUNT 34 - -typedef FIT_UINT16 FIT_LEG_CURL_EXERCISE_NAME; -#define FIT_LEG_CURL_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_LEG_CURL_EXERCISE_NAME_LEG_CURL ((FIT_LEG_CURL_EXERCISE_NAME)0) -#define FIT_LEG_CURL_EXERCISE_NAME_WEIGHTED_LEG_CURL ((FIT_LEG_CURL_EXERCISE_NAME)1) -#define FIT_LEG_CURL_EXERCISE_NAME_GOOD_MORNING ((FIT_LEG_CURL_EXERCISE_NAME)2) -#define FIT_LEG_CURL_EXERCISE_NAME_SEATED_BARBELL_GOOD_MORNING ((FIT_LEG_CURL_EXERCISE_NAME)3) -#define FIT_LEG_CURL_EXERCISE_NAME_SINGLE_LEG_BARBELL_GOOD_MORNING ((FIT_LEG_CURL_EXERCISE_NAME)4) -#define FIT_LEG_CURL_EXERCISE_NAME_SINGLE_LEG_SLIDING_LEG_CURL ((FIT_LEG_CURL_EXERCISE_NAME)5) -#define FIT_LEG_CURL_EXERCISE_NAME_SLIDING_LEG_CURL ((FIT_LEG_CURL_EXERCISE_NAME)6) -#define FIT_LEG_CURL_EXERCISE_NAME_SPLIT_BARBELL_GOOD_MORNING ((FIT_LEG_CURL_EXERCISE_NAME)7) -#define FIT_LEG_CURL_EXERCISE_NAME_SPLIT_STANCE_EXTENSION ((FIT_LEG_CURL_EXERCISE_NAME)8) -#define FIT_LEG_CURL_EXERCISE_NAME_STAGGERED_STANCE_GOOD_MORNING ((FIT_LEG_CURL_EXERCISE_NAME)9) -#define FIT_LEG_CURL_EXERCISE_NAME_SWISS_BALL_HIP_RAISE_AND_LEG_CURL ((FIT_LEG_CURL_EXERCISE_NAME)10) -#define FIT_LEG_CURL_EXERCISE_NAME_ZERCHER_GOOD_MORNING ((FIT_LEG_CURL_EXERCISE_NAME)11) -#define FIT_LEG_CURL_EXERCISE_NAME_COUNT 12 - -typedef FIT_UINT16 FIT_LEG_RAISE_EXERCISE_NAME; -#define FIT_LEG_RAISE_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_LEG_RAISE_EXERCISE_NAME_HANGING_KNEE_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)0) -#define FIT_LEG_RAISE_EXERCISE_NAME_HANGING_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)1) -#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_HANGING_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)2) -#define FIT_LEG_RAISE_EXERCISE_NAME_HANGING_SINGLE_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)3) -#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_HANGING_SINGLE_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)4) -#define FIT_LEG_RAISE_EXERCISE_NAME_KETTLEBELL_LEG_RAISES ((FIT_LEG_RAISE_EXERCISE_NAME)5) -#define FIT_LEG_RAISE_EXERCISE_NAME_LEG_LOWERING_DRILL ((FIT_LEG_RAISE_EXERCISE_NAME)6) -#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_LEG_LOWERING_DRILL ((FIT_LEG_RAISE_EXERCISE_NAME)7) -#define FIT_LEG_RAISE_EXERCISE_NAME_LYING_STRAIGHT_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)8) -#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_LYING_STRAIGHT_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)9) -#define FIT_LEG_RAISE_EXERCISE_NAME_MEDICINE_BALL_LEG_DROPS ((FIT_LEG_RAISE_EXERCISE_NAME)10) -#define FIT_LEG_RAISE_EXERCISE_NAME_QUADRUPED_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)11) -#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_QUADRUPED_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)12) -#define FIT_LEG_RAISE_EXERCISE_NAME_REVERSE_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)13) -#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_REVERSE_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)14) -#define FIT_LEG_RAISE_EXERCISE_NAME_REVERSE_LEG_RAISE_ON_SWISS_BALL ((FIT_LEG_RAISE_EXERCISE_NAME)15) -#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_REVERSE_LEG_RAISE_ON_SWISS_BALL ((FIT_LEG_RAISE_EXERCISE_NAME)16) -#define FIT_LEG_RAISE_EXERCISE_NAME_SINGLE_LEG_LOWERING_DRILL ((FIT_LEG_RAISE_EXERCISE_NAME)17) -#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_LOWERING_DRILL ((FIT_LEG_RAISE_EXERCISE_NAME)18) -#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_HANGING_KNEE_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)19) -#define FIT_LEG_RAISE_EXERCISE_NAME_LATERAL_STEPOVER ((FIT_LEG_RAISE_EXERCISE_NAME)20) -#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_LATERAL_STEPOVER ((FIT_LEG_RAISE_EXERCISE_NAME)21) -#define FIT_LEG_RAISE_EXERCISE_NAME_COUNT 22 - -typedef FIT_UINT16 FIT_LUNGE_EXERCISE_NAME; -#define FIT_LUNGE_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_LUNGE_EXERCISE_NAME_OVERHEAD_LUNGE ((FIT_LUNGE_EXERCISE_NAME)0) -#define FIT_LUNGE_EXERCISE_NAME_LUNGE_MATRIX ((FIT_LUNGE_EXERCISE_NAME)1) -#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_LUNGE_MATRIX ((FIT_LUNGE_EXERCISE_NAME)2) -#define FIT_LUNGE_EXERCISE_NAME_ALTERNATING_BARBELL_FORWARD_LUNGE ((FIT_LUNGE_EXERCISE_NAME)3) -#define FIT_LUNGE_EXERCISE_NAME_ALTERNATING_DUMBBELL_LUNGE_WITH_REACH ((FIT_LUNGE_EXERCISE_NAME)4) -#define FIT_LUNGE_EXERCISE_NAME_BACK_FOOT_ELEVATED_DUMBBELL_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)5) -#define FIT_LUNGE_EXERCISE_NAME_BARBELL_BOX_LUNGE ((FIT_LUNGE_EXERCISE_NAME)6) -#define FIT_LUNGE_EXERCISE_NAME_BARBELL_BULGARIAN_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)7) -#define FIT_LUNGE_EXERCISE_NAME_BARBELL_CROSSOVER_LUNGE ((FIT_LUNGE_EXERCISE_NAME)8) -#define FIT_LUNGE_EXERCISE_NAME_BARBELL_FRONT_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)9) -#define FIT_LUNGE_EXERCISE_NAME_BARBELL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)10) -#define FIT_LUNGE_EXERCISE_NAME_BARBELL_REVERSE_LUNGE ((FIT_LUNGE_EXERCISE_NAME)11) -#define FIT_LUNGE_EXERCISE_NAME_BARBELL_SIDE_LUNGE ((FIT_LUNGE_EXERCISE_NAME)12) -#define FIT_LUNGE_EXERCISE_NAME_BARBELL_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)13) -#define FIT_LUNGE_EXERCISE_NAME_CORE_CONTROL_REAR_LUNGE ((FIT_LUNGE_EXERCISE_NAME)14) -#define FIT_LUNGE_EXERCISE_NAME_DIAGONAL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)15) -#define FIT_LUNGE_EXERCISE_NAME_DROP_LUNGE ((FIT_LUNGE_EXERCISE_NAME)16) -#define FIT_LUNGE_EXERCISE_NAME_DUMBBELL_BOX_LUNGE ((FIT_LUNGE_EXERCISE_NAME)17) -#define FIT_LUNGE_EXERCISE_NAME_DUMBBELL_BULGARIAN_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)18) -#define FIT_LUNGE_EXERCISE_NAME_DUMBBELL_CROSSOVER_LUNGE ((FIT_LUNGE_EXERCISE_NAME)19) -#define FIT_LUNGE_EXERCISE_NAME_DUMBBELL_DIAGONAL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)20) -#define FIT_LUNGE_EXERCISE_NAME_DUMBBELL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)21) -#define FIT_LUNGE_EXERCISE_NAME_DUMBBELL_LUNGE_AND_ROTATION ((FIT_LUNGE_EXERCISE_NAME)22) -#define FIT_LUNGE_EXERCISE_NAME_DUMBBELL_OVERHEAD_BULGARIAN_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)23) -#define FIT_LUNGE_EXERCISE_NAME_DUMBBELL_REVERSE_LUNGE_TO_HIGH_KNEE_AND_PRESS ((FIT_LUNGE_EXERCISE_NAME)24) -#define FIT_LUNGE_EXERCISE_NAME_DUMBBELL_SIDE_LUNGE ((FIT_LUNGE_EXERCISE_NAME)25) -#define FIT_LUNGE_EXERCISE_NAME_ELEVATED_FRONT_FOOT_BARBELL_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)26) -#define FIT_LUNGE_EXERCISE_NAME_FRONT_FOOT_ELEVATED_DUMBBELL_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)27) -#define FIT_LUNGE_EXERCISE_NAME_GUNSLINGER_LUNGE ((FIT_LUNGE_EXERCISE_NAME)28) -#define FIT_LUNGE_EXERCISE_NAME_LAWNMOWER_LUNGE ((FIT_LUNGE_EXERCISE_NAME)29) -#define FIT_LUNGE_EXERCISE_NAME_LOW_LUNGE_WITH_ISOMETRIC_ADDUCTION ((FIT_LUNGE_EXERCISE_NAME)30) -#define FIT_LUNGE_EXERCISE_NAME_LOW_SIDE_TO_SIDE_LUNGE ((FIT_LUNGE_EXERCISE_NAME)31) -#define FIT_LUNGE_EXERCISE_NAME_LUNGE ((FIT_LUNGE_EXERCISE_NAME)32) -#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_LUNGE ((FIT_LUNGE_EXERCISE_NAME)33) -#define FIT_LUNGE_EXERCISE_NAME_LUNGE_WITH_ARM_REACH ((FIT_LUNGE_EXERCISE_NAME)34) -#define FIT_LUNGE_EXERCISE_NAME_LUNGE_WITH_DIAGONAL_REACH ((FIT_LUNGE_EXERCISE_NAME)35) -#define FIT_LUNGE_EXERCISE_NAME_LUNGE_WITH_SIDE_BEND ((FIT_LUNGE_EXERCISE_NAME)36) -#define FIT_LUNGE_EXERCISE_NAME_OFFSET_DUMBBELL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)37) -#define FIT_LUNGE_EXERCISE_NAME_OFFSET_DUMBBELL_REVERSE_LUNGE ((FIT_LUNGE_EXERCISE_NAME)38) -#define FIT_LUNGE_EXERCISE_NAME_OVERHEAD_BULGARIAN_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)39) -#define FIT_LUNGE_EXERCISE_NAME_OVERHEAD_DUMBBELL_REVERSE_LUNGE ((FIT_LUNGE_EXERCISE_NAME)40) -#define FIT_LUNGE_EXERCISE_NAME_OVERHEAD_DUMBBELL_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)41) -#define FIT_LUNGE_EXERCISE_NAME_OVERHEAD_LUNGE_WITH_ROTATION ((FIT_LUNGE_EXERCISE_NAME)42) -#define FIT_LUNGE_EXERCISE_NAME_REVERSE_BARBELL_BOX_LUNGE ((FIT_LUNGE_EXERCISE_NAME)43) -#define FIT_LUNGE_EXERCISE_NAME_REVERSE_BOX_LUNGE ((FIT_LUNGE_EXERCISE_NAME)44) -#define FIT_LUNGE_EXERCISE_NAME_REVERSE_DUMBBELL_BOX_LUNGE ((FIT_LUNGE_EXERCISE_NAME)45) -#define FIT_LUNGE_EXERCISE_NAME_REVERSE_DUMBBELL_CROSSOVER_LUNGE ((FIT_LUNGE_EXERCISE_NAME)46) -#define FIT_LUNGE_EXERCISE_NAME_REVERSE_DUMBBELL_DIAGONAL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)47) -#define FIT_LUNGE_EXERCISE_NAME_REVERSE_LUNGE_WITH_REACH_BACK ((FIT_LUNGE_EXERCISE_NAME)48) -#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_REVERSE_LUNGE_WITH_REACH_BACK ((FIT_LUNGE_EXERCISE_NAME)49) -#define FIT_LUNGE_EXERCISE_NAME_REVERSE_LUNGE_WITH_TWIST_AND_OVERHEAD_REACH ((FIT_LUNGE_EXERCISE_NAME)50) -#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_REVERSE_LUNGE_WITH_TWIST_AND_OVERHEAD_REACH ((FIT_LUNGE_EXERCISE_NAME)51) -#define FIT_LUNGE_EXERCISE_NAME_REVERSE_SLIDING_BOX_LUNGE ((FIT_LUNGE_EXERCISE_NAME)52) -#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_REVERSE_SLIDING_BOX_LUNGE ((FIT_LUNGE_EXERCISE_NAME)53) -#define FIT_LUNGE_EXERCISE_NAME_REVERSE_SLIDING_LUNGE ((FIT_LUNGE_EXERCISE_NAME)54) -#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_REVERSE_SLIDING_LUNGE ((FIT_LUNGE_EXERCISE_NAME)55) -#define FIT_LUNGE_EXERCISE_NAME_RUNNERS_LUNGE_TO_BALANCE ((FIT_LUNGE_EXERCISE_NAME)56) -#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_RUNNERS_LUNGE_TO_BALANCE ((FIT_LUNGE_EXERCISE_NAME)57) -#define FIT_LUNGE_EXERCISE_NAME_SHIFTING_SIDE_LUNGE ((FIT_LUNGE_EXERCISE_NAME)58) -#define FIT_LUNGE_EXERCISE_NAME_SIDE_AND_CROSSOVER_LUNGE ((FIT_LUNGE_EXERCISE_NAME)59) -#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_SIDE_AND_CROSSOVER_LUNGE ((FIT_LUNGE_EXERCISE_NAME)60) -#define FIT_LUNGE_EXERCISE_NAME_SIDE_LUNGE ((FIT_LUNGE_EXERCISE_NAME)61) -#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_SIDE_LUNGE ((FIT_LUNGE_EXERCISE_NAME)62) -#define FIT_LUNGE_EXERCISE_NAME_SIDE_LUNGE_AND_PRESS ((FIT_LUNGE_EXERCISE_NAME)63) -#define FIT_LUNGE_EXERCISE_NAME_SIDE_LUNGE_JUMP_OFF ((FIT_LUNGE_EXERCISE_NAME)64) -#define FIT_LUNGE_EXERCISE_NAME_SIDE_LUNGE_SWEEP ((FIT_LUNGE_EXERCISE_NAME)65) -#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_SIDE_LUNGE_SWEEP ((FIT_LUNGE_EXERCISE_NAME)66) -#define FIT_LUNGE_EXERCISE_NAME_SIDE_LUNGE_TO_CROSSOVER_TAP ((FIT_LUNGE_EXERCISE_NAME)67) -#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_SIDE_LUNGE_TO_CROSSOVER_TAP ((FIT_LUNGE_EXERCISE_NAME)68) -#define FIT_LUNGE_EXERCISE_NAME_SIDE_TO_SIDE_LUNGE_CHOPS ((FIT_LUNGE_EXERCISE_NAME)69) -#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_SIDE_TO_SIDE_LUNGE_CHOPS ((FIT_LUNGE_EXERCISE_NAME)70) -#define FIT_LUNGE_EXERCISE_NAME_SIFF_JUMP_LUNGE ((FIT_LUNGE_EXERCISE_NAME)71) -#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_SIFF_JUMP_LUNGE ((FIT_LUNGE_EXERCISE_NAME)72) -#define FIT_LUNGE_EXERCISE_NAME_SINGLE_ARM_REVERSE_LUNGE_AND_PRESS ((FIT_LUNGE_EXERCISE_NAME)73) -#define FIT_LUNGE_EXERCISE_NAME_SLIDING_LATERAL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)74) -#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_SLIDING_LATERAL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)75) -#define FIT_LUNGE_EXERCISE_NAME_WALKING_BARBELL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)76) -#define FIT_LUNGE_EXERCISE_NAME_WALKING_DUMBBELL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)77) -#define FIT_LUNGE_EXERCISE_NAME_WALKING_LUNGE ((FIT_LUNGE_EXERCISE_NAME)78) -#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_WALKING_LUNGE ((FIT_LUNGE_EXERCISE_NAME)79) -#define FIT_LUNGE_EXERCISE_NAME_WIDE_GRIP_OVERHEAD_BARBELL_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)80) -#define FIT_LUNGE_EXERCISE_NAME_COUNT 81 - -typedef FIT_UINT16 FIT_OLYMPIC_LIFT_EXERCISE_NAME; -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_HANG_POWER_CLEAN ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)0) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_HANG_SQUAT_CLEAN ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)1) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_POWER_CLEAN ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)2) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_POWER_SNATCH ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)3) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_SQUAT_CLEAN ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)4) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_CLEAN_AND_JERK ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)5) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_HANG_POWER_SNATCH ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)6) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_HANG_PULL ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)7) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_HIGH_PULL ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)8) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_SNATCH ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)9) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_SPLIT_JERK ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)10) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_CLEAN ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)11) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_DUMBBELL_CLEAN ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)12) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_DUMBBELL_HANG_PULL ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)13) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_ONE_HAND_DUMBBELL_SPLIT_SNATCH ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)14) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_PUSH_JERK ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)15) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_SINGLE_ARM_DUMBBELL_SNATCH ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)16) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_SINGLE_ARM_HANG_SNATCH ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)17) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_SINGLE_ARM_KETTLEBELL_SNATCH ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)18) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_SPLIT_JERK ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)19) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_SQUAT_CLEAN_AND_JERK ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)20) -#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_COUNT 21 - -typedef FIT_UINT16 FIT_PLANK_EXERCISE_NAME; -#define FIT_PLANK_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_PLANK_EXERCISE_NAME_45_DEGREE_PLANK ((FIT_PLANK_EXERCISE_NAME)0) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_45_DEGREE_PLANK ((FIT_PLANK_EXERCISE_NAME)1) -#define FIT_PLANK_EXERCISE_NAME_90_DEGREE_STATIC_HOLD ((FIT_PLANK_EXERCISE_NAME)2) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_90_DEGREE_STATIC_HOLD ((FIT_PLANK_EXERCISE_NAME)3) -#define FIT_PLANK_EXERCISE_NAME_BEAR_CRAWL ((FIT_PLANK_EXERCISE_NAME)4) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_BEAR_CRAWL ((FIT_PLANK_EXERCISE_NAME)5) -#define FIT_PLANK_EXERCISE_NAME_CROSS_BODY_MOUNTAIN_CLIMBER ((FIT_PLANK_EXERCISE_NAME)6) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_CROSS_BODY_MOUNTAIN_CLIMBER ((FIT_PLANK_EXERCISE_NAME)7) -#define FIT_PLANK_EXERCISE_NAME_ELBOW_PLANK_PIKE_JACKS ((FIT_PLANK_EXERCISE_NAME)8) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_ELBOW_PLANK_PIKE_JACKS ((FIT_PLANK_EXERCISE_NAME)9) -#define FIT_PLANK_EXERCISE_NAME_ELEVATED_FEET_PLANK ((FIT_PLANK_EXERCISE_NAME)10) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_ELEVATED_FEET_PLANK ((FIT_PLANK_EXERCISE_NAME)11) -#define FIT_PLANK_EXERCISE_NAME_ELEVATOR_ABS ((FIT_PLANK_EXERCISE_NAME)12) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_ELEVATOR_ABS ((FIT_PLANK_EXERCISE_NAME)13) -#define FIT_PLANK_EXERCISE_NAME_EXTENDED_PLANK ((FIT_PLANK_EXERCISE_NAME)14) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_EXTENDED_PLANK ((FIT_PLANK_EXERCISE_NAME)15) -#define FIT_PLANK_EXERCISE_NAME_FULL_PLANK_PASSE_TWIST ((FIT_PLANK_EXERCISE_NAME)16) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_FULL_PLANK_PASSE_TWIST ((FIT_PLANK_EXERCISE_NAME)17) -#define FIT_PLANK_EXERCISE_NAME_INCHING_ELBOW_PLANK ((FIT_PLANK_EXERCISE_NAME)18) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_INCHING_ELBOW_PLANK ((FIT_PLANK_EXERCISE_NAME)19) -#define FIT_PLANK_EXERCISE_NAME_INCHWORM_TO_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)20) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_INCHWORM_TO_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)21) -#define FIT_PLANK_EXERCISE_NAME_KNEELING_PLANK ((FIT_PLANK_EXERCISE_NAME)22) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_KNEELING_PLANK ((FIT_PLANK_EXERCISE_NAME)23) -#define FIT_PLANK_EXERCISE_NAME_KNEELING_SIDE_PLANK_WITH_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)24) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_KNEELING_SIDE_PLANK_WITH_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)25) -#define FIT_PLANK_EXERCISE_NAME_LATERAL_ROLL ((FIT_PLANK_EXERCISE_NAME)26) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_LATERAL_ROLL ((FIT_PLANK_EXERCISE_NAME)27) -#define FIT_PLANK_EXERCISE_NAME_LYING_REVERSE_PLANK ((FIT_PLANK_EXERCISE_NAME)28) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_LYING_REVERSE_PLANK ((FIT_PLANK_EXERCISE_NAME)29) -#define FIT_PLANK_EXERCISE_NAME_MEDICINE_BALL_MOUNTAIN_CLIMBER ((FIT_PLANK_EXERCISE_NAME)30) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_MEDICINE_BALL_MOUNTAIN_CLIMBER ((FIT_PLANK_EXERCISE_NAME)31) -#define FIT_PLANK_EXERCISE_NAME_MODIFIED_MOUNTAIN_CLIMBER_AND_EXTENSION ((FIT_PLANK_EXERCISE_NAME)32) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_MODIFIED_MOUNTAIN_CLIMBER_AND_EXTENSION ((FIT_PLANK_EXERCISE_NAME)33) -#define FIT_PLANK_EXERCISE_NAME_MOUNTAIN_CLIMBER ((FIT_PLANK_EXERCISE_NAME)34) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_MOUNTAIN_CLIMBER ((FIT_PLANK_EXERCISE_NAME)35) -#define FIT_PLANK_EXERCISE_NAME_MOUNTAIN_CLIMBER_ON_SLIDING_DISCS ((FIT_PLANK_EXERCISE_NAME)36) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_MOUNTAIN_CLIMBER_ON_SLIDING_DISCS ((FIT_PLANK_EXERCISE_NAME)37) -#define FIT_PLANK_EXERCISE_NAME_MOUNTAIN_CLIMBER_WITH_FEET_ON_BOSU_BALL ((FIT_PLANK_EXERCISE_NAME)38) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_MOUNTAIN_CLIMBER_WITH_FEET_ON_BOSU_BALL ((FIT_PLANK_EXERCISE_NAME)39) -#define FIT_PLANK_EXERCISE_NAME_MOUNTAIN_CLIMBER_WITH_HANDS_ON_BENCH ((FIT_PLANK_EXERCISE_NAME)40) -#define FIT_PLANK_EXERCISE_NAME_MOUNTAIN_CLIMBER_WITH_HANDS_ON_SWISS_BALL ((FIT_PLANK_EXERCISE_NAME)41) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_MOUNTAIN_CLIMBER_WITH_HANDS_ON_SWISS_BALL ((FIT_PLANK_EXERCISE_NAME)42) -#define FIT_PLANK_EXERCISE_NAME_PLANK ((FIT_PLANK_EXERCISE_NAME)43) -#define FIT_PLANK_EXERCISE_NAME_PLANK_JACKS_WITH_FEET_ON_SLIDING_DISCS ((FIT_PLANK_EXERCISE_NAME)44) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLANK_JACKS_WITH_FEET_ON_SLIDING_DISCS ((FIT_PLANK_EXERCISE_NAME)45) -#define FIT_PLANK_EXERCISE_NAME_PLANK_KNEE_TWIST ((FIT_PLANK_EXERCISE_NAME)46) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLANK_KNEE_TWIST ((FIT_PLANK_EXERCISE_NAME)47) -#define FIT_PLANK_EXERCISE_NAME_PLANK_PIKE_JUMPS ((FIT_PLANK_EXERCISE_NAME)48) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLANK_PIKE_JUMPS ((FIT_PLANK_EXERCISE_NAME)49) -#define FIT_PLANK_EXERCISE_NAME_PLANK_PIKES ((FIT_PLANK_EXERCISE_NAME)50) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLANK_PIKES ((FIT_PLANK_EXERCISE_NAME)51) -#define FIT_PLANK_EXERCISE_NAME_PLANK_TO_STAND_UP ((FIT_PLANK_EXERCISE_NAME)52) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLANK_TO_STAND_UP ((FIT_PLANK_EXERCISE_NAME)53) -#define FIT_PLANK_EXERCISE_NAME_PLANK_WITH_ARM_RAISE ((FIT_PLANK_EXERCISE_NAME)54) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLANK_WITH_ARM_RAISE ((FIT_PLANK_EXERCISE_NAME)55) -#define FIT_PLANK_EXERCISE_NAME_PLANK_WITH_KNEE_TO_ELBOW ((FIT_PLANK_EXERCISE_NAME)56) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLANK_WITH_KNEE_TO_ELBOW ((FIT_PLANK_EXERCISE_NAME)57) -#define FIT_PLANK_EXERCISE_NAME_PLANK_WITH_OBLIQUE_CRUNCH ((FIT_PLANK_EXERCISE_NAME)58) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLANK_WITH_OBLIQUE_CRUNCH ((FIT_PLANK_EXERCISE_NAME)59) -#define FIT_PLANK_EXERCISE_NAME_PLYOMETRIC_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)60) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLYOMETRIC_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)61) -#define FIT_PLANK_EXERCISE_NAME_ROLLING_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)62) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_ROLLING_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)63) -#define FIT_PLANK_EXERCISE_NAME_SIDE_KICK_PLANK ((FIT_PLANK_EXERCISE_NAME)64) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_KICK_PLANK ((FIT_PLANK_EXERCISE_NAME)65) -#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)66) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)67) -#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK_AND_ROW ((FIT_PLANK_EXERCISE_NAME)68) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_PLANK_AND_ROW ((FIT_PLANK_EXERCISE_NAME)69) -#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK_LIFT ((FIT_PLANK_EXERCISE_NAME)70) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_PLANK_LIFT ((FIT_PLANK_EXERCISE_NAME)71) -#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK_WITH_ELBOW_ON_BOSU_BALL ((FIT_PLANK_EXERCISE_NAME)72) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_PLANK_WITH_ELBOW_ON_BOSU_BALL ((FIT_PLANK_EXERCISE_NAME)73) -#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK_WITH_FEET_ON_BENCH ((FIT_PLANK_EXERCISE_NAME)74) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_PLANK_WITH_FEET_ON_BENCH ((FIT_PLANK_EXERCISE_NAME)75) -#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK_WITH_KNEE_CIRCLE ((FIT_PLANK_EXERCISE_NAME)76) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_PLANK_WITH_KNEE_CIRCLE ((FIT_PLANK_EXERCISE_NAME)77) -#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK_WITH_KNEE_TUCK ((FIT_PLANK_EXERCISE_NAME)78) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_PLANK_WITH_KNEE_TUCK ((FIT_PLANK_EXERCISE_NAME)79) -#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK_WITH_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)80) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_PLANK_WITH_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)81) -#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK_WITH_REACH_UNDER ((FIT_PLANK_EXERCISE_NAME)82) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_PLANK_WITH_REACH_UNDER ((FIT_PLANK_EXERCISE_NAME)83) -#define FIT_PLANK_EXERCISE_NAME_SINGLE_LEG_ELEVATED_FEET_PLANK ((FIT_PLANK_EXERCISE_NAME)84) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_ELEVATED_FEET_PLANK ((FIT_PLANK_EXERCISE_NAME)85) -#define FIT_PLANK_EXERCISE_NAME_SINGLE_LEG_FLEX_AND_EXTEND ((FIT_PLANK_EXERCISE_NAME)86) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_FLEX_AND_EXTEND ((FIT_PLANK_EXERCISE_NAME)87) -#define FIT_PLANK_EXERCISE_NAME_SINGLE_LEG_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)88) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)89) -#define FIT_PLANK_EXERCISE_NAME_SPIDERMAN_PLANK ((FIT_PLANK_EXERCISE_NAME)90) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SPIDERMAN_PLANK ((FIT_PLANK_EXERCISE_NAME)91) -#define FIT_PLANK_EXERCISE_NAME_STRAIGHT_ARM_PLANK ((FIT_PLANK_EXERCISE_NAME)92) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_STRAIGHT_ARM_PLANK ((FIT_PLANK_EXERCISE_NAME)93) -#define FIT_PLANK_EXERCISE_NAME_STRAIGHT_ARM_PLANK_WITH_SHOULDER_TOUCH ((FIT_PLANK_EXERCISE_NAME)94) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_STRAIGHT_ARM_PLANK_WITH_SHOULDER_TOUCH ((FIT_PLANK_EXERCISE_NAME)95) -#define FIT_PLANK_EXERCISE_NAME_SWISS_BALL_PLANK ((FIT_PLANK_EXERCISE_NAME)96) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SWISS_BALL_PLANK ((FIT_PLANK_EXERCISE_NAME)97) -#define FIT_PLANK_EXERCISE_NAME_SWISS_BALL_PLANK_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)98) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SWISS_BALL_PLANK_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)99) -#define FIT_PLANK_EXERCISE_NAME_SWISS_BALL_PLANK_LEG_LIFT_AND_HOLD ((FIT_PLANK_EXERCISE_NAME)100) -#define FIT_PLANK_EXERCISE_NAME_SWISS_BALL_PLANK_WITH_FEET_ON_BENCH ((FIT_PLANK_EXERCISE_NAME)101) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SWISS_BALL_PLANK_WITH_FEET_ON_BENCH ((FIT_PLANK_EXERCISE_NAME)102) -#define FIT_PLANK_EXERCISE_NAME_SWISS_BALL_PRONE_JACKKNIFE ((FIT_PLANK_EXERCISE_NAME)103) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SWISS_BALL_PRONE_JACKKNIFE ((FIT_PLANK_EXERCISE_NAME)104) -#define FIT_PLANK_EXERCISE_NAME_SWISS_BALL_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)105) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SWISS_BALL_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)106) -#define FIT_PLANK_EXERCISE_NAME_THREE_WAY_PLANK ((FIT_PLANK_EXERCISE_NAME)107) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_THREE_WAY_PLANK ((FIT_PLANK_EXERCISE_NAME)108) -#define FIT_PLANK_EXERCISE_NAME_TOWEL_PLANK_AND_KNEE_IN ((FIT_PLANK_EXERCISE_NAME)109) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_TOWEL_PLANK_AND_KNEE_IN ((FIT_PLANK_EXERCISE_NAME)110) -#define FIT_PLANK_EXERCISE_NAME_T_STABILIZATION ((FIT_PLANK_EXERCISE_NAME)111) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_T_STABILIZATION ((FIT_PLANK_EXERCISE_NAME)112) -#define FIT_PLANK_EXERCISE_NAME_TURKISH_GET_UP_TO_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)113) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_TURKISH_GET_UP_TO_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)114) -#define FIT_PLANK_EXERCISE_NAME_TWO_POINT_PLANK ((FIT_PLANK_EXERCISE_NAME)115) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_TWO_POINT_PLANK ((FIT_PLANK_EXERCISE_NAME)116) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLANK ((FIT_PLANK_EXERCISE_NAME)117) -#define FIT_PLANK_EXERCISE_NAME_WIDE_STANCE_PLANK_WITH_DIAGONAL_ARM_LIFT ((FIT_PLANK_EXERCISE_NAME)118) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_WIDE_STANCE_PLANK_WITH_DIAGONAL_ARM_LIFT ((FIT_PLANK_EXERCISE_NAME)119) -#define FIT_PLANK_EXERCISE_NAME_WIDE_STANCE_PLANK_WITH_DIAGONAL_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)120) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_WIDE_STANCE_PLANK_WITH_DIAGONAL_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)121) -#define FIT_PLANK_EXERCISE_NAME_WIDE_STANCE_PLANK_WITH_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)122) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_WIDE_STANCE_PLANK_WITH_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)123) -#define FIT_PLANK_EXERCISE_NAME_WIDE_STANCE_PLANK_WITH_OPPOSITE_ARM_AND_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)124) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_MOUNTAIN_CLIMBER_WITH_HANDS_ON_BENCH ((FIT_PLANK_EXERCISE_NAME)125) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SWISS_BALL_PLANK_LEG_LIFT_AND_HOLD ((FIT_PLANK_EXERCISE_NAME)126) -#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_WIDE_STANCE_PLANK_WITH_OPPOSITE_ARM_AND_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)127) -#define FIT_PLANK_EXERCISE_NAME_PLANK_WITH_FEET_ON_SWISS_BALL ((FIT_PLANK_EXERCISE_NAME)128) -#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK_TO_PLANK_WITH_REACH_UNDER ((FIT_PLANK_EXERCISE_NAME)129) -#define FIT_PLANK_EXERCISE_NAME_BRIDGE_WITH_GLUTE_LOWER_LIFT ((FIT_PLANK_EXERCISE_NAME)130) -#define FIT_PLANK_EXERCISE_NAME_BRIDGE_ONE_LEG_BRIDGE ((FIT_PLANK_EXERCISE_NAME)131) -#define FIT_PLANK_EXERCISE_NAME_PLANK_WITH_ARM_VARIATIONS ((FIT_PLANK_EXERCISE_NAME)132) -#define FIT_PLANK_EXERCISE_NAME_PLANK_WITH_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)133) -#define FIT_PLANK_EXERCISE_NAME_REVERSE_PLANK_WITH_LEG_PULL ((FIT_PLANK_EXERCISE_NAME)134) -#define FIT_PLANK_EXERCISE_NAME_COUNT 135 - -typedef FIT_UINT16 FIT_PLYO_EXERCISE_NAME; -#define FIT_PLYO_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_PLYO_EXERCISE_NAME_ALTERNATING_JUMP_LUNGE ((FIT_PLYO_EXERCISE_NAME)0) -#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_ALTERNATING_JUMP_LUNGE ((FIT_PLYO_EXERCISE_NAME)1) -#define FIT_PLYO_EXERCISE_NAME_BARBELL_JUMP_SQUAT ((FIT_PLYO_EXERCISE_NAME)2) -#define FIT_PLYO_EXERCISE_NAME_BODY_WEIGHT_JUMP_SQUAT ((FIT_PLYO_EXERCISE_NAME)3) -#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_JUMP_SQUAT ((FIT_PLYO_EXERCISE_NAME)4) -#define FIT_PLYO_EXERCISE_NAME_CROSS_KNEE_STRIKE ((FIT_PLYO_EXERCISE_NAME)5) -#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_CROSS_KNEE_STRIKE ((FIT_PLYO_EXERCISE_NAME)6) -#define FIT_PLYO_EXERCISE_NAME_DEPTH_JUMP ((FIT_PLYO_EXERCISE_NAME)7) -#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_DEPTH_JUMP ((FIT_PLYO_EXERCISE_NAME)8) -#define FIT_PLYO_EXERCISE_NAME_DUMBBELL_JUMP_SQUAT ((FIT_PLYO_EXERCISE_NAME)9) -#define FIT_PLYO_EXERCISE_NAME_DUMBBELL_SPLIT_JUMP ((FIT_PLYO_EXERCISE_NAME)10) -#define FIT_PLYO_EXERCISE_NAME_FRONT_KNEE_STRIKE ((FIT_PLYO_EXERCISE_NAME)11) -#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_FRONT_KNEE_STRIKE ((FIT_PLYO_EXERCISE_NAME)12) -#define FIT_PLYO_EXERCISE_NAME_HIGH_BOX_JUMP ((FIT_PLYO_EXERCISE_NAME)13) -#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_HIGH_BOX_JUMP ((FIT_PLYO_EXERCISE_NAME)14) -#define FIT_PLYO_EXERCISE_NAME_ISOMETRIC_EXPLOSIVE_BODY_WEIGHT_JUMP_SQUAT ((FIT_PLYO_EXERCISE_NAME)15) -#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_ISOMETRIC_EXPLOSIVE_JUMP_SQUAT ((FIT_PLYO_EXERCISE_NAME)16) -#define FIT_PLYO_EXERCISE_NAME_LATERAL_LEAP_AND_HOP ((FIT_PLYO_EXERCISE_NAME)17) -#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_LATERAL_LEAP_AND_HOP ((FIT_PLYO_EXERCISE_NAME)18) -#define FIT_PLYO_EXERCISE_NAME_LATERAL_PLYO_SQUATS ((FIT_PLYO_EXERCISE_NAME)19) -#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_LATERAL_PLYO_SQUATS ((FIT_PLYO_EXERCISE_NAME)20) -#define FIT_PLYO_EXERCISE_NAME_LATERAL_SLIDE ((FIT_PLYO_EXERCISE_NAME)21) -#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_LATERAL_SLIDE ((FIT_PLYO_EXERCISE_NAME)22) -#define FIT_PLYO_EXERCISE_NAME_MEDICINE_BALL_OVERHEAD_THROWS ((FIT_PLYO_EXERCISE_NAME)23) -#define FIT_PLYO_EXERCISE_NAME_MEDICINE_BALL_SIDE_THROW ((FIT_PLYO_EXERCISE_NAME)24) -#define FIT_PLYO_EXERCISE_NAME_MEDICINE_BALL_SLAM ((FIT_PLYO_EXERCISE_NAME)25) -#define FIT_PLYO_EXERCISE_NAME_SIDE_TO_SIDE_MEDICINE_BALL_THROWS ((FIT_PLYO_EXERCISE_NAME)26) -#define FIT_PLYO_EXERCISE_NAME_SIDE_TO_SIDE_SHUFFLE_JUMP ((FIT_PLYO_EXERCISE_NAME)27) -#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_SIDE_TO_SIDE_SHUFFLE_JUMP ((FIT_PLYO_EXERCISE_NAME)28) -#define FIT_PLYO_EXERCISE_NAME_SQUAT_JUMP_ONTO_BOX ((FIT_PLYO_EXERCISE_NAME)29) -#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_SQUAT_JUMP_ONTO_BOX ((FIT_PLYO_EXERCISE_NAME)30) -#define FIT_PLYO_EXERCISE_NAME_SQUAT_JUMPS_IN_AND_OUT ((FIT_PLYO_EXERCISE_NAME)31) -#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_SQUAT_JUMPS_IN_AND_OUT ((FIT_PLYO_EXERCISE_NAME)32) -#define FIT_PLYO_EXERCISE_NAME_COUNT 33 - -typedef FIT_UINT16 FIT_PULL_UP_EXERCISE_NAME; -#define FIT_PULL_UP_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_PULL_UP_EXERCISE_NAME_BANDED_PULL_UPS ((FIT_PULL_UP_EXERCISE_NAME)0) -#define FIT_PULL_UP_EXERCISE_NAME_30_DEGREE_LAT_PULLDOWN ((FIT_PULL_UP_EXERCISE_NAME)1) -#define FIT_PULL_UP_EXERCISE_NAME_BAND_ASSISTED_CHIN_UP ((FIT_PULL_UP_EXERCISE_NAME)2) -#define FIT_PULL_UP_EXERCISE_NAME_CLOSE_GRIP_CHIN_UP ((FIT_PULL_UP_EXERCISE_NAME)3) -#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_CLOSE_GRIP_CHIN_UP ((FIT_PULL_UP_EXERCISE_NAME)4) -#define FIT_PULL_UP_EXERCISE_NAME_CLOSE_GRIP_LAT_PULLDOWN ((FIT_PULL_UP_EXERCISE_NAME)5) -#define FIT_PULL_UP_EXERCISE_NAME_CROSSOVER_CHIN_UP ((FIT_PULL_UP_EXERCISE_NAME)6) -#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_CROSSOVER_CHIN_UP ((FIT_PULL_UP_EXERCISE_NAME)7) -#define FIT_PULL_UP_EXERCISE_NAME_EZ_BAR_PULLOVER ((FIT_PULL_UP_EXERCISE_NAME)8) -#define FIT_PULL_UP_EXERCISE_NAME_HANGING_HURDLE ((FIT_PULL_UP_EXERCISE_NAME)9) -#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_HANGING_HURDLE ((FIT_PULL_UP_EXERCISE_NAME)10) -#define FIT_PULL_UP_EXERCISE_NAME_KNEELING_LAT_PULLDOWN ((FIT_PULL_UP_EXERCISE_NAME)11) -#define FIT_PULL_UP_EXERCISE_NAME_KNEELING_UNDERHAND_GRIP_LAT_PULLDOWN ((FIT_PULL_UP_EXERCISE_NAME)12) -#define FIT_PULL_UP_EXERCISE_NAME_LAT_PULLDOWN ((FIT_PULL_UP_EXERCISE_NAME)13) -#define FIT_PULL_UP_EXERCISE_NAME_MIXED_GRIP_CHIN_UP ((FIT_PULL_UP_EXERCISE_NAME)14) -#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_MIXED_GRIP_CHIN_UP ((FIT_PULL_UP_EXERCISE_NAME)15) -#define FIT_PULL_UP_EXERCISE_NAME_MIXED_GRIP_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)16) -#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_MIXED_GRIP_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)17) -#define FIT_PULL_UP_EXERCISE_NAME_REVERSE_GRIP_PULLDOWN ((FIT_PULL_UP_EXERCISE_NAME)18) -#define FIT_PULL_UP_EXERCISE_NAME_STANDING_CABLE_PULLOVER ((FIT_PULL_UP_EXERCISE_NAME)19) -#define FIT_PULL_UP_EXERCISE_NAME_STRAIGHT_ARM_PULLDOWN ((FIT_PULL_UP_EXERCISE_NAME)20) -#define FIT_PULL_UP_EXERCISE_NAME_SWISS_BALL_EZ_BAR_PULLOVER ((FIT_PULL_UP_EXERCISE_NAME)21) -#define FIT_PULL_UP_EXERCISE_NAME_TOWEL_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)22) -#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_TOWEL_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)23) -#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)24) -#define FIT_PULL_UP_EXERCISE_NAME_WIDE_GRIP_LAT_PULLDOWN ((FIT_PULL_UP_EXERCISE_NAME)25) -#define FIT_PULL_UP_EXERCISE_NAME_WIDE_GRIP_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)26) -#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_WIDE_GRIP_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)27) -#define FIT_PULL_UP_EXERCISE_NAME_BURPEE_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)28) -#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_BURPEE_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)29) -#define FIT_PULL_UP_EXERCISE_NAME_JUMPING_PULL_UPS ((FIT_PULL_UP_EXERCISE_NAME)30) -#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_JUMPING_PULL_UPS ((FIT_PULL_UP_EXERCISE_NAME)31) -#define FIT_PULL_UP_EXERCISE_NAME_KIPPING_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)32) -#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_KIPPING_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)33) -#define FIT_PULL_UP_EXERCISE_NAME_L_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)34) -#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_L_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)35) -#define FIT_PULL_UP_EXERCISE_NAME_SUSPENDED_CHIN_UP ((FIT_PULL_UP_EXERCISE_NAME)36) -#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_SUSPENDED_CHIN_UP ((FIT_PULL_UP_EXERCISE_NAME)37) -#define FIT_PULL_UP_EXERCISE_NAME_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)38) -#define FIT_PULL_UP_EXERCISE_NAME_COUNT 39 - -typedef FIT_UINT16 FIT_PUSH_UP_EXERCISE_NAME; -#define FIT_PUSH_UP_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_PUSH_UP_EXERCISE_NAME_CHEST_PRESS_WITH_BAND ((FIT_PUSH_UP_EXERCISE_NAME)0) -#define FIT_PUSH_UP_EXERCISE_NAME_ALTERNATING_STAGGERED_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)1) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_ALTERNATING_STAGGERED_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)2) -#define FIT_PUSH_UP_EXERCISE_NAME_ALTERNATING_HANDS_MEDICINE_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)3) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_ALTERNATING_HANDS_MEDICINE_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)4) -#define FIT_PUSH_UP_EXERCISE_NAME_BOSU_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)5) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_BOSU_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)6) -#define FIT_PUSH_UP_EXERCISE_NAME_CLAPPING_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)7) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_CLAPPING_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)8) -#define FIT_PUSH_UP_EXERCISE_NAME_CLOSE_GRIP_MEDICINE_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)9) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_CLOSE_GRIP_MEDICINE_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)10) -#define FIT_PUSH_UP_EXERCISE_NAME_CLOSE_HANDS_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)11) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_CLOSE_HANDS_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)12) -#define FIT_PUSH_UP_EXERCISE_NAME_DECLINE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)13) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_DECLINE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)14) -#define FIT_PUSH_UP_EXERCISE_NAME_DIAMOND_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)15) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_DIAMOND_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)16) -#define FIT_PUSH_UP_EXERCISE_NAME_EXPLOSIVE_CROSSOVER_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)17) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_EXPLOSIVE_CROSSOVER_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)18) -#define FIT_PUSH_UP_EXERCISE_NAME_EXPLOSIVE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)19) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_EXPLOSIVE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)20) -#define FIT_PUSH_UP_EXERCISE_NAME_FEET_ELEVATED_SIDE_TO_SIDE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)21) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_FEET_ELEVATED_SIDE_TO_SIDE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)22) -#define FIT_PUSH_UP_EXERCISE_NAME_HAND_RELEASE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)23) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_HAND_RELEASE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)24) -#define FIT_PUSH_UP_EXERCISE_NAME_HANDSTAND_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)25) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_HANDSTAND_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)26) -#define FIT_PUSH_UP_EXERCISE_NAME_INCLINE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)27) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_INCLINE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)28) -#define FIT_PUSH_UP_EXERCISE_NAME_ISOMETRIC_EXPLOSIVE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)29) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_ISOMETRIC_EXPLOSIVE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)30) -#define FIT_PUSH_UP_EXERCISE_NAME_JUDO_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)31) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_JUDO_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)32) -#define FIT_PUSH_UP_EXERCISE_NAME_KNEELING_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)33) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_KNEELING_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)34) -#define FIT_PUSH_UP_EXERCISE_NAME_MEDICINE_BALL_CHEST_PASS ((FIT_PUSH_UP_EXERCISE_NAME)35) -#define FIT_PUSH_UP_EXERCISE_NAME_MEDICINE_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)36) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_MEDICINE_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)37) -#define FIT_PUSH_UP_EXERCISE_NAME_ONE_ARM_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)38) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_ONE_ARM_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)39) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)40) -#define FIT_PUSH_UP_EXERCISE_NAME_PUSH_UP_AND_ROW ((FIT_PUSH_UP_EXERCISE_NAME)41) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_PUSH_UP_AND_ROW ((FIT_PUSH_UP_EXERCISE_NAME)42) -#define FIT_PUSH_UP_EXERCISE_NAME_PUSH_UP_PLUS ((FIT_PUSH_UP_EXERCISE_NAME)43) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_PUSH_UP_PLUS ((FIT_PUSH_UP_EXERCISE_NAME)44) -#define FIT_PUSH_UP_EXERCISE_NAME_PUSH_UP_WITH_FEET_ON_SWISS_BALL ((FIT_PUSH_UP_EXERCISE_NAME)45) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_PUSH_UP_WITH_FEET_ON_SWISS_BALL ((FIT_PUSH_UP_EXERCISE_NAME)46) -#define FIT_PUSH_UP_EXERCISE_NAME_PUSH_UP_WITH_ONE_HAND_ON_MEDICINE_BALL ((FIT_PUSH_UP_EXERCISE_NAME)47) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_PUSH_UP_WITH_ONE_HAND_ON_MEDICINE_BALL ((FIT_PUSH_UP_EXERCISE_NAME)48) -#define FIT_PUSH_UP_EXERCISE_NAME_SHOULDER_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)49) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_SHOULDER_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)50) -#define FIT_PUSH_UP_EXERCISE_NAME_SINGLE_ARM_MEDICINE_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)51) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_SINGLE_ARM_MEDICINE_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)52) -#define FIT_PUSH_UP_EXERCISE_NAME_SPIDERMAN_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)53) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_SPIDERMAN_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)54) -#define FIT_PUSH_UP_EXERCISE_NAME_STACKED_FEET_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)55) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_STACKED_FEET_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)56) -#define FIT_PUSH_UP_EXERCISE_NAME_STAGGERED_HANDS_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)57) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_STAGGERED_HANDS_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)58) -#define FIT_PUSH_UP_EXERCISE_NAME_SUSPENDED_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)59) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_SUSPENDED_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)60) -#define FIT_PUSH_UP_EXERCISE_NAME_SWISS_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)61) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_SWISS_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)62) -#define FIT_PUSH_UP_EXERCISE_NAME_SWISS_BALL_PUSH_UP_PLUS ((FIT_PUSH_UP_EXERCISE_NAME)63) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_SWISS_BALL_PUSH_UP_PLUS ((FIT_PUSH_UP_EXERCISE_NAME)64) -#define FIT_PUSH_UP_EXERCISE_NAME_T_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)65) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_T_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)66) -#define FIT_PUSH_UP_EXERCISE_NAME_TRIPLE_STOP_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)67) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_TRIPLE_STOP_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)68) -#define FIT_PUSH_UP_EXERCISE_NAME_WIDE_HANDS_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)69) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_WIDE_HANDS_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)70) -#define FIT_PUSH_UP_EXERCISE_NAME_PARALLETTE_HANDSTAND_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)71) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_PARALLETTE_HANDSTAND_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)72) -#define FIT_PUSH_UP_EXERCISE_NAME_RING_HANDSTAND_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)73) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_RING_HANDSTAND_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)74) -#define FIT_PUSH_UP_EXERCISE_NAME_RING_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)75) -#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_RING_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)76) -#define FIT_PUSH_UP_EXERCISE_NAME_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)77) -#define FIT_PUSH_UP_EXERCISE_NAME_PILATES_PUSHUP ((FIT_PUSH_UP_EXERCISE_NAME)78) -#define FIT_PUSH_UP_EXERCISE_NAME_COUNT 79 - -typedef FIT_UINT16 FIT_ROW_EXERCISE_NAME; -#define FIT_ROW_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_ROW_EXERCISE_NAME_BARBELL_STRAIGHT_LEG_DEADLIFT_TO_ROW ((FIT_ROW_EXERCISE_NAME)0) -#define FIT_ROW_EXERCISE_NAME_CABLE_ROW_STANDING ((FIT_ROW_EXERCISE_NAME)1) -#define FIT_ROW_EXERCISE_NAME_DUMBBELL_ROW ((FIT_ROW_EXERCISE_NAME)2) -#define FIT_ROW_EXERCISE_NAME_ELEVATED_FEET_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)3) -#define FIT_ROW_EXERCISE_NAME_WEIGHTED_ELEVATED_FEET_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)4) -#define FIT_ROW_EXERCISE_NAME_FACE_PULL ((FIT_ROW_EXERCISE_NAME)5) -#define FIT_ROW_EXERCISE_NAME_FACE_PULL_WITH_EXTERNAL_ROTATION ((FIT_ROW_EXERCISE_NAME)6) -#define FIT_ROW_EXERCISE_NAME_INVERTED_ROW_WITH_FEET_ON_SWISS_BALL ((FIT_ROW_EXERCISE_NAME)7) -#define FIT_ROW_EXERCISE_NAME_WEIGHTED_INVERTED_ROW_WITH_FEET_ON_SWISS_BALL ((FIT_ROW_EXERCISE_NAME)8) -#define FIT_ROW_EXERCISE_NAME_KETTLEBELL_ROW ((FIT_ROW_EXERCISE_NAME)9) -#define FIT_ROW_EXERCISE_NAME_MODIFIED_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)10) -#define FIT_ROW_EXERCISE_NAME_WEIGHTED_MODIFIED_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)11) -#define FIT_ROW_EXERCISE_NAME_NEUTRAL_GRIP_ALTERNATING_DUMBBELL_ROW ((FIT_ROW_EXERCISE_NAME)12) -#define FIT_ROW_EXERCISE_NAME_ONE_ARM_BENT_OVER_ROW ((FIT_ROW_EXERCISE_NAME)13) -#define FIT_ROW_EXERCISE_NAME_ONE_LEGGED_DUMBBELL_ROW ((FIT_ROW_EXERCISE_NAME)14) -#define FIT_ROW_EXERCISE_NAME_RENEGADE_ROW ((FIT_ROW_EXERCISE_NAME)15) -#define FIT_ROW_EXERCISE_NAME_REVERSE_GRIP_BARBELL_ROW ((FIT_ROW_EXERCISE_NAME)16) -#define FIT_ROW_EXERCISE_NAME_ROPE_HANDLE_CABLE_ROW ((FIT_ROW_EXERCISE_NAME)17) -#define FIT_ROW_EXERCISE_NAME_SEATED_CABLE_ROW ((FIT_ROW_EXERCISE_NAME)18) -#define FIT_ROW_EXERCISE_NAME_SEATED_DUMBBELL_ROW ((FIT_ROW_EXERCISE_NAME)19) -#define FIT_ROW_EXERCISE_NAME_SINGLE_ARM_CABLE_ROW ((FIT_ROW_EXERCISE_NAME)20) -#define FIT_ROW_EXERCISE_NAME_SINGLE_ARM_CABLE_ROW_AND_ROTATION ((FIT_ROW_EXERCISE_NAME)21) -#define FIT_ROW_EXERCISE_NAME_SINGLE_ARM_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)22) -#define FIT_ROW_EXERCISE_NAME_WEIGHTED_SINGLE_ARM_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)23) -#define FIT_ROW_EXERCISE_NAME_SINGLE_ARM_NEUTRAL_GRIP_DUMBBELL_ROW ((FIT_ROW_EXERCISE_NAME)24) -#define FIT_ROW_EXERCISE_NAME_SINGLE_ARM_NEUTRAL_GRIP_DUMBBELL_ROW_AND_ROTATION ((FIT_ROW_EXERCISE_NAME)25) -#define FIT_ROW_EXERCISE_NAME_SUSPENDED_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)26) -#define FIT_ROW_EXERCISE_NAME_WEIGHTED_SUSPENDED_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)27) -#define FIT_ROW_EXERCISE_NAME_T_BAR_ROW ((FIT_ROW_EXERCISE_NAME)28) -#define FIT_ROW_EXERCISE_NAME_TOWEL_GRIP_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)29) -#define FIT_ROW_EXERCISE_NAME_WEIGHTED_TOWEL_GRIP_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)30) -#define FIT_ROW_EXERCISE_NAME_UNDERHAND_GRIP_CABLE_ROW ((FIT_ROW_EXERCISE_NAME)31) -#define FIT_ROW_EXERCISE_NAME_V_GRIP_CABLE_ROW ((FIT_ROW_EXERCISE_NAME)32) -#define FIT_ROW_EXERCISE_NAME_WIDE_GRIP_SEATED_CABLE_ROW ((FIT_ROW_EXERCISE_NAME)33) -#define FIT_ROW_EXERCISE_NAME_COUNT 34 - -typedef FIT_UINT16 FIT_SHOULDER_PRESS_EXERCISE_NAME; -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_ALTERNATING_DUMBBELL_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)0) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_ARNOLD_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)1) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_BARBELL_FRONT_SQUAT_TO_PUSH_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)2) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_BARBELL_PUSH_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)3) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_BARBELL_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)4) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_DEAD_CURL_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)5) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_DUMBBELL_ALTERNATING_SHOULDER_PRESS_AND_TWIST ((FIT_SHOULDER_PRESS_EXERCISE_NAME)6) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_DUMBBELL_HAMMER_CURL_TO_LUNGE_TO_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)7) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_DUMBBELL_PUSH_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)8) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_FLOOR_INVERTED_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)9) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_WEIGHTED_FLOOR_INVERTED_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)10) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_INVERTED_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)11) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_WEIGHTED_INVERTED_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)12) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_ONE_ARM_PUSH_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)13) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_OVERHEAD_BARBELL_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)14) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_OVERHEAD_DUMBBELL_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)15) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_SEATED_BARBELL_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)16) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_SEATED_DUMBBELL_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)17) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_SINGLE_ARM_DUMBBELL_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)18) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_SINGLE_ARM_STEP_UP_AND_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)19) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_SMITH_MACHINE_OVERHEAD_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)20) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_SPLIT_STANCE_HAMMER_CURL_TO_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)21) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_SWISS_BALL_DUMBBELL_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)22) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_WEIGHT_PLATE_FRONT_RAISE ((FIT_SHOULDER_PRESS_EXERCISE_NAME)23) -#define FIT_SHOULDER_PRESS_EXERCISE_NAME_COUNT 24 - -typedef FIT_UINT16 FIT_SHOULDER_STABILITY_EXERCISE_NAME; -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_90_DEGREE_CABLE_EXTERNAL_ROTATION ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)0) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_BAND_EXTERNAL_ROTATION ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)1) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_BAND_INTERNAL_ROTATION ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)2) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_BENT_ARM_LATERAL_RAISE_AND_EXTERNAL_ROTATION ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)3) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_CABLE_EXTERNAL_ROTATION ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)4) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_DUMBBELL_FACE_PULL_WITH_EXTERNAL_ROTATION ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)5) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_FLOOR_I_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)6) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_FLOOR_I_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)7) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_FLOOR_T_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)8) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_FLOOR_T_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)9) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_FLOOR_Y_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)10) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_FLOOR_Y_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)11) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_INCLINE_I_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)12) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_INCLINE_I_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)13) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_INCLINE_L_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)14) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_INCLINE_L_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)15) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_INCLINE_T_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)16) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_INCLINE_T_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)17) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_INCLINE_W_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)18) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_INCLINE_W_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)19) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_INCLINE_Y_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)20) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_INCLINE_Y_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)21) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_LYING_EXTERNAL_ROTATION ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)22) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_SEATED_DUMBBELL_EXTERNAL_ROTATION ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)23) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_STANDING_L_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)24) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_SWISS_BALL_I_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)25) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_SWISS_BALL_I_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)26) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_SWISS_BALL_T_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)27) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_SWISS_BALL_T_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)28) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_SWISS_BALL_W_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)29) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_SWISS_BALL_W_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)30) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_SWISS_BALL_Y_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)31) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_SWISS_BALL_Y_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)32) -#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_COUNT 33 - -typedef FIT_UINT16 FIT_SHRUG_EXERCISE_NAME; -#define FIT_SHRUG_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_SHRUG_EXERCISE_NAME_BARBELL_JUMP_SHRUG ((FIT_SHRUG_EXERCISE_NAME)0) -#define FIT_SHRUG_EXERCISE_NAME_BARBELL_SHRUG ((FIT_SHRUG_EXERCISE_NAME)1) -#define FIT_SHRUG_EXERCISE_NAME_BARBELL_UPRIGHT_ROW ((FIT_SHRUG_EXERCISE_NAME)2) -#define FIT_SHRUG_EXERCISE_NAME_BEHIND_THE_BACK_SMITH_MACHINE_SHRUG ((FIT_SHRUG_EXERCISE_NAME)3) -#define FIT_SHRUG_EXERCISE_NAME_DUMBBELL_JUMP_SHRUG ((FIT_SHRUG_EXERCISE_NAME)4) -#define FIT_SHRUG_EXERCISE_NAME_DUMBBELL_SHRUG ((FIT_SHRUG_EXERCISE_NAME)5) -#define FIT_SHRUG_EXERCISE_NAME_DUMBBELL_UPRIGHT_ROW ((FIT_SHRUG_EXERCISE_NAME)6) -#define FIT_SHRUG_EXERCISE_NAME_INCLINE_DUMBBELL_SHRUG ((FIT_SHRUG_EXERCISE_NAME)7) -#define FIT_SHRUG_EXERCISE_NAME_OVERHEAD_BARBELL_SHRUG ((FIT_SHRUG_EXERCISE_NAME)8) -#define FIT_SHRUG_EXERCISE_NAME_OVERHEAD_DUMBBELL_SHRUG ((FIT_SHRUG_EXERCISE_NAME)9) -#define FIT_SHRUG_EXERCISE_NAME_SCAPTION_AND_SHRUG ((FIT_SHRUG_EXERCISE_NAME)10) -#define FIT_SHRUG_EXERCISE_NAME_SCAPULAR_RETRACTION ((FIT_SHRUG_EXERCISE_NAME)11) -#define FIT_SHRUG_EXERCISE_NAME_SERRATUS_CHAIR_SHRUG ((FIT_SHRUG_EXERCISE_NAME)12) -#define FIT_SHRUG_EXERCISE_NAME_WEIGHTED_SERRATUS_CHAIR_SHRUG ((FIT_SHRUG_EXERCISE_NAME)13) -#define FIT_SHRUG_EXERCISE_NAME_SERRATUS_SHRUG ((FIT_SHRUG_EXERCISE_NAME)14) -#define FIT_SHRUG_EXERCISE_NAME_WEIGHTED_SERRATUS_SHRUG ((FIT_SHRUG_EXERCISE_NAME)15) -#define FIT_SHRUG_EXERCISE_NAME_WIDE_GRIP_JUMP_SHRUG ((FIT_SHRUG_EXERCISE_NAME)16) -#define FIT_SHRUG_EXERCISE_NAME_COUNT 17 - -typedef FIT_UINT16 FIT_SIT_UP_EXERCISE_NAME; -#define FIT_SIT_UP_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_SIT_UP_EXERCISE_NAME_ALTERNATING_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)0) -#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_ALTERNATING_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)1) -#define FIT_SIT_UP_EXERCISE_NAME_BENT_KNEE_V_UP ((FIT_SIT_UP_EXERCISE_NAME)2) -#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_BENT_KNEE_V_UP ((FIT_SIT_UP_EXERCISE_NAME)3) -#define FIT_SIT_UP_EXERCISE_NAME_BUTTERFLY_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)4) -#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_BUTTERFLY_SITUP ((FIT_SIT_UP_EXERCISE_NAME)5) -#define FIT_SIT_UP_EXERCISE_NAME_CROSS_PUNCH_ROLL_UP ((FIT_SIT_UP_EXERCISE_NAME)6) -#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_CROSS_PUNCH_ROLL_UP ((FIT_SIT_UP_EXERCISE_NAME)7) -#define FIT_SIT_UP_EXERCISE_NAME_CROSSED_ARMS_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)8) -#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_CROSSED_ARMS_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)9) -#define FIT_SIT_UP_EXERCISE_NAME_GET_UP_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)10) -#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_GET_UP_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)11) -#define FIT_SIT_UP_EXERCISE_NAME_HOVERING_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)12) -#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_HOVERING_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)13) -#define FIT_SIT_UP_EXERCISE_NAME_KETTLEBELL_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)14) -#define FIT_SIT_UP_EXERCISE_NAME_MEDICINE_BALL_ALTERNATING_V_UP ((FIT_SIT_UP_EXERCISE_NAME)15) -#define FIT_SIT_UP_EXERCISE_NAME_MEDICINE_BALL_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)16) -#define FIT_SIT_UP_EXERCISE_NAME_MEDICINE_BALL_V_UP ((FIT_SIT_UP_EXERCISE_NAME)17) -#define FIT_SIT_UP_EXERCISE_NAME_MODIFIED_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)18) -#define FIT_SIT_UP_EXERCISE_NAME_NEGATIVE_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)19) -#define FIT_SIT_UP_EXERCISE_NAME_ONE_ARM_FULL_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)20) -#define FIT_SIT_UP_EXERCISE_NAME_RECLINING_CIRCLE ((FIT_SIT_UP_EXERCISE_NAME)21) -#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_RECLINING_CIRCLE ((FIT_SIT_UP_EXERCISE_NAME)22) -#define FIT_SIT_UP_EXERCISE_NAME_REVERSE_CURL_UP ((FIT_SIT_UP_EXERCISE_NAME)23) -#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_REVERSE_CURL_UP ((FIT_SIT_UP_EXERCISE_NAME)24) -#define FIT_SIT_UP_EXERCISE_NAME_SINGLE_LEG_SWISS_BALL_JACKKNIFE ((FIT_SIT_UP_EXERCISE_NAME)25) -#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_SWISS_BALL_JACKKNIFE ((FIT_SIT_UP_EXERCISE_NAME)26) -#define FIT_SIT_UP_EXERCISE_NAME_THE_TEASER ((FIT_SIT_UP_EXERCISE_NAME)27) -#define FIT_SIT_UP_EXERCISE_NAME_THE_TEASER_WEIGHTED ((FIT_SIT_UP_EXERCISE_NAME)28) -#define FIT_SIT_UP_EXERCISE_NAME_THREE_PART_ROLL_DOWN ((FIT_SIT_UP_EXERCISE_NAME)29) -#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_THREE_PART_ROLL_DOWN ((FIT_SIT_UP_EXERCISE_NAME)30) -#define FIT_SIT_UP_EXERCISE_NAME_V_UP ((FIT_SIT_UP_EXERCISE_NAME)31) -#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_V_UP ((FIT_SIT_UP_EXERCISE_NAME)32) -#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_RUSSIAN_TWIST_ON_SWISS_BALL ((FIT_SIT_UP_EXERCISE_NAME)33) -#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)34) -#define FIT_SIT_UP_EXERCISE_NAME_X_ABS ((FIT_SIT_UP_EXERCISE_NAME)35) -#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_X_ABS ((FIT_SIT_UP_EXERCISE_NAME)36) -#define FIT_SIT_UP_EXERCISE_NAME_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)37) -#define FIT_SIT_UP_EXERCISE_NAME_COUNT 38 - -typedef FIT_UINT16 FIT_SQUAT_EXERCISE_NAME; -#define FIT_SQUAT_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_SQUAT_EXERCISE_NAME_LEG_PRESS ((FIT_SQUAT_EXERCISE_NAME)0) -#define FIT_SQUAT_EXERCISE_NAME_BACK_SQUAT_WITH_BODY_BAR ((FIT_SQUAT_EXERCISE_NAME)1) -#define FIT_SQUAT_EXERCISE_NAME_BACK_SQUATS ((FIT_SQUAT_EXERCISE_NAME)2) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_BACK_SQUATS ((FIT_SQUAT_EXERCISE_NAME)3) -#define FIT_SQUAT_EXERCISE_NAME_BALANCING_SQUAT ((FIT_SQUAT_EXERCISE_NAME)4) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_BALANCING_SQUAT ((FIT_SQUAT_EXERCISE_NAME)5) -#define FIT_SQUAT_EXERCISE_NAME_BARBELL_BACK_SQUAT ((FIT_SQUAT_EXERCISE_NAME)6) -#define FIT_SQUAT_EXERCISE_NAME_BARBELL_BOX_SQUAT ((FIT_SQUAT_EXERCISE_NAME)7) -#define FIT_SQUAT_EXERCISE_NAME_BARBELL_FRONT_SQUAT ((FIT_SQUAT_EXERCISE_NAME)8) -#define FIT_SQUAT_EXERCISE_NAME_BARBELL_HACK_SQUAT ((FIT_SQUAT_EXERCISE_NAME)9) -#define FIT_SQUAT_EXERCISE_NAME_BARBELL_HANG_SQUAT_SNATCH ((FIT_SQUAT_EXERCISE_NAME)10) -#define FIT_SQUAT_EXERCISE_NAME_BARBELL_LATERAL_STEP_UP ((FIT_SQUAT_EXERCISE_NAME)11) -#define FIT_SQUAT_EXERCISE_NAME_BARBELL_QUARTER_SQUAT ((FIT_SQUAT_EXERCISE_NAME)12) -#define FIT_SQUAT_EXERCISE_NAME_BARBELL_SIFF_SQUAT ((FIT_SQUAT_EXERCISE_NAME)13) -#define FIT_SQUAT_EXERCISE_NAME_BARBELL_SQUAT_SNATCH ((FIT_SQUAT_EXERCISE_NAME)14) -#define FIT_SQUAT_EXERCISE_NAME_BARBELL_SQUAT_WITH_HEELS_RAISED ((FIT_SQUAT_EXERCISE_NAME)15) -#define FIT_SQUAT_EXERCISE_NAME_BARBELL_STEPOVER ((FIT_SQUAT_EXERCISE_NAME)16) -#define FIT_SQUAT_EXERCISE_NAME_BARBELL_STEP_UP ((FIT_SQUAT_EXERCISE_NAME)17) -#define FIT_SQUAT_EXERCISE_NAME_BENCH_SQUAT_WITH_ROTATIONAL_CHOP ((FIT_SQUAT_EXERCISE_NAME)18) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_BENCH_SQUAT_WITH_ROTATIONAL_CHOP ((FIT_SQUAT_EXERCISE_NAME)19) -#define FIT_SQUAT_EXERCISE_NAME_BODY_WEIGHT_WALL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)20) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_WALL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)21) -#define FIT_SQUAT_EXERCISE_NAME_BOX_STEP_SQUAT ((FIT_SQUAT_EXERCISE_NAME)22) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_BOX_STEP_SQUAT ((FIT_SQUAT_EXERCISE_NAME)23) -#define FIT_SQUAT_EXERCISE_NAME_BRACED_SQUAT ((FIT_SQUAT_EXERCISE_NAME)24) -#define FIT_SQUAT_EXERCISE_NAME_CROSSED_ARM_BARBELL_FRONT_SQUAT ((FIT_SQUAT_EXERCISE_NAME)25) -#define FIT_SQUAT_EXERCISE_NAME_CROSSOVER_DUMBBELL_STEP_UP ((FIT_SQUAT_EXERCISE_NAME)26) -#define FIT_SQUAT_EXERCISE_NAME_DUMBBELL_FRONT_SQUAT ((FIT_SQUAT_EXERCISE_NAME)27) -#define FIT_SQUAT_EXERCISE_NAME_DUMBBELL_SPLIT_SQUAT ((FIT_SQUAT_EXERCISE_NAME)28) -#define FIT_SQUAT_EXERCISE_NAME_DUMBBELL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)29) -#define FIT_SQUAT_EXERCISE_NAME_DUMBBELL_SQUAT_CLEAN ((FIT_SQUAT_EXERCISE_NAME)30) -#define FIT_SQUAT_EXERCISE_NAME_DUMBBELL_STEPOVER ((FIT_SQUAT_EXERCISE_NAME)31) -#define FIT_SQUAT_EXERCISE_NAME_DUMBBELL_STEP_UP ((FIT_SQUAT_EXERCISE_NAME)32) -#define FIT_SQUAT_EXERCISE_NAME_ELEVATED_SINGLE_LEG_SQUAT ((FIT_SQUAT_EXERCISE_NAME)33) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_ELEVATED_SINGLE_LEG_SQUAT ((FIT_SQUAT_EXERCISE_NAME)34) -#define FIT_SQUAT_EXERCISE_NAME_FIGURE_FOUR_SQUATS ((FIT_SQUAT_EXERCISE_NAME)35) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_FIGURE_FOUR_SQUATS ((FIT_SQUAT_EXERCISE_NAME)36) -#define FIT_SQUAT_EXERCISE_NAME_GOBLET_SQUAT ((FIT_SQUAT_EXERCISE_NAME)37) -#define FIT_SQUAT_EXERCISE_NAME_KETTLEBELL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)38) -#define FIT_SQUAT_EXERCISE_NAME_KETTLEBELL_SWING_OVERHEAD ((FIT_SQUAT_EXERCISE_NAME)39) -#define FIT_SQUAT_EXERCISE_NAME_KETTLEBELL_SWING_WITH_FLIP_TO_SQUAT ((FIT_SQUAT_EXERCISE_NAME)40) -#define FIT_SQUAT_EXERCISE_NAME_LATERAL_DUMBBELL_STEP_UP ((FIT_SQUAT_EXERCISE_NAME)41) -#define FIT_SQUAT_EXERCISE_NAME_ONE_LEGGED_SQUAT ((FIT_SQUAT_EXERCISE_NAME)42) -#define FIT_SQUAT_EXERCISE_NAME_OVERHEAD_DUMBBELL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)43) -#define FIT_SQUAT_EXERCISE_NAME_OVERHEAD_SQUAT ((FIT_SQUAT_EXERCISE_NAME)44) -#define FIT_SQUAT_EXERCISE_NAME_PARTIAL_SINGLE_LEG_SQUAT ((FIT_SQUAT_EXERCISE_NAME)45) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_PARTIAL_SINGLE_LEG_SQUAT ((FIT_SQUAT_EXERCISE_NAME)46) -#define FIT_SQUAT_EXERCISE_NAME_PISTOL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)47) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_PISTOL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)48) -#define FIT_SQUAT_EXERCISE_NAME_PLIE_SLIDES ((FIT_SQUAT_EXERCISE_NAME)49) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_PLIE_SLIDES ((FIT_SQUAT_EXERCISE_NAME)50) -#define FIT_SQUAT_EXERCISE_NAME_PLIE_SQUAT ((FIT_SQUAT_EXERCISE_NAME)51) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_PLIE_SQUAT ((FIT_SQUAT_EXERCISE_NAME)52) -#define FIT_SQUAT_EXERCISE_NAME_PRISONER_SQUAT ((FIT_SQUAT_EXERCISE_NAME)53) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_PRISONER_SQUAT ((FIT_SQUAT_EXERCISE_NAME)54) -#define FIT_SQUAT_EXERCISE_NAME_SINGLE_LEG_BENCH_GET_UP ((FIT_SQUAT_EXERCISE_NAME)55) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_BENCH_GET_UP ((FIT_SQUAT_EXERCISE_NAME)56) -#define FIT_SQUAT_EXERCISE_NAME_SINGLE_LEG_BENCH_SQUAT ((FIT_SQUAT_EXERCISE_NAME)57) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_BENCH_SQUAT ((FIT_SQUAT_EXERCISE_NAME)58) -#define FIT_SQUAT_EXERCISE_NAME_SINGLE_LEG_SQUAT_ON_SWISS_BALL ((FIT_SQUAT_EXERCISE_NAME)59) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_SQUAT_ON_SWISS_BALL ((FIT_SQUAT_EXERCISE_NAME)60) -#define FIT_SQUAT_EXERCISE_NAME_SQUAT ((FIT_SQUAT_EXERCISE_NAME)61) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_SQUAT ((FIT_SQUAT_EXERCISE_NAME)62) -#define FIT_SQUAT_EXERCISE_NAME_SQUATS_WITH_BAND ((FIT_SQUAT_EXERCISE_NAME)63) -#define FIT_SQUAT_EXERCISE_NAME_STAGGERED_SQUAT ((FIT_SQUAT_EXERCISE_NAME)64) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_STAGGERED_SQUAT ((FIT_SQUAT_EXERCISE_NAME)65) -#define FIT_SQUAT_EXERCISE_NAME_STEP_UP ((FIT_SQUAT_EXERCISE_NAME)66) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_STEP_UP ((FIT_SQUAT_EXERCISE_NAME)67) -#define FIT_SQUAT_EXERCISE_NAME_SUITCASE_SQUATS ((FIT_SQUAT_EXERCISE_NAME)68) -#define FIT_SQUAT_EXERCISE_NAME_SUMO_SQUAT ((FIT_SQUAT_EXERCISE_NAME)69) -#define FIT_SQUAT_EXERCISE_NAME_SUMO_SQUAT_SLIDE_IN ((FIT_SQUAT_EXERCISE_NAME)70) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_SUMO_SQUAT_SLIDE_IN ((FIT_SQUAT_EXERCISE_NAME)71) -#define FIT_SQUAT_EXERCISE_NAME_SUMO_SQUAT_TO_HIGH_PULL ((FIT_SQUAT_EXERCISE_NAME)72) -#define FIT_SQUAT_EXERCISE_NAME_SUMO_SQUAT_TO_STAND ((FIT_SQUAT_EXERCISE_NAME)73) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_SUMO_SQUAT_TO_STAND ((FIT_SQUAT_EXERCISE_NAME)74) -#define FIT_SQUAT_EXERCISE_NAME_SUMO_SQUAT_WITH_ROTATION ((FIT_SQUAT_EXERCISE_NAME)75) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_SUMO_SQUAT_WITH_ROTATION ((FIT_SQUAT_EXERCISE_NAME)76) -#define FIT_SQUAT_EXERCISE_NAME_SWISS_BALL_BODY_WEIGHT_WALL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)77) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_SWISS_BALL_WALL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)78) -#define FIT_SQUAT_EXERCISE_NAME_THRUSTERS ((FIT_SQUAT_EXERCISE_NAME)79) -#define FIT_SQUAT_EXERCISE_NAME_UNEVEN_SQUAT ((FIT_SQUAT_EXERCISE_NAME)80) -#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_UNEVEN_SQUAT ((FIT_SQUAT_EXERCISE_NAME)81) -#define FIT_SQUAT_EXERCISE_NAME_WAIST_SLIMMING_SQUAT ((FIT_SQUAT_EXERCISE_NAME)82) -#define FIT_SQUAT_EXERCISE_NAME_WALL_BALL ((FIT_SQUAT_EXERCISE_NAME)83) -#define FIT_SQUAT_EXERCISE_NAME_WIDE_STANCE_BARBELL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)84) -#define FIT_SQUAT_EXERCISE_NAME_WIDE_STANCE_GOBLET_SQUAT ((FIT_SQUAT_EXERCISE_NAME)85) -#define FIT_SQUAT_EXERCISE_NAME_ZERCHER_SQUAT ((FIT_SQUAT_EXERCISE_NAME)86) -#define FIT_SQUAT_EXERCISE_NAME_KBS_OVERHEAD ((FIT_SQUAT_EXERCISE_NAME)87) // Deprecated do not use -#define FIT_SQUAT_EXERCISE_NAME_SQUAT_AND_SIDE_KICK ((FIT_SQUAT_EXERCISE_NAME)88) -#define FIT_SQUAT_EXERCISE_NAME_SQUAT_JUMPS_IN_N_OUT ((FIT_SQUAT_EXERCISE_NAME)89) -#define FIT_SQUAT_EXERCISE_NAME_PILATES_PLIE_SQUATS_PARALLEL_TURNED_OUT_FLAT_AND_HEELS ((FIT_SQUAT_EXERCISE_NAME)90) -#define FIT_SQUAT_EXERCISE_NAME_RELEVE_STRAIGHT_LEG_AND_KNEE_BENT_WITH_ONE_LEG_VARIATION ((FIT_SQUAT_EXERCISE_NAME)91) -#define FIT_SQUAT_EXERCISE_NAME_COUNT 92 - -typedef FIT_UINT16 FIT_TOTAL_BODY_EXERCISE_NAME; -#define FIT_TOTAL_BODY_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_TOTAL_BODY_EXERCISE_NAME_BURPEE ((FIT_TOTAL_BODY_EXERCISE_NAME)0) -#define FIT_TOTAL_BODY_EXERCISE_NAME_WEIGHTED_BURPEE ((FIT_TOTAL_BODY_EXERCISE_NAME)1) -#define FIT_TOTAL_BODY_EXERCISE_NAME_BURPEE_BOX_JUMP ((FIT_TOTAL_BODY_EXERCISE_NAME)2) -#define FIT_TOTAL_BODY_EXERCISE_NAME_WEIGHTED_BURPEE_BOX_JUMP ((FIT_TOTAL_BODY_EXERCISE_NAME)3) -#define FIT_TOTAL_BODY_EXERCISE_NAME_HIGH_PULL_BURPEE ((FIT_TOTAL_BODY_EXERCISE_NAME)4) -#define FIT_TOTAL_BODY_EXERCISE_NAME_MAN_MAKERS ((FIT_TOTAL_BODY_EXERCISE_NAME)5) -#define FIT_TOTAL_BODY_EXERCISE_NAME_ONE_ARM_BURPEE ((FIT_TOTAL_BODY_EXERCISE_NAME)6) -#define FIT_TOTAL_BODY_EXERCISE_NAME_SQUAT_THRUSTS ((FIT_TOTAL_BODY_EXERCISE_NAME)7) -#define FIT_TOTAL_BODY_EXERCISE_NAME_WEIGHTED_SQUAT_THRUSTS ((FIT_TOTAL_BODY_EXERCISE_NAME)8) -#define FIT_TOTAL_BODY_EXERCISE_NAME_SQUAT_PLANK_PUSH_UP ((FIT_TOTAL_BODY_EXERCISE_NAME)9) -#define FIT_TOTAL_BODY_EXERCISE_NAME_WEIGHTED_SQUAT_PLANK_PUSH_UP ((FIT_TOTAL_BODY_EXERCISE_NAME)10) -#define FIT_TOTAL_BODY_EXERCISE_NAME_STANDING_T_ROTATION_BALANCE ((FIT_TOTAL_BODY_EXERCISE_NAME)11) -#define FIT_TOTAL_BODY_EXERCISE_NAME_WEIGHTED_STANDING_T_ROTATION_BALANCE ((FIT_TOTAL_BODY_EXERCISE_NAME)12) -#define FIT_TOTAL_BODY_EXERCISE_NAME_COUNT 13 - -typedef FIT_UINT16 FIT_TRICEPS_EXTENSION_EXERCISE_NAME; -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_BENCH_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)0) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_WEIGHTED_BENCH_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)1) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_BODY_WEIGHT_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)2) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_CABLE_KICKBACK ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)3) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_CABLE_LYING_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)4) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_CABLE_OVERHEAD_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)5) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_DUMBBELL_KICKBACK ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)6) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_DUMBBELL_LYING_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)7) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_EZ_BAR_OVERHEAD_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)8) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_INCLINE_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)9) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_WEIGHTED_INCLINE_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)10) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_INCLINE_EZ_BAR_LYING_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)11) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_LYING_DUMBBELL_PULLOVER_TO_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)12) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_LYING_EZ_BAR_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)13) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_LYING_TRICEPS_EXTENSION_TO_CLOSE_GRIP_BENCH_PRESS ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)14) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_OVERHEAD_DUMBBELL_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)15) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_RECLINING_TRICEPS_PRESS ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)16) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_REVERSE_GRIP_PRESSDOWN ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)17) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_REVERSE_GRIP_TRICEPS_PRESSDOWN ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)18) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_ROPE_PRESSDOWN ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)19) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SEATED_BARBELL_OVERHEAD_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)20) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SEATED_DUMBBELL_OVERHEAD_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)21) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SEATED_EZ_BAR_OVERHEAD_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)22) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SEATED_SINGLE_ARM_OVERHEAD_DUMBBELL_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)23) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SINGLE_ARM_DUMBBELL_OVERHEAD_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)24) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SINGLE_DUMBBELL_SEATED_OVERHEAD_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)25) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SINGLE_LEG_BENCH_DIP_AND_KICK ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)26) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_BENCH_DIP_AND_KICK ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)27) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SINGLE_LEG_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)28) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)29) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_STATIC_LYING_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)30) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SUSPENDED_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)31) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_WEIGHTED_SUSPENDED_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)32) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SWISS_BALL_DUMBBELL_LYING_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)33) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SWISS_BALL_EZ_BAR_LYING_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)34) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SWISS_BALL_EZ_BAR_OVERHEAD_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)35) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_TABLETOP_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)36) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_WEIGHTED_TABLETOP_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)37) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_TRICEPS_EXTENSION_ON_FLOOR ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)38) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_TRICEPS_PRESSDOWN ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)39) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_WEIGHTED_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)40) -#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_COUNT 41 - -typedef FIT_UINT16 FIT_WARM_UP_EXERCISE_NAME; -#define FIT_WARM_UP_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_WARM_UP_EXERCISE_NAME_QUADRUPED_ROCKING ((FIT_WARM_UP_EXERCISE_NAME)0) -#define FIT_WARM_UP_EXERCISE_NAME_NECK_TILTS ((FIT_WARM_UP_EXERCISE_NAME)1) -#define FIT_WARM_UP_EXERCISE_NAME_ANKLE_CIRCLES ((FIT_WARM_UP_EXERCISE_NAME)2) -#define FIT_WARM_UP_EXERCISE_NAME_ANKLE_DORSIFLEXION_WITH_BAND ((FIT_WARM_UP_EXERCISE_NAME)3) -#define FIT_WARM_UP_EXERCISE_NAME_ANKLE_INTERNAL_ROTATION ((FIT_WARM_UP_EXERCISE_NAME)4) -#define FIT_WARM_UP_EXERCISE_NAME_ARM_CIRCLES ((FIT_WARM_UP_EXERCISE_NAME)5) -#define FIT_WARM_UP_EXERCISE_NAME_BENT_OVER_REACH_TO_SKY ((FIT_WARM_UP_EXERCISE_NAME)6) -#define FIT_WARM_UP_EXERCISE_NAME_CAT_CAMEL ((FIT_WARM_UP_EXERCISE_NAME)7) -#define FIT_WARM_UP_EXERCISE_NAME_ELBOW_TO_FOOT_LUNGE ((FIT_WARM_UP_EXERCISE_NAME)8) -#define FIT_WARM_UP_EXERCISE_NAME_FORWARD_AND_BACKWARD_LEG_SWINGS ((FIT_WARM_UP_EXERCISE_NAME)9) -#define FIT_WARM_UP_EXERCISE_NAME_GROINERS ((FIT_WARM_UP_EXERCISE_NAME)10) -#define FIT_WARM_UP_EXERCISE_NAME_INVERTED_HAMSTRING_STRETCH ((FIT_WARM_UP_EXERCISE_NAME)11) -#define FIT_WARM_UP_EXERCISE_NAME_LATERAL_DUCK_UNDER ((FIT_WARM_UP_EXERCISE_NAME)12) -#define FIT_WARM_UP_EXERCISE_NAME_NECK_ROTATIONS ((FIT_WARM_UP_EXERCISE_NAME)13) -#define FIT_WARM_UP_EXERCISE_NAME_OPPOSITE_ARM_AND_LEG_BALANCE ((FIT_WARM_UP_EXERCISE_NAME)14) -#define FIT_WARM_UP_EXERCISE_NAME_REACH_ROLL_AND_LIFT ((FIT_WARM_UP_EXERCISE_NAME)15) -#define FIT_WARM_UP_EXERCISE_NAME_SCORPION ((FIT_WARM_UP_EXERCISE_NAME)16) // Deprecated do not use -#define FIT_WARM_UP_EXERCISE_NAME_SHOULDER_CIRCLES ((FIT_WARM_UP_EXERCISE_NAME)17) -#define FIT_WARM_UP_EXERCISE_NAME_SIDE_TO_SIDE_LEG_SWINGS ((FIT_WARM_UP_EXERCISE_NAME)18) -#define FIT_WARM_UP_EXERCISE_NAME_SLEEPER_STRETCH ((FIT_WARM_UP_EXERCISE_NAME)19) -#define FIT_WARM_UP_EXERCISE_NAME_SLIDE_OUT ((FIT_WARM_UP_EXERCISE_NAME)20) -#define FIT_WARM_UP_EXERCISE_NAME_SWISS_BALL_HIP_CROSSOVER ((FIT_WARM_UP_EXERCISE_NAME)21) -#define FIT_WARM_UP_EXERCISE_NAME_SWISS_BALL_REACH_ROLL_AND_LIFT ((FIT_WARM_UP_EXERCISE_NAME)22) -#define FIT_WARM_UP_EXERCISE_NAME_SWISS_BALL_WINDSHIELD_WIPERS ((FIT_WARM_UP_EXERCISE_NAME)23) -#define FIT_WARM_UP_EXERCISE_NAME_THORACIC_ROTATION ((FIT_WARM_UP_EXERCISE_NAME)24) -#define FIT_WARM_UP_EXERCISE_NAME_WALKING_HIGH_KICKS ((FIT_WARM_UP_EXERCISE_NAME)25) -#define FIT_WARM_UP_EXERCISE_NAME_WALKING_HIGH_KNEES ((FIT_WARM_UP_EXERCISE_NAME)26) -#define FIT_WARM_UP_EXERCISE_NAME_WALKING_KNEE_HUGS ((FIT_WARM_UP_EXERCISE_NAME)27) -#define FIT_WARM_UP_EXERCISE_NAME_WALKING_LEG_CRADLES ((FIT_WARM_UP_EXERCISE_NAME)28) -#define FIT_WARM_UP_EXERCISE_NAME_WALKOUT ((FIT_WARM_UP_EXERCISE_NAME)29) -#define FIT_WARM_UP_EXERCISE_NAME_WALKOUT_FROM_PUSH_UP_POSITION ((FIT_WARM_UP_EXERCISE_NAME)30) -#define FIT_WARM_UP_EXERCISE_NAME_COUNT 31 - -typedef FIT_UINT16 FIT_RUN_EXERCISE_NAME; -#define FIT_RUN_EXERCISE_NAME_INVALID FIT_UINT16_INVALID -#define FIT_RUN_EXERCISE_NAME_RUN ((FIT_RUN_EXERCISE_NAME)0) -#define FIT_RUN_EXERCISE_NAME_WALK ((FIT_RUN_EXERCISE_NAME)1) -#define FIT_RUN_EXERCISE_NAME_JOG ((FIT_RUN_EXERCISE_NAME)2) -#define FIT_RUN_EXERCISE_NAME_SPRINT ((FIT_RUN_EXERCISE_NAME)3) -#define FIT_RUN_EXERCISE_NAME_COUNT 4 - -typedef FIT_ENUM FIT_WATER_TYPE; -#define FIT_WATER_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_WATER_TYPE_FRESH ((FIT_WATER_TYPE)0) -#define FIT_WATER_TYPE_SALT ((FIT_WATER_TYPE)1) -#define FIT_WATER_TYPE_EN13319 ((FIT_WATER_TYPE)2) -#define FIT_WATER_TYPE_CUSTOM ((FIT_WATER_TYPE)3) -#define FIT_WATER_TYPE_COUNT 4 - -typedef FIT_ENUM FIT_TISSUE_MODEL_TYPE; -#define FIT_TISSUE_MODEL_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_TISSUE_MODEL_TYPE_ZHL_16C ((FIT_TISSUE_MODEL_TYPE)0) // Buhlmann's decompression algorithm, version C -#define FIT_TISSUE_MODEL_TYPE_COUNT 1 - -typedef FIT_ENUM FIT_DIVE_GAS_STATUS; -#define FIT_DIVE_GAS_STATUS_INVALID FIT_ENUM_INVALID -#define FIT_DIVE_GAS_STATUS_DISABLED ((FIT_DIVE_GAS_STATUS)0) -#define FIT_DIVE_GAS_STATUS_ENABLED ((FIT_DIVE_GAS_STATUS)1) -#define FIT_DIVE_GAS_STATUS_BACKUP_ONLY ((FIT_DIVE_GAS_STATUS)2) -#define FIT_DIVE_GAS_STATUS_COUNT 3 - -typedef FIT_ENUM FIT_DIVE_ALERT; -#define FIT_DIVE_ALERT_INVALID FIT_ENUM_INVALID -#define FIT_DIVE_ALERT_NDL_REACHED ((FIT_DIVE_ALERT)0) -#define FIT_DIVE_ALERT_GAS_SWITCH_PROMPTED ((FIT_DIVE_ALERT)1) -#define FIT_DIVE_ALERT_NEAR_SURFACE ((FIT_DIVE_ALERT)2) -#define FIT_DIVE_ALERT_APPROACHING_NDL ((FIT_DIVE_ALERT)3) -#define FIT_DIVE_ALERT_PO2_WARN ((FIT_DIVE_ALERT)4) -#define FIT_DIVE_ALERT_PO2_CRIT_HIGH ((FIT_DIVE_ALERT)5) -#define FIT_DIVE_ALERT_PO2_CRIT_LOW ((FIT_DIVE_ALERT)6) -#define FIT_DIVE_ALERT_TIME_ALERT ((FIT_DIVE_ALERT)7) -#define FIT_DIVE_ALERT_DEPTH_ALERT ((FIT_DIVE_ALERT)8) -#define FIT_DIVE_ALERT_DECO_CEILING_BROKEN ((FIT_DIVE_ALERT)9) -#define FIT_DIVE_ALERT_DECO_COMPLETE ((FIT_DIVE_ALERT)10) -#define FIT_DIVE_ALERT_SAFETY_STOP_BROKEN ((FIT_DIVE_ALERT)11) -#define FIT_DIVE_ALERT_SAFETY_STOP_COMPLETE ((FIT_DIVE_ALERT)12) -#define FIT_DIVE_ALERT_CNS_WARNING ((FIT_DIVE_ALERT)13) -#define FIT_DIVE_ALERT_CNS_CRITICAL ((FIT_DIVE_ALERT)14) -#define FIT_DIVE_ALERT_OTU_WARNING ((FIT_DIVE_ALERT)15) -#define FIT_DIVE_ALERT_OTU_CRITICAL ((FIT_DIVE_ALERT)16) -#define FIT_DIVE_ALERT_ASCENT_CRITICAL ((FIT_DIVE_ALERT)17) -#define FIT_DIVE_ALERT_ALERT_DISMISSED_BY_KEY ((FIT_DIVE_ALERT)18) -#define FIT_DIVE_ALERT_ALERT_DISMISSED_BY_TIMEOUT ((FIT_DIVE_ALERT)19) -#define FIT_DIVE_ALERT_BATTERY_LOW ((FIT_DIVE_ALERT)20) -#define FIT_DIVE_ALERT_BATTERY_CRITICAL ((FIT_DIVE_ALERT)21) -#define FIT_DIVE_ALERT_SAFETY_STOP_STARTED ((FIT_DIVE_ALERT)22) -#define FIT_DIVE_ALERT_APPROACHING_FIRST_DECO_STOP ((FIT_DIVE_ALERT)23) -#define FIT_DIVE_ALERT_SETPOINT_SWITCH_AUTO_LOW ((FIT_DIVE_ALERT)24) -#define FIT_DIVE_ALERT_SETPOINT_SWITCH_AUTO_HIGH ((FIT_DIVE_ALERT)25) -#define FIT_DIVE_ALERT_SETPOINT_SWITCH_MANUAL_LOW ((FIT_DIVE_ALERT)26) -#define FIT_DIVE_ALERT_SETPOINT_SWITCH_MANUAL_HIGH ((FIT_DIVE_ALERT)27) -#define FIT_DIVE_ALERT_AUTO_SETPOINT_SWITCH_IGNORED ((FIT_DIVE_ALERT)28) -#define FIT_DIVE_ALERT_SWITCHED_TO_OPEN_CIRCUIT ((FIT_DIVE_ALERT)29) -#define FIT_DIVE_ALERT_SWITCHED_TO_CLOSED_CIRCUIT ((FIT_DIVE_ALERT)30) -#define FIT_DIVE_ALERT_TANK_BATTERY_LOW ((FIT_DIVE_ALERT)32) -#define FIT_DIVE_ALERT_PO2_CCR_DIL_LOW ((FIT_DIVE_ALERT)33) // ccr diluent has low po2 -#define FIT_DIVE_ALERT_DECO_STOP_CLEARED ((FIT_DIVE_ALERT)34) // a deco stop has been cleared -#define FIT_DIVE_ALERT_APNEA_NEUTRAL_BUOYANCY ((FIT_DIVE_ALERT)35) // Target Depth Apnea Alarm triggered -#define FIT_DIVE_ALERT_APNEA_TARGET_DEPTH ((FIT_DIVE_ALERT)36) // Neutral Buoyance Apnea Alarm triggered -#define FIT_DIVE_ALERT_APNEA_SURFACE ((FIT_DIVE_ALERT)37) // Surface Apnea Alarm triggered -#define FIT_DIVE_ALERT_APNEA_HIGH_SPEED ((FIT_DIVE_ALERT)38) // High Speed Apnea Alarm triggered -#define FIT_DIVE_ALERT_APNEA_LOW_SPEED ((FIT_DIVE_ALERT)39) // Low Speed Apnea Alarm triggered -#define FIT_DIVE_ALERT_COUNT 39 - -typedef FIT_ENUM FIT_DIVE_ALARM_TYPE; -#define FIT_DIVE_ALARM_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_DIVE_ALARM_TYPE_DEPTH ((FIT_DIVE_ALARM_TYPE)0) // Alarm when a certain depth is crossed -#define FIT_DIVE_ALARM_TYPE_TIME ((FIT_DIVE_ALARM_TYPE)1) // Alarm when a certain time has transpired -#define FIT_DIVE_ALARM_TYPE_SPEED ((FIT_DIVE_ALARM_TYPE)2) // Alarm when a certain ascent or descent rate is exceeded -#define FIT_DIVE_ALARM_TYPE_COUNT 3 - -typedef FIT_ENUM FIT_DIVE_BACKLIGHT_MODE; -#define FIT_DIVE_BACKLIGHT_MODE_INVALID FIT_ENUM_INVALID -#define FIT_DIVE_BACKLIGHT_MODE_AT_DEPTH ((FIT_DIVE_BACKLIGHT_MODE)0) -#define FIT_DIVE_BACKLIGHT_MODE_ALWAYS_ON ((FIT_DIVE_BACKLIGHT_MODE)1) -#define FIT_DIVE_BACKLIGHT_MODE_COUNT 2 - -typedef FIT_ENUM FIT_SLEEP_LEVEL; -#define FIT_SLEEP_LEVEL_INVALID FIT_ENUM_INVALID -#define FIT_SLEEP_LEVEL_UNMEASURABLE ((FIT_SLEEP_LEVEL)0) -#define FIT_SLEEP_LEVEL_AWAKE ((FIT_SLEEP_LEVEL)1) -#define FIT_SLEEP_LEVEL_LIGHT ((FIT_SLEEP_LEVEL)2) -#define FIT_SLEEP_LEVEL_DEEP ((FIT_SLEEP_LEVEL)3) -#define FIT_SLEEP_LEVEL_REM ((FIT_SLEEP_LEVEL)4) -#define FIT_SLEEP_LEVEL_COUNT 5 - -typedef FIT_ENUM FIT_SPO2_MEASUREMENT_TYPE; -#define FIT_SPO2_MEASUREMENT_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_SPO2_MEASUREMENT_TYPE_OFF_WRIST ((FIT_SPO2_MEASUREMENT_TYPE)0) -#define FIT_SPO2_MEASUREMENT_TYPE_SPOT_CHECK ((FIT_SPO2_MEASUREMENT_TYPE)1) -#define FIT_SPO2_MEASUREMENT_TYPE_CONTINUOUS_CHECK ((FIT_SPO2_MEASUREMENT_TYPE)2) -#define FIT_SPO2_MEASUREMENT_TYPE_PERIODIC ((FIT_SPO2_MEASUREMENT_TYPE)3) -#define FIT_SPO2_MEASUREMENT_TYPE_COUNT 4 - -typedef FIT_ENUM FIT_CCR_SETPOINT_SWITCH_MODE; -#define FIT_CCR_SETPOINT_SWITCH_MODE_INVALID FIT_ENUM_INVALID -#define FIT_CCR_SETPOINT_SWITCH_MODE_MANUAL ((FIT_CCR_SETPOINT_SWITCH_MODE)0) // User switches setpoints manually -#define FIT_CCR_SETPOINT_SWITCH_MODE_AUTOMATIC ((FIT_CCR_SETPOINT_SWITCH_MODE)1) // Switch automatically based on depth -#define FIT_CCR_SETPOINT_SWITCH_MODE_COUNT 2 - -typedef FIT_ENUM FIT_DIVE_GAS_MODE; -#define FIT_DIVE_GAS_MODE_INVALID FIT_ENUM_INVALID -#define FIT_DIVE_GAS_MODE_OPEN_CIRCUIT ((FIT_DIVE_GAS_MODE)0) -#define FIT_DIVE_GAS_MODE_CLOSED_CIRCUIT_DILUENT ((FIT_DIVE_GAS_MODE)1) -#define FIT_DIVE_GAS_MODE_COUNT 2 - -typedef FIT_UINT16 FIT_FAVERO_PRODUCT; -#define FIT_FAVERO_PRODUCT_INVALID FIT_UINT16_INVALID -#define FIT_FAVERO_PRODUCT_ASSIOMA_UNO ((FIT_FAVERO_PRODUCT)10) -#define FIT_FAVERO_PRODUCT_ASSIOMA_DUO ((FIT_FAVERO_PRODUCT)12) -#define FIT_FAVERO_PRODUCT_COUNT 2 - -typedef FIT_ENUM FIT_SPLIT_TYPE; -#define FIT_SPLIT_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_SPLIT_TYPE_ASCENT_SPLIT ((FIT_SPLIT_TYPE)1) -#define FIT_SPLIT_TYPE_DESCENT_SPLIT ((FIT_SPLIT_TYPE)2) -#define FIT_SPLIT_TYPE_INTERVAL_ACTIVE ((FIT_SPLIT_TYPE)3) -#define FIT_SPLIT_TYPE_INTERVAL_REST ((FIT_SPLIT_TYPE)4) -#define FIT_SPLIT_TYPE_INTERVAL_WARMUP ((FIT_SPLIT_TYPE)5) -#define FIT_SPLIT_TYPE_INTERVAL_COOLDOWN ((FIT_SPLIT_TYPE)6) -#define FIT_SPLIT_TYPE_INTERVAL_RECOVERY ((FIT_SPLIT_TYPE)7) -#define FIT_SPLIT_TYPE_INTERVAL_OTHER ((FIT_SPLIT_TYPE)8) -#define FIT_SPLIT_TYPE_CLIMB_ACTIVE ((FIT_SPLIT_TYPE)9) -#define FIT_SPLIT_TYPE_CLIMB_REST ((FIT_SPLIT_TYPE)10) -#define FIT_SPLIT_TYPE_SURF_ACTIVE ((FIT_SPLIT_TYPE)11) -#define FIT_SPLIT_TYPE_RUN_ACTIVE ((FIT_SPLIT_TYPE)12) -#define FIT_SPLIT_TYPE_RUN_REST ((FIT_SPLIT_TYPE)13) -#define FIT_SPLIT_TYPE_WORKOUT_ROUND ((FIT_SPLIT_TYPE)14) -#define FIT_SPLIT_TYPE_RWD_RUN ((FIT_SPLIT_TYPE)17) // run/walk detection running -#define FIT_SPLIT_TYPE_RWD_WALK ((FIT_SPLIT_TYPE)18) // run/walk detection walking -#define FIT_SPLIT_TYPE_WINDSURF_ACTIVE ((FIT_SPLIT_TYPE)21) -#define FIT_SPLIT_TYPE_RWD_STAND ((FIT_SPLIT_TYPE)22) // run/walk detection standing -#define FIT_SPLIT_TYPE_TRANSITION ((FIT_SPLIT_TYPE)23) // Marks the time going from ascent_split to descent_split/used in backcountry ski -#define FIT_SPLIT_TYPE_SKI_LIFT_SPLIT ((FIT_SPLIT_TYPE)28) -#define FIT_SPLIT_TYPE_SKI_RUN_SPLIT ((FIT_SPLIT_TYPE)29) -#define FIT_SPLIT_TYPE_COUNT 21 - -typedef FIT_ENUM FIT_CLIMB_PRO_EVENT; -#define FIT_CLIMB_PRO_EVENT_INVALID FIT_ENUM_INVALID -#define FIT_CLIMB_PRO_EVENT_APPROACH ((FIT_CLIMB_PRO_EVENT)0) -#define FIT_CLIMB_PRO_EVENT_START ((FIT_CLIMB_PRO_EVENT)1) -#define FIT_CLIMB_PRO_EVENT_COMPLETE ((FIT_CLIMB_PRO_EVENT)2) -#define FIT_CLIMB_PRO_EVENT_COUNT 3 - -typedef FIT_ENUM FIT_GAS_CONSUMPTION_RATE_TYPE; -#define FIT_GAS_CONSUMPTION_RATE_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_GAS_CONSUMPTION_RATE_TYPE_PRESSURE_SAC ((FIT_GAS_CONSUMPTION_RATE_TYPE)0) // Pressure-based Surface Air Consumption -#define FIT_GAS_CONSUMPTION_RATE_TYPE_VOLUME_SAC ((FIT_GAS_CONSUMPTION_RATE_TYPE)1) // Volumetric Surface Air Consumption -#define FIT_GAS_CONSUMPTION_RATE_TYPE_RMV ((FIT_GAS_CONSUMPTION_RATE_TYPE)2) // Respiratory Minute Volume -#define FIT_GAS_CONSUMPTION_RATE_TYPE_COUNT 3 - -typedef FIT_ENUM FIT_TAP_SENSITIVITY; -#define FIT_TAP_SENSITIVITY_INVALID FIT_ENUM_INVALID -#define FIT_TAP_SENSITIVITY_HIGH ((FIT_TAP_SENSITIVITY)0) -#define FIT_TAP_SENSITIVITY_MEDIUM ((FIT_TAP_SENSITIVITY)1) -#define FIT_TAP_SENSITIVITY_LOW ((FIT_TAP_SENSITIVITY)2) -#define FIT_TAP_SENSITIVITY_COUNT 3 - -typedef FIT_ENUM FIT_RADAR_THREAT_LEVEL_TYPE; -#define FIT_RADAR_THREAT_LEVEL_TYPE_INVALID FIT_ENUM_INVALID -#define FIT_RADAR_THREAT_LEVEL_TYPE_THREAT_UNKNOWN ((FIT_RADAR_THREAT_LEVEL_TYPE)0) -#define FIT_RADAR_THREAT_LEVEL_TYPE_THREAT_NONE ((FIT_RADAR_THREAT_LEVEL_TYPE)1) -#define FIT_RADAR_THREAT_LEVEL_TYPE_THREAT_APPROACHING ((FIT_RADAR_THREAT_LEVEL_TYPE)2) -#define FIT_RADAR_THREAT_LEVEL_TYPE_THREAT_APPROACHING_FAST ((FIT_RADAR_THREAT_LEVEL_TYPE)3) -#define FIT_RADAR_THREAT_LEVEL_TYPE_COUNT 4 - -typedef FIT_ENUM FIT_MAX_MET_SPEED_SOURCE; -#define FIT_MAX_MET_SPEED_SOURCE_INVALID FIT_ENUM_INVALID -#define FIT_MAX_MET_SPEED_SOURCE_ONBOARD_GPS ((FIT_MAX_MET_SPEED_SOURCE)0) -#define FIT_MAX_MET_SPEED_SOURCE_CONNECTED_GPS ((FIT_MAX_MET_SPEED_SOURCE)1) -#define FIT_MAX_MET_SPEED_SOURCE_CADENCE ((FIT_MAX_MET_SPEED_SOURCE)2) -#define FIT_MAX_MET_SPEED_SOURCE_COUNT 3 - -typedef FIT_ENUM FIT_MAX_MET_HEART_RATE_SOURCE; -#define FIT_MAX_MET_HEART_RATE_SOURCE_INVALID FIT_ENUM_INVALID -#define FIT_MAX_MET_HEART_RATE_SOURCE_WHR ((FIT_MAX_MET_HEART_RATE_SOURCE)0) // Wrist Heart Rate Monitor -#define FIT_MAX_MET_HEART_RATE_SOURCE_HRM ((FIT_MAX_MET_HEART_RATE_SOURCE)1) // Chest Strap Heart Rate Monitor -#define FIT_MAX_MET_HEART_RATE_SOURCE_COUNT 2 - -typedef FIT_ENUM FIT_HRV_STATUS; -#define FIT_HRV_STATUS_INVALID FIT_ENUM_INVALID -#define FIT_HRV_STATUS_NONE ((FIT_HRV_STATUS)0) -#define FIT_HRV_STATUS_POOR ((FIT_HRV_STATUS)1) -#define FIT_HRV_STATUS_LOW ((FIT_HRV_STATUS)2) -#define FIT_HRV_STATUS_UNBALANCED ((FIT_HRV_STATUS)3) -#define FIT_HRV_STATUS_BALANCED ((FIT_HRV_STATUS)4) -#define FIT_HRV_STATUS_COUNT 5 - -typedef FIT_ENUM FIT_NO_FLY_TIME_MODE; -#define FIT_NO_FLY_TIME_MODE_INVALID FIT_ENUM_INVALID -#define FIT_NO_FLY_TIME_MODE_STANDARD ((FIT_NO_FLY_TIME_MODE)0) // Standard Diver Alert Network no-fly guidance -#define FIT_NO_FLY_TIME_MODE_FLAT_24_HOURS ((FIT_NO_FLY_TIME_MODE)1) // Flat 24 hour no-fly guidance -#define FIT_NO_FLY_TIME_MODE_COUNT 2 - - -/////////////////////////////////////////////////////////////////////// -// Message Conversion Structures -/////////////////////////////////////////////////////////////////////// - -typedef struct -{ - FIT_UINT8 base_type; - FIT_UINT16 offset_in; - FIT_UINT16 offset_local; - FIT_UINT8 size; - FIT_UINT8 num; -} FIT_FIELD_CONVERT; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_FIELD_CONVERT fields[95]; -} FIT_MESG_CONVERT; - - -/////////////////////////////////////////////////////////////////////// -// Messages -/////////////////////////////////////////////////////////////////////// - -#define FIT_MESG_SIZE 254 -#define FIT_MESG_DEF_SIZE 290 - -// pad message - -#define FIT_PAD_MESG_DEF_SIZE 5 - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; -} FIT_PAD_MESG_DEF; - - -// file_id message - -#define FIT_FILE_ID_MESG_SIZE 35 -#define FIT_FILE_ID_MESG_DEF_SIZE 26 -#define FIT_FILE_ID_MESG_PRODUCT_NAME_COUNT 20 - -typedef struct -{ - FIT_UINT32Z serial_number; // - FIT_DATE_TIME time_created; // Only set for files that are can be created/erased. - FIT_STRING product_name[FIT_FILE_ID_MESG_PRODUCT_NAME_COUNT]; // Optional free form string to indicate the devices name or model - FIT_MANUFACTURER manufacturer; // - FIT_UINT16 product; // - FIT_UINT16 number; // Only set for files that are not created/erased. - FIT_FILE type; // -} FIT_FILE_ID_MESG; - -typedef FIT_UINT8 FIT_FILE_ID_FIELD_NUM; - -#define FIT_FILE_ID_FIELD_NUM_SERIAL_NUMBER ((FIT_FILE_ID_FIELD_NUM)3) -#define FIT_FILE_ID_FIELD_NUM_TIME_CREATED ((FIT_FILE_ID_FIELD_NUM)4) -#define FIT_FILE_ID_FIELD_NUM_PRODUCT_NAME ((FIT_FILE_ID_FIELD_NUM)8) -#define FIT_FILE_ID_FIELD_NUM_MANUFACTURER ((FIT_FILE_ID_FIELD_NUM)1) -#define FIT_FILE_ID_FIELD_NUM_PRODUCT ((FIT_FILE_ID_FIELD_NUM)2) -#define FIT_FILE_ID_FIELD_NUM_NUMBER ((FIT_FILE_ID_FIELD_NUM)5) -#define FIT_FILE_ID_FIELD_NUM_TYPE ((FIT_FILE_ID_FIELD_NUM)0) - -typedef enum -{ - FIT_FILE_ID_MESG_SERIAL_NUMBER, - FIT_FILE_ID_MESG_TIME_CREATED, - FIT_FILE_ID_MESG_PRODUCT_NAME, - FIT_FILE_ID_MESG_MANUFACTURER, - FIT_FILE_ID_MESG_PRODUCT, - FIT_FILE_ID_MESG_NUMBER, - FIT_FILE_ID_MESG_TYPE, - FIT_FILE_ID_MESG_FIELDS -} FIT_FILE_ID_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_FILE_ID_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_FILE_ID_MESG_DEF; - -// file_creator message - -#define FIT_FILE_CREATOR_MESG_SIZE 3 -#define FIT_FILE_CREATOR_MESG_DEF_SIZE 11 - -typedef struct -{ - FIT_UINT16 software_version; // - FIT_UINT8 hardware_version; // -} FIT_FILE_CREATOR_MESG; - -typedef FIT_UINT8 FIT_FILE_CREATOR_FIELD_NUM; - -#define FIT_FILE_CREATOR_FIELD_NUM_SOFTWARE_VERSION ((FIT_FILE_CREATOR_FIELD_NUM)0) -#define FIT_FILE_CREATOR_FIELD_NUM_HARDWARE_VERSION ((FIT_FILE_CREATOR_FIELD_NUM)1) - -typedef enum -{ - FIT_FILE_CREATOR_MESG_SOFTWARE_VERSION, - FIT_FILE_CREATOR_MESG_HARDWARE_VERSION, - FIT_FILE_CREATOR_MESG_FIELDS -} FIT_FILE_CREATOR_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_FILE_CREATOR_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_FILE_CREATOR_MESG_DEF; - -// software message - -#define FIT_SOFTWARE_MESG_SIZE 20 -#define FIT_SOFTWARE_MESG_DEF_SIZE 14 -#define FIT_SOFTWARE_MESG_PART_NUMBER_COUNT 16 - -typedef struct -{ - FIT_STRING part_number[FIT_SOFTWARE_MESG_PART_NUMBER_COUNT]; // - FIT_MESSAGE_INDEX message_index; // - FIT_UINT16 version; // -} FIT_SOFTWARE_MESG; - -typedef FIT_UINT8 FIT_SOFTWARE_FIELD_NUM; - -#define FIT_SOFTWARE_FIELD_NUM_PART_NUMBER ((FIT_SOFTWARE_FIELD_NUM)5) -#define FIT_SOFTWARE_FIELD_NUM_MESSAGE_INDEX ((FIT_SOFTWARE_FIELD_NUM)254) -#define FIT_SOFTWARE_FIELD_NUM_VERSION ((FIT_SOFTWARE_FIELD_NUM)3) - -typedef enum -{ - FIT_SOFTWARE_MESG_PART_NUMBER, - FIT_SOFTWARE_MESG_MESSAGE_INDEX, - FIT_SOFTWARE_MESG_VERSION, - FIT_SOFTWARE_MESG_FIELDS -} FIT_SOFTWARE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_SOFTWARE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_SOFTWARE_MESG_DEF; - -// slave_device message - -#define FIT_SLAVE_DEVICE_MESG_SIZE 4 -#define FIT_SLAVE_DEVICE_MESG_DEF_SIZE 11 - -typedef struct -{ - FIT_MANUFACTURER manufacturer; // - FIT_UINT16 product; // -} FIT_SLAVE_DEVICE_MESG; - -typedef FIT_UINT8 FIT_SLAVE_DEVICE_FIELD_NUM; - -#define FIT_SLAVE_DEVICE_FIELD_NUM_MANUFACTURER ((FIT_SLAVE_DEVICE_FIELD_NUM)0) -#define FIT_SLAVE_DEVICE_FIELD_NUM_PRODUCT ((FIT_SLAVE_DEVICE_FIELD_NUM)1) - -typedef enum -{ - FIT_SLAVE_DEVICE_MESG_MANUFACTURER, - FIT_SLAVE_DEVICE_MESG_PRODUCT, - FIT_SLAVE_DEVICE_MESG_FIELDS -} FIT_SLAVE_DEVICE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_SLAVE_DEVICE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_SLAVE_DEVICE_MESG_DEF; - -// capabilities message - -#define FIT_CAPABILITIES_MESG_SIZE 13 -#define FIT_CAPABILITIES_MESG_DEF_SIZE 17 -#define FIT_CAPABILITIES_MESG_LANGUAGES_COUNT 4 -#define FIT_CAPABILITIES_MESG_SPORTS_COUNT 1 - -typedef struct -{ - FIT_UINT8Z languages[FIT_CAPABILITIES_MESG_LANGUAGES_COUNT]; // Use language_bits_x types where x is index of array. - FIT_WORKOUT_CAPABILITIES workouts_supported; // - FIT_CONNECTIVITY_CAPABILITIES connectivity_supported; // - FIT_SPORT_BITS_0 sports[FIT_CAPABILITIES_MESG_SPORTS_COUNT]; // Use sport_bits_x types where x is index of array. -} FIT_CAPABILITIES_MESG; - -typedef FIT_UINT8 FIT_CAPABILITIES_FIELD_NUM; - -#define FIT_CAPABILITIES_FIELD_NUM_LANGUAGES ((FIT_CAPABILITIES_FIELD_NUM)0) -#define FIT_CAPABILITIES_FIELD_NUM_WORKOUTS_SUPPORTED ((FIT_CAPABILITIES_FIELD_NUM)21) -#define FIT_CAPABILITIES_FIELD_NUM_CONNECTIVITY_SUPPORTED ((FIT_CAPABILITIES_FIELD_NUM)23) -#define FIT_CAPABILITIES_FIELD_NUM_SPORTS ((FIT_CAPABILITIES_FIELD_NUM)1) - -typedef enum -{ - FIT_CAPABILITIES_MESG_LANGUAGES, - FIT_CAPABILITIES_MESG_WORKOUTS_SUPPORTED, - FIT_CAPABILITIES_MESG_CONNECTIVITY_SUPPORTED, - FIT_CAPABILITIES_MESG_SPORTS, - FIT_CAPABILITIES_MESG_FIELDS -} FIT_CAPABILITIES_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_CAPABILITIES_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_CAPABILITIES_MESG_DEF; - -// file_capabilities message - -#define FIT_FILE_CAPABILITIES_MESG_SIZE 26 -#define FIT_FILE_CAPABILITIES_MESG_DEF_SIZE 23 -#define FIT_FILE_CAPABILITIES_MESG_DIRECTORY_COUNT 16 - -typedef struct -{ - FIT_STRING directory[FIT_FILE_CAPABILITIES_MESG_DIRECTORY_COUNT]; // - FIT_UINT32 max_size; // 1 * bytes + 0, - FIT_MESSAGE_INDEX message_index; // - FIT_UINT16 max_count; // - FIT_FILE type; // - FIT_FILE_FLAGS flags; // -} FIT_FILE_CAPABILITIES_MESG; - -typedef FIT_UINT8 FIT_FILE_CAPABILITIES_FIELD_NUM; - -#define FIT_FILE_CAPABILITIES_FIELD_NUM_DIRECTORY ((FIT_FILE_CAPABILITIES_FIELD_NUM)2) -#define FIT_FILE_CAPABILITIES_FIELD_NUM_MAX_SIZE ((FIT_FILE_CAPABILITIES_FIELD_NUM)4) -#define FIT_FILE_CAPABILITIES_FIELD_NUM_MESSAGE_INDEX ((FIT_FILE_CAPABILITIES_FIELD_NUM)254) -#define FIT_FILE_CAPABILITIES_FIELD_NUM_MAX_COUNT ((FIT_FILE_CAPABILITIES_FIELD_NUM)3) -#define FIT_FILE_CAPABILITIES_FIELD_NUM_TYPE ((FIT_FILE_CAPABILITIES_FIELD_NUM)0) -#define FIT_FILE_CAPABILITIES_FIELD_NUM_FLAGS ((FIT_FILE_CAPABILITIES_FIELD_NUM)1) - -typedef enum -{ - FIT_FILE_CAPABILITIES_MESG_DIRECTORY, - FIT_FILE_CAPABILITIES_MESG_MAX_SIZE, - FIT_FILE_CAPABILITIES_MESG_MESSAGE_INDEX, - FIT_FILE_CAPABILITIES_MESG_MAX_COUNT, - FIT_FILE_CAPABILITIES_MESG_TYPE, - FIT_FILE_CAPABILITIES_MESG_FLAGS, - FIT_FILE_CAPABILITIES_MESG_FIELDS -} FIT_FILE_CAPABILITIES_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_FILE_CAPABILITIES_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_FILE_CAPABILITIES_MESG_DEF; - -// mesg_capabilities message - -#define FIT_MESG_CAPABILITIES_MESG_SIZE 8 -#define FIT_MESG_CAPABILITIES_MESG_DEF_SIZE 20 - -typedef struct -{ - FIT_MESSAGE_INDEX message_index; // - FIT_MESG_NUM mesg_num; // - FIT_UINT16 count; // - FIT_FILE file; // - FIT_MESG_COUNT count_type; // -} FIT_MESG_CAPABILITIES_MESG; - -typedef FIT_UINT8 FIT_MESG_CAPABILITIES_FIELD_NUM; - -#define FIT_MESG_CAPABILITIES_FIELD_NUM_MESSAGE_INDEX ((FIT_MESG_CAPABILITIES_FIELD_NUM)254) -#define FIT_MESG_CAPABILITIES_FIELD_NUM_MESG_NUM ((FIT_MESG_CAPABILITIES_FIELD_NUM)1) -#define FIT_MESG_CAPABILITIES_FIELD_NUM_COUNT ((FIT_MESG_CAPABILITIES_FIELD_NUM)3) -#define FIT_MESG_CAPABILITIES_FIELD_NUM_FILE ((FIT_MESG_CAPABILITIES_FIELD_NUM)0) -#define FIT_MESG_CAPABILITIES_FIELD_NUM_COUNT_TYPE ((FIT_MESG_CAPABILITIES_FIELD_NUM)2) - -typedef enum -{ - FIT_MESG_CAPABILITIES_MESG_MESSAGE_INDEX, - FIT_MESG_CAPABILITIES_MESG_MESG_NUM, - FIT_MESG_CAPABILITIES_MESG_COUNT, - FIT_MESG_CAPABILITIES_MESG_FILE, - FIT_MESG_CAPABILITIES_MESG_COUNT_TYPE, - FIT_MESG_CAPABILITIES_MESG_FIELDS -} FIT_MESG_CAPABILITIES_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_MESG_CAPABILITIES_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_MESG_CAPABILITIES_MESG_DEF; - -// field_capabilities message - -#define FIT_FIELD_CAPABILITIES_MESG_SIZE 8 -#define FIT_FIELD_CAPABILITIES_MESG_DEF_SIZE 20 - -typedef struct -{ - FIT_MESSAGE_INDEX message_index; // - FIT_MESG_NUM mesg_num; // - FIT_UINT16 count; // - FIT_FILE file; // - FIT_UINT8 field_num; // -} FIT_FIELD_CAPABILITIES_MESG; - -typedef FIT_UINT8 FIT_FIELD_CAPABILITIES_FIELD_NUM; - -#define FIT_FIELD_CAPABILITIES_FIELD_NUM_MESSAGE_INDEX ((FIT_FIELD_CAPABILITIES_FIELD_NUM)254) -#define FIT_FIELD_CAPABILITIES_FIELD_NUM_MESG_NUM ((FIT_FIELD_CAPABILITIES_FIELD_NUM)1) -#define FIT_FIELD_CAPABILITIES_FIELD_NUM_COUNT ((FIT_FIELD_CAPABILITIES_FIELD_NUM)3) -#define FIT_FIELD_CAPABILITIES_FIELD_NUM_FILE ((FIT_FIELD_CAPABILITIES_FIELD_NUM)0) -#define FIT_FIELD_CAPABILITIES_FIELD_NUM_FIELD_NUM ((FIT_FIELD_CAPABILITIES_FIELD_NUM)2) - -typedef enum -{ - FIT_FIELD_CAPABILITIES_MESG_MESSAGE_INDEX, - FIT_FIELD_CAPABILITIES_MESG_MESG_NUM, - FIT_FIELD_CAPABILITIES_MESG_COUNT, - FIT_FIELD_CAPABILITIES_MESG_FILE, - FIT_FIELD_CAPABILITIES_MESG_FIELD_NUM, - FIT_FIELD_CAPABILITIES_MESG_FIELDS -} FIT_FIELD_CAPABILITIES_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_FIELD_CAPABILITIES_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_FIELD_CAPABILITIES_MESG_DEF; - -// device_settings message - -#define FIT_DEVICE_SETTINGS_MESG_SIZE 36 -#define FIT_DEVICE_SETTINGS_MESG_DEF_SIZE 56 -#define FIT_DEVICE_SETTINGS_MESG_TIME_OFFSET_COUNT 2 -#define FIT_DEVICE_SETTINGS_MESG_PAGES_ENABLED_COUNT 1 -#define FIT_DEVICE_SETTINGS_MESG_DEFAULT_PAGE_COUNT 1 -#define FIT_DEVICE_SETTINGS_MESG_TIME_MODE_COUNT 2 -#define FIT_DEVICE_SETTINGS_MESG_TIME_ZONE_OFFSET_COUNT 2 - -typedef struct -{ - FIT_UINT32 utc_offset; // Offset from system time. Required to convert timestamp from system time to UTC. - FIT_UINT32 time_offset[FIT_DEVICE_SETTINGS_MESG_TIME_OFFSET_COUNT]; // 1 * s + 0, Offset from system time. - FIT_DATE_TIME clock_time; // UTC timestamp used to set the devices clock and date - FIT_UINT16 pages_enabled[FIT_DEVICE_SETTINGS_MESG_PAGES_ENABLED_COUNT]; // Bitfield to configure enabled screens for each supported loop - FIT_UINT16 default_page[FIT_DEVICE_SETTINGS_MESG_DEFAULT_PAGE_COUNT]; // Bitfield to indicate one page as default for each supported loop - FIT_UINT16 autosync_min_steps; // 1 * steps + 0, Minimum steps before an autosync can occur - FIT_UINT16 autosync_min_time; // 1 * minutes + 0, Minimum minutes before an autosync can occur - FIT_UINT8 active_time_zone; // Index into time zone arrays. - FIT_TIME_MODE time_mode[FIT_DEVICE_SETTINGS_MESG_TIME_MODE_COUNT]; // Display mode for the time - FIT_SINT8 time_zone_offset[FIT_DEVICE_SETTINGS_MESG_TIME_ZONE_OFFSET_COUNT]; // 4 * hr + 0, timezone offset in 1/4 hour increments - FIT_BACKLIGHT_MODE backlight_mode; // Mode for backlight - FIT_BOOL activity_tracker_enabled; // Enabled state of the activity tracker functionality - FIT_BOOL move_alert_enabled; // Enabled state of the move alert - FIT_DATE_MODE date_mode; // Display mode for the date - FIT_DISPLAY_ORIENTATION display_orientation; // - FIT_SIDE mounting_side; // - FIT_TAP_SENSITIVITY tap_sensitivity; // Used to hold the tap threshold setting -} FIT_DEVICE_SETTINGS_MESG; - -typedef FIT_UINT8 FIT_DEVICE_SETTINGS_FIELD_NUM; - -#define FIT_DEVICE_SETTINGS_FIELD_NUM_UTC_OFFSET ((FIT_DEVICE_SETTINGS_FIELD_NUM)1) -#define FIT_DEVICE_SETTINGS_FIELD_NUM_TIME_OFFSET ((FIT_DEVICE_SETTINGS_FIELD_NUM)2) -#define FIT_DEVICE_SETTINGS_FIELD_NUM_CLOCK_TIME ((FIT_DEVICE_SETTINGS_FIELD_NUM)39) -#define FIT_DEVICE_SETTINGS_FIELD_NUM_PAGES_ENABLED ((FIT_DEVICE_SETTINGS_FIELD_NUM)40) -#define FIT_DEVICE_SETTINGS_FIELD_NUM_DEFAULT_PAGE ((FIT_DEVICE_SETTINGS_FIELD_NUM)57) -#define FIT_DEVICE_SETTINGS_FIELD_NUM_AUTOSYNC_MIN_STEPS ((FIT_DEVICE_SETTINGS_FIELD_NUM)58) -#define FIT_DEVICE_SETTINGS_FIELD_NUM_AUTOSYNC_MIN_TIME ((FIT_DEVICE_SETTINGS_FIELD_NUM)59) -#define FIT_DEVICE_SETTINGS_FIELD_NUM_ACTIVE_TIME_ZONE ((FIT_DEVICE_SETTINGS_FIELD_NUM)0) -#define FIT_DEVICE_SETTINGS_FIELD_NUM_TIME_MODE ((FIT_DEVICE_SETTINGS_FIELD_NUM)4) -#define FIT_DEVICE_SETTINGS_FIELD_NUM_TIME_ZONE_OFFSET ((FIT_DEVICE_SETTINGS_FIELD_NUM)5) -#define FIT_DEVICE_SETTINGS_FIELD_NUM_BACKLIGHT_MODE ((FIT_DEVICE_SETTINGS_FIELD_NUM)12) -#define FIT_DEVICE_SETTINGS_FIELD_NUM_ACTIVITY_TRACKER_ENABLED ((FIT_DEVICE_SETTINGS_FIELD_NUM)36) -#define FIT_DEVICE_SETTINGS_FIELD_NUM_MOVE_ALERT_ENABLED ((FIT_DEVICE_SETTINGS_FIELD_NUM)46) -#define FIT_DEVICE_SETTINGS_FIELD_NUM_DATE_MODE ((FIT_DEVICE_SETTINGS_FIELD_NUM)47) -#define FIT_DEVICE_SETTINGS_FIELD_NUM_DISPLAY_ORIENTATION ((FIT_DEVICE_SETTINGS_FIELD_NUM)55) -#define FIT_DEVICE_SETTINGS_FIELD_NUM_MOUNTING_SIDE ((FIT_DEVICE_SETTINGS_FIELD_NUM)56) -#define FIT_DEVICE_SETTINGS_FIELD_NUM_TAP_SENSITIVITY ((FIT_DEVICE_SETTINGS_FIELD_NUM)174) - -typedef enum -{ - FIT_DEVICE_SETTINGS_MESG_UTC_OFFSET, - FIT_DEVICE_SETTINGS_MESG_TIME_OFFSET, - FIT_DEVICE_SETTINGS_MESG_CLOCK_TIME, - FIT_DEVICE_SETTINGS_MESG_PAGES_ENABLED, - FIT_DEVICE_SETTINGS_MESG_DEFAULT_PAGE, - FIT_DEVICE_SETTINGS_MESG_AUTOSYNC_MIN_STEPS, - FIT_DEVICE_SETTINGS_MESG_AUTOSYNC_MIN_TIME, - FIT_DEVICE_SETTINGS_MESG_ACTIVE_TIME_ZONE, - FIT_DEVICE_SETTINGS_MESG_TIME_MODE, - FIT_DEVICE_SETTINGS_MESG_TIME_ZONE_OFFSET, - FIT_DEVICE_SETTINGS_MESG_BACKLIGHT_MODE, - FIT_DEVICE_SETTINGS_MESG_ACTIVITY_TRACKER_ENABLED, - FIT_DEVICE_SETTINGS_MESG_MOVE_ALERT_ENABLED, - FIT_DEVICE_SETTINGS_MESG_DATE_MODE, - FIT_DEVICE_SETTINGS_MESG_DISPLAY_ORIENTATION, - FIT_DEVICE_SETTINGS_MESG_MOUNTING_SIDE, - FIT_DEVICE_SETTINGS_MESG_TAP_SENSITIVITY, - FIT_DEVICE_SETTINGS_MESG_FIELDS -} FIT_DEVICE_SETTINGS_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_DEVICE_SETTINGS_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_DEVICE_SETTINGS_MESG_DEF; - -// user_profile message - -#define FIT_USER_PROFILE_MESG_SIZE 50 -#define FIT_USER_PROFILE_MESG_DEF_SIZE 80 -#define FIT_USER_PROFILE_MESG_FRIENDLY_NAME_COUNT 16 -#define FIT_USER_PROFILE_MESG_GLOBAL_ID_COUNT 6 - -typedef struct -{ - FIT_STRING friendly_name[FIT_USER_PROFILE_MESG_FRIENDLY_NAME_COUNT]; // - FIT_MESSAGE_INDEX message_index; // - FIT_UINT16 weight; // 10 * kg + 0, - FIT_USER_LOCAL_ID local_id; // - FIT_UINT16 user_running_step_length; // 1000 * m + 0, User defined running step length set to 0 for auto length - FIT_UINT16 user_walking_step_length; // 1000 * m + 0, User defined walking step length set to 0 for auto length - FIT_GENDER gender; // - FIT_UINT8 age; // 1 * years + 0, - FIT_UINT8 height; // 100 * m + 0, - FIT_LANGUAGE language; // - FIT_DISPLAY_MEASURE elev_setting; // - FIT_DISPLAY_MEASURE weight_setting; // - FIT_UINT8 resting_heart_rate; // 1 * bpm + 0, - FIT_UINT8 default_max_running_heart_rate; // 1 * bpm + 0, - FIT_UINT8 default_max_biking_heart_rate; // 1 * bpm + 0, - FIT_UINT8 default_max_heart_rate; // 1 * bpm + 0, - FIT_DISPLAY_HEART hr_setting; // - FIT_DISPLAY_MEASURE speed_setting; // - FIT_DISPLAY_MEASURE dist_setting; // - FIT_DISPLAY_POWER power_setting; // - FIT_ACTIVITY_CLASS activity_class; // - FIT_DISPLAY_POSITION position_setting; // - FIT_DISPLAY_MEASURE temperature_setting; // - FIT_BYTE global_id[FIT_USER_PROFILE_MESG_GLOBAL_ID_COUNT]; // - FIT_DISPLAY_MEASURE height_setting; // -} FIT_USER_PROFILE_MESG; - -typedef FIT_UINT8 FIT_USER_PROFILE_FIELD_NUM; - -#define FIT_USER_PROFILE_FIELD_NUM_FRIENDLY_NAME ((FIT_USER_PROFILE_FIELD_NUM)0) -#define FIT_USER_PROFILE_FIELD_NUM_MESSAGE_INDEX ((FIT_USER_PROFILE_FIELD_NUM)254) -#define FIT_USER_PROFILE_FIELD_NUM_WEIGHT ((FIT_USER_PROFILE_FIELD_NUM)4) -#define FIT_USER_PROFILE_FIELD_NUM_LOCAL_ID ((FIT_USER_PROFILE_FIELD_NUM)22) -#define FIT_USER_PROFILE_FIELD_NUM_USER_RUNNING_STEP_LENGTH ((FIT_USER_PROFILE_FIELD_NUM)31) -#define FIT_USER_PROFILE_FIELD_NUM_USER_WALKING_STEP_LENGTH ((FIT_USER_PROFILE_FIELD_NUM)32) -#define FIT_USER_PROFILE_FIELD_NUM_GENDER ((FIT_USER_PROFILE_FIELD_NUM)1) -#define FIT_USER_PROFILE_FIELD_NUM_AGE ((FIT_USER_PROFILE_FIELD_NUM)2) -#define FIT_USER_PROFILE_FIELD_NUM_HEIGHT ((FIT_USER_PROFILE_FIELD_NUM)3) -#define FIT_USER_PROFILE_FIELD_NUM_LANGUAGE ((FIT_USER_PROFILE_FIELD_NUM)5) -#define FIT_USER_PROFILE_FIELD_NUM_ELEV_SETTING ((FIT_USER_PROFILE_FIELD_NUM)6) -#define FIT_USER_PROFILE_FIELD_NUM_WEIGHT_SETTING ((FIT_USER_PROFILE_FIELD_NUM)7) -#define FIT_USER_PROFILE_FIELD_NUM_RESTING_HEART_RATE ((FIT_USER_PROFILE_FIELD_NUM)8) -#define FIT_USER_PROFILE_FIELD_NUM_DEFAULT_MAX_RUNNING_HEART_RATE ((FIT_USER_PROFILE_FIELD_NUM)9) -#define FIT_USER_PROFILE_FIELD_NUM_DEFAULT_MAX_BIKING_HEART_RATE ((FIT_USER_PROFILE_FIELD_NUM)10) -#define FIT_USER_PROFILE_FIELD_NUM_DEFAULT_MAX_HEART_RATE ((FIT_USER_PROFILE_FIELD_NUM)11) -#define FIT_USER_PROFILE_FIELD_NUM_HR_SETTING ((FIT_USER_PROFILE_FIELD_NUM)12) -#define FIT_USER_PROFILE_FIELD_NUM_SPEED_SETTING ((FIT_USER_PROFILE_FIELD_NUM)13) -#define FIT_USER_PROFILE_FIELD_NUM_DIST_SETTING ((FIT_USER_PROFILE_FIELD_NUM)14) -#define FIT_USER_PROFILE_FIELD_NUM_POWER_SETTING ((FIT_USER_PROFILE_FIELD_NUM)16) -#define FIT_USER_PROFILE_FIELD_NUM_ACTIVITY_CLASS ((FIT_USER_PROFILE_FIELD_NUM)17) -#define FIT_USER_PROFILE_FIELD_NUM_POSITION_SETTING ((FIT_USER_PROFILE_FIELD_NUM)18) -#define FIT_USER_PROFILE_FIELD_NUM_TEMPERATURE_SETTING ((FIT_USER_PROFILE_FIELD_NUM)21) -#define FIT_USER_PROFILE_FIELD_NUM_GLOBAL_ID ((FIT_USER_PROFILE_FIELD_NUM)23) -#define FIT_USER_PROFILE_FIELD_NUM_HEIGHT_SETTING ((FIT_USER_PROFILE_FIELD_NUM)30) - -typedef enum -{ - FIT_USER_PROFILE_MESG_FRIENDLY_NAME, - FIT_USER_PROFILE_MESG_MESSAGE_INDEX, - FIT_USER_PROFILE_MESG_WEIGHT, - FIT_USER_PROFILE_MESG_LOCAL_ID, - FIT_USER_PROFILE_MESG_USER_RUNNING_STEP_LENGTH, - FIT_USER_PROFILE_MESG_USER_WALKING_STEP_LENGTH, - FIT_USER_PROFILE_MESG_GENDER, - FIT_USER_PROFILE_MESG_AGE, - FIT_USER_PROFILE_MESG_HEIGHT, - FIT_USER_PROFILE_MESG_LANGUAGE, - FIT_USER_PROFILE_MESG_ELEV_SETTING, - FIT_USER_PROFILE_MESG_WEIGHT_SETTING, - FIT_USER_PROFILE_MESG_RESTING_HEART_RATE, - FIT_USER_PROFILE_MESG_DEFAULT_MAX_RUNNING_HEART_RATE, - FIT_USER_PROFILE_MESG_DEFAULT_MAX_BIKING_HEART_RATE, - FIT_USER_PROFILE_MESG_DEFAULT_MAX_HEART_RATE, - FIT_USER_PROFILE_MESG_HR_SETTING, - FIT_USER_PROFILE_MESG_SPEED_SETTING, - FIT_USER_PROFILE_MESG_DIST_SETTING, - FIT_USER_PROFILE_MESG_POWER_SETTING, - FIT_USER_PROFILE_MESG_ACTIVITY_CLASS, - FIT_USER_PROFILE_MESG_POSITION_SETTING, - FIT_USER_PROFILE_MESG_TEMPERATURE_SETTING, - FIT_USER_PROFILE_MESG_GLOBAL_ID, - FIT_USER_PROFILE_MESG_HEIGHT_SETTING, - FIT_USER_PROFILE_MESG_FIELDS -} FIT_USER_PROFILE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_USER_PROFILE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_USER_PROFILE_MESG_DEF; - -// hrm_profile message - -#define FIT_HRM_PROFILE_MESG_SIZE 7 -#define FIT_HRM_PROFILE_MESG_DEF_SIZE 20 - -typedef struct -{ - FIT_MESSAGE_INDEX message_index; // - FIT_UINT16Z hrm_ant_id; // - FIT_BOOL enabled; // - FIT_BOOL log_hrv; // - FIT_UINT8Z hrm_ant_id_trans_type; // -} FIT_HRM_PROFILE_MESG; - -typedef FIT_UINT8 FIT_HRM_PROFILE_FIELD_NUM; - -#define FIT_HRM_PROFILE_FIELD_NUM_MESSAGE_INDEX ((FIT_HRM_PROFILE_FIELD_NUM)254) -#define FIT_HRM_PROFILE_FIELD_NUM_HRM_ANT_ID ((FIT_HRM_PROFILE_FIELD_NUM)1) -#define FIT_HRM_PROFILE_FIELD_NUM_ENABLED ((FIT_HRM_PROFILE_FIELD_NUM)0) -#define FIT_HRM_PROFILE_FIELD_NUM_LOG_HRV ((FIT_HRM_PROFILE_FIELD_NUM)2) -#define FIT_HRM_PROFILE_FIELD_NUM_HRM_ANT_ID_TRANS_TYPE ((FIT_HRM_PROFILE_FIELD_NUM)3) - -typedef enum -{ - FIT_HRM_PROFILE_MESG_MESSAGE_INDEX, - FIT_HRM_PROFILE_MESG_HRM_ANT_ID, - FIT_HRM_PROFILE_MESG_ENABLED, - FIT_HRM_PROFILE_MESG_LOG_HRV, - FIT_HRM_PROFILE_MESG_HRM_ANT_ID_TRANS_TYPE, - FIT_HRM_PROFILE_MESG_FIELDS -} FIT_HRM_PROFILE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_HRM_PROFILE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_HRM_PROFILE_MESG_DEF; - -// sdm_profile message - -#define FIT_SDM_PROFILE_MESG_SIZE 14 -#define FIT_SDM_PROFILE_MESG_DEF_SIZE 29 - -typedef struct -{ - FIT_UINT32 odometer; // 100 * m + 0, - FIT_MESSAGE_INDEX message_index; // - FIT_UINT16Z sdm_ant_id; // - FIT_UINT16 sdm_cal_factor; // 10 * % + 0, - FIT_BOOL enabled; // - FIT_BOOL speed_source; // Use footpod for speed source instead of GPS - FIT_UINT8Z sdm_ant_id_trans_type; // - FIT_UINT8 odometer_rollover; // Rollover counter that can be used to extend the odometer -} FIT_SDM_PROFILE_MESG; - -typedef FIT_UINT8 FIT_SDM_PROFILE_FIELD_NUM; - -#define FIT_SDM_PROFILE_FIELD_NUM_ODOMETER ((FIT_SDM_PROFILE_FIELD_NUM)3) -#define FIT_SDM_PROFILE_FIELD_NUM_MESSAGE_INDEX ((FIT_SDM_PROFILE_FIELD_NUM)254) -#define FIT_SDM_PROFILE_FIELD_NUM_SDM_ANT_ID ((FIT_SDM_PROFILE_FIELD_NUM)1) -#define FIT_SDM_PROFILE_FIELD_NUM_SDM_CAL_FACTOR ((FIT_SDM_PROFILE_FIELD_NUM)2) -#define FIT_SDM_PROFILE_FIELD_NUM_ENABLED ((FIT_SDM_PROFILE_FIELD_NUM)0) -#define FIT_SDM_PROFILE_FIELD_NUM_SPEED_SOURCE ((FIT_SDM_PROFILE_FIELD_NUM)4) -#define FIT_SDM_PROFILE_FIELD_NUM_SDM_ANT_ID_TRANS_TYPE ((FIT_SDM_PROFILE_FIELD_NUM)5) -#define FIT_SDM_PROFILE_FIELD_NUM_ODOMETER_ROLLOVER ((FIT_SDM_PROFILE_FIELD_NUM)7) - -typedef enum -{ - FIT_SDM_PROFILE_MESG_ODOMETER, - FIT_SDM_PROFILE_MESG_MESSAGE_INDEX, - FIT_SDM_PROFILE_MESG_SDM_ANT_ID, - FIT_SDM_PROFILE_MESG_SDM_CAL_FACTOR, - FIT_SDM_PROFILE_MESG_ENABLED, - FIT_SDM_PROFILE_MESG_SPEED_SOURCE, - FIT_SDM_PROFILE_MESG_SDM_ANT_ID_TRANS_TYPE, - FIT_SDM_PROFILE_MESG_ODOMETER_ROLLOVER, - FIT_SDM_PROFILE_MESG_FIELDS -} FIT_SDM_PROFILE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_SDM_PROFILE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_SDM_PROFILE_MESG_DEF; - -// bike_profile message - -#define FIT_BIKE_PROFILE_MESG_SIZE 59 -#define FIT_BIKE_PROFILE_MESG_DEF_SIZE 101 -#define FIT_BIKE_PROFILE_MESG_NAME_COUNT 16 -#define FIT_BIKE_PROFILE_MESG_FRONT_GEAR_COUNT 1 -#define FIT_BIKE_PROFILE_MESG_REAR_GEAR_COUNT 1 - -typedef struct -{ - FIT_STRING name[FIT_BIKE_PROFILE_MESG_NAME_COUNT]; // - FIT_UINT32 odometer; // 100 * m + 0, - FIT_MESSAGE_INDEX message_index; // - FIT_UINT16Z bike_spd_ant_id; // - FIT_UINT16Z bike_cad_ant_id; // - FIT_UINT16Z bike_spdcad_ant_id; // - FIT_UINT16Z bike_power_ant_id; // - FIT_UINT16 custom_wheelsize; // 1000 * m + 0, - FIT_UINT16 auto_wheelsize; // 1000 * m + 0, - FIT_UINT16 bike_weight; // 10 * kg + 0, - FIT_UINT16 power_cal_factor; // 10 * % + 0, - FIT_SPORT sport; // - FIT_SUB_SPORT sub_sport; // - FIT_BOOL auto_wheel_cal; // - FIT_BOOL auto_power_zero; // - FIT_UINT8 id; // - FIT_BOOL spd_enabled; // - FIT_BOOL cad_enabled; // - FIT_BOOL spdcad_enabled; // - FIT_BOOL power_enabled; // - FIT_UINT8 crank_length; // 2 * mm + -110, - FIT_BOOL enabled; // - FIT_UINT8Z bike_spd_ant_id_trans_type; // - FIT_UINT8Z bike_cad_ant_id_trans_type; // - FIT_UINT8Z bike_spdcad_ant_id_trans_type; // - FIT_UINT8Z bike_power_ant_id_trans_type; // - FIT_UINT8 odometer_rollover; // Rollover counter that can be used to extend the odometer - FIT_UINT8Z front_gear_num; // Number of front gears - FIT_UINT8Z front_gear[FIT_BIKE_PROFILE_MESG_FRONT_GEAR_COUNT]; // Number of teeth on each gear 0 is innermost - FIT_UINT8Z rear_gear_num; // Number of rear gears - FIT_UINT8Z rear_gear[FIT_BIKE_PROFILE_MESG_REAR_GEAR_COUNT]; // Number of teeth on each gear 0 is innermost - FIT_BOOL shimano_di2_enabled; // -} FIT_BIKE_PROFILE_MESG; - -typedef FIT_UINT8 FIT_BIKE_PROFILE_FIELD_NUM; - -#define FIT_BIKE_PROFILE_FIELD_NUM_NAME ((FIT_BIKE_PROFILE_FIELD_NUM)0) -#define FIT_BIKE_PROFILE_FIELD_NUM_ODOMETER ((FIT_BIKE_PROFILE_FIELD_NUM)3) -#define FIT_BIKE_PROFILE_FIELD_NUM_MESSAGE_INDEX ((FIT_BIKE_PROFILE_FIELD_NUM)254) -#define FIT_BIKE_PROFILE_FIELD_NUM_BIKE_SPD_ANT_ID ((FIT_BIKE_PROFILE_FIELD_NUM)4) -#define FIT_BIKE_PROFILE_FIELD_NUM_BIKE_CAD_ANT_ID ((FIT_BIKE_PROFILE_FIELD_NUM)5) -#define FIT_BIKE_PROFILE_FIELD_NUM_BIKE_SPDCAD_ANT_ID ((FIT_BIKE_PROFILE_FIELD_NUM)6) -#define FIT_BIKE_PROFILE_FIELD_NUM_BIKE_POWER_ANT_ID ((FIT_BIKE_PROFILE_FIELD_NUM)7) -#define FIT_BIKE_PROFILE_FIELD_NUM_CUSTOM_WHEELSIZE ((FIT_BIKE_PROFILE_FIELD_NUM)8) -#define FIT_BIKE_PROFILE_FIELD_NUM_AUTO_WHEELSIZE ((FIT_BIKE_PROFILE_FIELD_NUM)9) -#define FIT_BIKE_PROFILE_FIELD_NUM_BIKE_WEIGHT ((FIT_BIKE_PROFILE_FIELD_NUM)10) -#define FIT_BIKE_PROFILE_FIELD_NUM_POWER_CAL_FACTOR ((FIT_BIKE_PROFILE_FIELD_NUM)11) -#define FIT_BIKE_PROFILE_FIELD_NUM_SPORT ((FIT_BIKE_PROFILE_FIELD_NUM)1) -#define FIT_BIKE_PROFILE_FIELD_NUM_SUB_SPORT ((FIT_BIKE_PROFILE_FIELD_NUM)2) -#define FIT_BIKE_PROFILE_FIELD_NUM_AUTO_WHEEL_CAL ((FIT_BIKE_PROFILE_FIELD_NUM)12) -#define FIT_BIKE_PROFILE_FIELD_NUM_AUTO_POWER_ZERO ((FIT_BIKE_PROFILE_FIELD_NUM)13) -#define FIT_BIKE_PROFILE_FIELD_NUM_ID ((FIT_BIKE_PROFILE_FIELD_NUM)14) -#define FIT_BIKE_PROFILE_FIELD_NUM_SPD_ENABLED ((FIT_BIKE_PROFILE_FIELD_NUM)15) -#define FIT_BIKE_PROFILE_FIELD_NUM_CAD_ENABLED ((FIT_BIKE_PROFILE_FIELD_NUM)16) -#define FIT_BIKE_PROFILE_FIELD_NUM_SPDCAD_ENABLED ((FIT_BIKE_PROFILE_FIELD_NUM)17) -#define FIT_BIKE_PROFILE_FIELD_NUM_POWER_ENABLED ((FIT_BIKE_PROFILE_FIELD_NUM)18) -#define FIT_BIKE_PROFILE_FIELD_NUM_CRANK_LENGTH ((FIT_BIKE_PROFILE_FIELD_NUM)19) -#define FIT_BIKE_PROFILE_FIELD_NUM_ENABLED ((FIT_BIKE_PROFILE_FIELD_NUM)20) -#define FIT_BIKE_PROFILE_FIELD_NUM_BIKE_SPD_ANT_ID_TRANS_TYPE ((FIT_BIKE_PROFILE_FIELD_NUM)21) -#define FIT_BIKE_PROFILE_FIELD_NUM_BIKE_CAD_ANT_ID_TRANS_TYPE ((FIT_BIKE_PROFILE_FIELD_NUM)22) -#define FIT_BIKE_PROFILE_FIELD_NUM_BIKE_SPDCAD_ANT_ID_TRANS_TYPE ((FIT_BIKE_PROFILE_FIELD_NUM)23) -#define FIT_BIKE_PROFILE_FIELD_NUM_BIKE_POWER_ANT_ID_TRANS_TYPE ((FIT_BIKE_PROFILE_FIELD_NUM)24) -#define FIT_BIKE_PROFILE_FIELD_NUM_ODOMETER_ROLLOVER ((FIT_BIKE_PROFILE_FIELD_NUM)37) -#define FIT_BIKE_PROFILE_FIELD_NUM_FRONT_GEAR_NUM ((FIT_BIKE_PROFILE_FIELD_NUM)38) -#define FIT_BIKE_PROFILE_FIELD_NUM_FRONT_GEAR ((FIT_BIKE_PROFILE_FIELD_NUM)39) -#define FIT_BIKE_PROFILE_FIELD_NUM_REAR_GEAR_NUM ((FIT_BIKE_PROFILE_FIELD_NUM)40) -#define FIT_BIKE_PROFILE_FIELD_NUM_REAR_GEAR ((FIT_BIKE_PROFILE_FIELD_NUM)41) -#define FIT_BIKE_PROFILE_FIELD_NUM_SHIMANO_DI2_ENABLED ((FIT_BIKE_PROFILE_FIELD_NUM)44) - -typedef enum -{ - FIT_BIKE_PROFILE_MESG_NAME, - FIT_BIKE_PROFILE_MESG_ODOMETER, - FIT_BIKE_PROFILE_MESG_MESSAGE_INDEX, - FIT_BIKE_PROFILE_MESG_BIKE_SPD_ANT_ID, - FIT_BIKE_PROFILE_MESG_BIKE_CAD_ANT_ID, - FIT_BIKE_PROFILE_MESG_BIKE_SPDCAD_ANT_ID, - FIT_BIKE_PROFILE_MESG_BIKE_POWER_ANT_ID, - FIT_BIKE_PROFILE_MESG_CUSTOM_WHEELSIZE, - FIT_BIKE_PROFILE_MESG_AUTO_WHEELSIZE, - FIT_BIKE_PROFILE_MESG_BIKE_WEIGHT, - FIT_BIKE_PROFILE_MESG_POWER_CAL_FACTOR, - FIT_BIKE_PROFILE_MESG_SPORT, - FIT_BIKE_PROFILE_MESG_SUB_SPORT, - FIT_BIKE_PROFILE_MESG_AUTO_WHEEL_CAL, - FIT_BIKE_PROFILE_MESG_AUTO_POWER_ZERO, - FIT_BIKE_PROFILE_MESG_ID, - FIT_BIKE_PROFILE_MESG_SPD_ENABLED, - FIT_BIKE_PROFILE_MESG_CAD_ENABLED, - FIT_BIKE_PROFILE_MESG_SPDCAD_ENABLED, - FIT_BIKE_PROFILE_MESG_POWER_ENABLED, - FIT_BIKE_PROFILE_MESG_CRANK_LENGTH, - FIT_BIKE_PROFILE_MESG_ENABLED, - FIT_BIKE_PROFILE_MESG_BIKE_SPD_ANT_ID_TRANS_TYPE, - FIT_BIKE_PROFILE_MESG_BIKE_CAD_ANT_ID_TRANS_TYPE, - FIT_BIKE_PROFILE_MESG_BIKE_SPDCAD_ANT_ID_TRANS_TYPE, - FIT_BIKE_PROFILE_MESG_BIKE_POWER_ANT_ID_TRANS_TYPE, - FIT_BIKE_PROFILE_MESG_ODOMETER_ROLLOVER, - FIT_BIKE_PROFILE_MESG_FRONT_GEAR_NUM, - FIT_BIKE_PROFILE_MESG_FRONT_GEAR, - FIT_BIKE_PROFILE_MESG_REAR_GEAR_NUM, - FIT_BIKE_PROFILE_MESG_REAR_GEAR, - FIT_BIKE_PROFILE_MESG_SHIMANO_DI2_ENABLED, - FIT_BIKE_PROFILE_MESG_FIELDS -} FIT_BIKE_PROFILE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_BIKE_PROFILE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_BIKE_PROFILE_MESG_DEF; - -// connectivity message - -#define FIT_CONNECTIVITY_MESG_SIZE 36 -#define FIT_CONNECTIVITY_MESG_DEF_SIZE 44 -#define FIT_CONNECTIVITY_MESG_NAME_COUNT 24 - -typedef struct -{ - FIT_STRING name[FIT_CONNECTIVITY_MESG_NAME_COUNT]; // - FIT_BOOL bluetooth_enabled; // Use Bluetooth for connectivity features - FIT_BOOL bluetooth_le_enabled; // Use Bluetooth Low Energy for connectivity features - FIT_BOOL ant_enabled; // Use ANT for connectivity features - FIT_BOOL live_tracking_enabled; // - FIT_BOOL weather_conditions_enabled; // - FIT_BOOL weather_alerts_enabled; // - FIT_BOOL auto_activity_upload_enabled; // - FIT_BOOL course_download_enabled; // - FIT_BOOL workout_download_enabled; // - FIT_BOOL gps_ephemeris_download_enabled; // - FIT_BOOL incident_detection_enabled; // - FIT_BOOL grouptrack_enabled; // -} FIT_CONNECTIVITY_MESG; - -typedef FIT_UINT8 FIT_CONNECTIVITY_FIELD_NUM; - -#define FIT_CONNECTIVITY_FIELD_NUM_NAME ((FIT_CONNECTIVITY_FIELD_NUM)3) -#define FIT_CONNECTIVITY_FIELD_NUM_BLUETOOTH_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)0) -#define FIT_CONNECTIVITY_FIELD_NUM_BLUETOOTH_LE_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)1) -#define FIT_CONNECTIVITY_FIELD_NUM_ANT_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)2) -#define FIT_CONNECTIVITY_FIELD_NUM_LIVE_TRACKING_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)4) -#define FIT_CONNECTIVITY_FIELD_NUM_WEATHER_CONDITIONS_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)5) -#define FIT_CONNECTIVITY_FIELD_NUM_WEATHER_ALERTS_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)6) -#define FIT_CONNECTIVITY_FIELD_NUM_AUTO_ACTIVITY_UPLOAD_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)7) -#define FIT_CONNECTIVITY_FIELD_NUM_COURSE_DOWNLOAD_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)8) -#define FIT_CONNECTIVITY_FIELD_NUM_WORKOUT_DOWNLOAD_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)9) -#define FIT_CONNECTIVITY_FIELD_NUM_GPS_EPHEMERIS_DOWNLOAD_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)10) -#define FIT_CONNECTIVITY_FIELD_NUM_INCIDENT_DETECTION_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)11) -#define FIT_CONNECTIVITY_FIELD_NUM_GROUPTRACK_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)12) - -typedef enum -{ - FIT_CONNECTIVITY_MESG_NAME, - FIT_CONNECTIVITY_MESG_BLUETOOTH_ENABLED, - FIT_CONNECTIVITY_MESG_BLUETOOTH_LE_ENABLED, - FIT_CONNECTIVITY_MESG_ANT_ENABLED, - FIT_CONNECTIVITY_MESG_LIVE_TRACKING_ENABLED, - FIT_CONNECTIVITY_MESG_WEATHER_CONDITIONS_ENABLED, - FIT_CONNECTIVITY_MESG_WEATHER_ALERTS_ENABLED, - FIT_CONNECTIVITY_MESG_AUTO_ACTIVITY_UPLOAD_ENABLED, - FIT_CONNECTIVITY_MESG_COURSE_DOWNLOAD_ENABLED, - FIT_CONNECTIVITY_MESG_WORKOUT_DOWNLOAD_ENABLED, - FIT_CONNECTIVITY_MESG_GPS_EPHEMERIS_DOWNLOAD_ENABLED, - FIT_CONNECTIVITY_MESG_INCIDENT_DETECTION_ENABLED, - FIT_CONNECTIVITY_MESG_GROUPTRACK_ENABLED, - FIT_CONNECTIVITY_MESG_FIELDS -} FIT_CONNECTIVITY_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_CONNECTIVITY_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_CONNECTIVITY_MESG_DEF; - -// zones_target message - -#define FIT_ZONES_TARGET_MESG_SIZE 6 -#define FIT_ZONES_TARGET_MESG_DEF_SIZE 20 - -typedef struct -{ - FIT_UINT16 functional_threshold_power; // - FIT_UINT8 max_heart_rate; // - FIT_UINT8 threshold_heart_rate; // - FIT_HR_ZONE_CALC hr_calc_type; // - FIT_PWR_ZONE_CALC pwr_calc_type; // -} FIT_ZONES_TARGET_MESG; - -typedef FIT_UINT8 FIT_ZONES_TARGET_FIELD_NUM; - -#define FIT_ZONES_TARGET_FIELD_NUM_FUNCTIONAL_THRESHOLD_POWER ((FIT_ZONES_TARGET_FIELD_NUM)3) -#define FIT_ZONES_TARGET_FIELD_NUM_MAX_HEART_RATE ((FIT_ZONES_TARGET_FIELD_NUM)1) -#define FIT_ZONES_TARGET_FIELD_NUM_THRESHOLD_HEART_RATE ((FIT_ZONES_TARGET_FIELD_NUM)2) -#define FIT_ZONES_TARGET_FIELD_NUM_HR_CALC_TYPE ((FIT_ZONES_TARGET_FIELD_NUM)5) -#define FIT_ZONES_TARGET_FIELD_NUM_PWR_CALC_TYPE ((FIT_ZONES_TARGET_FIELD_NUM)7) - -typedef enum -{ - FIT_ZONES_TARGET_MESG_FUNCTIONAL_THRESHOLD_POWER, - FIT_ZONES_TARGET_MESG_MAX_HEART_RATE, - FIT_ZONES_TARGET_MESG_THRESHOLD_HEART_RATE, - FIT_ZONES_TARGET_MESG_HR_CALC_TYPE, - FIT_ZONES_TARGET_MESG_PWR_CALC_TYPE, - FIT_ZONES_TARGET_MESG_FIELDS -} FIT_ZONES_TARGET_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_ZONES_TARGET_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_ZONES_TARGET_MESG_DEF; - -// sport message - -#define FIT_SPORT_MESG_SIZE 18 -#define FIT_SPORT_MESG_DEF_SIZE 14 -#define FIT_SPORT_MESG_NAME_COUNT 16 - -typedef struct -{ - FIT_STRING name[FIT_SPORT_MESG_NAME_COUNT]; // - FIT_SPORT sport; // - FIT_SUB_SPORT sub_sport; // -} FIT_SPORT_MESG; - -typedef FIT_UINT8 FIT_SPORT_FIELD_NUM; - -#define FIT_SPORT_FIELD_NUM_NAME ((FIT_SPORT_FIELD_NUM)3) -#define FIT_SPORT_FIELD_NUM_SPORT ((FIT_SPORT_FIELD_NUM)0) -#define FIT_SPORT_FIELD_NUM_SUB_SPORT ((FIT_SPORT_FIELD_NUM)1) - -typedef enum -{ - FIT_SPORT_MESG_NAME, - FIT_SPORT_MESG_SPORT, - FIT_SPORT_MESG_SUB_SPORT, - FIT_SPORT_MESG_FIELDS -} FIT_SPORT_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_SPORT_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_SPORT_MESG_DEF; - -// hr_zone message - -#define FIT_HR_ZONE_MESG_SIZE 19 -#define FIT_HR_ZONE_MESG_DEF_SIZE 14 -#define FIT_HR_ZONE_MESG_NAME_COUNT 16 - -typedef struct -{ - FIT_STRING name[FIT_HR_ZONE_MESG_NAME_COUNT]; // - FIT_MESSAGE_INDEX message_index; // - FIT_UINT8 high_bpm; // 1 * bpm + 0, -} FIT_HR_ZONE_MESG; - -typedef FIT_UINT8 FIT_HR_ZONE_FIELD_NUM; - -#define FIT_HR_ZONE_FIELD_NUM_NAME ((FIT_HR_ZONE_FIELD_NUM)2) -#define FIT_HR_ZONE_FIELD_NUM_MESSAGE_INDEX ((FIT_HR_ZONE_FIELD_NUM)254) -#define FIT_HR_ZONE_FIELD_NUM_HIGH_BPM ((FIT_HR_ZONE_FIELD_NUM)1) - -typedef enum -{ - FIT_HR_ZONE_MESG_NAME, - FIT_HR_ZONE_MESG_MESSAGE_INDEX, - FIT_HR_ZONE_MESG_HIGH_BPM, - FIT_HR_ZONE_MESG_FIELDS -} FIT_HR_ZONE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_HR_ZONE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_HR_ZONE_MESG_DEF; - -// speed_zone message - -#define FIT_SPEED_ZONE_MESG_SIZE 20 -#define FIT_SPEED_ZONE_MESG_DEF_SIZE 14 -#define FIT_SPEED_ZONE_MESG_NAME_COUNT 16 - -typedef struct -{ - FIT_STRING name[FIT_SPEED_ZONE_MESG_NAME_COUNT]; // - FIT_MESSAGE_INDEX message_index; // - FIT_UINT16 high_value; // 1000 * m/s + 0, -} FIT_SPEED_ZONE_MESG; - -typedef FIT_UINT8 FIT_SPEED_ZONE_FIELD_NUM; - -#define FIT_SPEED_ZONE_FIELD_NUM_NAME ((FIT_SPEED_ZONE_FIELD_NUM)1) -#define FIT_SPEED_ZONE_FIELD_NUM_MESSAGE_INDEX ((FIT_SPEED_ZONE_FIELD_NUM)254) -#define FIT_SPEED_ZONE_FIELD_NUM_HIGH_VALUE ((FIT_SPEED_ZONE_FIELD_NUM)0) - -typedef enum -{ - FIT_SPEED_ZONE_MESG_NAME, - FIT_SPEED_ZONE_MESG_MESSAGE_INDEX, - FIT_SPEED_ZONE_MESG_HIGH_VALUE, - FIT_SPEED_ZONE_MESG_FIELDS -} FIT_SPEED_ZONE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_SPEED_ZONE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_SPEED_ZONE_MESG_DEF; - -// cadence_zone message - -#define FIT_CADENCE_ZONE_MESG_SIZE 19 -#define FIT_CADENCE_ZONE_MESG_DEF_SIZE 14 -#define FIT_CADENCE_ZONE_MESG_NAME_COUNT 16 - -typedef struct -{ - FIT_STRING name[FIT_CADENCE_ZONE_MESG_NAME_COUNT]; // - FIT_MESSAGE_INDEX message_index; // - FIT_UINT8 high_value; // 1 * rpm + 0, -} FIT_CADENCE_ZONE_MESG; - -typedef FIT_UINT8 FIT_CADENCE_ZONE_FIELD_NUM; - -#define FIT_CADENCE_ZONE_FIELD_NUM_NAME ((FIT_CADENCE_ZONE_FIELD_NUM)1) -#define FIT_CADENCE_ZONE_FIELD_NUM_MESSAGE_INDEX ((FIT_CADENCE_ZONE_FIELD_NUM)254) -#define FIT_CADENCE_ZONE_FIELD_NUM_HIGH_VALUE ((FIT_CADENCE_ZONE_FIELD_NUM)0) - -typedef enum -{ - FIT_CADENCE_ZONE_MESG_NAME, - FIT_CADENCE_ZONE_MESG_MESSAGE_INDEX, - FIT_CADENCE_ZONE_MESG_HIGH_VALUE, - FIT_CADENCE_ZONE_MESG_FIELDS -} FIT_CADENCE_ZONE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_CADENCE_ZONE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_CADENCE_ZONE_MESG_DEF; - -// power_zone message - -#define FIT_POWER_ZONE_MESG_SIZE 20 -#define FIT_POWER_ZONE_MESG_DEF_SIZE 14 -#define FIT_POWER_ZONE_MESG_NAME_COUNT 16 - -typedef struct -{ - FIT_STRING name[FIT_POWER_ZONE_MESG_NAME_COUNT]; // - FIT_MESSAGE_INDEX message_index; // - FIT_UINT16 high_value; // 1 * watts + 0, -} FIT_POWER_ZONE_MESG; - -typedef FIT_UINT8 FIT_POWER_ZONE_FIELD_NUM; - -#define FIT_POWER_ZONE_FIELD_NUM_NAME ((FIT_POWER_ZONE_FIELD_NUM)2) -#define FIT_POWER_ZONE_FIELD_NUM_MESSAGE_INDEX ((FIT_POWER_ZONE_FIELD_NUM)254) -#define FIT_POWER_ZONE_FIELD_NUM_HIGH_VALUE ((FIT_POWER_ZONE_FIELD_NUM)1) - -typedef enum -{ - FIT_POWER_ZONE_MESG_NAME, - FIT_POWER_ZONE_MESG_MESSAGE_INDEX, - FIT_POWER_ZONE_MESG_HIGH_VALUE, - FIT_POWER_ZONE_MESG_FIELDS -} FIT_POWER_ZONE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_POWER_ZONE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_POWER_ZONE_MESG_DEF; - -// met_zone message - -#define FIT_MET_ZONE_MESG_SIZE 6 -#define FIT_MET_ZONE_MESG_DEF_SIZE 17 - -typedef struct -{ - FIT_MESSAGE_INDEX message_index; // - FIT_UINT16 calories; // 10 * kcal / min + 0, - FIT_UINT8 high_bpm; // - FIT_UINT8 fat_calories; // 10 * kcal / min + 0, -} FIT_MET_ZONE_MESG; - -typedef FIT_UINT8 FIT_MET_ZONE_FIELD_NUM; - -#define FIT_MET_ZONE_FIELD_NUM_MESSAGE_INDEX ((FIT_MET_ZONE_FIELD_NUM)254) -#define FIT_MET_ZONE_FIELD_NUM_CALORIES ((FIT_MET_ZONE_FIELD_NUM)2) -#define FIT_MET_ZONE_FIELD_NUM_HIGH_BPM ((FIT_MET_ZONE_FIELD_NUM)1) -#define FIT_MET_ZONE_FIELD_NUM_FAT_CALORIES ((FIT_MET_ZONE_FIELD_NUM)3) - -typedef enum -{ - FIT_MET_ZONE_MESG_MESSAGE_INDEX, - FIT_MET_ZONE_MESG_CALORIES, - FIT_MET_ZONE_MESG_HIGH_BPM, - FIT_MET_ZONE_MESG_FAT_CALORIES, - FIT_MET_ZONE_MESG_FIELDS -} FIT_MET_ZONE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_MET_ZONE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_MET_ZONE_MESG_DEF; - -// dive_settings message - -#define FIT_DIVE_SETTINGS_MESG_SIZE 17 -#define FIT_DIVE_SETTINGS_MESG_DEF_SIZE 11 -#define FIT_DIVE_SETTINGS_MESG_NAME_COUNT 16 - -typedef struct -{ - FIT_STRING name[FIT_DIVE_SETTINGS_MESG_NAME_COUNT]; // - FIT_UINT8 heart_rate_source; // -} FIT_DIVE_SETTINGS_MESG; - -typedef FIT_UINT8 FIT_DIVE_SETTINGS_FIELD_NUM; - -#define FIT_DIVE_SETTINGS_FIELD_NUM_NAME ((FIT_DIVE_SETTINGS_FIELD_NUM)0) -#define FIT_DIVE_SETTINGS_FIELD_NUM_HEART_RATE_SOURCE ((FIT_DIVE_SETTINGS_FIELD_NUM)20) - -typedef enum -{ - FIT_DIVE_SETTINGS_MESG_NAME, - FIT_DIVE_SETTINGS_MESG_HEART_RATE_SOURCE, - FIT_DIVE_SETTINGS_MESG_FIELDS -} FIT_DIVE_SETTINGS_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_DIVE_SETTINGS_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_DIVE_SETTINGS_MESG_DEF; - -// goal message - -#define FIT_GOAL_MESG_SIZE 27 -#define FIT_GOAL_MESG_DEF_SIZE 44 - -typedef struct -{ - FIT_DATE_TIME start_date; // - FIT_DATE_TIME end_date; // - FIT_UINT32 value; // - FIT_UINT32 target_value; // - FIT_MESSAGE_INDEX message_index; // - FIT_UINT16 recurrence_value; // - FIT_SPORT sport; // - FIT_SUB_SPORT sub_sport; // - FIT_GOAL type; // - FIT_BOOL repeat; // - FIT_GOAL_RECURRENCE recurrence; // - FIT_BOOL enabled; // - FIT_GOAL_SOURCE source; // -} FIT_GOAL_MESG; - -typedef FIT_UINT8 FIT_GOAL_FIELD_NUM; - -#define FIT_GOAL_FIELD_NUM_START_DATE ((FIT_GOAL_FIELD_NUM)2) -#define FIT_GOAL_FIELD_NUM_END_DATE ((FIT_GOAL_FIELD_NUM)3) -#define FIT_GOAL_FIELD_NUM_VALUE ((FIT_GOAL_FIELD_NUM)5) -#define FIT_GOAL_FIELD_NUM_TARGET_VALUE ((FIT_GOAL_FIELD_NUM)7) -#define FIT_GOAL_FIELD_NUM_MESSAGE_INDEX ((FIT_GOAL_FIELD_NUM)254) -#define FIT_GOAL_FIELD_NUM_RECURRENCE_VALUE ((FIT_GOAL_FIELD_NUM)9) -#define FIT_GOAL_FIELD_NUM_SPORT ((FIT_GOAL_FIELD_NUM)0) -#define FIT_GOAL_FIELD_NUM_SUB_SPORT ((FIT_GOAL_FIELD_NUM)1) -#define FIT_GOAL_FIELD_NUM_TYPE ((FIT_GOAL_FIELD_NUM)4) -#define FIT_GOAL_FIELD_NUM_REPEAT ((FIT_GOAL_FIELD_NUM)6) -#define FIT_GOAL_FIELD_NUM_RECURRENCE ((FIT_GOAL_FIELD_NUM)8) -#define FIT_GOAL_FIELD_NUM_ENABLED ((FIT_GOAL_FIELD_NUM)10) -#define FIT_GOAL_FIELD_NUM_SOURCE ((FIT_GOAL_FIELD_NUM)11) - -typedef enum -{ - FIT_GOAL_MESG_START_DATE, - FIT_GOAL_MESG_END_DATE, - FIT_GOAL_MESG_VALUE, - FIT_GOAL_MESG_TARGET_VALUE, - FIT_GOAL_MESG_MESSAGE_INDEX, - FIT_GOAL_MESG_RECURRENCE_VALUE, - FIT_GOAL_MESG_SPORT, - FIT_GOAL_MESG_SUB_SPORT, - FIT_GOAL_MESG_TYPE, - FIT_GOAL_MESG_REPEAT, - FIT_GOAL_MESG_RECURRENCE, - FIT_GOAL_MESG_ENABLED, - FIT_GOAL_MESG_SOURCE, - FIT_GOAL_MESG_FIELDS -} FIT_GOAL_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_GOAL_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_GOAL_MESG_DEF; - -// activity message - -#define FIT_ACTIVITY_MESG_SIZE 18 -#define FIT_ACTIVITY_MESG_DEF_SIZE 29 - -typedef struct -{ - FIT_DATE_TIME timestamp; // - FIT_UINT32 total_timer_time; // 1000 * s + 0, Exclude pauses - FIT_LOCAL_DATE_TIME local_timestamp; // timestamp epoch expressed in local time, used to convert activity timestamps to local time - FIT_UINT16 num_sessions; // - FIT_ACTIVITY type; // - FIT_EVENT event; // - FIT_EVENT_TYPE event_type; // - FIT_UINT8 event_group; // -} FIT_ACTIVITY_MESG; - -typedef FIT_UINT8 FIT_ACTIVITY_FIELD_NUM; - -#define FIT_ACTIVITY_FIELD_NUM_TIMESTAMP ((FIT_ACTIVITY_FIELD_NUM)253) -#define FIT_ACTIVITY_FIELD_NUM_TOTAL_TIMER_TIME ((FIT_ACTIVITY_FIELD_NUM)0) -#define FIT_ACTIVITY_FIELD_NUM_LOCAL_TIMESTAMP ((FIT_ACTIVITY_FIELD_NUM)5) -#define FIT_ACTIVITY_FIELD_NUM_NUM_SESSIONS ((FIT_ACTIVITY_FIELD_NUM)1) -#define FIT_ACTIVITY_FIELD_NUM_TYPE ((FIT_ACTIVITY_FIELD_NUM)2) -#define FIT_ACTIVITY_FIELD_NUM_EVENT ((FIT_ACTIVITY_FIELD_NUM)3) -#define FIT_ACTIVITY_FIELD_NUM_EVENT_TYPE ((FIT_ACTIVITY_FIELD_NUM)4) -#define FIT_ACTIVITY_FIELD_NUM_EVENT_GROUP ((FIT_ACTIVITY_FIELD_NUM)6) - -typedef enum -{ - FIT_ACTIVITY_MESG_TIMESTAMP, - FIT_ACTIVITY_MESG_TOTAL_TIMER_TIME, - FIT_ACTIVITY_MESG_LOCAL_TIMESTAMP, - FIT_ACTIVITY_MESG_NUM_SESSIONS, - FIT_ACTIVITY_MESG_TYPE, - FIT_ACTIVITY_MESG_EVENT, - FIT_ACTIVITY_MESG_EVENT_TYPE, - FIT_ACTIVITY_MESG_EVENT_GROUP, - FIT_ACTIVITY_MESG_FIELDS -} FIT_ACTIVITY_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_ACTIVITY_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_ACTIVITY_MESG_DEF; - -// session message - -#define FIT_SESSION_MESG_SIZE 234 -#define FIT_SESSION_MESG_DEF_SIZE 290 -#define FIT_SESSION_MESG_TIME_IN_HR_ZONE_COUNT 1 -#define FIT_SESSION_MESG_TIME_IN_SPEED_ZONE_COUNT 1 -#define FIT_SESSION_MESG_TIME_IN_CADENCE_ZONE_COUNT 1 -#define FIT_SESSION_MESG_TIME_IN_POWER_ZONE_COUNT 1 -#define FIT_SESSION_MESG_SPORT_PROFILE_NAME_COUNT 16 -#define FIT_SESSION_MESG_STROKE_COUNT_COUNT 1 -#define FIT_SESSION_MESG_ZONE_COUNT_COUNT 1 -#define FIT_SESSION_MESG_OPPONENT_NAME_COUNT 1 - -typedef struct -{ - FIT_DATE_TIME timestamp; // 1 * s + 0, Sesson end time. - FIT_DATE_TIME start_time; // - FIT_SINT32 start_position_lat; // 1 * semicircles + 0, - FIT_SINT32 start_position_long; // 1 * semicircles + 0, - FIT_UINT32 total_elapsed_time; // 1000 * s + 0, Time (includes pauses) - FIT_UINT32 total_timer_time; // 1000 * s + 0, Timer Time (excludes pauses) - FIT_UINT32 total_distance; // 100 * m + 0, - FIT_UINT32 total_cycles; // 1 * cycles + 0, - FIT_SINT32 nec_lat; // 1 * semicircles + 0, North east corner latitude - FIT_SINT32 nec_long; // 1 * semicircles + 0, North east corner longitude - FIT_SINT32 swc_lat; // 1 * semicircles + 0, South west corner latitude - FIT_SINT32 swc_long; // 1 * semicircles + 0, South west corner longitude - FIT_SINT32 end_position_lat; // 1 * semicircles + 0, - FIT_SINT32 end_position_long; // 1 * semicircles + 0, - FIT_UINT32 avg_stroke_count; // 10 * strokes/lap + 0, - FIT_UINT32 total_work; // 1 * J + 0, - FIT_UINT32 total_moving_time; // 1000 * s + 0, - FIT_UINT32 time_in_hr_zone[FIT_SESSION_MESG_TIME_IN_HR_ZONE_COUNT]; // 1000 * s + 0, - FIT_UINT32 time_in_speed_zone[FIT_SESSION_MESG_TIME_IN_SPEED_ZONE_COUNT]; // 1000 * s + 0, - FIT_UINT32 time_in_cadence_zone[FIT_SESSION_MESG_TIME_IN_CADENCE_ZONE_COUNT]; // 1000 * s + 0, - FIT_UINT32 time_in_power_zone[FIT_SESSION_MESG_TIME_IN_POWER_ZONE_COUNT]; // 1000 * s + 0, - FIT_UINT32 avg_lap_time; // 1000 * s + 0, - FIT_STRING sport_profile_name[FIT_SESSION_MESG_SPORT_PROFILE_NAME_COUNT]; // Sport name from associated sport mesg - FIT_UINT32 enhanced_avg_speed; // 1000 * m/s + 0, total_distance / total_timer_time - FIT_UINT32 enhanced_max_speed; // 1000 * m/s + 0, - FIT_UINT32 enhanced_avg_altitude; // 5 * m + 500, - FIT_UINT32 enhanced_min_altitude; // 5 * m + 500, - FIT_UINT32 enhanced_max_altitude; // 5 * m + 500, - FIT_MESSAGE_INDEX message_index; // Selected bit is set for the current session. - FIT_UINT16 total_calories; // 1 * kcal + 0, - FIT_UINT16 total_fat_calories; // 1 * kcal + 0, - FIT_UINT16 avg_speed; // 1000 * m/s + 0, total_distance / total_timer_time - FIT_UINT16 max_speed; // 1000 * m/s + 0, - FIT_UINT16 avg_power; // 1 * watts + 0, total_power / total_timer_time if non_zero_avg_power otherwise total_power / total_elapsed_time - FIT_UINT16 max_power; // 1 * watts + 0, - FIT_UINT16 total_ascent; // 1 * m + 0, - FIT_UINT16 total_descent; // 1 * m + 0, - FIT_UINT16 first_lap_index; // - FIT_UINT16 num_laps; // - FIT_UINT16 num_lengths; // 1 * lengths + 0, # of lengths of swim pool - FIT_UINT16 normalized_power; // 1 * watts + 0, - FIT_UINT16 training_stress_score; // 10 * tss + 0, - FIT_UINT16 intensity_factor; // 1000 * if + 0, - FIT_LEFT_RIGHT_BALANCE_100 left_right_balance; // - FIT_UINT16 avg_stroke_distance; // 100 * m + 0, - FIT_UINT16 pool_length; // 100 * m + 0, - FIT_UINT16 threshold_power; // 1 * watts + 0, - FIT_UINT16 num_active_lengths; // 1 * lengths + 0, # of active lengths of swim pool - FIT_UINT16 avg_altitude; // 5 * m + 500, - FIT_UINT16 max_altitude; // 5 * m + 500, - FIT_SINT16 avg_grade; // 100 * % + 0, - FIT_SINT16 avg_pos_grade; // 100 * % + 0, - FIT_SINT16 avg_neg_grade; // 100 * % + 0, - FIT_SINT16 max_pos_grade; // 100 * % + 0, - FIT_SINT16 max_neg_grade; // 100 * % + 0, - FIT_SINT16 avg_pos_vertical_speed; // 1000 * m/s + 0, - FIT_SINT16 avg_neg_vertical_speed; // 1000 * m/s + 0, - FIT_SINT16 max_pos_vertical_speed; // 1000 * m/s + 0, - FIT_SINT16 max_neg_vertical_speed; // 1000 * m/s + 0, - FIT_UINT16 best_lap_index; // - FIT_UINT16 min_altitude; // 5 * m + 500, - FIT_UINT16 player_score; // - FIT_UINT16 opponent_score; // - FIT_UINT16 stroke_count[FIT_SESSION_MESG_STROKE_COUNT_COUNT]; // 1 * counts + 0, stroke_type enum used as the index - FIT_UINT16 zone_count[FIT_SESSION_MESG_ZONE_COUNT_COUNT]; // 1 * counts + 0, zone number used as the index - FIT_UINT16 max_ball_speed; // 100 * m/s + 0, - FIT_UINT16 avg_ball_speed; // 100 * m/s + 0, - FIT_UINT16 avg_vertical_oscillation; // 10 * mm + 0, - FIT_UINT16 avg_stance_time_percent; // 100 * percent + 0, - FIT_UINT16 avg_stance_time; // 10 * ms + 0, - FIT_UINT16 avg_vam; // 1000 * m/s + 0, - FIT_EVENT event; // session - FIT_EVENT_TYPE event_type; // stop - FIT_SPORT sport; // - FIT_SUB_SPORT sub_sport; // - FIT_UINT8 avg_heart_rate; // 1 * bpm + 0, average heart rate (excludes pause time) - FIT_UINT8 max_heart_rate; // 1 * bpm + 0, - FIT_UINT8 avg_cadence; // 1 * rpm + 0, total_cycles / total_timer_time if non_zero_avg_cadence otherwise total_cycles / total_elapsed_time - FIT_UINT8 max_cadence; // 1 * rpm + 0, - FIT_UINT8 total_training_effect; // - FIT_UINT8 event_group; // - FIT_SESSION_TRIGGER trigger; // - FIT_SWIM_STROKE swim_stroke; // 1 * swim_stroke + 0, - FIT_DISPLAY_MEASURE pool_length_unit; // - FIT_UINT8 gps_accuracy; // 1 * m + 0, - FIT_SINT8 avg_temperature; // 1 * C + 0, - FIT_SINT8 max_temperature; // 1 * C + 0, - FIT_UINT8 min_heart_rate; // 1 * bpm + 0, - FIT_STRING opponent_name[FIT_SESSION_MESG_OPPONENT_NAME_COUNT]; // - FIT_UINT8 avg_fractional_cadence; // 128 * rpm + 0, fractional part of the avg_cadence - FIT_UINT8 max_fractional_cadence; // 128 * rpm + 0, fractional part of the max_cadence - FIT_UINT8 total_fractional_cycles; // 128 * cycles + 0, fractional part of the total_cycles - FIT_UINT8 sport_index; // - FIT_UINT8 total_anaerobic_training_effect; // - FIT_SINT8 min_temperature; // 1 * C + 0, -} FIT_SESSION_MESG; - -typedef FIT_UINT8 FIT_SESSION_FIELD_NUM; - -#define FIT_SESSION_FIELD_NUM_TIMESTAMP ((FIT_SESSION_FIELD_NUM)253) -#define FIT_SESSION_FIELD_NUM_START_TIME ((FIT_SESSION_FIELD_NUM)2) -#define FIT_SESSION_FIELD_NUM_START_POSITION_LAT ((FIT_SESSION_FIELD_NUM)3) -#define FIT_SESSION_FIELD_NUM_START_POSITION_LONG ((FIT_SESSION_FIELD_NUM)4) -#define FIT_SESSION_FIELD_NUM_TOTAL_ELAPSED_TIME ((FIT_SESSION_FIELD_NUM)7) -#define FIT_SESSION_FIELD_NUM_TOTAL_TIMER_TIME ((FIT_SESSION_FIELD_NUM)8) -#define FIT_SESSION_FIELD_NUM_TOTAL_DISTANCE ((FIT_SESSION_FIELD_NUM)9) -#define FIT_SESSION_FIELD_NUM_TOTAL_CYCLES ((FIT_SESSION_FIELD_NUM)10) -#define FIT_SESSION_FIELD_NUM_NEC_LAT ((FIT_SESSION_FIELD_NUM)29) -#define FIT_SESSION_FIELD_NUM_NEC_LONG ((FIT_SESSION_FIELD_NUM)30) -#define FIT_SESSION_FIELD_NUM_SWC_LAT ((FIT_SESSION_FIELD_NUM)31) -#define FIT_SESSION_FIELD_NUM_SWC_LONG ((FIT_SESSION_FIELD_NUM)32) -#define FIT_SESSION_FIELD_NUM_END_POSITION_LAT ((FIT_SESSION_FIELD_NUM)38) -#define FIT_SESSION_FIELD_NUM_END_POSITION_LONG ((FIT_SESSION_FIELD_NUM)39) -#define FIT_SESSION_FIELD_NUM_AVG_STROKE_COUNT ((FIT_SESSION_FIELD_NUM)41) -#define FIT_SESSION_FIELD_NUM_TOTAL_WORK ((FIT_SESSION_FIELD_NUM)48) -#define FIT_SESSION_FIELD_NUM_TOTAL_MOVING_TIME ((FIT_SESSION_FIELD_NUM)59) -#define FIT_SESSION_FIELD_NUM_TIME_IN_HR_ZONE ((FIT_SESSION_FIELD_NUM)65) -#define FIT_SESSION_FIELD_NUM_TIME_IN_SPEED_ZONE ((FIT_SESSION_FIELD_NUM)66) -#define FIT_SESSION_FIELD_NUM_TIME_IN_CADENCE_ZONE ((FIT_SESSION_FIELD_NUM)67) -#define FIT_SESSION_FIELD_NUM_TIME_IN_POWER_ZONE ((FIT_SESSION_FIELD_NUM)68) -#define FIT_SESSION_FIELD_NUM_AVG_LAP_TIME ((FIT_SESSION_FIELD_NUM)69) -#define FIT_SESSION_FIELD_NUM_SPORT_PROFILE_NAME ((FIT_SESSION_FIELD_NUM)110) -#define FIT_SESSION_FIELD_NUM_ENHANCED_AVG_SPEED ((FIT_SESSION_FIELD_NUM)124) -#define FIT_SESSION_FIELD_NUM_ENHANCED_MAX_SPEED ((FIT_SESSION_FIELD_NUM)125) -#define FIT_SESSION_FIELD_NUM_ENHANCED_AVG_ALTITUDE ((FIT_SESSION_FIELD_NUM)126) -#define FIT_SESSION_FIELD_NUM_ENHANCED_MIN_ALTITUDE ((FIT_SESSION_FIELD_NUM)127) -#define FIT_SESSION_FIELD_NUM_ENHANCED_MAX_ALTITUDE ((FIT_SESSION_FIELD_NUM)128) -#define FIT_SESSION_FIELD_NUM_MESSAGE_INDEX ((FIT_SESSION_FIELD_NUM)254) -#define FIT_SESSION_FIELD_NUM_TOTAL_CALORIES ((FIT_SESSION_FIELD_NUM)11) -#define FIT_SESSION_FIELD_NUM_TOTAL_FAT_CALORIES ((FIT_SESSION_FIELD_NUM)13) -#define FIT_SESSION_FIELD_NUM_AVG_SPEED ((FIT_SESSION_FIELD_NUM)14) -#define FIT_SESSION_FIELD_NUM_MAX_SPEED ((FIT_SESSION_FIELD_NUM)15) -#define FIT_SESSION_FIELD_NUM_AVG_POWER ((FIT_SESSION_FIELD_NUM)20) -#define FIT_SESSION_FIELD_NUM_MAX_POWER ((FIT_SESSION_FIELD_NUM)21) -#define FIT_SESSION_FIELD_NUM_TOTAL_ASCENT ((FIT_SESSION_FIELD_NUM)22) -#define FIT_SESSION_FIELD_NUM_TOTAL_DESCENT ((FIT_SESSION_FIELD_NUM)23) -#define FIT_SESSION_FIELD_NUM_FIRST_LAP_INDEX ((FIT_SESSION_FIELD_NUM)25) -#define FIT_SESSION_FIELD_NUM_NUM_LAPS ((FIT_SESSION_FIELD_NUM)26) -#define FIT_SESSION_FIELD_NUM_NUM_LENGTHS ((FIT_SESSION_FIELD_NUM)33) -#define FIT_SESSION_FIELD_NUM_NORMALIZED_POWER ((FIT_SESSION_FIELD_NUM)34) -#define FIT_SESSION_FIELD_NUM_TRAINING_STRESS_SCORE ((FIT_SESSION_FIELD_NUM)35) -#define FIT_SESSION_FIELD_NUM_INTENSITY_FACTOR ((FIT_SESSION_FIELD_NUM)36) -#define FIT_SESSION_FIELD_NUM_LEFT_RIGHT_BALANCE ((FIT_SESSION_FIELD_NUM)37) -#define FIT_SESSION_FIELD_NUM_AVG_STROKE_DISTANCE ((FIT_SESSION_FIELD_NUM)42) -#define FIT_SESSION_FIELD_NUM_POOL_LENGTH ((FIT_SESSION_FIELD_NUM)44) -#define FIT_SESSION_FIELD_NUM_THRESHOLD_POWER ((FIT_SESSION_FIELD_NUM)45) -#define FIT_SESSION_FIELD_NUM_NUM_ACTIVE_LENGTHS ((FIT_SESSION_FIELD_NUM)47) -#define FIT_SESSION_FIELD_NUM_AVG_ALTITUDE ((FIT_SESSION_FIELD_NUM)49) -#define FIT_SESSION_FIELD_NUM_MAX_ALTITUDE ((FIT_SESSION_FIELD_NUM)50) -#define FIT_SESSION_FIELD_NUM_AVG_GRADE ((FIT_SESSION_FIELD_NUM)52) -#define FIT_SESSION_FIELD_NUM_AVG_POS_GRADE ((FIT_SESSION_FIELD_NUM)53) -#define FIT_SESSION_FIELD_NUM_AVG_NEG_GRADE ((FIT_SESSION_FIELD_NUM)54) -#define FIT_SESSION_FIELD_NUM_MAX_POS_GRADE ((FIT_SESSION_FIELD_NUM)55) -#define FIT_SESSION_FIELD_NUM_MAX_NEG_GRADE ((FIT_SESSION_FIELD_NUM)56) -#define FIT_SESSION_FIELD_NUM_AVG_POS_VERTICAL_SPEED ((FIT_SESSION_FIELD_NUM)60) -#define FIT_SESSION_FIELD_NUM_AVG_NEG_VERTICAL_SPEED ((FIT_SESSION_FIELD_NUM)61) -#define FIT_SESSION_FIELD_NUM_MAX_POS_VERTICAL_SPEED ((FIT_SESSION_FIELD_NUM)62) -#define FIT_SESSION_FIELD_NUM_MAX_NEG_VERTICAL_SPEED ((FIT_SESSION_FIELD_NUM)63) -#define FIT_SESSION_FIELD_NUM_BEST_LAP_INDEX ((FIT_SESSION_FIELD_NUM)70) -#define FIT_SESSION_FIELD_NUM_MIN_ALTITUDE ((FIT_SESSION_FIELD_NUM)71) -#define FIT_SESSION_FIELD_NUM_PLAYER_SCORE ((FIT_SESSION_FIELD_NUM)82) -#define FIT_SESSION_FIELD_NUM_OPPONENT_SCORE ((FIT_SESSION_FIELD_NUM)83) -#define FIT_SESSION_FIELD_NUM_STROKE_COUNT ((FIT_SESSION_FIELD_NUM)85) -#define FIT_SESSION_FIELD_NUM_ZONE_COUNT ((FIT_SESSION_FIELD_NUM)86) -#define FIT_SESSION_FIELD_NUM_MAX_BALL_SPEED ((FIT_SESSION_FIELD_NUM)87) -#define FIT_SESSION_FIELD_NUM_AVG_BALL_SPEED ((FIT_SESSION_FIELD_NUM)88) -#define FIT_SESSION_FIELD_NUM_AVG_VERTICAL_OSCILLATION ((FIT_SESSION_FIELD_NUM)89) -#define FIT_SESSION_FIELD_NUM_AVG_STANCE_TIME_PERCENT ((FIT_SESSION_FIELD_NUM)90) -#define FIT_SESSION_FIELD_NUM_AVG_STANCE_TIME ((FIT_SESSION_FIELD_NUM)91) -#define FIT_SESSION_FIELD_NUM_AVG_VAM ((FIT_SESSION_FIELD_NUM)139) -#define FIT_SESSION_FIELD_NUM_EVENT ((FIT_SESSION_FIELD_NUM)0) -#define FIT_SESSION_FIELD_NUM_EVENT_TYPE ((FIT_SESSION_FIELD_NUM)1) -#define FIT_SESSION_FIELD_NUM_SPORT ((FIT_SESSION_FIELD_NUM)5) -#define FIT_SESSION_FIELD_NUM_SUB_SPORT ((FIT_SESSION_FIELD_NUM)6) -#define FIT_SESSION_FIELD_NUM_AVG_HEART_RATE ((FIT_SESSION_FIELD_NUM)16) -#define FIT_SESSION_FIELD_NUM_MAX_HEART_RATE ((FIT_SESSION_FIELD_NUM)17) -#define FIT_SESSION_FIELD_NUM_AVG_CADENCE ((FIT_SESSION_FIELD_NUM)18) -#define FIT_SESSION_FIELD_NUM_MAX_CADENCE ((FIT_SESSION_FIELD_NUM)19) -#define FIT_SESSION_FIELD_NUM_TOTAL_TRAINING_EFFECT ((FIT_SESSION_FIELD_NUM)24) -#define FIT_SESSION_FIELD_NUM_EVENT_GROUP ((FIT_SESSION_FIELD_NUM)27) -#define FIT_SESSION_FIELD_NUM_TRIGGER ((FIT_SESSION_FIELD_NUM)28) -#define FIT_SESSION_FIELD_NUM_SWIM_STROKE ((FIT_SESSION_FIELD_NUM)43) -#define FIT_SESSION_FIELD_NUM_POOL_LENGTH_UNIT ((FIT_SESSION_FIELD_NUM)46) -#define FIT_SESSION_FIELD_NUM_GPS_ACCURACY ((FIT_SESSION_FIELD_NUM)51) -#define FIT_SESSION_FIELD_NUM_AVG_TEMPERATURE ((FIT_SESSION_FIELD_NUM)57) -#define FIT_SESSION_FIELD_NUM_MAX_TEMPERATURE ((FIT_SESSION_FIELD_NUM)58) -#define FIT_SESSION_FIELD_NUM_MIN_HEART_RATE ((FIT_SESSION_FIELD_NUM)64) -#define FIT_SESSION_FIELD_NUM_OPPONENT_NAME ((FIT_SESSION_FIELD_NUM)84) -#define FIT_SESSION_FIELD_NUM_AVG_FRACTIONAL_CADENCE ((FIT_SESSION_FIELD_NUM)92) -#define FIT_SESSION_FIELD_NUM_MAX_FRACTIONAL_CADENCE ((FIT_SESSION_FIELD_NUM)93) -#define FIT_SESSION_FIELD_NUM_TOTAL_FRACTIONAL_CYCLES ((FIT_SESSION_FIELD_NUM)94) -#define FIT_SESSION_FIELD_NUM_SPORT_INDEX ((FIT_SESSION_FIELD_NUM)111) -#define FIT_SESSION_FIELD_NUM_TOTAL_ANAEROBIC_TRAINING_EFFECT ((FIT_SESSION_FIELD_NUM)137) -#define FIT_SESSION_FIELD_NUM_MIN_TEMPERATURE ((FIT_SESSION_FIELD_NUM)150) - -typedef enum -{ - FIT_SESSION_MESG_TIMESTAMP, - FIT_SESSION_MESG_START_TIME, - FIT_SESSION_MESG_START_POSITION_LAT, - FIT_SESSION_MESG_START_POSITION_LONG, - FIT_SESSION_MESG_TOTAL_ELAPSED_TIME, - FIT_SESSION_MESG_TOTAL_TIMER_TIME, - FIT_SESSION_MESG_TOTAL_DISTANCE, - FIT_SESSION_MESG_TOTAL_CYCLES, - FIT_SESSION_MESG_NEC_LAT, - FIT_SESSION_MESG_NEC_LONG, - FIT_SESSION_MESG_SWC_LAT, - FIT_SESSION_MESG_SWC_LONG, - FIT_SESSION_MESG_END_POSITION_LAT, - FIT_SESSION_MESG_END_POSITION_LONG, - FIT_SESSION_MESG_AVG_STROKE_COUNT, - FIT_SESSION_MESG_TOTAL_WORK, - FIT_SESSION_MESG_TOTAL_MOVING_TIME, - FIT_SESSION_MESG_TIME_IN_HR_ZONE, - FIT_SESSION_MESG_TIME_IN_SPEED_ZONE, - FIT_SESSION_MESG_TIME_IN_CADENCE_ZONE, - FIT_SESSION_MESG_TIME_IN_POWER_ZONE, - FIT_SESSION_MESG_AVG_LAP_TIME, - FIT_SESSION_MESG_SPORT_PROFILE_NAME, - FIT_SESSION_MESG_ENHANCED_AVG_SPEED, - FIT_SESSION_MESG_ENHANCED_MAX_SPEED, - FIT_SESSION_MESG_ENHANCED_AVG_ALTITUDE, - FIT_SESSION_MESG_ENHANCED_MIN_ALTITUDE, - FIT_SESSION_MESG_ENHANCED_MAX_ALTITUDE, - FIT_SESSION_MESG_MESSAGE_INDEX, - FIT_SESSION_MESG_TOTAL_CALORIES, - FIT_SESSION_MESG_TOTAL_FAT_CALORIES, - FIT_SESSION_MESG_AVG_SPEED, - FIT_SESSION_MESG_MAX_SPEED, - FIT_SESSION_MESG_AVG_POWER, - FIT_SESSION_MESG_MAX_POWER, - FIT_SESSION_MESG_TOTAL_ASCENT, - FIT_SESSION_MESG_TOTAL_DESCENT, - FIT_SESSION_MESG_FIRST_LAP_INDEX, - FIT_SESSION_MESG_NUM_LAPS, - FIT_SESSION_MESG_NUM_LENGTHS, - FIT_SESSION_MESG_NORMALIZED_POWER, - FIT_SESSION_MESG_TRAINING_STRESS_SCORE, - FIT_SESSION_MESG_INTENSITY_FACTOR, - FIT_SESSION_MESG_LEFT_RIGHT_BALANCE, - FIT_SESSION_MESG_AVG_STROKE_DISTANCE, - FIT_SESSION_MESG_POOL_LENGTH, - FIT_SESSION_MESG_THRESHOLD_POWER, - FIT_SESSION_MESG_NUM_ACTIVE_LENGTHS, - FIT_SESSION_MESG_AVG_ALTITUDE, - FIT_SESSION_MESG_MAX_ALTITUDE, - FIT_SESSION_MESG_AVG_GRADE, - FIT_SESSION_MESG_AVG_POS_GRADE, - FIT_SESSION_MESG_AVG_NEG_GRADE, - FIT_SESSION_MESG_MAX_POS_GRADE, - FIT_SESSION_MESG_MAX_NEG_GRADE, - FIT_SESSION_MESG_AVG_POS_VERTICAL_SPEED, - FIT_SESSION_MESG_AVG_NEG_VERTICAL_SPEED, - FIT_SESSION_MESG_MAX_POS_VERTICAL_SPEED, - FIT_SESSION_MESG_MAX_NEG_VERTICAL_SPEED, - FIT_SESSION_MESG_BEST_LAP_INDEX, - FIT_SESSION_MESG_MIN_ALTITUDE, - FIT_SESSION_MESG_PLAYER_SCORE, - FIT_SESSION_MESG_OPPONENT_SCORE, - FIT_SESSION_MESG_STROKE_COUNT, - FIT_SESSION_MESG_ZONE_COUNT, - FIT_SESSION_MESG_MAX_BALL_SPEED, - FIT_SESSION_MESG_AVG_BALL_SPEED, - FIT_SESSION_MESG_AVG_VERTICAL_OSCILLATION, - FIT_SESSION_MESG_AVG_STANCE_TIME_PERCENT, - FIT_SESSION_MESG_AVG_STANCE_TIME, - FIT_SESSION_MESG_AVG_VAM, - FIT_SESSION_MESG_EVENT, - FIT_SESSION_MESG_EVENT_TYPE, - FIT_SESSION_MESG_SPORT, - FIT_SESSION_MESG_SUB_SPORT, - FIT_SESSION_MESG_AVG_HEART_RATE, - FIT_SESSION_MESG_MAX_HEART_RATE, - FIT_SESSION_MESG_AVG_CADENCE, - FIT_SESSION_MESG_MAX_CADENCE, - FIT_SESSION_MESG_TOTAL_TRAINING_EFFECT, - FIT_SESSION_MESG_EVENT_GROUP, - FIT_SESSION_MESG_TRIGGER, - FIT_SESSION_MESG_SWIM_STROKE, - FIT_SESSION_MESG_POOL_LENGTH_UNIT, - FIT_SESSION_MESG_GPS_ACCURACY, - FIT_SESSION_MESG_AVG_TEMPERATURE, - FIT_SESSION_MESG_MAX_TEMPERATURE, - FIT_SESSION_MESG_MIN_HEART_RATE, - FIT_SESSION_MESG_OPPONENT_NAME, - FIT_SESSION_MESG_AVG_FRACTIONAL_CADENCE, - FIT_SESSION_MESG_MAX_FRACTIONAL_CADENCE, - FIT_SESSION_MESG_TOTAL_FRACTIONAL_CYCLES, - FIT_SESSION_MESG_SPORT_INDEX, - FIT_SESSION_MESG_TOTAL_ANAEROBIC_TRAINING_EFFECT, - FIT_SESSION_MESG_MIN_TEMPERATURE, - FIT_SESSION_MESG_FIELDS -} FIT_SESSION_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_SESSION_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_SESSION_MESG_DEF; - -// lap message - -#define FIT_LAP_MESG_SIZE 190 -#define FIT_LAP_MESG_DEF_SIZE 257 -#define FIT_LAP_MESG_TIME_IN_HR_ZONE_COUNT 1 -#define FIT_LAP_MESG_TIME_IN_SPEED_ZONE_COUNT 1 -#define FIT_LAP_MESG_TIME_IN_CADENCE_ZONE_COUNT 1 -#define FIT_LAP_MESG_TIME_IN_POWER_ZONE_COUNT 1 -#define FIT_LAP_MESG_STROKE_COUNT_COUNT 1 -#define FIT_LAP_MESG_ZONE_COUNT_COUNT 1 -#define FIT_LAP_MESG_AVG_TOTAL_HEMOGLOBIN_CONC_COUNT 1 -#define FIT_LAP_MESG_MIN_TOTAL_HEMOGLOBIN_CONC_COUNT 1 -#define FIT_LAP_MESG_MAX_TOTAL_HEMOGLOBIN_CONC_COUNT 1 -#define FIT_LAP_MESG_AVG_SATURATED_HEMOGLOBIN_PERCENT_COUNT 1 -#define FIT_LAP_MESG_MIN_SATURATED_HEMOGLOBIN_PERCENT_COUNT 1 -#define FIT_LAP_MESG_MAX_SATURATED_HEMOGLOBIN_PERCENT_COUNT 1 - -typedef struct -{ - FIT_DATE_TIME timestamp; // 1 * s + 0, Lap end time. - FIT_DATE_TIME start_time; // - FIT_SINT32 start_position_lat; // 1 * semicircles + 0, - FIT_SINT32 start_position_long; // 1 * semicircles + 0, - FIT_SINT32 end_position_lat; // 1 * semicircles + 0, - FIT_SINT32 end_position_long; // 1 * semicircles + 0, - FIT_UINT32 total_elapsed_time; // 1000 * s + 0, Time (includes pauses) - FIT_UINT32 total_timer_time; // 1000 * s + 0, Timer Time (excludes pauses) - FIT_UINT32 total_distance; // 100 * m + 0, - FIT_UINT32 total_cycles; // 1 * cycles + 0, - FIT_UINT32 total_work; // 1 * J + 0, - FIT_UINT32 total_moving_time; // 1000 * s + 0, - FIT_UINT32 time_in_hr_zone[FIT_LAP_MESG_TIME_IN_HR_ZONE_COUNT]; // 1000 * s + 0, - FIT_UINT32 time_in_speed_zone[FIT_LAP_MESG_TIME_IN_SPEED_ZONE_COUNT]; // 1000 * s + 0, - FIT_UINT32 time_in_cadence_zone[FIT_LAP_MESG_TIME_IN_CADENCE_ZONE_COUNT]; // 1000 * s + 0, - FIT_UINT32 time_in_power_zone[FIT_LAP_MESG_TIME_IN_POWER_ZONE_COUNT]; // 1000 * s + 0, - FIT_UINT32 enhanced_avg_speed; // 1000 * m/s + 0, - FIT_UINT32 enhanced_max_speed; // 1000 * m/s + 0, - FIT_UINT32 enhanced_avg_altitude; // 5 * m + 500, - FIT_UINT32 enhanced_min_altitude; // 5 * m + 500, - FIT_UINT32 enhanced_max_altitude; // 5 * m + 500, - FIT_MESSAGE_INDEX message_index; // - FIT_UINT16 total_calories; // 1 * kcal + 0, - FIT_UINT16 total_fat_calories; // 1 * kcal + 0, If New Leaf - FIT_UINT16 avg_speed; // 1000 * m/s + 0, - FIT_UINT16 max_speed; // 1000 * m/s + 0, - FIT_UINT16 avg_power; // 1 * watts + 0, total_power / total_timer_time if non_zero_avg_power otherwise total_power / total_elapsed_time - FIT_UINT16 max_power; // 1 * watts + 0, - FIT_UINT16 total_ascent; // 1 * m + 0, - FIT_UINT16 total_descent; // 1 * m + 0, - FIT_UINT16 num_lengths; // 1 * lengths + 0, # of lengths of swim pool - FIT_UINT16 normalized_power; // 1 * watts + 0, - FIT_LEFT_RIGHT_BALANCE_100 left_right_balance; // - FIT_UINT16 first_length_index; // - FIT_UINT16 avg_stroke_distance; // 100 * m + 0, - FIT_UINT16 num_active_lengths; // 1 * lengths + 0, # of active lengths of swim pool - FIT_UINT16 avg_altitude; // 5 * m + 500, - FIT_UINT16 max_altitude; // 5 * m + 500, - FIT_SINT16 avg_grade; // 100 * % + 0, - FIT_SINT16 avg_pos_grade; // 100 * % + 0, - FIT_SINT16 avg_neg_grade; // 100 * % + 0, - FIT_SINT16 max_pos_grade; // 100 * % + 0, - FIT_SINT16 max_neg_grade; // 100 * % + 0, - FIT_SINT16 avg_pos_vertical_speed; // 1000 * m/s + 0, - FIT_SINT16 avg_neg_vertical_speed; // 1000 * m/s + 0, - FIT_SINT16 max_pos_vertical_speed; // 1000 * m/s + 0, - FIT_SINT16 max_neg_vertical_speed; // 1000 * m/s + 0, - FIT_UINT16 repetition_num; // - FIT_UINT16 min_altitude; // 5 * m + 500, - FIT_MESSAGE_INDEX wkt_step_index; // - FIT_UINT16 opponent_score; // - FIT_UINT16 stroke_count[FIT_LAP_MESG_STROKE_COUNT_COUNT]; // 1 * counts + 0, stroke_type enum used as the index - FIT_UINT16 zone_count[FIT_LAP_MESG_ZONE_COUNT_COUNT]; // 1 * counts + 0, zone number used as the index - FIT_UINT16 avg_vertical_oscillation; // 10 * mm + 0, - FIT_UINT16 avg_stance_time_percent; // 100 * percent + 0, - FIT_UINT16 avg_stance_time; // 10 * ms + 0, - FIT_UINT16 player_score; // - FIT_UINT16 avg_total_hemoglobin_conc[FIT_LAP_MESG_AVG_TOTAL_HEMOGLOBIN_CONC_COUNT]; // 100 * g/dL + 0, Avg saturated and unsaturated hemoglobin - FIT_UINT16 min_total_hemoglobin_conc[FIT_LAP_MESG_MIN_TOTAL_HEMOGLOBIN_CONC_COUNT]; // 100 * g/dL + 0, Min saturated and unsaturated hemoglobin - FIT_UINT16 max_total_hemoglobin_conc[FIT_LAP_MESG_MAX_TOTAL_HEMOGLOBIN_CONC_COUNT]; // 100 * g/dL + 0, Max saturated and unsaturated hemoglobin - FIT_UINT16 avg_saturated_hemoglobin_percent[FIT_LAP_MESG_AVG_SATURATED_HEMOGLOBIN_PERCENT_COUNT]; // 10 * % + 0, Avg percentage of hemoglobin saturated with oxygen - FIT_UINT16 min_saturated_hemoglobin_percent[FIT_LAP_MESG_MIN_SATURATED_HEMOGLOBIN_PERCENT_COUNT]; // 10 * % + 0, Min percentage of hemoglobin saturated with oxygen - FIT_UINT16 max_saturated_hemoglobin_percent[FIT_LAP_MESG_MAX_SATURATED_HEMOGLOBIN_PERCENT_COUNT]; // 10 * % + 0, Max percentage of hemoglobin saturated with oxygen - FIT_UINT16 avg_vam; // 1000 * m/s + 0, - FIT_EVENT event; // - FIT_EVENT_TYPE event_type; // - FIT_UINT8 avg_heart_rate; // 1 * bpm + 0, - FIT_UINT8 max_heart_rate; // 1 * bpm + 0, - FIT_UINT8 avg_cadence; // 1 * rpm + 0, total_cycles / total_timer_time if non_zero_avg_cadence otherwise total_cycles / total_elapsed_time - FIT_UINT8 max_cadence; // 1 * rpm + 0, - FIT_INTENSITY intensity; // - FIT_LAP_TRIGGER lap_trigger; // - FIT_SPORT sport; // - FIT_UINT8 event_group; // - FIT_SWIM_STROKE swim_stroke; // - FIT_SUB_SPORT sub_sport; // - FIT_UINT8 gps_accuracy; // 1 * m + 0, - FIT_SINT8 avg_temperature; // 1 * C + 0, - FIT_SINT8 max_temperature; // 1 * C + 0, - FIT_UINT8 min_heart_rate; // 1 * bpm + 0, - FIT_UINT8 avg_fractional_cadence; // 128 * rpm + 0, fractional part of the avg_cadence - FIT_UINT8 max_fractional_cadence; // 128 * rpm + 0, fractional part of the max_cadence - FIT_UINT8 total_fractional_cycles; // 128 * cycles + 0, fractional part of the total_cycles - FIT_SINT8 min_temperature; // 1 * C + 0, -} FIT_LAP_MESG; - -typedef FIT_UINT8 FIT_LAP_FIELD_NUM; - -#define FIT_LAP_FIELD_NUM_TIMESTAMP ((FIT_LAP_FIELD_NUM)253) -#define FIT_LAP_FIELD_NUM_START_TIME ((FIT_LAP_FIELD_NUM)2) -#define FIT_LAP_FIELD_NUM_START_POSITION_LAT ((FIT_LAP_FIELD_NUM)3) -#define FIT_LAP_FIELD_NUM_START_POSITION_LONG ((FIT_LAP_FIELD_NUM)4) -#define FIT_LAP_FIELD_NUM_END_POSITION_LAT ((FIT_LAP_FIELD_NUM)5) -#define FIT_LAP_FIELD_NUM_END_POSITION_LONG ((FIT_LAP_FIELD_NUM)6) -#define FIT_LAP_FIELD_NUM_TOTAL_ELAPSED_TIME ((FIT_LAP_FIELD_NUM)7) -#define FIT_LAP_FIELD_NUM_TOTAL_TIMER_TIME ((FIT_LAP_FIELD_NUM)8) -#define FIT_LAP_FIELD_NUM_TOTAL_DISTANCE ((FIT_LAP_FIELD_NUM)9) -#define FIT_LAP_FIELD_NUM_TOTAL_CYCLES ((FIT_LAP_FIELD_NUM)10) -#define FIT_LAP_FIELD_NUM_TOTAL_WORK ((FIT_LAP_FIELD_NUM)41) -#define FIT_LAP_FIELD_NUM_TOTAL_MOVING_TIME ((FIT_LAP_FIELD_NUM)52) -#define FIT_LAP_FIELD_NUM_TIME_IN_HR_ZONE ((FIT_LAP_FIELD_NUM)57) -#define FIT_LAP_FIELD_NUM_TIME_IN_SPEED_ZONE ((FIT_LAP_FIELD_NUM)58) -#define FIT_LAP_FIELD_NUM_TIME_IN_CADENCE_ZONE ((FIT_LAP_FIELD_NUM)59) -#define FIT_LAP_FIELD_NUM_TIME_IN_POWER_ZONE ((FIT_LAP_FIELD_NUM)60) -#define FIT_LAP_FIELD_NUM_ENHANCED_AVG_SPEED ((FIT_LAP_FIELD_NUM)110) -#define FIT_LAP_FIELD_NUM_ENHANCED_MAX_SPEED ((FIT_LAP_FIELD_NUM)111) -#define FIT_LAP_FIELD_NUM_ENHANCED_AVG_ALTITUDE ((FIT_LAP_FIELD_NUM)112) -#define FIT_LAP_FIELD_NUM_ENHANCED_MIN_ALTITUDE ((FIT_LAP_FIELD_NUM)113) -#define FIT_LAP_FIELD_NUM_ENHANCED_MAX_ALTITUDE ((FIT_LAP_FIELD_NUM)114) -#define FIT_LAP_FIELD_NUM_MESSAGE_INDEX ((FIT_LAP_FIELD_NUM)254) -#define FIT_LAP_FIELD_NUM_TOTAL_CALORIES ((FIT_LAP_FIELD_NUM)11) -#define FIT_LAP_FIELD_NUM_TOTAL_FAT_CALORIES ((FIT_LAP_FIELD_NUM)12) -#define FIT_LAP_FIELD_NUM_AVG_SPEED ((FIT_LAP_FIELD_NUM)13) -#define FIT_LAP_FIELD_NUM_MAX_SPEED ((FIT_LAP_FIELD_NUM)14) -#define FIT_LAP_FIELD_NUM_AVG_POWER ((FIT_LAP_FIELD_NUM)19) -#define FIT_LAP_FIELD_NUM_MAX_POWER ((FIT_LAP_FIELD_NUM)20) -#define FIT_LAP_FIELD_NUM_TOTAL_ASCENT ((FIT_LAP_FIELD_NUM)21) -#define FIT_LAP_FIELD_NUM_TOTAL_DESCENT ((FIT_LAP_FIELD_NUM)22) -#define FIT_LAP_FIELD_NUM_NUM_LENGTHS ((FIT_LAP_FIELD_NUM)32) -#define FIT_LAP_FIELD_NUM_NORMALIZED_POWER ((FIT_LAP_FIELD_NUM)33) -#define FIT_LAP_FIELD_NUM_LEFT_RIGHT_BALANCE ((FIT_LAP_FIELD_NUM)34) -#define FIT_LAP_FIELD_NUM_FIRST_LENGTH_INDEX ((FIT_LAP_FIELD_NUM)35) -#define FIT_LAP_FIELD_NUM_AVG_STROKE_DISTANCE ((FIT_LAP_FIELD_NUM)37) -#define FIT_LAP_FIELD_NUM_NUM_ACTIVE_LENGTHS ((FIT_LAP_FIELD_NUM)40) -#define FIT_LAP_FIELD_NUM_AVG_ALTITUDE ((FIT_LAP_FIELD_NUM)42) -#define FIT_LAP_FIELD_NUM_MAX_ALTITUDE ((FIT_LAP_FIELD_NUM)43) -#define FIT_LAP_FIELD_NUM_AVG_GRADE ((FIT_LAP_FIELD_NUM)45) -#define FIT_LAP_FIELD_NUM_AVG_POS_GRADE ((FIT_LAP_FIELD_NUM)46) -#define FIT_LAP_FIELD_NUM_AVG_NEG_GRADE ((FIT_LAP_FIELD_NUM)47) -#define FIT_LAP_FIELD_NUM_MAX_POS_GRADE ((FIT_LAP_FIELD_NUM)48) -#define FIT_LAP_FIELD_NUM_MAX_NEG_GRADE ((FIT_LAP_FIELD_NUM)49) -#define FIT_LAP_FIELD_NUM_AVG_POS_VERTICAL_SPEED ((FIT_LAP_FIELD_NUM)53) -#define FIT_LAP_FIELD_NUM_AVG_NEG_VERTICAL_SPEED ((FIT_LAP_FIELD_NUM)54) -#define FIT_LAP_FIELD_NUM_MAX_POS_VERTICAL_SPEED ((FIT_LAP_FIELD_NUM)55) -#define FIT_LAP_FIELD_NUM_MAX_NEG_VERTICAL_SPEED ((FIT_LAP_FIELD_NUM)56) -#define FIT_LAP_FIELD_NUM_REPETITION_NUM ((FIT_LAP_FIELD_NUM)61) -#define FIT_LAP_FIELD_NUM_MIN_ALTITUDE ((FIT_LAP_FIELD_NUM)62) -#define FIT_LAP_FIELD_NUM_WKT_STEP_INDEX ((FIT_LAP_FIELD_NUM)71) -#define FIT_LAP_FIELD_NUM_OPPONENT_SCORE ((FIT_LAP_FIELD_NUM)74) -#define FIT_LAP_FIELD_NUM_STROKE_COUNT ((FIT_LAP_FIELD_NUM)75) -#define FIT_LAP_FIELD_NUM_ZONE_COUNT ((FIT_LAP_FIELD_NUM)76) -#define FIT_LAP_FIELD_NUM_AVG_VERTICAL_OSCILLATION ((FIT_LAP_FIELD_NUM)77) -#define FIT_LAP_FIELD_NUM_AVG_STANCE_TIME_PERCENT ((FIT_LAP_FIELD_NUM)78) -#define FIT_LAP_FIELD_NUM_AVG_STANCE_TIME ((FIT_LAP_FIELD_NUM)79) -#define FIT_LAP_FIELD_NUM_PLAYER_SCORE ((FIT_LAP_FIELD_NUM)83) -#define FIT_LAP_FIELD_NUM_AVG_TOTAL_HEMOGLOBIN_CONC ((FIT_LAP_FIELD_NUM)84) -#define FIT_LAP_FIELD_NUM_MIN_TOTAL_HEMOGLOBIN_CONC ((FIT_LAP_FIELD_NUM)85) -#define FIT_LAP_FIELD_NUM_MAX_TOTAL_HEMOGLOBIN_CONC ((FIT_LAP_FIELD_NUM)86) -#define FIT_LAP_FIELD_NUM_AVG_SATURATED_HEMOGLOBIN_PERCENT ((FIT_LAP_FIELD_NUM)87) -#define FIT_LAP_FIELD_NUM_MIN_SATURATED_HEMOGLOBIN_PERCENT ((FIT_LAP_FIELD_NUM)88) -#define FIT_LAP_FIELD_NUM_MAX_SATURATED_HEMOGLOBIN_PERCENT ((FIT_LAP_FIELD_NUM)89) -#define FIT_LAP_FIELD_NUM_AVG_VAM ((FIT_LAP_FIELD_NUM)121) -#define FIT_LAP_FIELD_NUM_EVENT ((FIT_LAP_FIELD_NUM)0) -#define FIT_LAP_FIELD_NUM_EVENT_TYPE ((FIT_LAP_FIELD_NUM)1) -#define FIT_LAP_FIELD_NUM_AVG_HEART_RATE ((FIT_LAP_FIELD_NUM)15) -#define FIT_LAP_FIELD_NUM_MAX_HEART_RATE ((FIT_LAP_FIELD_NUM)16) -#define FIT_LAP_FIELD_NUM_AVG_CADENCE ((FIT_LAP_FIELD_NUM)17) -#define FIT_LAP_FIELD_NUM_MAX_CADENCE ((FIT_LAP_FIELD_NUM)18) -#define FIT_LAP_FIELD_NUM_INTENSITY ((FIT_LAP_FIELD_NUM)23) -#define FIT_LAP_FIELD_NUM_LAP_TRIGGER ((FIT_LAP_FIELD_NUM)24) -#define FIT_LAP_FIELD_NUM_SPORT ((FIT_LAP_FIELD_NUM)25) -#define FIT_LAP_FIELD_NUM_EVENT_GROUP ((FIT_LAP_FIELD_NUM)26) -#define FIT_LAP_FIELD_NUM_SWIM_STROKE ((FIT_LAP_FIELD_NUM)38) -#define FIT_LAP_FIELD_NUM_SUB_SPORT ((FIT_LAP_FIELD_NUM)39) -#define FIT_LAP_FIELD_NUM_GPS_ACCURACY ((FIT_LAP_FIELD_NUM)44) -#define FIT_LAP_FIELD_NUM_AVG_TEMPERATURE ((FIT_LAP_FIELD_NUM)50) -#define FIT_LAP_FIELD_NUM_MAX_TEMPERATURE ((FIT_LAP_FIELD_NUM)51) -#define FIT_LAP_FIELD_NUM_MIN_HEART_RATE ((FIT_LAP_FIELD_NUM)63) -#define FIT_LAP_FIELD_NUM_AVG_FRACTIONAL_CADENCE ((FIT_LAP_FIELD_NUM)80) -#define FIT_LAP_FIELD_NUM_MAX_FRACTIONAL_CADENCE ((FIT_LAP_FIELD_NUM)81) -#define FIT_LAP_FIELD_NUM_TOTAL_FRACTIONAL_CYCLES ((FIT_LAP_FIELD_NUM)82) -#define FIT_LAP_FIELD_NUM_MIN_TEMPERATURE ((FIT_LAP_FIELD_NUM)124) - -typedef enum -{ - FIT_LAP_MESG_TIMESTAMP, - FIT_LAP_MESG_START_TIME, - FIT_LAP_MESG_START_POSITION_LAT, - FIT_LAP_MESG_START_POSITION_LONG, - FIT_LAP_MESG_END_POSITION_LAT, - FIT_LAP_MESG_END_POSITION_LONG, - FIT_LAP_MESG_TOTAL_ELAPSED_TIME, - FIT_LAP_MESG_TOTAL_TIMER_TIME, - FIT_LAP_MESG_TOTAL_DISTANCE, - FIT_LAP_MESG_TOTAL_CYCLES, - FIT_LAP_MESG_TOTAL_WORK, - FIT_LAP_MESG_TOTAL_MOVING_TIME, - FIT_LAP_MESG_TIME_IN_HR_ZONE, - FIT_LAP_MESG_TIME_IN_SPEED_ZONE, - FIT_LAP_MESG_TIME_IN_CADENCE_ZONE, - FIT_LAP_MESG_TIME_IN_POWER_ZONE, - FIT_LAP_MESG_ENHANCED_AVG_SPEED, - FIT_LAP_MESG_ENHANCED_MAX_SPEED, - FIT_LAP_MESG_ENHANCED_AVG_ALTITUDE, - FIT_LAP_MESG_ENHANCED_MIN_ALTITUDE, - FIT_LAP_MESG_ENHANCED_MAX_ALTITUDE, - FIT_LAP_MESG_MESSAGE_INDEX, - FIT_LAP_MESG_TOTAL_CALORIES, - FIT_LAP_MESG_TOTAL_FAT_CALORIES, - FIT_LAP_MESG_AVG_SPEED, - FIT_LAP_MESG_MAX_SPEED, - FIT_LAP_MESG_AVG_POWER, - FIT_LAP_MESG_MAX_POWER, - FIT_LAP_MESG_TOTAL_ASCENT, - FIT_LAP_MESG_TOTAL_DESCENT, - FIT_LAP_MESG_NUM_LENGTHS, - FIT_LAP_MESG_NORMALIZED_POWER, - FIT_LAP_MESG_LEFT_RIGHT_BALANCE, - FIT_LAP_MESG_FIRST_LENGTH_INDEX, - FIT_LAP_MESG_AVG_STROKE_DISTANCE, - FIT_LAP_MESG_NUM_ACTIVE_LENGTHS, - FIT_LAP_MESG_AVG_ALTITUDE, - FIT_LAP_MESG_MAX_ALTITUDE, - FIT_LAP_MESG_AVG_GRADE, - FIT_LAP_MESG_AVG_POS_GRADE, - FIT_LAP_MESG_AVG_NEG_GRADE, - FIT_LAP_MESG_MAX_POS_GRADE, - FIT_LAP_MESG_MAX_NEG_GRADE, - FIT_LAP_MESG_AVG_POS_VERTICAL_SPEED, - FIT_LAP_MESG_AVG_NEG_VERTICAL_SPEED, - FIT_LAP_MESG_MAX_POS_VERTICAL_SPEED, - FIT_LAP_MESG_MAX_NEG_VERTICAL_SPEED, - FIT_LAP_MESG_REPETITION_NUM, - FIT_LAP_MESG_MIN_ALTITUDE, - FIT_LAP_MESG_WKT_STEP_INDEX, - FIT_LAP_MESG_OPPONENT_SCORE, - FIT_LAP_MESG_STROKE_COUNT, - FIT_LAP_MESG_ZONE_COUNT, - FIT_LAP_MESG_AVG_VERTICAL_OSCILLATION, - FIT_LAP_MESG_AVG_STANCE_TIME_PERCENT, - FIT_LAP_MESG_AVG_STANCE_TIME, - FIT_LAP_MESG_PLAYER_SCORE, - FIT_LAP_MESG_AVG_TOTAL_HEMOGLOBIN_CONC, - FIT_LAP_MESG_MIN_TOTAL_HEMOGLOBIN_CONC, - FIT_LAP_MESG_MAX_TOTAL_HEMOGLOBIN_CONC, - FIT_LAP_MESG_AVG_SATURATED_HEMOGLOBIN_PERCENT, - FIT_LAP_MESG_MIN_SATURATED_HEMOGLOBIN_PERCENT, - FIT_LAP_MESG_MAX_SATURATED_HEMOGLOBIN_PERCENT, - FIT_LAP_MESG_AVG_VAM, - FIT_LAP_MESG_EVENT, - FIT_LAP_MESG_EVENT_TYPE, - FIT_LAP_MESG_AVG_HEART_RATE, - FIT_LAP_MESG_MAX_HEART_RATE, - FIT_LAP_MESG_AVG_CADENCE, - FIT_LAP_MESG_MAX_CADENCE, - FIT_LAP_MESG_INTENSITY, - FIT_LAP_MESG_LAP_TRIGGER, - FIT_LAP_MESG_SPORT, - FIT_LAP_MESG_EVENT_GROUP, - FIT_LAP_MESG_SWIM_STROKE, - FIT_LAP_MESG_SUB_SPORT, - FIT_LAP_MESG_GPS_ACCURACY, - FIT_LAP_MESG_AVG_TEMPERATURE, - FIT_LAP_MESG_MAX_TEMPERATURE, - FIT_LAP_MESG_MIN_HEART_RATE, - FIT_LAP_MESG_AVG_FRACTIONAL_CADENCE, - FIT_LAP_MESG_MAX_FRACTIONAL_CADENCE, - FIT_LAP_MESG_TOTAL_FRACTIONAL_CYCLES, - FIT_LAP_MESG_MIN_TEMPERATURE, - FIT_LAP_MESG_FIELDS -} FIT_LAP_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_LAP_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_LAP_MESG_DEF; - -// length message - -#define FIT_LENGTH_MESG_SIZE 38 -#define FIT_LENGTH_MESG_DEF_SIZE 59 -#define FIT_LENGTH_MESG_STROKE_COUNT_COUNT 1 -#define FIT_LENGTH_MESG_ZONE_COUNT_COUNT 1 - -typedef struct -{ - FIT_DATE_TIME timestamp; // - FIT_DATE_TIME start_time; // - FIT_UINT32 total_elapsed_time; // 1000 * s + 0, - FIT_UINT32 total_timer_time; // 1000 * s + 0, - FIT_MESSAGE_INDEX message_index; // - FIT_UINT16 total_strokes; // 1 * strokes + 0, - FIT_UINT16 avg_speed; // 1000 * m/s + 0, - FIT_UINT16 total_calories; // 1 * kcal + 0, - FIT_UINT16 player_score; // - FIT_UINT16 opponent_score; // - FIT_UINT16 stroke_count[FIT_LENGTH_MESG_STROKE_COUNT_COUNT]; // 1 * counts + 0, stroke_type enum used as the index - FIT_UINT16 zone_count[FIT_LENGTH_MESG_ZONE_COUNT_COUNT]; // 1 * counts + 0, zone number used as the index - FIT_EVENT event; // - FIT_EVENT_TYPE event_type; // - FIT_SWIM_STROKE swim_stroke; // 1 * swim_stroke + 0, - FIT_UINT8 avg_swimming_cadence; // 1 * strokes/min + 0, - FIT_UINT8 event_group; // - FIT_LENGTH_TYPE length_type; // -} FIT_LENGTH_MESG; - -typedef FIT_UINT8 FIT_LENGTH_FIELD_NUM; - -#define FIT_LENGTH_FIELD_NUM_TIMESTAMP ((FIT_LENGTH_FIELD_NUM)253) -#define FIT_LENGTH_FIELD_NUM_START_TIME ((FIT_LENGTH_FIELD_NUM)2) -#define FIT_LENGTH_FIELD_NUM_TOTAL_ELAPSED_TIME ((FIT_LENGTH_FIELD_NUM)3) -#define FIT_LENGTH_FIELD_NUM_TOTAL_TIMER_TIME ((FIT_LENGTH_FIELD_NUM)4) -#define FIT_LENGTH_FIELD_NUM_MESSAGE_INDEX ((FIT_LENGTH_FIELD_NUM)254) -#define FIT_LENGTH_FIELD_NUM_TOTAL_STROKES ((FIT_LENGTH_FIELD_NUM)5) -#define FIT_LENGTH_FIELD_NUM_AVG_SPEED ((FIT_LENGTH_FIELD_NUM)6) -#define FIT_LENGTH_FIELD_NUM_TOTAL_CALORIES ((FIT_LENGTH_FIELD_NUM)11) -#define FIT_LENGTH_FIELD_NUM_PLAYER_SCORE ((FIT_LENGTH_FIELD_NUM)18) -#define FIT_LENGTH_FIELD_NUM_OPPONENT_SCORE ((FIT_LENGTH_FIELD_NUM)19) -#define FIT_LENGTH_FIELD_NUM_STROKE_COUNT ((FIT_LENGTH_FIELD_NUM)20) -#define FIT_LENGTH_FIELD_NUM_ZONE_COUNT ((FIT_LENGTH_FIELD_NUM)21) -#define FIT_LENGTH_FIELD_NUM_EVENT ((FIT_LENGTH_FIELD_NUM)0) -#define FIT_LENGTH_FIELD_NUM_EVENT_TYPE ((FIT_LENGTH_FIELD_NUM)1) -#define FIT_LENGTH_FIELD_NUM_SWIM_STROKE ((FIT_LENGTH_FIELD_NUM)7) -#define FIT_LENGTH_FIELD_NUM_AVG_SWIMMING_CADENCE ((FIT_LENGTH_FIELD_NUM)9) -#define FIT_LENGTH_FIELD_NUM_EVENT_GROUP ((FIT_LENGTH_FIELD_NUM)10) -#define FIT_LENGTH_FIELD_NUM_LENGTH_TYPE ((FIT_LENGTH_FIELD_NUM)12) - -typedef enum -{ - FIT_LENGTH_MESG_TIMESTAMP, - FIT_LENGTH_MESG_START_TIME, - FIT_LENGTH_MESG_TOTAL_ELAPSED_TIME, - FIT_LENGTH_MESG_TOTAL_TIMER_TIME, - FIT_LENGTH_MESG_MESSAGE_INDEX, - FIT_LENGTH_MESG_TOTAL_STROKES, - FIT_LENGTH_MESG_AVG_SPEED, - FIT_LENGTH_MESG_TOTAL_CALORIES, - FIT_LENGTH_MESG_PLAYER_SCORE, - FIT_LENGTH_MESG_OPPONENT_SCORE, - FIT_LENGTH_MESG_STROKE_COUNT, - FIT_LENGTH_MESG_ZONE_COUNT, - FIT_LENGTH_MESG_EVENT, - FIT_LENGTH_MESG_EVENT_TYPE, - FIT_LENGTH_MESG_SWIM_STROKE, - FIT_LENGTH_MESG_AVG_SWIMMING_CADENCE, - FIT_LENGTH_MESG_EVENT_GROUP, - FIT_LENGTH_MESG_LENGTH_TYPE, - FIT_LENGTH_MESG_FIELDS -} FIT_LENGTH_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_LENGTH_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_LENGTH_MESG_DEF; - -// record message - -#define FIT_RECORD_MESG_SIZE 99 -#define FIT_RECORD_MESG_DEF_SIZE 149 -#define FIT_RECORD_MESG_COMPRESSED_SPEED_DISTANCE_COUNT 3 -#define FIT_RECORD_MESG_SPEED_1S_COUNT 5 - -typedef struct -{ - FIT_DATE_TIME timestamp; // 1 * s + 0, - FIT_SINT32 position_lat; // 1 * semicircles + 0, - FIT_SINT32 position_long; // 1 * semicircles + 0, - FIT_UINT32 distance; // 100 * m + 0, - FIT_SINT32 time_from_course; // 1000 * s + 0, - FIT_UINT32 total_cycles; // 1 * cycles + 0, - FIT_UINT32 accumulated_power; // 1 * watts + 0, - FIT_UINT32 enhanced_speed; // 1000 * m/s + 0, - FIT_UINT32 enhanced_altitude; // 5 * m + 500, - FIT_UINT16 altitude; // 5 * m + 500, - FIT_UINT16 speed; // 1000 * m/s + 0, - FIT_UINT16 power; // 1 * watts + 0, - FIT_SINT16 grade; // 100 * % + 0, - FIT_UINT16 compressed_accumulated_power; // 1 * watts + 0, - FIT_SINT16 vertical_speed; // 1000 * m/s + 0, - FIT_UINT16 calories; // 1 * kcal + 0, - FIT_UINT16 vertical_oscillation; // 10 * mm + 0, - FIT_UINT16 stance_time_percent; // 100 * percent + 0, - FIT_UINT16 stance_time; // 10 * ms + 0, - FIT_UINT16 ball_speed; // 100 * m/s + 0, - FIT_UINT16 cadence256; // 256 * rpm + 0, Log cadence and fractional cadence for backwards compatability - FIT_UINT16 total_hemoglobin_conc; // 100 * g/dL + 0, Total saturated and unsaturated hemoglobin - FIT_UINT16 total_hemoglobin_conc_min; // 100 * g/dL + 0, Min saturated and unsaturated hemoglobin - FIT_UINT16 total_hemoglobin_conc_max; // 100 * g/dL + 0, Max saturated and unsaturated hemoglobin - FIT_UINT16 saturated_hemoglobin_percent; // 10 * % + 0, Percentage of hemoglobin saturated with oxygen - FIT_UINT16 saturated_hemoglobin_percent_min; // 10 * % + 0, Min percentage of hemoglobin saturated with oxygen - FIT_UINT16 saturated_hemoglobin_percent_max; // 10 * % + 0, Max percentage of hemoglobin saturated with oxygen - FIT_UINT8 heart_rate; // 1 * bpm + 0, - FIT_UINT8 cadence; // 1 * rpm + 0, - FIT_BYTE compressed_speed_distance[FIT_RECORD_MESG_COMPRESSED_SPEED_DISTANCE_COUNT]; // - FIT_UINT8 resistance; // Relative. 0 is none 254 is Max. - FIT_UINT8 cycle_length; // 100 * m + 0, - FIT_SINT8 temperature; // 1 * C + 0, - FIT_UINT8 speed_1s[FIT_RECORD_MESG_SPEED_1S_COUNT]; // 16 * m/s + 0, Speed at 1s intervals. Timestamp field indicates time of last array element. - FIT_UINT8 cycles; // 1 * cycles + 0, - FIT_LEFT_RIGHT_BALANCE left_right_balance; // - FIT_UINT8 gps_accuracy; // 1 * m + 0, - FIT_ACTIVITY_TYPE activity_type; // - FIT_UINT8 left_torque_effectiveness; // 2 * percent + 0, - FIT_UINT8 right_torque_effectiveness; // 2 * percent + 0, - FIT_UINT8 left_pedal_smoothness; // 2 * percent + 0, - FIT_UINT8 right_pedal_smoothness; // 2 * percent + 0, - FIT_UINT8 combined_pedal_smoothness; // 2 * percent + 0, - FIT_UINT8 time128; // 128 * s + 0, - FIT_STROKE_TYPE stroke_type; // - FIT_UINT8 zone; // - FIT_UINT8 fractional_cadence; // 128 * rpm + 0, - FIT_DEVICE_INDEX device_index; // -} FIT_RECORD_MESG; - -typedef FIT_UINT8 FIT_RECORD_FIELD_NUM; - -#define FIT_RECORD_FIELD_NUM_TIMESTAMP ((FIT_RECORD_FIELD_NUM)253) -#define FIT_RECORD_FIELD_NUM_POSITION_LAT ((FIT_RECORD_FIELD_NUM)0) -#define FIT_RECORD_FIELD_NUM_POSITION_LONG ((FIT_RECORD_FIELD_NUM)1) -#define FIT_RECORD_FIELD_NUM_DISTANCE ((FIT_RECORD_FIELD_NUM)5) -#define FIT_RECORD_FIELD_NUM_TIME_FROM_COURSE ((FIT_RECORD_FIELD_NUM)11) -#define FIT_RECORD_FIELD_NUM_TOTAL_CYCLES ((FIT_RECORD_FIELD_NUM)19) -#define FIT_RECORD_FIELD_NUM_ACCUMULATED_POWER ((FIT_RECORD_FIELD_NUM)29) -#define FIT_RECORD_FIELD_NUM_ENHANCED_SPEED ((FIT_RECORD_FIELD_NUM)73) -#define FIT_RECORD_FIELD_NUM_ENHANCED_ALTITUDE ((FIT_RECORD_FIELD_NUM)78) -#define FIT_RECORD_FIELD_NUM_ALTITUDE ((FIT_RECORD_FIELD_NUM)2) -#define FIT_RECORD_FIELD_NUM_SPEED ((FIT_RECORD_FIELD_NUM)6) -#define FIT_RECORD_FIELD_NUM_POWER ((FIT_RECORD_FIELD_NUM)7) -#define FIT_RECORD_FIELD_NUM_GRADE ((FIT_RECORD_FIELD_NUM)9) -#define FIT_RECORD_FIELD_NUM_COMPRESSED_ACCUMULATED_POWER ((FIT_RECORD_FIELD_NUM)28) -#define FIT_RECORD_FIELD_NUM_VERTICAL_SPEED ((FIT_RECORD_FIELD_NUM)32) -#define FIT_RECORD_FIELD_NUM_CALORIES ((FIT_RECORD_FIELD_NUM)33) -#define FIT_RECORD_FIELD_NUM_VERTICAL_OSCILLATION ((FIT_RECORD_FIELD_NUM)39) -#define FIT_RECORD_FIELD_NUM_STANCE_TIME_PERCENT ((FIT_RECORD_FIELD_NUM)40) -#define FIT_RECORD_FIELD_NUM_STANCE_TIME ((FIT_RECORD_FIELD_NUM)41) -#define FIT_RECORD_FIELD_NUM_BALL_SPEED ((FIT_RECORD_FIELD_NUM)51) -#define FIT_RECORD_FIELD_NUM_CADENCE256 ((FIT_RECORD_FIELD_NUM)52) -#define FIT_RECORD_FIELD_NUM_TOTAL_HEMOGLOBIN_CONC ((FIT_RECORD_FIELD_NUM)54) -#define FIT_RECORD_FIELD_NUM_TOTAL_HEMOGLOBIN_CONC_MIN ((FIT_RECORD_FIELD_NUM)55) -#define FIT_RECORD_FIELD_NUM_TOTAL_HEMOGLOBIN_CONC_MAX ((FIT_RECORD_FIELD_NUM)56) -#define FIT_RECORD_FIELD_NUM_SATURATED_HEMOGLOBIN_PERCENT ((FIT_RECORD_FIELD_NUM)57) -#define FIT_RECORD_FIELD_NUM_SATURATED_HEMOGLOBIN_PERCENT_MIN ((FIT_RECORD_FIELD_NUM)58) -#define FIT_RECORD_FIELD_NUM_SATURATED_HEMOGLOBIN_PERCENT_MAX ((FIT_RECORD_FIELD_NUM)59) -#define FIT_RECORD_FIELD_NUM_HEART_RATE ((FIT_RECORD_FIELD_NUM)3) -#define FIT_RECORD_FIELD_NUM_CADENCE ((FIT_RECORD_FIELD_NUM)4) -#define FIT_RECORD_FIELD_NUM_COMPRESSED_SPEED_DISTANCE ((FIT_RECORD_FIELD_NUM)8) -#define FIT_RECORD_FIELD_NUM_RESISTANCE ((FIT_RECORD_FIELD_NUM)10) -#define FIT_RECORD_FIELD_NUM_CYCLE_LENGTH ((FIT_RECORD_FIELD_NUM)12) -#define FIT_RECORD_FIELD_NUM_TEMPERATURE ((FIT_RECORD_FIELD_NUM)13) -#define FIT_RECORD_FIELD_NUM_SPEED_1S ((FIT_RECORD_FIELD_NUM)17) -#define FIT_RECORD_FIELD_NUM_CYCLES ((FIT_RECORD_FIELD_NUM)18) -#define FIT_RECORD_FIELD_NUM_LEFT_RIGHT_BALANCE ((FIT_RECORD_FIELD_NUM)30) -#define FIT_RECORD_FIELD_NUM_GPS_ACCURACY ((FIT_RECORD_FIELD_NUM)31) -#define FIT_RECORD_FIELD_NUM_ACTIVITY_TYPE ((FIT_RECORD_FIELD_NUM)42) -#define FIT_RECORD_FIELD_NUM_LEFT_TORQUE_EFFECTIVENESS ((FIT_RECORD_FIELD_NUM)43) -#define FIT_RECORD_FIELD_NUM_RIGHT_TORQUE_EFFECTIVENESS ((FIT_RECORD_FIELD_NUM)44) -#define FIT_RECORD_FIELD_NUM_LEFT_PEDAL_SMOOTHNESS ((FIT_RECORD_FIELD_NUM)45) -#define FIT_RECORD_FIELD_NUM_RIGHT_PEDAL_SMOOTHNESS ((FIT_RECORD_FIELD_NUM)46) -#define FIT_RECORD_FIELD_NUM_COMBINED_PEDAL_SMOOTHNESS ((FIT_RECORD_FIELD_NUM)47) -#define FIT_RECORD_FIELD_NUM_TIME128 ((FIT_RECORD_FIELD_NUM)48) -#define FIT_RECORD_FIELD_NUM_STROKE_TYPE ((FIT_RECORD_FIELD_NUM)49) -#define FIT_RECORD_FIELD_NUM_ZONE ((FIT_RECORD_FIELD_NUM)50) -#define FIT_RECORD_FIELD_NUM_FRACTIONAL_CADENCE ((FIT_RECORD_FIELD_NUM)53) -#define FIT_RECORD_FIELD_NUM_DEVICE_INDEX ((FIT_RECORD_FIELD_NUM)62) - -typedef enum -{ - FIT_RECORD_MESG_TIMESTAMP, - FIT_RECORD_MESG_POSITION_LAT, - FIT_RECORD_MESG_POSITION_LONG, - FIT_RECORD_MESG_DISTANCE, - FIT_RECORD_MESG_TIME_FROM_COURSE, - FIT_RECORD_MESG_TOTAL_CYCLES, - FIT_RECORD_MESG_ACCUMULATED_POWER, - FIT_RECORD_MESG_ENHANCED_SPEED, - FIT_RECORD_MESG_ENHANCED_ALTITUDE, - FIT_RECORD_MESG_ALTITUDE, - FIT_RECORD_MESG_SPEED, - FIT_RECORD_MESG_POWER, - FIT_RECORD_MESG_GRADE, - FIT_RECORD_MESG_COMPRESSED_ACCUMULATED_POWER, - FIT_RECORD_MESG_VERTICAL_SPEED, - FIT_RECORD_MESG_CALORIES, - FIT_RECORD_MESG_VERTICAL_OSCILLATION, - FIT_RECORD_MESG_STANCE_TIME_PERCENT, - FIT_RECORD_MESG_STANCE_TIME, - FIT_RECORD_MESG_BALL_SPEED, - FIT_RECORD_MESG_CADENCE256, - FIT_RECORD_MESG_TOTAL_HEMOGLOBIN_CONC, - FIT_RECORD_MESG_TOTAL_HEMOGLOBIN_CONC_MIN, - FIT_RECORD_MESG_TOTAL_HEMOGLOBIN_CONC_MAX, - FIT_RECORD_MESG_SATURATED_HEMOGLOBIN_PERCENT, - FIT_RECORD_MESG_SATURATED_HEMOGLOBIN_PERCENT_MIN, - FIT_RECORD_MESG_SATURATED_HEMOGLOBIN_PERCENT_MAX, - FIT_RECORD_MESG_HEART_RATE, - FIT_RECORD_MESG_CADENCE, - FIT_RECORD_MESG_COMPRESSED_SPEED_DISTANCE, - FIT_RECORD_MESG_RESISTANCE, - FIT_RECORD_MESG_CYCLE_LENGTH, - FIT_RECORD_MESG_TEMPERATURE, - FIT_RECORD_MESG_SPEED_1S, - FIT_RECORD_MESG_CYCLES, - FIT_RECORD_MESG_LEFT_RIGHT_BALANCE, - FIT_RECORD_MESG_GPS_ACCURACY, - FIT_RECORD_MESG_ACTIVITY_TYPE, - FIT_RECORD_MESG_LEFT_TORQUE_EFFECTIVENESS, - FIT_RECORD_MESG_RIGHT_TORQUE_EFFECTIVENESS, - FIT_RECORD_MESG_LEFT_PEDAL_SMOOTHNESS, - FIT_RECORD_MESG_RIGHT_PEDAL_SMOOTHNESS, - FIT_RECORD_MESG_COMBINED_PEDAL_SMOOTHNESS, - FIT_RECORD_MESG_TIME128, - FIT_RECORD_MESG_STROKE_TYPE, - FIT_RECORD_MESG_ZONE, - FIT_RECORD_MESG_FRACTIONAL_CADENCE, - FIT_RECORD_MESG_DEVICE_INDEX, - FIT_RECORD_MESG_FIELDS -} FIT_RECORD_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_RECORD_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_RECORD_MESG_DEF; - -// event message - -#define FIT_EVENT_MESG_SIZE 23 -#define FIT_EVENT_MESG_DEF_SIZE 47 - -typedef struct -{ - FIT_DATE_TIME timestamp; // 1 * s + 0, - FIT_UINT32 data; // - FIT_UINT16 data16; // - FIT_UINT16 score; // Do not populate directly. Autogenerated by decoder for sport_point subfield components - FIT_UINT16 opponent_score; // Do not populate directly. Autogenerated by decoder for sport_point subfield components - FIT_EVENT event; // - FIT_EVENT_TYPE event_type; // - FIT_UINT8 event_group; // - FIT_UINT8Z front_gear_num; // Do not populate directly. Autogenerated by decoder for gear_change subfield components. Front gear number. 1 is innermost. - FIT_UINT8Z front_gear; // Do not populate directly. Autogenerated by decoder for gear_change subfield components. Number of front teeth. - FIT_UINT8Z rear_gear_num; // Do not populate directly. Autogenerated by decoder for gear_change subfield components. Rear gear number. 1 is innermost. - FIT_UINT8Z rear_gear; // Do not populate directly. Autogenerated by decoder for gear_change subfield components. Number of rear teeth. - FIT_RADAR_THREAT_LEVEL_TYPE radar_threat_level_max; // Do not populate directly. Autogenerated by decoder for threat_alert subfield components. - FIT_UINT8 radar_threat_count; // Do not populate directly. Autogenerated by decoder for threat_alert subfield components. -} FIT_EVENT_MESG; - -typedef FIT_UINT8 FIT_EVENT_FIELD_NUM; - -#define FIT_EVENT_FIELD_NUM_TIMESTAMP ((FIT_EVENT_FIELD_NUM)253) -#define FIT_EVENT_FIELD_NUM_DATA ((FIT_EVENT_FIELD_NUM)3) -#define FIT_EVENT_FIELD_NUM_DATA16 ((FIT_EVENT_FIELD_NUM)2) -#define FIT_EVENT_FIELD_NUM_SCORE ((FIT_EVENT_FIELD_NUM)7) -#define FIT_EVENT_FIELD_NUM_OPPONENT_SCORE ((FIT_EVENT_FIELD_NUM)8) -#define FIT_EVENT_FIELD_NUM_EVENT ((FIT_EVENT_FIELD_NUM)0) -#define FIT_EVENT_FIELD_NUM_EVENT_TYPE ((FIT_EVENT_FIELD_NUM)1) -#define FIT_EVENT_FIELD_NUM_EVENT_GROUP ((FIT_EVENT_FIELD_NUM)4) -#define FIT_EVENT_FIELD_NUM_FRONT_GEAR_NUM ((FIT_EVENT_FIELD_NUM)9) -#define FIT_EVENT_FIELD_NUM_FRONT_GEAR ((FIT_EVENT_FIELD_NUM)10) -#define FIT_EVENT_FIELD_NUM_REAR_GEAR_NUM ((FIT_EVENT_FIELD_NUM)11) -#define FIT_EVENT_FIELD_NUM_REAR_GEAR ((FIT_EVENT_FIELD_NUM)12) -#define FIT_EVENT_FIELD_NUM_RADAR_THREAT_LEVEL_MAX ((FIT_EVENT_FIELD_NUM)21) -#define FIT_EVENT_FIELD_NUM_RADAR_THREAT_COUNT ((FIT_EVENT_FIELD_NUM)22) - -typedef enum -{ - FIT_EVENT_MESG_TIMESTAMP, - FIT_EVENT_MESG_DATA, - FIT_EVENT_MESG_DATA16, - FIT_EVENT_MESG_SCORE, - FIT_EVENT_MESG_OPPONENT_SCORE, - FIT_EVENT_MESG_EVENT, - FIT_EVENT_MESG_EVENT_TYPE, - FIT_EVENT_MESG_EVENT_GROUP, - FIT_EVENT_MESG_FRONT_GEAR_NUM, - FIT_EVENT_MESG_FRONT_GEAR, - FIT_EVENT_MESG_REAR_GEAR_NUM, - FIT_EVENT_MESG_REAR_GEAR, - FIT_EVENT_MESG_RADAR_THREAT_LEVEL_MAX, - FIT_EVENT_MESG_RADAR_THREAT_COUNT, - FIT_EVENT_MESG_FIELDS -} FIT_EVENT_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_EVENT_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_EVENT_MESG_DEF; - -// device_info message - -#define FIT_DEVICE_INFO_MESG_SIZE 51 -#define FIT_DEVICE_INFO_MESG_DEF_SIZE 59 -#define FIT_DEVICE_INFO_MESG_PRODUCT_NAME_COUNT 20 -#define FIT_DEVICE_INFO_MESG_DESCRIPTOR_COUNT 1 - -typedef struct -{ - FIT_DATE_TIME timestamp; // 1 * s + 0, - FIT_UINT32Z serial_number; // - FIT_UINT32 cum_operating_time; // 1 * s + 0, Reset by new battery or charge. - FIT_STRING product_name[FIT_DEVICE_INFO_MESG_PRODUCT_NAME_COUNT]; // Optional free form string to indicate the devices name or model - FIT_MANUFACTURER manufacturer; // - FIT_UINT16 product; // - FIT_UINT16 software_version; // - FIT_UINT16 battery_voltage; // 256 * V + 0, - FIT_UINT16Z ant_device_number; // - FIT_DEVICE_INDEX device_index; // - FIT_UINT8 device_type; // - FIT_UINT8 hardware_version; // - FIT_BATTERY_STATUS battery_status; // - FIT_BODY_LOCATION sensor_position; // Indicates the location of the sensor - FIT_STRING descriptor[FIT_DEVICE_INFO_MESG_DESCRIPTOR_COUNT]; // Used to describe the sensor or location - FIT_UINT8Z ant_transmission_type; // - FIT_ANT_NETWORK ant_network; // - FIT_SOURCE_TYPE source_type; // -} FIT_DEVICE_INFO_MESG; - -typedef FIT_UINT8 FIT_DEVICE_INFO_FIELD_NUM; - -#define FIT_DEVICE_INFO_FIELD_NUM_TIMESTAMP ((FIT_DEVICE_INFO_FIELD_NUM)253) -#define FIT_DEVICE_INFO_FIELD_NUM_SERIAL_NUMBER ((FIT_DEVICE_INFO_FIELD_NUM)3) -#define FIT_DEVICE_INFO_FIELD_NUM_CUM_OPERATING_TIME ((FIT_DEVICE_INFO_FIELD_NUM)7) -#define FIT_DEVICE_INFO_FIELD_NUM_PRODUCT_NAME ((FIT_DEVICE_INFO_FIELD_NUM)27) -#define FIT_DEVICE_INFO_FIELD_NUM_MANUFACTURER ((FIT_DEVICE_INFO_FIELD_NUM)2) -#define FIT_DEVICE_INFO_FIELD_NUM_PRODUCT ((FIT_DEVICE_INFO_FIELD_NUM)4) -#define FIT_DEVICE_INFO_FIELD_NUM_SOFTWARE_VERSION ((FIT_DEVICE_INFO_FIELD_NUM)5) -#define FIT_DEVICE_INFO_FIELD_NUM_BATTERY_VOLTAGE ((FIT_DEVICE_INFO_FIELD_NUM)10) -#define FIT_DEVICE_INFO_FIELD_NUM_ANT_DEVICE_NUMBER ((FIT_DEVICE_INFO_FIELD_NUM)21) -#define FIT_DEVICE_INFO_FIELD_NUM_DEVICE_INDEX ((FIT_DEVICE_INFO_FIELD_NUM)0) -#define FIT_DEVICE_INFO_FIELD_NUM_DEVICE_TYPE ((FIT_DEVICE_INFO_FIELD_NUM)1) -#define FIT_DEVICE_INFO_FIELD_NUM_HARDWARE_VERSION ((FIT_DEVICE_INFO_FIELD_NUM)6) -#define FIT_DEVICE_INFO_FIELD_NUM_BATTERY_STATUS ((FIT_DEVICE_INFO_FIELD_NUM)11) -#define FIT_DEVICE_INFO_FIELD_NUM_SENSOR_POSITION ((FIT_DEVICE_INFO_FIELD_NUM)18) -#define FIT_DEVICE_INFO_FIELD_NUM_DESCRIPTOR ((FIT_DEVICE_INFO_FIELD_NUM)19) -#define FIT_DEVICE_INFO_FIELD_NUM_ANT_TRANSMISSION_TYPE ((FIT_DEVICE_INFO_FIELD_NUM)20) -#define FIT_DEVICE_INFO_FIELD_NUM_ANT_NETWORK ((FIT_DEVICE_INFO_FIELD_NUM)22) -#define FIT_DEVICE_INFO_FIELD_NUM_SOURCE_TYPE ((FIT_DEVICE_INFO_FIELD_NUM)25) - -typedef enum -{ - FIT_DEVICE_INFO_MESG_TIMESTAMP, - FIT_DEVICE_INFO_MESG_SERIAL_NUMBER, - FIT_DEVICE_INFO_MESG_CUM_OPERATING_TIME, - FIT_DEVICE_INFO_MESG_PRODUCT_NAME, - FIT_DEVICE_INFO_MESG_MANUFACTURER, - FIT_DEVICE_INFO_MESG_PRODUCT, - FIT_DEVICE_INFO_MESG_SOFTWARE_VERSION, - FIT_DEVICE_INFO_MESG_BATTERY_VOLTAGE, - FIT_DEVICE_INFO_MESG_ANT_DEVICE_NUMBER, - FIT_DEVICE_INFO_MESG_DEVICE_INDEX, - FIT_DEVICE_INFO_MESG_DEVICE_TYPE, - FIT_DEVICE_INFO_MESG_HARDWARE_VERSION, - FIT_DEVICE_INFO_MESG_BATTERY_STATUS, - FIT_DEVICE_INFO_MESG_SENSOR_POSITION, - FIT_DEVICE_INFO_MESG_DESCRIPTOR, - FIT_DEVICE_INFO_MESG_ANT_TRANSMISSION_TYPE, - FIT_DEVICE_INFO_MESG_ANT_NETWORK, - FIT_DEVICE_INFO_MESG_SOURCE_TYPE, - FIT_DEVICE_INFO_MESG_FIELDS -} FIT_DEVICE_INFO_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_DEVICE_INFO_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_DEVICE_INFO_MESG_DEF; - -// device_aux_battery_info message - -#define FIT_DEVICE_AUX_BATTERY_INFO_MESG_SIZE 9 -#define FIT_DEVICE_AUX_BATTERY_INFO_MESG_DEF_SIZE 20 - -typedef struct -{ - FIT_DATE_TIME timestamp; // - FIT_UINT16 battery_voltage; // 256 * V + 0, - FIT_DEVICE_INDEX device_index; // - FIT_BATTERY_STATUS battery_status; // - FIT_UINT8 battery_identifier; // -} FIT_DEVICE_AUX_BATTERY_INFO_MESG; - -typedef FIT_UINT8 FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM; - -#define FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM_TIMESTAMP ((FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM)253) -#define FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM_BATTERY_VOLTAGE ((FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM)1) -#define FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM_DEVICE_INDEX ((FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM)0) -#define FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM_BATTERY_STATUS ((FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM)2) -#define FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM_BATTERY_IDENTIFIER ((FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM)3) - -typedef enum -{ - FIT_DEVICE_AUX_BATTERY_INFO_MESG_TIMESTAMP, - FIT_DEVICE_AUX_BATTERY_INFO_MESG_BATTERY_VOLTAGE, - FIT_DEVICE_AUX_BATTERY_INFO_MESG_DEVICE_INDEX, - FIT_DEVICE_AUX_BATTERY_INFO_MESG_BATTERY_STATUS, - FIT_DEVICE_AUX_BATTERY_INFO_MESG_BATTERY_IDENTIFIER, - FIT_DEVICE_AUX_BATTERY_INFO_MESG_FIELDS -} FIT_DEVICE_AUX_BATTERY_INFO_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_DEVICE_AUX_BATTERY_INFO_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_DEVICE_AUX_BATTERY_INFO_MESG_DEF; - -// training_file message - -#define FIT_TRAINING_FILE_MESG_SIZE 17 -#define FIT_TRAINING_FILE_MESG_DEF_SIZE 23 - -typedef struct -{ - FIT_DATE_TIME timestamp; // - FIT_UINT32Z serial_number; // - FIT_DATE_TIME time_created; // - FIT_MANUFACTURER manufacturer; // - FIT_UINT16 product; // - FIT_FILE type; // -} FIT_TRAINING_FILE_MESG; - -typedef FIT_UINT8 FIT_TRAINING_FILE_FIELD_NUM; - -#define FIT_TRAINING_FILE_FIELD_NUM_TIMESTAMP ((FIT_TRAINING_FILE_FIELD_NUM)253) -#define FIT_TRAINING_FILE_FIELD_NUM_SERIAL_NUMBER ((FIT_TRAINING_FILE_FIELD_NUM)3) -#define FIT_TRAINING_FILE_FIELD_NUM_TIME_CREATED ((FIT_TRAINING_FILE_FIELD_NUM)4) -#define FIT_TRAINING_FILE_FIELD_NUM_MANUFACTURER ((FIT_TRAINING_FILE_FIELD_NUM)1) -#define FIT_TRAINING_FILE_FIELD_NUM_PRODUCT ((FIT_TRAINING_FILE_FIELD_NUM)2) -#define FIT_TRAINING_FILE_FIELD_NUM_TYPE ((FIT_TRAINING_FILE_FIELD_NUM)0) - -typedef enum -{ - FIT_TRAINING_FILE_MESG_TIMESTAMP, - FIT_TRAINING_FILE_MESG_SERIAL_NUMBER, - FIT_TRAINING_FILE_MESG_TIME_CREATED, - FIT_TRAINING_FILE_MESG_MANUFACTURER, - FIT_TRAINING_FILE_MESG_PRODUCT, - FIT_TRAINING_FILE_MESG_TYPE, - FIT_TRAINING_FILE_MESG_FIELDS -} FIT_TRAINING_FILE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_TRAINING_FILE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_TRAINING_FILE_MESG_DEF; - -// weather_conditions message - -#define FIT_WEATHER_CONDITIONS_MESG_SIZE 93 -#define FIT_WEATHER_CONDITIONS_MESG_DEF_SIZE 53 -#define FIT_WEATHER_CONDITIONS_MESG_LOCATION_COUNT 64 - -typedef struct -{ - FIT_DATE_TIME timestamp; // time of update for current conditions, else forecast time - FIT_STRING location[FIT_WEATHER_CONDITIONS_MESG_LOCATION_COUNT]; // string corresponding to GCS response location string - FIT_DATE_TIME observed_at_time; // - FIT_SINT32 observed_location_lat; // 1 * semicircles + 0, - FIT_SINT32 observed_location_long; // 1 * semicircles + 0, - FIT_UINT16 wind_direction; // 1 * degrees + 0, - FIT_UINT16 wind_speed; // 1000 * m/s + 0, - FIT_WEATHER_REPORT weather_report; // Current or forecast - FIT_SINT8 temperature; // 1 * C + 0, - FIT_WEATHER_STATUS condition; // Corresponds to GSC Response weatherIcon field - FIT_UINT8 precipitation_probability; // range 0-100 - FIT_SINT8 temperature_feels_like; // 1 * C + 0, Heat Index if GCS heatIdx above or equal to 90F or wind chill if GCS windChill below or equal to 32F - FIT_UINT8 relative_humidity; // - FIT_DAY_OF_WEEK day_of_week; // - FIT_SINT8 high_temperature; // 1 * C + 0, - FIT_SINT8 low_temperature; // 1 * C + 0, -} FIT_WEATHER_CONDITIONS_MESG; - -typedef FIT_UINT8 FIT_WEATHER_CONDITIONS_FIELD_NUM; - -#define FIT_WEATHER_CONDITIONS_FIELD_NUM_TIMESTAMP ((FIT_WEATHER_CONDITIONS_FIELD_NUM)253) -#define FIT_WEATHER_CONDITIONS_FIELD_NUM_LOCATION ((FIT_WEATHER_CONDITIONS_FIELD_NUM)8) -#define FIT_WEATHER_CONDITIONS_FIELD_NUM_OBSERVED_AT_TIME ((FIT_WEATHER_CONDITIONS_FIELD_NUM)9) -#define FIT_WEATHER_CONDITIONS_FIELD_NUM_OBSERVED_LOCATION_LAT ((FIT_WEATHER_CONDITIONS_FIELD_NUM)10) -#define FIT_WEATHER_CONDITIONS_FIELD_NUM_OBSERVED_LOCATION_LONG ((FIT_WEATHER_CONDITIONS_FIELD_NUM)11) -#define FIT_WEATHER_CONDITIONS_FIELD_NUM_WIND_DIRECTION ((FIT_WEATHER_CONDITIONS_FIELD_NUM)3) -#define FIT_WEATHER_CONDITIONS_FIELD_NUM_WIND_SPEED ((FIT_WEATHER_CONDITIONS_FIELD_NUM)4) -#define FIT_WEATHER_CONDITIONS_FIELD_NUM_WEATHER_REPORT ((FIT_WEATHER_CONDITIONS_FIELD_NUM)0) -#define FIT_WEATHER_CONDITIONS_FIELD_NUM_TEMPERATURE ((FIT_WEATHER_CONDITIONS_FIELD_NUM)1) -#define FIT_WEATHER_CONDITIONS_FIELD_NUM_CONDITION ((FIT_WEATHER_CONDITIONS_FIELD_NUM)2) -#define FIT_WEATHER_CONDITIONS_FIELD_NUM_PRECIPITATION_PROBABILITY ((FIT_WEATHER_CONDITIONS_FIELD_NUM)5) -#define FIT_WEATHER_CONDITIONS_FIELD_NUM_TEMPERATURE_FEELS_LIKE ((FIT_WEATHER_CONDITIONS_FIELD_NUM)6) -#define FIT_WEATHER_CONDITIONS_FIELD_NUM_RELATIVE_HUMIDITY ((FIT_WEATHER_CONDITIONS_FIELD_NUM)7) -#define FIT_WEATHER_CONDITIONS_FIELD_NUM_DAY_OF_WEEK ((FIT_WEATHER_CONDITIONS_FIELD_NUM)12) -#define FIT_WEATHER_CONDITIONS_FIELD_NUM_HIGH_TEMPERATURE ((FIT_WEATHER_CONDITIONS_FIELD_NUM)13) -#define FIT_WEATHER_CONDITIONS_FIELD_NUM_LOW_TEMPERATURE ((FIT_WEATHER_CONDITIONS_FIELD_NUM)14) - -typedef enum -{ - FIT_WEATHER_CONDITIONS_MESG_TIMESTAMP, - FIT_WEATHER_CONDITIONS_MESG_LOCATION, - FIT_WEATHER_CONDITIONS_MESG_OBSERVED_AT_TIME, - FIT_WEATHER_CONDITIONS_MESG_OBSERVED_LOCATION_LAT, - FIT_WEATHER_CONDITIONS_MESG_OBSERVED_LOCATION_LONG, - FIT_WEATHER_CONDITIONS_MESG_WIND_DIRECTION, - FIT_WEATHER_CONDITIONS_MESG_WIND_SPEED, - FIT_WEATHER_CONDITIONS_MESG_WEATHER_REPORT, - FIT_WEATHER_CONDITIONS_MESG_TEMPERATURE, - FIT_WEATHER_CONDITIONS_MESG_CONDITION, - FIT_WEATHER_CONDITIONS_MESG_PRECIPITATION_PROBABILITY, - FIT_WEATHER_CONDITIONS_MESG_TEMPERATURE_FEELS_LIKE, - FIT_WEATHER_CONDITIONS_MESG_RELATIVE_HUMIDITY, - FIT_WEATHER_CONDITIONS_MESG_DAY_OF_WEEK, - FIT_WEATHER_CONDITIONS_MESG_HIGH_TEMPERATURE, - FIT_WEATHER_CONDITIONS_MESG_LOW_TEMPERATURE, - FIT_WEATHER_CONDITIONS_MESG_FIELDS -} FIT_WEATHER_CONDITIONS_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_WEATHER_CONDITIONS_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_WEATHER_CONDITIONS_MESG_DEF; - -// weather_alert message - -#define FIT_WEATHER_ALERT_MESG_SIZE 26 -#define FIT_WEATHER_ALERT_MESG_DEF_SIZE 23 -#define FIT_WEATHER_ALERT_MESG_REPORT_ID_COUNT 12 - -typedef struct -{ - FIT_DATE_TIME timestamp; // - FIT_STRING report_id[FIT_WEATHER_ALERT_MESG_REPORT_ID_COUNT]; // Unique identifier from GCS report ID string, length is 12 - FIT_DATE_TIME issue_time; // Time alert was issued - FIT_DATE_TIME expire_time; // Time alert expires - FIT_WEATHER_SEVERITY severity; // Warning, Watch, Advisory, Statement - FIT_WEATHER_SEVERE_TYPE type; // Tornado, Severe Thunderstorm, etc. -} FIT_WEATHER_ALERT_MESG; - -typedef FIT_UINT8 FIT_WEATHER_ALERT_FIELD_NUM; - -#define FIT_WEATHER_ALERT_FIELD_NUM_TIMESTAMP ((FIT_WEATHER_ALERT_FIELD_NUM)253) -#define FIT_WEATHER_ALERT_FIELD_NUM_REPORT_ID ((FIT_WEATHER_ALERT_FIELD_NUM)0) -#define FIT_WEATHER_ALERT_FIELD_NUM_ISSUE_TIME ((FIT_WEATHER_ALERT_FIELD_NUM)1) -#define FIT_WEATHER_ALERT_FIELD_NUM_EXPIRE_TIME ((FIT_WEATHER_ALERT_FIELD_NUM)2) -#define FIT_WEATHER_ALERT_FIELD_NUM_SEVERITY ((FIT_WEATHER_ALERT_FIELD_NUM)3) -#define FIT_WEATHER_ALERT_FIELD_NUM_TYPE ((FIT_WEATHER_ALERT_FIELD_NUM)4) - -typedef enum -{ - FIT_WEATHER_ALERT_MESG_TIMESTAMP, - FIT_WEATHER_ALERT_MESG_REPORT_ID, - FIT_WEATHER_ALERT_MESG_ISSUE_TIME, - FIT_WEATHER_ALERT_MESG_EXPIRE_TIME, - FIT_WEATHER_ALERT_MESG_SEVERITY, - FIT_WEATHER_ALERT_MESG_TYPE, - FIT_WEATHER_ALERT_MESG_FIELDS -} FIT_WEATHER_ALERT_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_WEATHER_ALERT_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_WEATHER_ALERT_MESG_DEF; - -// nmea_sentence message - -#define FIT_NMEA_SENTENCE_MESG_SIZE 89 -#define FIT_NMEA_SENTENCE_MESG_DEF_SIZE 14 -#define FIT_NMEA_SENTENCE_MESG_SENTENCE_COUNT 83 - -typedef struct -{ - FIT_DATE_TIME timestamp; // 1 * s + 0, Timestamp message was output - FIT_UINT16 timestamp_ms; // 1 * ms + 0, Fractional part of timestamp, added to timestamp - FIT_STRING sentence[FIT_NMEA_SENTENCE_MESG_SENTENCE_COUNT]; // NMEA sentence -} FIT_NMEA_SENTENCE_MESG; - -typedef FIT_UINT8 FIT_NMEA_SENTENCE_FIELD_NUM; - -#define FIT_NMEA_SENTENCE_FIELD_NUM_TIMESTAMP ((FIT_NMEA_SENTENCE_FIELD_NUM)253) -#define FIT_NMEA_SENTENCE_FIELD_NUM_TIMESTAMP_MS ((FIT_NMEA_SENTENCE_FIELD_NUM)0) -#define FIT_NMEA_SENTENCE_FIELD_NUM_SENTENCE ((FIT_NMEA_SENTENCE_FIELD_NUM)1) - -typedef enum -{ - FIT_NMEA_SENTENCE_MESG_TIMESTAMP, - FIT_NMEA_SENTENCE_MESG_TIMESTAMP_MS, - FIT_NMEA_SENTENCE_MESG_SENTENCE, - FIT_NMEA_SENTENCE_MESG_FIELDS -} FIT_NMEA_SENTENCE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_NMEA_SENTENCE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_NMEA_SENTENCE_MESG_DEF; - -// aviation_attitude message - -#define FIT_AVIATION_ATTITUDE_MESG_SIZE 26 -#define FIT_AVIATION_ATTITUDE_MESG_DEF_SIZE 41 -#define FIT_AVIATION_ATTITUDE_MESG_SYSTEM_TIME_COUNT 1 -#define FIT_AVIATION_ATTITUDE_MESG_PITCH_COUNT 1 -#define FIT_AVIATION_ATTITUDE_MESG_ROLL_COUNT 1 -#define FIT_AVIATION_ATTITUDE_MESG_ACCEL_LATERAL_COUNT 1 -#define FIT_AVIATION_ATTITUDE_MESG_ACCEL_NORMAL_COUNT 1 -#define FIT_AVIATION_ATTITUDE_MESG_TURN_RATE_COUNT 1 -#define FIT_AVIATION_ATTITUDE_MESG_TRACK_COUNT 1 -#define FIT_AVIATION_ATTITUDE_MESG_VALIDITY_COUNT 1 -#define FIT_AVIATION_ATTITUDE_MESG_STAGE_COUNT 1 -#define FIT_AVIATION_ATTITUDE_MESG_ATTITUDE_STAGE_COMPLETE_COUNT 1 - -typedef struct -{ - FIT_DATE_TIME timestamp; // 1 * s + 0, Timestamp message was output - FIT_UINT32 system_time[FIT_AVIATION_ATTITUDE_MESG_SYSTEM_TIME_COUNT]; // 1 * ms + 0, System time associated with sample expressed in ms. - FIT_UINT16 timestamp_ms; // 1 * ms + 0, Fractional part of timestamp, added to timestamp - FIT_SINT16 pitch[FIT_AVIATION_ATTITUDE_MESG_PITCH_COUNT]; // 10430.38 * radians + 0, Range -PI/2 to +PI/2 - FIT_SINT16 roll[FIT_AVIATION_ATTITUDE_MESG_ROLL_COUNT]; // 10430.38 * radians + 0, Range -PI to +PI - FIT_SINT16 accel_lateral[FIT_AVIATION_ATTITUDE_MESG_ACCEL_LATERAL_COUNT]; // 100 * m/s^2 + 0, Range -78.4 to +78.4 (-8 Gs to 8 Gs) - FIT_SINT16 accel_normal[FIT_AVIATION_ATTITUDE_MESG_ACCEL_NORMAL_COUNT]; // 100 * m/s^2 + 0, Range -78.4 to +78.4 (-8 Gs to 8 Gs) - FIT_SINT16 turn_rate[FIT_AVIATION_ATTITUDE_MESG_TURN_RATE_COUNT]; // 1024 * radians/second + 0, Range -8.727 to +8.727 (-500 degs/sec to +500 degs/sec) - FIT_UINT16 track[FIT_AVIATION_ATTITUDE_MESG_TRACK_COUNT]; // 10430.38 * radians + 0, Track Angle/Heading Range 0 - 2pi - FIT_ATTITUDE_VALIDITY validity[FIT_AVIATION_ATTITUDE_MESG_VALIDITY_COUNT]; // - FIT_ATTITUDE_STAGE stage[FIT_AVIATION_ATTITUDE_MESG_STAGE_COUNT]; // - FIT_UINT8 attitude_stage_complete[FIT_AVIATION_ATTITUDE_MESG_ATTITUDE_STAGE_COMPLETE_COUNT]; // 1 * % + 0, The percent complete of the current attitude stage. Set to 0 for attitude stages 0, 1 and 2 and to 100 for attitude stage 3 by AHRS modules that do not support it. Range - 100 -} FIT_AVIATION_ATTITUDE_MESG; - -typedef FIT_UINT8 FIT_AVIATION_ATTITUDE_FIELD_NUM; - -#define FIT_AVIATION_ATTITUDE_FIELD_NUM_TIMESTAMP ((FIT_AVIATION_ATTITUDE_FIELD_NUM)253) -#define FIT_AVIATION_ATTITUDE_FIELD_NUM_SYSTEM_TIME ((FIT_AVIATION_ATTITUDE_FIELD_NUM)1) -#define FIT_AVIATION_ATTITUDE_FIELD_NUM_TIMESTAMP_MS ((FIT_AVIATION_ATTITUDE_FIELD_NUM)0) -#define FIT_AVIATION_ATTITUDE_FIELD_NUM_PITCH ((FIT_AVIATION_ATTITUDE_FIELD_NUM)2) -#define FIT_AVIATION_ATTITUDE_FIELD_NUM_ROLL ((FIT_AVIATION_ATTITUDE_FIELD_NUM)3) -#define FIT_AVIATION_ATTITUDE_FIELD_NUM_ACCEL_LATERAL ((FIT_AVIATION_ATTITUDE_FIELD_NUM)4) -#define FIT_AVIATION_ATTITUDE_FIELD_NUM_ACCEL_NORMAL ((FIT_AVIATION_ATTITUDE_FIELD_NUM)5) -#define FIT_AVIATION_ATTITUDE_FIELD_NUM_TURN_RATE ((FIT_AVIATION_ATTITUDE_FIELD_NUM)6) -#define FIT_AVIATION_ATTITUDE_FIELD_NUM_TRACK ((FIT_AVIATION_ATTITUDE_FIELD_NUM)9) -#define FIT_AVIATION_ATTITUDE_FIELD_NUM_VALIDITY ((FIT_AVIATION_ATTITUDE_FIELD_NUM)10) -#define FIT_AVIATION_ATTITUDE_FIELD_NUM_STAGE ((FIT_AVIATION_ATTITUDE_FIELD_NUM)7) -#define FIT_AVIATION_ATTITUDE_FIELD_NUM_ATTITUDE_STAGE_COMPLETE ((FIT_AVIATION_ATTITUDE_FIELD_NUM)8) - -typedef enum -{ - FIT_AVIATION_ATTITUDE_MESG_TIMESTAMP, - FIT_AVIATION_ATTITUDE_MESG_SYSTEM_TIME, - FIT_AVIATION_ATTITUDE_MESG_TIMESTAMP_MS, - FIT_AVIATION_ATTITUDE_MESG_PITCH, - FIT_AVIATION_ATTITUDE_MESG_ROLL, - FIT_AVIATION_ATTITUDE_MESG_ACCEL_LATERAL, - FIT_AVIATION_ATTITUDE_MESG_ACCEL_NORMAL, - FIT_AVIATION_ATTITUDE_MESG_TURN_RATE, - FIT_AVIATION_ATTITUDE_MESG_TRACK, - FIT_AVIATION_ATTITUDE_MESG_VALIDITY, - FIT_AVIATION_ATTITUDE_MESG_STAGE, - FIT_AVIATION_ATTITUDE_MESG_ATTITUDE_STAGE_COMPLETE, - FIT_AVIATION_ATTITUDE_MESG_FIELDS -} FIT_AVIATION_ATTITUDE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_AVIATION_ATTITUDE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_AVIATION_ATTITUDE_MESG_DEF; - -// video_title message - -#define FIT_VIDEO_TITLE_MESG_SIZE 84 -#define FIT_VIDEO_TITLE_MESG_DEF_SIZE 14 -#define FIT_VIDEO_TITLE_MESG_TEXT_COUNT 80 - -typedef struct -{ - FIT_STRING text[FIT_VIDEO_TITLE_MESG_TEXT_COUNT]; // - FIT_MESSAGE_INDEX message_index; // Long titles will be split into multiple parts - FIT_UINT16 message_count; // Total number of title parts -} FIT_VIDEO_TITLE_MESG; - -typedef FIT_UINT8 FIT_VIDEO_TITLE_FIELD_NUM; - -#define FIT_VIDEO_TITLE_FIELD_NUM_TEXT ((FIT_VIDEO_TITLE_FIELD_NUM)1) -#define FIT_VIDEO_TITLE_FIELD_NUM_MESSAGE_INDEX ((FIT_VIDEO_TITLE_FIELD_NUM)254) -#define FIT_VIDEO_TITLE_FIELD_NUM_MESSAGE_COUNT ((FIT_VIDEO_TITLE_FIELD_NUM)0) - -typedef enum -{ - FIT_VIDEO_TITLE_MESG_TEXT, - FIT_VIDEO_TITLE_MESG_MESSAGE_INDEX, - FIT_VIDEO_TITLE_MESG_MESSAGE_COUNT, - FIT_VIDEO_TITLE_MESG_FIELDS -} FIT_VIDEO_TITLE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_VIDEO_TITLE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_VIDEO_TITLE_MESG_DEF; - -// video_description message - -#define FIT_VIDEO_DESCRIPTION_MESG_SIZE 254 -#define FIT_VIDEO_DESCRIPTION_MESG_DEF_SIZE 14 -#define FIT_VIDEO_DESCRIPTION_MESG_TEXT_COUNT 250 - -typedef struct -{ - FIT_MESSAGE_INDEX message_index; // Long descriptions will be split into multiple parts - FIT_UINT16 message_count; // Total number of description parts - FIT_STRING text[FIT_VIDEO_DESCRIPTION_MESG_TEXT_COUNT]; // -} FIT_VIDEO_DESCRIPTION_MESG; - -typedef FIT_UINT8 FIT_VIDEO_DESCRIPTION_FIELD_NUM; - -#define FIT_VIDEO_DESCRIPTION_FIELD_NUM_MESSAGE_INDEX ((FIT_VIDEO_DESCRIPTION_FIELD_NUM)254) -#define FIT_VIDEO_DESCRIPTION_FIELD_NUM_MESSAGE_COUNT ((FIT_VIDEO_DESCRIPTION_FIELD_NUM)0) -#define FIT_VIDEO_DESCRIPTION_FIELD_NUM_TEXT ((FIT_VIDEO_DESCRIPTION_FIELD_NUM)1) - -typedef enum -{ - FIT_VIDEO_DESCRIPTION_MESG_MESSAGE_INDEX, - FIT_VIDEO_DESCRIPTION_MESG_MESSAGE_COUNT, - FIT_VIDEO_DESCRIPTION_MESG_TEXT, - FIT_VIDEO_DESCRIPTION_MESG_FIELDS -} FIT_VIDEO_DESCRIPTION_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_VIDEO_DESCRIPTION_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_VIDEO_DESCRIPTION_MESG_DEF; - -// set message - -#define FIT_SET_MESG_SIZE 2 -#define FIT_SET_MESG_DEF_SIZE 8 - -typedef struct -{ - FIT_FIT_BASE_UNIT weight_display_unit; // -} FIT_SET_MESG; - -typedef FIT_UINT8 FIT_SET_FIELD_NUM; - -#define FIT_SET_FIELD_NUM_WEIGHT_DISPLAY_UNIT ((FIT_SET_FIELD_NUM)9) - -typedef enum -{ - FIT_SET_MESG_WEIGHT_DISPLAY_UNIT, - FIT_SET_MESG_FIELDS -} FIT_SET_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_SET_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_SET_MESG_DEF; - -// field_description message - -#define FIT_FIELD_DESCRIPTION_MESG_SIZE 90 -#define FIT_FIELD_DESCRIPTION_MESG_DEF_SIZE 35 -#define FIT_FIELD_DESCRIPTION_MESG_FIELD_NAME_COUNT 64 -#define FIT_FIELD_DESCRIPTION_MESG_UNITS_COUNT 16 - -typedef struct -{ - FIT_STRING field_name[FIT_FIELD_DESCRIPTION_MESG_FIELD_NAME_COUNT]; // - FIT_STRING units[FIT_FIELD_DESCRIPTION_MESG_UNITS_COUNT]; // - FIT_FIT_BASE_UNIT fit_base_unit_id; // - FIT_MESG_NUM native_mesg_num; // - FIT_UINT8 developer_data_index; // - FIT_UINT8 field_definition_number; // - FIT_FIT_BASE_TYPE fit_base_type_id; // - FIT_UINT8 scale; // - FIT_SINT8 offset; // - FIT_UINT8 native_field_num; // -} FIT_FIELD_DESCRIPTION_MESG; - -typedef FIT_UINT8 FIT_FIELD_DESCRIPTION_FIELD_NUM; - -#define FIT_FIELD_DESCRIPTION_FIELD_NUM_FIELD_NAME ((FIT_FIELD_DESCRIPTION_FIELD_NUM)3) -#define FIT_FIELD_DESCRIPTION_FIELD_NUM_UNITS ((FIT_FIELD_DESCRIPTION_FIELD_NUM)8) -#define FIT_FIELD_DESCRIPTION_FIELD_NUM_FIT_BASE_UNIT_ID ((FIT_FIELD_DESCRIPTION_FIELD_NUM)13) -#define FIT_FIELD_DESCRIPTION_FIELD_NUM_NATIVE_MESG_NUM ((FIT_FIELD_DESCRIPTION_FIELD_NUM)14) -#define FIT_FIELD_DESCRIPTION_FIELD_NUM_DEVELOPER_DATA_INDEX ((FIT_FIELD_DESCRIPTION_FIELD_NUM)0) -#define FIT_FIELD_DESCRIPTION_FIELD_NUM_FIELD_DEFINITION_NUMBER ((FIT_FIELD_DESCRIPTION_FIELD_NUM)1) -#define FIT_FIELD_DESCRIPTION_FIELD_NUM_FIT_BASE_TYPE_ID ((FIT_FIELD_DESCRIPTION_FIELD_NUM)2) -#define FIT_FIELD_DESCRIPTION_FIELD_NUM_SCALE ((FIT_FIELD_DESCRIPTION_FIELD_NUM)6) -#define FIT_FIELD_DESCRIPTION_FIELD_NUM_OFFSET ((FIT_FIELD_DESCRIPTION_FIELD_NUM)7) -#define FIT_FIELD_DESCRIPTION_FIELD_NUM_NATIVE_FIELD_NUM ((FIT_FIELD_DESCRIPTION_FIELD_NUM)15) - -typedef enum -{ - FIT_FIELD_DESCRIPTION_MESG_FIELD_NAME, - FIT_FIELD_DESCRIPTION_MESG_UNITS, - FIT_FIELD_DESCRIPTION_MESG_FIT_BASE_UNIT_ID, - FIT_FIELD_DESCRIPTION_MESG_NATIVE_MESG_NUM, - FIT_FIELD_DESCRIPTION_MESG_DEVELOPER_DATA_INDEX, - FIT_FIELD_DESCRIPTION_MESG_FIELD_DEFINITION_NUMBER, - FIT_FIELD_DESCRIPTION_MESG_FIT_BASE_TYPE_ID, - FIT_FIELD_DESCRIPTION_MESG_SCALE, - FIT_FIELD_DESCRIPTION_MESG_OFFSET, - FIT_FIELD_DESCRIPTION_MESG_NATIVE_FIELD_NUM, - FIT_FIELD_DESCRIPTION_MESG_FIELDS -} FIT_FIELD_DESCRIPTION_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_FIELD_DESCRIPTION_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_FIELD_DESCRIPTION_MESG_DEF; - -// developer_data_id message - -#define FIT_DEVELOPER_DATA_ID_MESG_SIZE 39 -#define FIT_DEVELOPER_DATA_ID_MESG_DEF_SIZE 20 -#define FIT_DEVELOPER_DATA_ID_MESG_DEVELOPER_ID_COUNT 16 -#define FIT_DEVELOPER_DATA_ID_MESG_APPLICATION_ID_COUNT 16 - -typedef struct -{ - FIT_BYTE developer_id[FIT_DEVELOPER_DATA_ID_MESG_DEVELOPER_ID_COUNT]; // - FIT_BYTE application_id[FIT_DEVELOPER_DATA_ID_MESG_APPLICATION_ID_COUNT]; // - FIT_UINT32 application_version; // - FIT_MANUFACTURER manufacturer_id; // - FIT_UINT8 developer_data_index; // -} FIT_DEVELOPER_DATA_ID_MESG; - -typedef FIT_UINT8 FIT_DEVELOPER_DATA_ID_FIELD_NUM; - -#define FIT_DEVELOPER_DATA_ID_FIELD_NUM_DEVELOPER_ID ((FIT_DEVELOPER_DATA_ID_FIELD_NUM)0) -#define FIT_DEVELOPER_DATA_ID_FIELD_NUM_APPLICATION_ID ((FIT_DEVELOPER_DATA_ID_FIELD_NUM)1) -#define FIT_DEVELOPER_DATA_ID_FIELD_NUM_APPLICATION_VERSION ((FIT_DEVELOPER_DATA_ID_FIELD_NUM)4) -#define FIT_DEVELOPER_DATA_ID_FIELD_NUM_MANUFACTURER_ID ((FIT_DEVELOPER_DATA_ID_FIELD_NUM)2) -#define FIT_DEVELOPER_DATA_ID_FIELD_NUM_DEVELOPER_DATA_INDEX ((FIT_DEVELOPER_DATA_ID_FIELD_NUM)3) - -typedef enum -{ - FIT_DEVELOPER_DATA_ID_MESG_DEVELOPER_ID, - FIT_DEVELOPER_DATA_ID_MESG_APPLICATION_ID, - FIT_DEVELOPER_DATA_ID_MESG_APPLICATION_VERSION, - FIT_DEVELOPER_DATA_ID_MESG_MANUFACTURER_ID, - FIT_DEVELOPER_DATA_ID_MESG_DEVELOPER_DATA_INDEX, - FIT_DEVELOPER_DATA_ID_MESG_FIELDS -} FIT_DEVELOPER_DATA_ID_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_DEVELOPER_DATA_ID_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_DEVELOPER_DATA_ID_MESG_DEF; - -// course message - -#define FIT_COURSE_MESG_SIZE 22 -#define FIT_COURSE_MESG_DEF_SIZE 17 -#define FIT_COURSE_MESG_NAME_COUNT 16 - -typedef struct -{ - FIT_STRING name[FIT_COURSE_MESG_NAME_COUNT]; // - FIT_COURSE_CAPABILITIES capabilities; // - FIT_SPORT sport; // - FIT_SUB_SPORT sub_sport; // -} FIT_COURSE_MESG; - -typedef FIT_UINT8 FIT_COURSE_FIELD_NUM; - -#define FIT_COURSE_FIELD_NUM_NAME ((FIT_COURSE_FIELD_NUM)5) -#define FIT_COURSE_FIELD_NUM_CAPABILITIES ((FIT_COURSE_FIELD_NUM)6) -#define FIT_COURSE_FIELD_NUM_SPORT ((FIT_COURSE_FIELD_NUM)4) -#define FIT_COURSE_FIELD_NUM_SUB_SPORT ((FIT_COURSE_FIELD_NUM)7) - -typedef enum -{ - FIT_COURSE_MESG_NAME, - FIT_COURSE_MESG_CAPABILITIES, - FIT_COURSE_MESG_SPORT, - FIT_COURSE_MESG_SUB_SPORT, - FIT_COURSE_MESG_FIELDS -} FIT_COURSE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_COURSE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_COURSE_MESG_DEF; - -// course_point message - -#define FIT_COURSE_POINT_MESG_SIZE 36 -#define FIT_COURSE_POINT_MESG_DEF_SIZE 29 -#define FIT_COURSE_POINT_MESG_NAME_COUNT 16 - -typedef struct -{ - FIT_DATE_TIME timestamp; // - FIT_SINT32 position_lat; // 1 * semicircles + 0, - FIT_SINT32 position_long; // 1 * semicircles + 0, - FIT_UINT32 distance; // 100 * m + 0, - FIT_STRING name[FIT_COURSE_POINT_MESG_NAME_COUNT]; // - FIT_MESSAGE_INDEX message_index; // - FIT_COURSE_POINT type; // - FIT_BOOL favorite; // -} FIT_COURSE_POINT_MESG; - -typedef FIT_UINT8 FIT_COURSE_POINT_FIELD_NUM; - -#define FIT_COURSE_POINT_FIELD_NUM_TIMESTAMP ((FIT_COURSE_POINT_FIELD_NUM)1) -#define FIT_COURSE_POINT_FIELD_NUM_POSITION_LAT ((FIT_COURSE_POINT_FIELD_NUM)2) -#define FIT_COURSE_POINT_FIELD_NUM_POSITION_LONG ((FIT_COURSE_POINT_FIELD_NUM)3) -#define FIT_COURSE_POINT_FIELD_NUM_DISTANCE ((FIT_COURSE_POINT_FIELD_NUM)4) -#define FIT_COURSE_POINT_FIELD_NUM_NAME ((FIT_COURSE_POINT_FIELD_NUM)6) -#define FIT_COURSE_POINT_FIELD_NUM_MESSAGE_INDEX ((FIT_COURSE_POINT_FIELD_NUM)254) -#define FIT_COURSE_POINT_FIELD_NUM_TYPE ((FIT_COURSE_POINT_FIELD_NUM)5) -#define FIT_COURSE_POINT_FIELD_NUM_FAVORITE ((FIT_COURSE_POINT_FIELD_NUM)8) - -typedef enum -{ - FIT_COURSE_POINT_MESG_TIMESTAMP, - FIT_COURSE_POINT_MESG_POSITION_LAT, - FIT_COURSE_POINT_MESG_POSITION_LONG, - FIT_COURSE_POINT_MESG_DISTANCE, - FIT_COURSE_POINT_MESG_NAME, - FIT_COURSE_POINT_MESG_MESSAGE_INDEX, - FIT_COURSE_POINT_MESG_TYPE, - FIT_COURSE_POINT_MESG_FAVORITE, - FIT_COURSE_POINT_MESG_FIELDS -} FIT_COURSE_POINT_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_COURSE_POINT_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_COURSE_POINT_MESG_DEF; - -// segment_id message - -#define FIT_SEGMENT_ID_MESG_SIZE 15 -#define FIT_SEGMENT_ID_MESG_DEF_SIZE 32 -#define FIT_SEGMENT_ID_MESG_NAME_COUNT 1 -#define FIT_SEGMENT_ID_MESG_UUID_COUNT 1 - -typedef struct -{ - FIT_UINT32 user_profile_primary_key; // Primary key of the user that created the segment - FIT_UINT32 device_id; // ID of the device that created the segment - FIT_STRING name[FIT_SEGMENT_ID_MESG_NAME_COUNT]; // Friendly name assigned to segment - FIT_STRING uuid[FIT_SEGMENT_ID_MESG_UUID_COUNT]; // UUID of the segment - FIT_SPORT sport; // Sport associated with the segment - FIT_BOOL enabled; // Segment enabled for evaluation - FIT_UINT8 default_race_leader; // Index for the Leader Board entry selected as the default race participant - FIT_SEGMENT_DELETE_STATUS delete_status; // Indicates if any segments should be deleted - FIT_SEGMENT_SELECTION_TYPE selection_type; // Indicates how the segment was selected to be sent to the device -} FIT_SEGMENT_ID_MESG; - -typedef FIT_UINT8 FIT_SEGMENT_ID_FIELD_NUM; - -#define FIT_SEGMENT_ID_FIELD_NUM_USER_PROFILE_PRIMARY_KEY ((FIT_SEGMENT_ID_FIELD_NUM)4) -#define FIT_SEGMENT_ID_FIELD_NUM_DEVICE_ID ((FIT_SEGMENT_ID_FIELD_NUM)5) -#define FIT_SEGMENT_ID_FIELD_NUM_NAME ((FIT_SEGMENT_ID_FIELD_NUM)0) -#define FIT_SEGMENT_ID_FIELD_NUM_UUID ((FIT_SEGMENT_ID_FIELD_NUM)1) -#define FIT_SEGMENT_ID_FIELD_NUM_SPORT ((FIT_SEGMENT_ID_FIELD_NUM)2) -#define FIT_SEGMENT_ID_FIELD_NUM_ENABLED ((FIT_SEGMENT_ID_FIELD_NUM)3) -#define FIT_SEGMENT_ID_FIELD_NUM_DEFAULT_RACE_LEADER ((FIT_SEGMENT_ID_FIELD_NUM)6) -#define FIT_SEGMENT_ID_FIELD_NUM_DELETE_STATUS ((FIT_SEGMENT_ID_FIELD_NUM)7) -#define FIT_SEGMENT_ID_FIELD_NUM_SELECTION_TYPE ((FIT_SEGMENT_ID_FIELD_NUM)8) - -typedef enum -{ - FIT_SEGMENT_ID_MESG_USER_PROFILE_PRIMARY_KEY, - FIT_SEGMENT_ID_MESG_DEVICE_ID, - FIT_SEGMENT_ID_MESG_NAME, - FIT_SEGMENT_ID_MESG_UUID, - FIT_SEGMENT_ID_MESG_SPORT, - FIT_SEGMENT_ID_MESG_ENABLED, - FIT_SEGMENT_ID_MESG_DEFAULT_RACE_LEADER, - FIT_SEGMENT_ID_MESG_DELETE_STATUS, - FIT_SEGMENT_ID_MESG_SELECTION_TYPE, - FIT_SEGMENT_ID_MESG_FIELDS -} FIT_SEGMENT_ID_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_SEGMENT_ID_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_SEGMENT_ID_MESG_DEF; - -// segment_leaderboard_entry message - -#define FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_SIZE 16 -#define FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_DEF_SIZE 23 -#define FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_NAME_COUNT 1 - -typedef struct -{ - FIT_UINT32 group_primary_key; // Primary user ID of this leader - FIT_UINT32 activity_id; // ID of the activity associated with this leader time - FIT_UINT32 segment_time; // 1000 * s + 0, Segment Time (includes pauses) - FIT_MESSAGE_INDEX message_index; // - FIT_STRING name[FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_NAME_COUNT]; // Friendly name assigned to leader - FIT_SEGMENT_LEADERBOARD_TYPE type; // Leader classification -} FIT_SEGMENT_LEADERBOARD_ENTRY_MESG; - -typedef FIT_UINT8 FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM; - -#define FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM_GROUP_PRIMARY_KEY ((FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM)2) -#define FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM_ACTIVITY_ID ((FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM)3) -#define FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM_SEGMENT_TIME ((FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM)4) -#define FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM_MESSAGE_INDEX ((FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM)254) -#define FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM_NAME ((FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM)0) -#define FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM_TYPE ((FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM)1) - -typedef enum -{ - FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_GROUP_PRIMARY_KEY, - FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_ACTIVITY_ID, - FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_SEGMENT_TIME, - FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_MESSAGE_INDEX, - FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_NAME, - FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_TYPE, - FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_FIELDS -} FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_DEF; - -// segment_point message - -#define FIT_SEGMENT_POINT_MESG_SIZE 20 -#define FIT_SEGMENT_POINT_MESG_DEF_SIZE 23 -#define FIT_SEGMENT_POINT_MESG_LEADER_TIME_COUNT 1 - -typedef struct -{ - FIT_SINT32 position_lat; // 1 * semicircles + 0, - FIT_SINT32 position_long; // 1 * semicircles + 0, - FIT_UINT32 distance; // 100 * m + 0, Accumulated distance along the segment at the described point - FIT_UINT32 leader_time[FIT_SEGMENT_POINT_MESG_LEADER_TIME_COUNT]; // 1000 * s + 0, Accumualted time each leader board member required to reach the described point. This value is zero for all leader board members at the starting point of the segment. - FIT_MESSAGE_INDEX message_index; // - FIT_UINT16 altitude; // 5 * m + 500, Accumulated altitude along the segment at the described point -} FIT_SEGMENT_POINT_MESG; - -typedef FIT_UINT8 FIT_SEGMENT_POINT_FIELD_NUM; - -#define FIT_SEGMENT_POINT_FIELD_NUM_POSITION_LAT ((FIT_SEGMENT_POINT_FIELD_NUM)1) -#define FIT_SEGMENT_POINT_FIELD_NUM_POSITION_LONG ((FIT_SEGMENT_POINT_FIELD_NUM)2) -#define FIT_SEGMENT_POINT_FIELD_NUM_DISTANCE ((FIT_SEGMENT_POINT_FIELD_NUM)3) -#define FIT_SEGMENT_POINT_FIELD_NUM_LEADER_TIME ((FIT_SEGMENT_POINT_FIELD_NUM)5) -#define FIT_SEGMENT_POINT_FIELD_NUM_MESSAGE_INDEX ((FIT_SEGMENT_POINT_FIELD_NUM)254) -#define FIT_SEGMENT_POINT_FIELD_NUM_ALTITUDE ((FIT_SEGMENT_POINT_FIELD_NUM)4) - -typedef enum -{ - FIT_SEGMENT_POINT_MESG_POSITION_LAT, - FIT_SEGMENT_POINT_MESG_POSITION_LONG, - FIT_SEGMENT_POINT_MESG_DISTANCE, - FIT_SEGMENT_POINT_MESG_LEADER_TIME, - FIT_SEGMENT_POINT_MESG_MESSAGE_INDEX, - FIT_SEGMENT_POINT_MESG_ALTITUDE, - FIT_SEGMENT_POINT_MESG_FIELDS -} FIT_SEGMENT_POINT_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_SEGMENT_POINT_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_SEGMENT_POINT_MESG_DEF; - -// segment_lap message - -#define FIT_SEGMENT_LAP_MESG_SIZE 210 -#define FIT_SEGMENT_LAP_MESG_DEF_SIZE 224 -#define FIT_SEGMENT_LAP_MESG_NAME_COUNT 16 -#define FIT_SEGMENT_LAP_MESG_TIME_IN_HR_ZONE_COUNT 1 -#define FIT_SEGMENT_LAP_MESG_TIME_IN_SPEED_ZONE_COUNT 1 -#define FIT_SEGMENT_LAP_MESG_TIME_IN_CADENCE_ZONE_COUNT 1 -#define FIT_SEGMENT_LAP_MESG_TIME_IN_POWER_ZONE_COUNT 1 -#define FIT_SEGMENT_LAP_MESG_UUID_COUNT 33 - -typedef struct -{ - FIT_DATE_TIME timestamp; // 1 * s + 0, Lap end time. - FIT_DATE_TIME start_time; // - FIT_SINT32 start_position_lat; // 1 * semicircles + 0, - FIT_SINT32 start_position_long; // 1 * semicircles + 0, - FIT_SINT32 end_position_lat; // 1 * semicircles + 0, - FIT_SINT32 end_position_long; // 1 * semicircles + 0, - FIT_UINT32 total_elapsed_time; // 1000 * s + 0, Time (includes pauses) - FIT_UINT32 total_timer_time; // 1000 * s + 0, Timer Time (excludes pauses) - FIT_UINT32 total_distance; // 100 * m + 0, - FIT_UINT32 total_cycles; // 1 * cycles + 0, - FIT_SINT32 nec_lat; // 1 * semicircles + 0, North east corner latitude. - FIT_SINT32 nec_long; // 1 * semicircles + 0, North east corner longitude. - FIT_SINT32 swc_lat; // 1 * semicircles + 0, South west corner latitude. - FIT_SINT32 swc_long; // 1 * semicircles + 0, South west corner latitude. - FIT_STRING name[FIT_SEGMENT_LAP_MESG_NAME_COUNT]; // - FIT_UINT32 total_work; // 1 * J + 0, - FIT_UINT32 total_moving_time; // 1000 * s + 0, - FIT_UINT32 time_in_hr_zone[FIT_SEGMENT_LAP_MESG_TIME_IN_HR_ZONE_COUNT]; // 1000 * s + 0, - FIT_UINT32 time_in_speed_zone[FIT_SEGMENT_LAP_MESG_TIME_IN_SPEED_ZONE_COUNT]; // 1000 * s + 0, - FIT_UINT32 time_in_cadence_zone[FIT_SEGMENT_LAP_MESG_TIME_IN_CADENCE_ZONE_COUNT]; // 1000 * s + 0, - FIT_UINT32 time_in_power_zone[FIT_SEGMENT_LAP_MESG_TIME_IN_POWER_ZONE_COUNT]; // 1000 * s + 0, - FIT_UINT32 active_time; // 1000 * s + 0, - FIT_MESSAGE_INDEX message_index; // - FIT_UINT16 total_calories; // 1 * kcal + 0, - FIT_UINT16 total_fat_calories; // 1 * kcal + 0, If New Leaf - FIT_UINT16 avg_speed; // 1000 * m/s + 0, - FIT_UINT16 max_speed; // 1000 * m/s + 0, - FIT_UINT16 avg_power; // 1 * watts + 0, total_power / total_timer_time if non_zero_avg_power otherwise total_power / total_elapsed_time - FIT_UINT16 max_power; // 1 * watts + 0, - FIT_UINT16 total_ascent; // 1 * m + 0, - FIT_UINT16 total_descent; // 1 * m + 0, - FIT_UINT16 normalized_power; // 1 * watts + 0, - FIT_LEFT_RIGHT_BALANCE_100 left_right_balance; // - FIT_UINT16 avg_altitude; // 5 * m + 500, - FIT_UINT16 max_altitude; // 5 * m + 500, - FIT_SINT16 avg_grade; // 100 * % + 0, - FIT_SINT16 avg_pos_grade; // 100 * % + 0, - FIT_SINT16 avg_neg_grade; // 100 * % + 0, - FIT_SINT16 max_pos_grade; // 100 * % + 0, - FIT_SINT16 max_neg_grade; // 100 * % + 0, - FIT_SINT16 avg_pos_vertical_speed; // 1000 * m/s + 0, - FIT_SINT16 avg_neg_vertical_speed; // 1000 * m/s + 0, - FIT_SINT16 max_pos_vertical_speed; // 1000 * m/s + 0, - FIT_SINT16 max_neg_vertical_speed; // 1000 * m/s + 0, - FIT_UINT16 repetition_num; // - FIT_UINT16 min_altitude; // 5 * m + 500, - FIT_MESSAGE_INDEX wkt_step_index; // - FIT_UINT16 front_gear_shift_count; // - FIT_UINT16 rear_gear_shift_count; // - FIT_EVENT event; // - FIT_EVENT_TYPE event_type; // - FIT_UINT8 avg_heart_rate; // 1 * bpm + 0, - FIT_UINT8 max_heart_rate; // 1 * bpm + 0, - FIT_UINT8 avg_cadence; // 1 * rpm + 0, total_cycles / total_timer_time if non_zero_avg_cadence otherwise total_cycles / total_elapsed_time - FIT_UINT8 max_cadence; // 1 * rpm + 0, - FIT_SPORT sport; // - FIT_UINT8 event_group; // - FIT_SUB_SPORT sub_sport; // - FIT_UINT8 gps_accuracy; // 1 * m + 0, - FIT_SINT8 avg_temperature; // 1 * C + 0, - FIT_SINT8 max_temperature; // 1 * C + 0, - FIT_UINT8 min_heart_rate; // 1 * bpm + 0, - FIT_SPORT_EVENT sport_event; // - FIT_UINT8 avg_left_torque_effectiveness; // 2 * percent + 0, - FIT_UINT8 avg_right_torque_effectiveness; // 2 * percent + 0, - FIT_UINT8 avg_left_pedal_smoothness; // 2 * percent + 0, - FIT_UINT8 avg_right_pedal_smoothness; // 2 * percent + 0, - FIT_UINT8 avg_combined_pedal_smoothness; // 2 * percent + 0, - FIT_SEGMENT_LAP_STATUS status; // - FIT_STRING uuid[FIT_SEGMENT_LAP_MESG_UUID_COUNT]; // - FIT_UINT8 avg_fractional_cadence; // 128 * rpm + 0, fractional part of the avg_cadence - FIT_UINT8 max_fractional_cadence; // 128 * rpm + 0, fractional part of the max_cadence - FIT_UINT8 total_fractional_cycles; // 128 * cycles + 0, fractional part of the total_cycles -} FIT_SEGMENT_LAP_MESG; - -typedef FIT_UINT8 FIT_SEGMENT_LAP_FIELD_NUM; - -#define FIT_SEGMENT_LAP_FIELD_NUM_TIMESTAMP ((FIT_SEGMENT_LAP_FIELD_NUM)253) -#define FIT_SEGMENT_LAP_FIELD_NUM_START_TIME ((FIT_SEGMENT_LAP_FIELD_NUM)2) -#define FIT_SEGMENT_LAP_FIELD_NUM_START_POSITION_LAT ((FIT_SEGMENT_LAP_FIELD_NUM)3) -#define FIT_SEGMENT_LAP_FIELD_NUM_START_POSITION_LONG ((FIT_SEGMENT_LAP_FIELD_NUM)4) -#define FIT_SEGMENT_LAP_FIELD_NUM_END_POSITION_LAT ((FIT_SEGMENT_LAP_FIELD_NUM)5) -#define FIT_SEGMENT_LAP_FIELD_NUM_END_POSITION_LONG ((FIT_SEGMENT_LAP_FIELD_NUM)6) -#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_ELAPSED_TIME ((FIT_SEGMENT_LAP_FIELD_NUM)7) -#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_TIMER_TIME ((FIT_SEGMENT_LAP_FIELD_NUM)8) -#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_DISTANCE ((FIT_SEGMENT_LAP_FIELD_NUM)9) -#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_CYCLES ((FIT_SEGMENT_LAP_FIELD_NUM)10) -#define FIT_SEGMENT_LAP_FIELD_NUM_NEC_LAT ((FIT_SEGMENT_LAP_FIELD_NUM)25) -#define FIT_SEGMENT_LAP_FIELD_NUM_NEC_LONG ((FIT_SEGMENT_LAP_FIELD_NUM)26) -#define FIT_SEGMENT_LAP_FIELD_NUM_SWC_LAT ((FIT_SEGMENT_LAP_FIELD_NUM)27) -#define FIT_SEGMENT_LAP_FIELD_NUM_SWC_LONG ((FIT_SEGMENT_LAP_FIELD_NUM)28) -#define FIT_SEGMENT_LAP_FIELD_NUM_NAME ((FIT_SEGMENT_LAP_FIELD_NUM)29) -#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_WORK ((FIT_SEGMENT_LAP_FIELD_NUM)33) -#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_MOVING_TIME ((FIT_SEGMENT_LAP_FIELD_NUM)44) -#define FIT_SEGMENT_LAP_FIELD_NUM_TIME_IN_HR_ZONE ((FIT_SEGMENT_LAP_FIELD_NUM)49) -#define FIT_SEGMENT_LAP_FIELD_NUM_TIME_IN_SPEED_ZONE ((FIT_SEGMENT_LAP_FIELD_NUM)50) -#define FIT_SEGMENT_LAP_FIELD_NUM_TIME_IN_CADENCE_ZONE ((FIT_SEGMENT_LAP_FIELD_NUM)51) -#define FIT_SEGMENT_LAP_FIELD_NUM_TIME_IN_POWER_ZONE ((FIT_SEGMENT_LAP_FIELD_NUM)52) -#define FIT_SEGMENT_LAP_FIELD_NUM_ACTIVE_TIME ((FIT_SEGMENT_LAP_FIELD_NUM)56) -#define FIT_SEGMENT_LAP_FIELD_NUM_MESSAGE_INDEX ((FIT_SEGMENT_LAP_FIELD_NUM)254) -#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_CALORIES ((FIT_SEGMENT_LAP_FIELD_NUM)11) -#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_FAT_CALORIES ((FIT_SEGMENT_LAP_FIELD_NUM)12) -#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_SPEED ((FIT_SEGMENT_LAP_FIELD_NUM)13) -#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_SPEED ((FIT_SEGMENT_LAP_FIELD_NUM)14) -#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_POWER ((FIT_SEGMENT_LAP_FIELD_NUM)19) -#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_POWER ((FIT_SEGMENT_LAP_FIELD_NUM)20) -#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_ASCENT ((FIT_SEGMENT_LAP_FIELD_NUM)21) -#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_DESCENT ((FIT_SEGMENT_LAP_FIELD_NUM)22) -#define FIT_SEGMENT_LAP_FIELD_NUM_NORMALIZED_POWER ((FIT_SEGMENT_LAP_FIELD_NUM)30) -#define FIT_SEGMENT_LAP_FIELD_NUM_LEFT_RIGHT_BALANCE ((FIT_SEGMENT_LAP_FIELD_NUM)31) -#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_ALTITUDE ((FIT_SEGMENT_LAP_FIELD_NUM)34) -#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_ALTITUDE ((FIT_SEGMENT_LAP_FIELD_NUM)35) -#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_GRADE ((FIT_SEGMENT_LAP_FIELD_NUM)37) -#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_POS_GRADE ((FIT_SEGMENT_LAP_FIELD_NUM)38) -#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_NEG_GRADE ((FIT_SEGMENT_LAP_FIELD_NUM)39) -#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_POS_GRADE ((FIT_SEGMENT_LAP_FIELD_NUM)40) -#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_NEG_GRADE ((FIT_SEGMENT_LAP_FIELD_NUM)41) -#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_POS_VERTICAL_SPEED ((FIT_SEGMENT_LAP_FIELD_NUM)45) -#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_NEG_VERTICAL_SPEED ((FIT_SEGMENT_LAP_FIELD_NUM)46) -#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_POS_VERTICAL_SPEED ((FIT_SEGMENT_LAP_FIELD_NUM)47) -#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_NEG_VERTICAL_SPEED ((FIT_SEGMENT_LAP_FIELD_NUM)48) -#define FIT_SEGMENT_LAP_FIELD_NUM_REPETITION_NUM ((FIT_SEGMENT_LAP_FIELD_NUM)53) -#define FIT_SEGMENT_LAP_FIELD_NUM_MIN_ALTITUDE ((FIT_SEGMENT_LAP_FIELD_NUM)54) -#define FIT_SEGMENT_LAP_FIELD_NUM_WKT_STEP_INDEX ((FIT_SEGMENT_LAP_FIELD_NUM)57) -#define FIT_SEGMENT_LAP_FIELD_NUM_FRONT_GEAR_SHIFT_COUNT ((FIT_SEGMENT_LAP_FIELD_NUM)69) -#define FIT_SEGMENT_LAP_FIELD_NUM_REAR_GEAR_SHIFT_COUNT ((FIT_SEGMENT_LAP_FIELD_NUM)70) -#define FIT_SEGMENT_LAP_FIELD_NUM_EVENT ((FIT_SEGMENT_LAP_FIELD_NUM)0) -#define FIT_SEGMENT_LAP_FIELD_NUM_EVENT_TYPE ((FIT_SEGMENT_LAP_FIELD_NUM)1) -#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_HEART_RATE ((FIT_SEGMENT_LAP_FIELD_NUM)15) -#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_HEART_RATE ((FIT_SEGMENT_LAP_FIELD_NUM)16) -#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_CADENCE ((FIT_SEGMENT_LAP_FIELD_NUM)17) -#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_CADENCE ((FIT_SEGMENT_LAP_FIELD_NUM)18) -#define FIT_SEGMENT_LAP_FIELD_NUM_SPORT ((FIT_SEGMENT_LAP_FIELD_NUM)23) -#define FIT_SEGMENT_LAP_FIELD_NUM_EVENT_GROUP ((FIT_SEGMENT_LAP_FIELD_NUM)24) -#define FIT_SEGMENT_LAP_FIELD_NUM_SUB_SPORT ((FIT_SEGMENT_LAP_FIELD_NUM)32) -#define FIT_SEGMENT_LAP_FIELD_NUM_GPS_ACCURACY ((FIT_SEGMENT_LAP_FIELD_NUM)36) -#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_TEMPERATURE ((FIT_SEGMENT_LAP_FIELD_NUM)42) -#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_TEMPERATURE ((FIT_SEGMENT_LAP_FIELD_NUM)43) -#define FIT_SEGMENT_LAP_FIELD_NUM_MIN_HEART_RATE ((FIT_SEGMENT_LAP_FIELD_NUM)55) -#define FIT_SEGMENT_LAP_FIELD_NUM_SPORT_EVENT ((FIT_SEGMENT_LAP_FIELD_NUM)58) -#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_LEFT_TORQUE_EFFECTIVENESS ((FIT_SEGMENT_LAP_FIELD_NUM)59) -#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_RIGHT_TORQUE_EFFECTIVENESS ((FIT_SEGMENT_LAP_FIELD_NUM)60) -#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_LEFT_PEDAL_SMOOTHNESS ((FIT_SEGMENT_LAP_FIELD_NUM)61) -#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_RIGHT_PEDAL_SMOOTHNESS ((FIT_SEGMENT_LAP_FIELD_NUM)62) -#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_COMBINED_PEDAL_SMOOTHNESS ((FIT_SEGMENT_LAP_FIELD_NUM)63) -#define FIT_SEGMENT_LAP_FIELD_NUM_STATUS ((FIT_SEGMENT_LAP_FIELD_NUM)64) -#define FIT_SEGMENT_LAP_FIELD_NUM_UUID ((FIT_SEGMENT_LAP_FIELD_NUM)65) -#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_FRACTIONAL_CADENCE ((FIT_SEGMENT_LAP_FIELD_NUM)66) -#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_FRACTIONAL_CADENCE ((FIT_SEGMENT_LAP_FIELD_NUM)67) -#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_FRACTIONAL_CYCLES ((FIT_SEGMENT_LAP_FIELD_NUM)68) - -typedef enum -{ - FIT_SEGMENT_LAP_MESG_TIMESTAMP, - FIT_SEGMENT_LAP_MESG_START_TIME, - FIT_SEGMENT_LAP_MESG_START_POSITION_LAT, - FIT_SEGMENT_LAP_MESG_START_POSITION_LONG, - FIT_SEGMENT_LAP_MESG_END_POSITION_LAT, - FIT_SEGMENT_LAP_MESG_END_POSITION_LONG, - FIT_SEGMENT_LAP_MESG_TOTAL_ELAPSED_TIME, - FIT_SEGMENT_LAP_MESG_TOTAL_TIMER_TIME, - FIT_SEGMENT_LAP_MESG_TOTAL_DISTANCE, - FIT_SEGMENT_LAP_MESG_TOTAL_CYCLES, - FIT_SEGMENT_LAP_MESG_NEC_LAT, - FIT_SEGMENT_LAP_MESG_NEC_LONG, - FIT_SEGMENT_LAP_MESG_SWC_LAT, - FIT_SEGMENT_LAP_MESG_SWC_LONG, - FIT_SEGMENT_LAP_MESG_NAME, - FIT_SEGMENT_LAP_MESG_TOTAL_WORK, - FIT_SEGMENT_LAP_MESG_TOTAL_MOVING_TIME, - FIT_SEGMENT_LAP_MESG_TIME_IN_HR_ZONE, - FIT_SEGMENT_LAP_MESG_TIME_IN_SPEED_ZONE, - FIT_SEGMENT_LAP_MESG_TIME_IN_CADENCE_ZONE, - FIT_SEGMENT_LAP_MESG_TIME_IN_POWER_ZONE, - FIT_SEGMENT_LAP_MESG_ACTIVE_TIME, - FIT_SEGMENT_LAP_MESG_MESSAGE_INDEX, - FIT_SEGMENT_LAP_MESG_TOTAL_CALORIES, - FIT_SEGMENT_LAP_MESG_TOTAL_FAT_CALORIES, - FIT_SEGMENT_LAP_MESG_AVG_SPEED, - FIT_SEGMENT_LAP_MESG_MAX_SPEED, - FIT_SEGMENT_LAP_MESG_AVG_POWER, - FIT_SEGMENT_LAP_MESG_MAX_POWER, - FIT_SEGMENT_LAP_MESG_TOTAL_ASCENT, - FIT_SEGMENT_LAP_MESG_TOTAL_DESCENT, - FIT_SEGMENT_LAP_MESG_NORMALIZED_POWER, - FIT_SEGMENT_LAP_MESG_LEFT_RIGHT_BALANCE, - FIT_SEGMENT_LAP_MESG_AVG_ALTITUDE, - FIT_SEGMENT_LAP_MESG_MAX_ALTITUDE, - FIT_SEGMENT_LAP_MESG_AVG_GRADE, - FIT_SEGMENT_LAP_MESG_AVG_POS_GRADE, - FIT_SEGMENT_LAP_MESG_AVG_NEG_GRADE, - FIT_SEGMENT_LAP_MESG_MAX_POS_GRADE, - FIT_SEGMENT_LAP_MESG_MAX_NEG_GRADE, - FIT_SEGMENT_LAP_MESG_AVG_POS_VERTICAL_SPEED, - FIT_SEGMENT_LAP_MESG_AVG_NEG_VERTICAL_SPEED, - FIT_SEGMENT_LAP_MESG_MAX_POS_VERTICAL_SPEED, - FIT_SEGMENT_LAP_MESG_MAX_NEG_VERTICAL_SPEED, - FIT_SEGMENT_LAP_MESG_REPETITION_NUM, - FIT_SEGMENT_LAP_MESG_MIN_ALTITUDE, - FIT_SEGMENT_LAP_MESG_WKT_STEP_INDEX, - FIT_SEGMENT_LAP_MESG_FRONT_GEAR_SHIFT_COUNT, - FIT_SEGMENT_LAP_MESG_REAR_GEAR_SHIFT_COUNT, - FIT_SEGMENT_LAP_MESG_EVENT, - FIT_SEGMENT_LAP_MESG_EVENT_TYPE, - FIT_SEGMENT_LAP_MESG_AVG_HEART_RATE, - FIT_SEGMENT_LAP_MESG_MAX_HEART_RATE, - FIT_SEGMENT_LAP_MESG_AVG_CADENCE, - FIT_SEGMENT_LAP_MESG_MAX_CADENCE, - FIT_SEGMENT_LAP_MESG_SPORT, - FIT_SEGMENT_LAP_MESG_EVENT_GROUP, - FIT_SEGMENT_LAP_MESG_SUB_SPORT, - FIT_SEGMENT_LAP_MESG_GPS_ACCURACY, - FIT_SEGMENT_LAP_MESG_AVG_TEMPERATURE, - FIT_SEGMENT_LAP_MESG_MAX_TEMPERATURE, - FIT_SEGMENT_LAP_MESG_MIN_HEART_RATE, - FIT_SEGMENT_LAP_MESG_SPORT_EVENT, - FIT_SEGMENT_LAP_MESG_AVG_LEFT_TORQUE_EFFECTIVENESS, - FIT_SEGMENT_LAP_MESG_AVG_RIGHT_TORQUE_EFFECTIVENESS, - FIT_SEGMENT_LAP_MESG_AVG_LEFT_PEDAL_SMOOTHNESS, - FIT_SEGMENT_LAP_MESG_AVG_RIGHT_PEDAL_SMOOTHNESS, - FIT_SEGMENT_LAP_MESG_AVG_COMBINED_PEDAL_SMOOTHNESS, - FIT_SEGMENT_LAP_MESG_STATUS, - FIT_SEGMENT_LAP_MESG_UUID, - FIT_SEGMENT_LAP_MESG_AVG_FRACTIONAL_CADENCE, - FIT_SEGMENT_LAP_MESG_MAX_FRACTIONAL_CADENCE, - FIT_SEGMENT_LAP_MESG_TOTAL_FRACTIONAL_CYCLES, - FIT_SEGMENT_LAP_MESG_FIELDS -} FIT_SEGMENT_LAP_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_SEGMENT_LAP_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_SEGMENT_LAP_MESG_DEF; - -// segment_file message - -#define FIT_SEGMENT_FILE_MESG_SIZE 17 -#define FIT_SEGMENT_FILE_MESG_DEF_SIZE 26 -#define FIT_SEGMENT_FILE_MESG_LEADER_GROUP_PRIMARY_KEY_COUNT 1 -#define FIT_SEGMENT_FILE_MESG_LEADER_ACTIVITY_ID_COUNT 1 -#define FIT_SEGMENT_FILE_MESG_FILE_UUID_COUNT 1 -#define FIT_SEGMENT_FILE_MESG_LEADER_TYPE_COUNT 1 - -typedef struct -{ - FIT_UINT32 user_profile_primary_key; // Primary key of the user that created the segment file - FIT_UINT32 leader_group_primary_key[FIT_SEGMENT_FILE_MESG_LEADER_GROUP_PRIMARY_KEY_COUNT]; // Group primary key of each leader in the segment file - FIT_UINT32 leader_activity_id[FIT_SEGMENT_FILE_MESG_LEADER_ACTIVITY_ID_COUNT]; // Activity ID of each leader in the segment file - FIT_MESSAGE_INDEX message_index; // - FIT_STRING file_uuid[FIT_SEGMENT_FILE_MESG_FILE_UUID_COUNT]; // UUID of the segment file - FIT_BOOL enabled; // Enabled state of the segment file - FIT_SEGMENT_LEADERBOARD_TYPE leader_type[FIT_SEGMENT_FILE_MESG_LEADER_TYPE_COUNT]; // Leader type of each leader in the segment file -} FIT_SEGMENT_FILE_MESG; - -typedef FIT_UINT8 FIT_SEGMENT_FILE_FIELD_NUM; - -#define FIT_SEGMENT_FILE_FIELD_NUM_USER_PROFILE_PRIMARY_KEY ((FIT_SEGMENT_FILE_FIELD_NUM)4) -#define FIT_SEGMENT_FILE_FIELD_NUM_LEADER_GROUP_PRIMARY_KEY ((FIT_SEGMENT_FILE_FIELD_NUM)8) -#define FIT_SEGMENT_FILE_FIELD_NUM_LEADER_ACTIVITY_ID ((FIT_SEGMENT_FILE_FIELD_NUM)9) -#define FIT_SEGMENT_FILE_FIELD_NUM_MESSAGE_INDEX ((FIT_SEGMENT_FILE_FIELD_NUM)254) -#define FIT_SEGMENT_FILE_FIELD_NUM_FILE_UUID ((FIT_SEGMENT_FILE_FIELD_NUM)1) -#define FIT_SEGMENT_FILE_FIELD_NUM_ENABLED ((FIT_SEGMENT_FILE_FIELD_NUM)3) -#define FIT_SEGMENT_FILE_FIELD_NUM_LEADER_TYPE ((FIT_SEGMENT_FILE_FIELD_NUM)7) - -typedef enum -{ - FIT_SEGMENT_FILE_MESG_USER_PROFILE_PRIMARY_KEY, - FIT_SEGMENT_FILE_MESG_LEADER_GROUP_PRIMARY_KEY, - FIT_SEGMENT_FILE_MESG_LEADER_ACTIVITY_ID, - FIT_SEGMENT_FILE_MESG_MESSAGE_INDEX, - FIT_SEGMENT_FILE_MESG_FILE_UUID, - FIT_SEGMENT_FILE_MESG_ENABLED, - FIT_SEGMENT_FILE_MESG_LEADER_TYPE, - FIT_SEGMENT_FILE_MESG_FIELDS -} FIT_SEGMENT_FILE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_SEGMENT_FILE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_SEGMENT_FILE_MESG_DEF; - -// workout message - -#define FIT_WORKOUT_MESG_SIZE 29 -#define FIT_WORKOUT_MESG_DEF_SIZE 29 -#define FIT_WORKOUT_MESG_WKT_NAME_COUNT 16 - -typedef struct -{ - FIT_WORKOUT_CAPABILITIES capabilities; // - FIT_STRING wkt_name[FIT_WORKOUT_MESG_WKT_NAME_COUNT]; // - FIT_MESSAGE_INDEX message_index; // - FIT_UINT16 num_valid_steps; // number of valid steps - FIT_UINT16 pool_length; // 100 * m + 0, - FIT_SPORT sport; // - FIT_SUB_SPORT sub_sport; // - FIT_DISPLAY_MEASURE pool_length_unit; // -} FIT_WORKOUT_MESG; - -typedef FIT_UINT8 FIT_WORKOUT_FIELD_NUM; - -#define FIT_WORKOUT_FIELD_NUM_CAPABILITIES ((FIT_WORKOUT_FIELD_NUM)5) -#define FIT_WORKOUT_FIELD_NUM_WKT_NAME ((FIT_WORKOUT_FIELD_NUM)8) -#define FIT_WORKOUT_FIELD_NUM_MESSAGE_INDEX ((FIT_WORKOUT_FIELD_NUM)254) -#define FIT_WORKOUT_FIELD_NUM_NUM_VALID_STEPS ((FIT_WORKOUT_FIELD_NUM)6) -#define FIT_WORKOUT_FIELD_NUM_POOL_LENGTH ((FIT_WORKOUT_FIELD_NUM)14) -#define FIT_WORKOUT_FIELD_NUM_SPORT ((FIT_WORKOUT_FIELD_NUM)4) -#define FIT_WORKOUT_FIELD_NUM_SUB_SPORT ((FIT_WORKOUT_FIELD_NUM)11) -#define FIT_WORKOUT_FIELD_NUM_POOL_LENGTH_UNIT ((FIT_WORKOUT_FIELD_NUM)15) - -typedef enum -{ - FIT_WORKOUT_MESG_CAPABILITIES, - FIT_WORKOUT_MESG_WKT_NAME, - FIT_WORKOUT_MESG_MESSAGE_INDEX, - FIT_WORKOUT_MESG_NUM_VALID_STEPS, - FIT_WORKOUT_MESG_POOL_LENGTH, - FIT_WORKOUT_MESG_SPORT, - FIT_WORKOUT_MESG_SUB_SPORT, - FIT_WORKOUT_MESG_POOL_LENGTH_UNIT, - FIT_WORKOUT_MESG_FIELDS -} FIT_WORKOUT_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_WORKOUT_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_WORKOUT_MESG_DEF; - -// workout_session message - -#define FIT_WORKOUT_SESSION_MESG_SIZE 11 -#define FIT_WORKOUT_SESSION_MESG_DEF_SIZE 26 - -typedef struct -{ - FIT_MESSAGE_INDEX message_index; // - FIT_UINT16 num_valid_steps; // - FIT_UINT16 first_step_index; // - FIT_UINT16 pool_length; // 100 * m + 0, - FIT_SPORT sport; // - FIT_SUB_SPORT sub_sport; // - FIT_DISPLAY_MEASURE pool_length_unit; // -} FIT_WORKOUT_SESSION_MESG; - -typedef FIT_UINT8 FIT_WORKOUT_SESSION_FIELD_NUM; - -#define FIT_WORKOUT_SESSION_FIELD_NUM_MESSAGE_INDEX ((FIT_WORKOUT_SESSION_FIELD_NUM)254) -#define FIT_WORKOUT_SESSION_FIELD_NUM_NUM_VALID_STEPS ((FIT_WORKOUT_SESSION_FIELD_NUM)2) -#define FIT_WORKOUT_SESSION_FIELD_NUM_FIRST_STEP_INDEX ((FIT_WORKOUT_SESSION_FIELD_NUM)3) -#define FIT_WORKOUT_SESSION_FIELD_NUM_POOL_LENGTH ((FIT_WORKOUT_SESSION_FIELD_NUM)4) -#define FIT_WORKOUT_SESSION_FIELD_NUM_SPORT ((FIT_WORKOUT_SESSION_FIELD_NUM)0) -#define FIT_WORKOUT_SESSION_FIELD_NUM_SUB_SPORT ((FIT_WORKOUT_SESSION_FIELD_NUM)1) -#define FIT_WORKOUT_SESSION_FIELD_NUM_POOL_LENGTH_UNIT ((FIT_WORKOUT_SESSION_FIELD_NUM)5) - -typedef enum -{ - FIT_WORKOUT_SESSION_MESG_MESSAGE_INDEX, - FIT_WORKOUT_SESSION_MESG_NUM_VALID_STEPS, - FIT_WORKOUT_SESSION_MESG_FIRST_STEP_INDEX, - FIT_WORKOUT_SESSION_MESG_POOL_LENGTH, - FIT_WORKOUT_SESSION_MESG_SPORT, - FIT_WORKOUT_SESSION_MESG_SUB_SPORT, - FIT_WORKOUT_SESSION_MESG_POOL_LENGTH_UNIT, - FIT_WORKOUT_SESSION_MESG_FIELDS -} FIT_WORKOUT_SESSION_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_WORKOUT_SESSION_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_WORKOUT_SESSION_MESG_DEF; - -// workout_step message - -#define FIT_WORKOUT_STEP_MESG_SIZE 103 -#define FIT_WORKOUT_STEP_MESG_DEF_SIZE 53 -#define FIT_WORKOUT_STEP_MESG_WKT_STEP_NAME_COUNT 16 -#define FIT_WORKOUT_STEP_MESG_NOTES_COUNT 50 - -typedef struct -{ - FIT_STRING wkt_step_name[FIT_WORKOUT_STEP_MESG_WKT_STEP_NAME_COUNT]; // - FIT_UINT32 duration_value; // - FIT_UINT32 target_value; // - FIT_UINT32 custom_target_value_low; // - FIT_UINT32 custom_target_value_high; // - FIT_UINT32 secondary_target_value; // - FIT_UINT32 secondary_custom_target_value_low; // - FIT_UINT32 secondary_custom_target_value_high; // - FIT_MESSAGE_INDEX message_index; // - FIT_EXERCISE_CATEGORY exercise_category; // - FIT_WKT_STEP_DURATION duration_type; // - FIT_WKT_STEP_TARGET target_type; // - FIT_INTENSITY intensity; // - FIT_STRING notes[FIT_WORKOUT_STEP_MESG_NOTES_COUNT]; // - FIT_WORKOUT_EQUIPMENT equipment; // - FIT_WKT_STEP_TARGET secondary_target_type; // -} FIT_WORKOUT_STEP_MESG; - -typedef FIT_UINT8 FIT_WORKOUT_STEP_FIELD_NUM; - -#define FIT_WORKOUT_STEP_FIELD_NUM_WKT_STEP_NAME ((FIT_WORKOUT_STEP_FIELD_NUM)0) -#define FIT_WORKOUT_STEP_FIELD_NUM_DURATION_VALUE ((FIT_WORKOUT_STEP_FIELD_NUM)2) -#define FIT_WORKOUT_STEP_FIELD_NUM_TARGET_VALUE ((FIT_WORKOUT_STEP_FIELD_NUM)4) -#define FIT_WORKOUT_STEP_FIELD_NUM_CUSTOM_TARGET_VALUE_LOW ((FIT_WORKOUT_STEP_FIELD_NUM)5) -#define FIT_WORKOUT_STEP_FIELD_NUM_CUSTOM_TARGET_VALUE_HIGH ((FIT_WORKOUT_STEP_FIELD_NUM)6) -#define FIT_WORKOUT_STEP_FIELD_NUM_SECONDARY_TARGET_VALUE ((FIT_WORKOUT_STEP_FIELD_NUM)20) -#define FIT_WORKOUT_STEP_FIELD_NUM_SECONDARY_CUSTOM_TARGET_VALUE_LOW ((FIT_WORKOUT_STEP_FIELD_NUM)21) -#define FIT_WORKOUT_STEP_FIELD_NUM_SECONDARY_CUSTOM_TARGET_VALUE_HIGH ((FIT_WORKOUT_STEP_FIELD_NUM)22) -#define FIT_WORKOUT_STEP_FIELD_NUM_MESSAGE_INDEX ((FIT_WORKOUT_STEP_FIELD_NUM)254) -#define FIT_WORKOUT_STEP_FIELD_NUM_EXERCISE_CATEGORY ((FIT_WORKOUT_STEP_FIELD_NUM)10) -#define FIT_WORKOUT_STEP_FIELD_NUM_DURATION_TYPE ((FIT_WORKOUT_STEP_FIELD_NUM)1) -#define FIT_WORKOUT_STEP_FIELD_NUM_TARGET_TYPE ((FIT_WORKOUT_STEP_FIELD_NUM)3) -#define FIT_WORKOUT_STEP_FIELD_NUM_INTENSITY ((FIT_WORKOUT_STEP_FIELD_NUM)7) -#define FIT_WORKOUT_STEP_FIELD_NUM_NOTES ((FIT_WORKOUT_STEP_FIELD_NUM)8) -#define FIT_WORKOUT_STEP_FIELD_NUM_EQUIPMENT ((FIT_WORKOUT_STEP_FIELD_NUM)9) -#define FIT_WORKOUT_STEP_FIELD_NUM_SECONDARY_TARGET_TYPE ((FIT_WORKOUT_STEP_FIELD_NUM)19) - -typedef enum -{ - FIT_WORKOUT_STEP_MESG_WKT_STEP_NAME, - FIT_WORKOUT_STEP_MESG_DURATION_VALUE, - FIT_WORKOUT_STEP_MESG_TARGET_VALUE, - FIT_WORKOUT_STEP_MESG_CUSTOM_TARGET_VALUE_LOW, - FIT_WORKOUT_STEP_MESG_CUSTOM_TARGET_VALUE_HIGH, - FIT_WORKOUT_STEP_MESG_SECONDARY_TARGET_VALUE, - FIT_WORKOUT_STEP_MESG_SECONDARY_CUSTOM_TARGET_VALUE_LOW, - FIT_WORKOUT_STEP_MESG_SECONDARY_CUSTOM_TARGET_VALUE_HIGH, - FIT_WORKOUT_STEP_MESG_MESSAGE_INDEX, - FIT_WORKOUT_STEP_MESG_EXERCISE_CATEGORY, - FIT_WORKOUT_STEP_MESG_DURATION_TYPE, - FIT_WORKOUT_STEP_MESG_TARGET_TYPE, - FIT_WORKOUT_STEP_MESG_INTENSITY, - FIT_WORKOUT_STEP_MESG_NOTES, - FIT_WORKOUT_STEP_MESG_EQUIPMENT, - FIT_WORKOUT_STEP_MESG_SECONDARY_TARGET_TYPE, - FIT_WORKOUT_STEP_MESG_FIELDS -} FIT_WORKOUT_STEP_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_WORKOUT_STEP_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_WORKOUT_STEP_MESG_DEF; - -// exercise_title message - -#define FIT_EXERCISE_TITLE_MESG_SIZE 206 -#define FIT_EXERCISE_TITLE_MESG_DEF_SIZE 17 -#define FIT_EXERCISE_TITLE_MESG_WKT_STEP_NAME_COUNT 200 - -typedef struct -{ - FIT_STRING wkt_step_name[FIT_EXERCISE_TITLE_MESG_WKT_STEP_NAME_COUNT]; // - FIT_MESSAGE_INDEX message_index; // - FIT_EXERCISE_CATEGORY exercise_category; // - FIT_UINT16 exercise_name; // -} FIT_EXERCISE_TITLE_MESG; - -typedef FIT_UINT8 FIT_EXERCISE_TITLE_FIELD_NUM; - -#define FIT_EXERCISE_TITLE_FIELD_NUM_WKT_STEP_NAME ((FIT_EXERCISE_TITLE_FIELD_NUM)2) -#define FIT_EXERCISE_TITLE_FIELD_NUM_MESSAGE_INDEX ((FIT_EXERCISE_TITLE_FIELD_NUM)254) -#define FIT_EXERCISE_TITLE_FIELD_NUM_EXERCISE_CATEGORY ((FIT_EXERCISE_TITLE_FIELD_NUM)0) -#define FIT_EXERCISE_TITLE_FIELD_NUM_EXERCISE_NAME ((FIT_EXERCISE_TITLE_FIELD_NUM)1) - -typedef enum -{ - FIT_EXERCISE_TITLE_MESG_WKT_STEP_NAME, - FIT_EXERCISE_TITLE_MESG_MESSAGE_INDEX, - FIT_EXERCISE_TITLE_MESG_EXERCISE_CATEGORY, - FIT_EXERCISE_TITLE_MESG_EXERCISE_NAME, - FIT_EXERCISE_TITLE_MESG_FIELDS -} FIT_EXERCISE_TITLE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_EXERCISE_TITLE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_EXERCISE_TITLE_MESG_DEF; - -// schedule message - -#define FIT_SCHEDULE_MESG_SIZE 18 -#define FIT_SCHEDULE_MESG_DEF_SIZE 26 - -typedef struct -{ - FIT_UINT32Z serial_number; // Corresponds to file_id of scheduled workout / course. - FIT_DATE_TIME time_created; // Corresponds to file_id of scheduled workout / course. - FIT_LOCAL_DATE_TIME scheduled_time; // - FIT_MANUFACTURER manufacturer; // Corresponds to file_id of scheduled workout / course. - FIT_UINT16 product; // Corresponds to file_id of scheduled workout / course. - FIT_BOOL completed; // TRUE if this activity has been started - FIT_SCHEDULE type; // -} FIT_SCHEDULE_MESG; - -typedef FIT_UINT8 FIT_SCHEDULE_FIELD_NUM; - -#define FIT_SCHEDULE_FIELD_NUM_SERIAL_NUMBER ((FIT_SCHEDULE_FIELD_NUM)2) -#define FIT_SCHEDULE_FIELD_NUM_TIME_CREATED ((FIT_SCHEDULE_FIELD_NUM)3) -#define FIT_SCHEDULE_FIELD_NUM_SCHEDULED_TIME ((FIT_SCHEDULE_FIELD_NUM)6) -#define FIT_SCHEDULE_FIELD_NUM_MANUFACTURER ((FIT_SCHEDULE_FIELD_NUM)0) -#define FIT_SCHEDULE_FIELD_NUM_PRODUCT ((FIT_SCHEDULE_FIELD_NUM)1) -#define FIT_SCHEDULE_FIELD_NUM_COMPLETED ((FIT_SCHEDULE_FIELD_NUM)4) -#define FIT_SCHEDULE_FIELD_NUM_TYPE ((FIT_SCHEDULE_FIELD_NUM)5) - -typedef enum -{ - FIT_SCHEDULE_MESG_SERIAL_NUMBER, - FIT_SCHEDULE_MESG_TIME_CREATED, - FIT_SCHEDULE_MESG_SCHEDULED_TIME, - FIT_SCHEDULE_MESG_MANUFACTURER, - FIT_SCHEDULE_MESG_PRODUCT, - FIT_SCHEDULE_MESG_COMPLETED, - FIT_SCHEDULE_MESG_TYPE, - FIT_SCHEDULE_MESG_FIELDS -} FIT_SCHEDULE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_SCHEDULE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_SCHEDULE_MESG_DEF; - -// totals message - -#define FIT_TOTALS_MESG_SIZE 29 -#define FIT_TOTALS_MESG_DEF_SIZE 32 - -typedef struct -{ - FIT_DATE_TIME timestamp; // 1 * s + 0, - FIT_UINT32 timer_time; // 1 * s + 0, Excludes pauses - FIT_UINT32 distance; // 1 * m + 0, - FIT_UINT32 calories; // 1 * kcal + 0, - FIT_UINT32 elapsed_time; // 1 * s + 0, Includes pauses - FIT_UINT32 active_time; // 1 * s + 0, - FIT_MESSAGE_INDEX message_index; // - FIT_UINT16 sessions; // - FIT_SPORT sport; // -} FIT_TOTALS_MESG; - -typedef FIT_UINT8 FIT_TOTALS_FIELD_NUM; - -#define FIT_TOTALS_FIELD_NUM_TIMESTAMP ((FIT_TOTALS_FIELD_NUM)253) -#define FIT_TOTALS_FIELD_NUM_TIMER_TIME ((FIT_TOTALS_FIELD_NUM)0) -#define FIT_TOTALS_FIELD_NUM_DISTANCE ((FIT_TOTALS_FIELD_NUM)1) -#define FIT_TOTALS_FIELD_NUM_CALORIES ((FIT_TOTALS_FIELD_NUM)2) -#define FIT_TOTALS_FIELD_NUM_ELAPSED_TIME ((FIT_TOTALS_FIELD_NUM)4) -#define FIT_TOTALS_FIELD_NUM_ACTIVE_TIME ((FIT_TOTALS_FIELD_NUM)6) -#define FIT_TOTALS_FIELD_NUM_MESSAGE_INDEX ((FIT_TOTALS_FIELD_NUM)254) -#define FIT_TOTALS_FIELD_NUM_SESSIONS ((FIT_TOTALS_FIELD_NUM)5) -#define FIT_TOTALS_FIELD_NUM_SPORT ((FIT_TOTALS_FIELD_NUM)3) - -typedef enum -{ - FIT_TOTALS_MESG_TIMESTAMP, - FIT_TOTALS_MESG_TIMER_TIME, - FIT_TOTALS_MESG_DISTANCE, - FIT_TOTALS_MESG_CALORIES, - FIT_TOTALS_MESG_ELAPSED_TIME, - FIT_TOTALS_MESG_ACTIVE_TIME, - FIT_TOTALS_MESG_MESSAGE_INDEX, - FIT_TOTALS_MESG_SESSIONS, - FIT_TOTALS_MESG_SPORT, - FIT_TOTALS_MESG_FIELDS -} FIT_TOTALS_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_TOTALS_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_TOTALS_MESG_DEF; - -// weight_scale message - -#define FIT_WEIGHT_SCALE_MESG_SIZE 27 -#define FIT_WEIGHT_SCALE_MESG_DEF_SIZE 47 - -typedef struct -{ - FIT_DATE_TIME timestamp; // 1 * s + 0, - FIT_WEIGHT weight; // 100 * kg + 0, - FIT_UINT16 percent_fat; // 100 * % + 0, - FIT_UINT16 percent_hydration; // 100 * % + 0, - FIT_UINT16 visceral_fat_mass; // 100 * kg + 0, - FIT_UINT16 bone_mass; // 100 * kg + 0, - FIT_UINT16 muscle_mass; // 100 * kg + 0, - FIT_UINT16 basal_met; // 4 * kcal/day + 0, - FIT_UINT16 active_met; // 4 * kcal/day + 0, ~4kJ per kcal, 0.25 allows max 16384 kcal - FIT_MESSAGE_INDEX user_profile_index; // Associates this weight scale message to a user. This corresponds to the index of the user profile message in the weight scale file. - FIT_UINT16 bmi; // 10 * kg/m^2 + 0, - FIT_UINT8 physique_rating; // - FIT_UINT8 metabolic_age; // 1 * years + 0, - FIT_UINT8 visceral_fat_rating; // -} FIT_WEIGHT_SCALE_MESG; - -typedef FIT_UINT8 FIT_WEIGHT_SCALE_FIELD_NUM; - -#define FIT_WEIGHT_SCALE_FIELD_NUM_TIMESTAMP ((FIT_WEIGHT_SCALE_FIELD_NUM)253) -#define FIT_WEIGHT_SCALE_FIELD_NUM_WEIGHT ((FIT_WEIGHT_SCALE_FIELD_NUM)0) -#define FIT_WEIGHT_SCALE_FIELD_NUM_PERCENT_FAT ((FIT_WEIGHT_SCALE_FIELD_NUM)1) -#define FIT_WEIGHT_SCALE_FIELD_NUM_PERCENT_HYDRATION ((FIT_WEIGHT_SCALE_FIELD_NUM)2) -#define FIT_WEIGHT_SCALE_FIELD_NUM_VISCERAL_FAT_MASS ((FIT_WEIGHT_SCALE_FIELD_NUM)3) -#define FIT_WEIGHT_SCALE_FIELD_NUM_BONE_MASS ((FIT_WEIGHT_SCALE_FIELD_NUM)4) -#define FIT_WEIGHT_SCALE_FIELD_NUM_MUSCLE_MASS ((FIT_WEIGHT_SCALE_FIELD_NUM)5) -#define FIT_WEIGHT_SCALE_FIELD_NUM_BASAL_MET ((FIT_WEIGHT_SCALE_FIELD_NUM)7) -#define FIT_WEIGHT_SCALE_FIELD_NUM_ACTIVE_MET ((FIT_WEIGHT_SCALE_FIELD_NUM)9) -#define FIT_WEIGHT_SCALE_FIELD_NUM_USER_PROFILE_INDEX ((FIT_WEIGHT_SCALE_FIELD_NUM)12) -#define FIT_WEIGHT_SCALE_FIELD_NUM_BMI ((FIT_WEIGHT_SCALE_FIELD_NUM)13) -#define FIT_WEIGHT_SCALE_FIELD_NUM_PHYSIQUE_RATING ((FIT_WEIGHT_SCALE_FIELD_NUM)8) -#define FIT_WEIGHT_SCALE_FIELD_NUM_METABOLIC_AGE ((FIT_WEIGHT_SCALE_FIELD_NUM)10) -#define FIT_WEIGHT_SCALE_FIELD_NUM_VISCERAL_FAT_RATING ((FIT_WEIGHT_SCALE_FIELD_NUM)11) - -typedef enum -{ - FIT_WEIGHT_SCALE_MESG_TIMESTAMP, - FIT_WEIGHT_SCALE_MESG_WEIGHT, - FIT_WEIGHT_SCALE_MESG_PERCENT_FAT, - FIT_WEIGHT_SCALE_MESG_PERCENT_HYDRATION, - FIT_WEIGHT_SCALE_MESG_VISCERAL_FAT_MASS, - FIT_WEIGHT_SCALE_MESG_BONE_MASS, - FIT_WEIGHT_SCALE_MESG_MUSCLE_MASS, - FIT_WEIGHT_SCALE_MESG_BASAL_MET, - FIT_WEIGHT_SCALE_MESG_ACTIVE_MET, - FIT_WEIGHT_SCALE_MESG_USER_PROFILE_INDEX, - FIT_WEIGHT_SCALE_MESG_BMI, - FIT_WEIGHT_SCALE_MESG_PHYSIQUE_RATING, - FIT_WEIGHT_SCALE_MESG_METABOLIC_AGE, - FIT_WEIGHT_SCALE_MESG_VISCERAL_FAT_RATING, - FIT_WEIGHT_SCALE_MESG_FIELDS -} FIT_WEIGHT_SCALE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_WEIGHT_SCALE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_WEIGHT_SCALE_MESG_DEF; - -// blood_pressure message - -#define FIT_BLOOD_PRESSURE_MESG_SIZE 21 -#define FIT_BLOOD_PRESSURE_MESG_DEF_SIZE 38 - -typedef struct -{ - FIT_DATE_TIME timestamp; // 1 * s + 0, - FIT_UINT16 systolic_pressure; // 1 * mmHg + 0, - FIT_UINT16 diastolic_pressure; // 1 * mmHg + 0, - FIT_UINT16 mean_arterial_pressure; // 1 * mmHg + 0, - FIT_UINT16 map_3_sample_mean; // 1 * mmHg + 0, - FIT_UINT16 map_morning_values; // 1 * mmHg + 0, - FIT_UINT16 map_evening_values; // 1 * mmHg + 0, - FIT_MESSAGE_INDEX user_profile_index; // Associates this blood pressure message to a user. This corresponds to the index of the user profile message in the blood pressure file. - FIT_UINT8 heart_rate; // 1 * bpm + 0, - FIT_HR_TYPE heart_rate_type; // - FIT_BP_STATUS status; // -} FIT_BLOOD_PRESSURE_MESG; - -typedef FIT_UINT8 FIT_BLOOD_PRESSURE_FIELD_NUM; - -#define FIT_BLOOD_PRESSURE_FIELD_NUM_TIMESTAMP ((FIT_BLOOD_PRESSURE_FIELD_NUM)253) -#define FIT_BLOOD_PRESSURE_FIELD_NUM_SYSTOLIC_PRESSURE ((FIT_BLOOD_PRESSURE_FIELD_NUM)0) -#define FIT_BLOOD_PRESSURE_FIELD_NUM_DIASTOLIC_PRESSURE ((FIT_BLOOD_PRESSURE_FIELD_NUM)1) -#define FIT_BLOOD_PRESSURE_FIELD_NUM_MEAN_ARTERIAL_PRESSURE ((FIT_BLOOD_PRESSURE_FIELD_NUM)2) -#define FIT_BLOOD_PRESSURE_FIELD_NUM_MAP_3_SAMPLE_MEAN ((FIT_BLOOD_PRESSURE_FIELD_NUM)3) -#define FIT_BLOOD_PRESSURE_FIELD_NUM_MAP_MORNING_VALUES ((FIT_BLOOD_PRESSURE_FIELD_NUM)4) -#define FIT_BLOOD_PRESSURE_FIELD_NUM_MAP_EVENING_VALUES ((FIT_BLOOD_PRESSURE_FIELD_NUM)5) -#define FIT_BLOOD_PRESSURE_FIELD_NUM_USER_PROFILE_INDEX ((FIT_BLOOD_PRESSURE_FIELD_NUM)9) -#define FIT_BLOOD_PRESSURE_FIELD_NUM_HEART_RATE ((FIT_BLOOD_PRESSURE_FIELD_NUM)6) -#define FIT_BLOOD_PRESSURE_FIELD_NUM_HEART_RATE_TYPE ((FIT_BLOOD_PRESSURE_FIELD_NUM)7) -#define FIT_BLOOD_PRESSURE_FIELD_NUM_STATUS ((FIT_BLOOD_PRESSURE_FIELD_NUM)8) - -typedef enum -{ - FIT_BLOOD_PRESSURE_MESG_TIMESTAMP, - FIT_BLOOD_PRESSURE_MESG_SYSTOLIC_PRESSURE, - FIT_BLOOD_PRESSURE_MESG_DIASTOLIC_PRESSURE, - FIT_BLOOD_PRESSURE_MESG_MEAN_ARTERIAL_PRESSURE, - FIT_BLOOD_PRESSURE_MESG_MAP_3_SAMPLE_MEAN, - FIT_BLOOD_PRESSURE_MESG_MAP_MORNING_VALUES, - FIT_BLOOD_PRESSURE_MESG_MAP_EVENING_VALUES, - FIT_BLOOD_PRESSURE_MESG_USER_PROFILE_INDEX, - FIT_BLOOD_PRESSURE_MESG_HEART_RATE, - FIT_BLOOD_PRESSURE_MESG_HEART_RATE_TYPE, - FIT_BLOOD_PRESSURE_MESG_STATUS, - FIT_BLOOD_PRESSURE_MESG_FIELDS -} FIT_BLOOD_PRESSURE_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_BLOOD_PRESSURE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_BLOOD_PRESSURE_MESG_DEF; - -// monitoring_info message - -#define FIT_MONITORING_INFO_MESG_SIZE 8 -#define FIT_MONITORING_INFO_MESG_DEF_SIZE 11 - -typedef struct -{ - FIT_DATE_TIME timestamp; // 1 * s + 0, - FIT_LOCAL_DATE_TIME local_timestamp; // 1 * s + 0, Use to convert activity timestamps to local time if device does not support time zone and daylight savings time correction. -} FIT_MONITORING_INFO_MESG; - -typedef FIT_UINT8 FIT_MONITORING_INFO_FIELD_NUM; - -#define FIT_MONITORING_INFO_FIELD_NUM_TIMESTAMP ((FIT_MONITORING_INFO_FIELD_NUM)253) -#define FIT_MONITORING_INFO_FIELD_NUM_LOCAL_TIMESTAMP ((FIT_MONITORING_INFO_FIELD_NUM)0) - -typedef enum -{ - FIT_MONITORING_INFO_MESG_TIMESTAMP, - FIT_MONITORING_INFO_MESG_LOCAL_TIMESTAMP, - FIT_MONITORING_INFO_MESG_FIELDS -} FIT_MONITORING_INFO_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_MONITORING_INFO_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_MONITORING_INFO_MESG_DEF; - -// monitoring message - -#define FIT_MONITORING_MESG_SIZE 31 -#define FIT_MONITORING_MESG_DEF_SIZE 41 - -typedef struct -{ - FIT_DATE_TIME timestamp; // 1 * s + 0, Must align to logging interval, for example, time must be 00:00:00 for daily log. - FIT_UINT32 distance; // 100 * m + 0, Accumulated distance. Maintained by MonitoringReader for each activity_type. See SDK documentation. - FIT_UINT32 cycles; // 2 * cycles + 0, Accumulated cycles. Maintained by MonitoringReader for each activity_type. See SDK documentation. - FIT_UINT32 active_time; // 1000 * s + 0, - FIT_LOCAL_DATE_TIME local_timestamp; // Must align to logging interval, for example, time must be 00:00:00 for daily log. - FIT_UINT16 calories; // 1 * kcal + 0, Accumulated total calories. Maintained by MonitoringReader for each activity_type. See SDK documentation - FIT_UINT16 distance_16; // 1 * 100 * m + 0, - FIT_UINT16 cycles_16; // 1 * 2 * cycles (steps) + 0, - FIT_UINT16 active_time_16; // 1 * s + 0, - FIT_DEVICE_INDEX device_index; // Associates this data to device_info message. Not required for file with single device (sensor). - FIT_ACTIVITY_TYPE activity_type; // - FIT_ACTIVITY_SUBTYPE activity_subtype; // -} FIT_MONITORING_MESG; - -typedef FIT_UINT8 FIT_MONITORING_FIELD_NUM; - -#define FIT_MONITORING_FIELD_NUM_TIMESTAMP ((FIT_MONITORING_FIELD_NUM)253) -#define FIT_MONITORING_FIELD_NUM_DISTANCE ((FIT_MONITORING_FIELD_NUM)2) -#define FIT_MONITORING_FIELD_NUM_CYCLES ((FIT_MONITORING_FIELD_NUM)3) -#define FIT_MONITORING_FIELD_NUM_ACTIVE_TIME ((FIT_MONITORING_FIELD_NUM)4) -#define FIT_MONITORING_FIELD_NUM_LOCAL_TIMESTAMP ((FIT_MONITORING_FIELD_NUM)11) -#define FIT_MONITORING_FIELD_NUM_CALORIES ((FIT_MONITORING_FIELD_NUM)1) -#define FIT_MONITORING_FIELD_NUM_DISTANCE_16 ((FIT_MONITORING_FIELD_NUM)8) -#define FIT_MONITORING_FIELD_NUM_CYCLES_16 ((FIT_MONITORING_FIELD_NUM)9) -#define FIT_MONITORING_FIELD_NUM_ACTIVE_TIME_16 ((FIT_MONITORING_FIELD_NUM)10) -#define FIT_MONITORING_FIELD_NUM_DEVICE_INDEX ((FIT_MONITORING_FIELD_NUM)0) -#define FIT_MONITORING_FIELD_NUM_ACTIVITY_TYPE ((FIT_MONITORING_FIELD_NUM)5) -#define FIT_MONITORING_FIELD_NUM_ACTIVITY_SUBTYPE ((FIT_MONITORING_FIELD_NUM)6) - -typedef enum -{ - FIT_MONITORING_MESG_TIMESTAMP, - FIT_MONITORING_MESG_DISTANCE, - FIT_MONITORING_MESG_CYCLES, - FIT_MONITORING_MESG_ACTIVE_TIME, - FIT_MONITORING_MESG_LOCAL_TIMESTAMP, - FIT_MONITORING_MESG_CALORIES, - FIT_MONITORING_MESG_DISTANCE_16, - FIT_MONITORING_MESG_CYCLES_16, - FIT_MONITORING_MESG_ACTIVE_TIME_16, - FIT_MONITORING_MESG_DEVICE_INDEX, - FIT_MONITORING_MESG_ACTIVITY_TYPE, - FIT_MONITORING_MESG_ACTIVITY_SUBTYPE, - FIT_MONITORING_MESG_FIELDS -} FIT_MONITORING_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_MONITORING_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_MONITORING_MESG_DEF; - -// monitoring_hr_data message - -#define FIT_MONITORING_HR_DATA_MESG_SIZE 6 -#define FIT_MONITORING_HR_DATA_MESG_DEF_SIZE 14 - -typedef struct -{ - FIT_DATE_TIME timestamp; // 1 * s + 0, Must align to logging interval, for example, time must be 00:00:00 for daily log. - FIT_UINT8 resting_heart_rate; // 1 * bpm + 0, 7-day rolling average - FIT_UINT8 current_day_resting_heart_rate; // 1 * bpm + 0, RHR for today only. (Feeds into 7-day average) -} FIT_MONITORING_HR_DATA_MESG; - -typedef FIT_UINT8 FIT_MONITORING_HR_DATA_FIELD_NUM; - -#define FIT_MONITORING_HR_DATA_FIELD_NUM_TIMESTAMP ((FIT_MONITORING_HR_DATA_FIELD_NUM)253) -#define FIT_MONITORING_HR_DATA_FIELD_NUM_RESTING_HEART_RATE ((FIT_MONITORING_HR_DATA_FIELD_NUM)0) -#define FIT_MONITORING_HR_DATA_FIELD_NUM_CURRENT_DAY_RESTING_HEART_RATE ((FIT_MONITORING_HR_DATA_FIELD_NUM)1) - -typedef enum -{ - FIT_MONITORING_HR_DATA_MESG_TIMESTAMP, - FIT_MONITORING_HR_DATA_MESG_RESTING_HEART_RATE, - FIT_MONITORING_HR_DATA_MESG_CURRENT_DAY_RESTING_HEART_RATE, - FIT_MONITORING_HR_DATA_MESG_FIELDS -} FIT_MONITORING_HR_DATA_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_MONITORING_HR_DATA_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_MONITORING_HR_DATA_MESG_DEF; - -// hr message - -#define FIT_HR_MESG_SIZE 13 -#define FIT_HR_MESG_DEF_SIZE 23 -#define FIT_HR_MESG_EVENT_TIMESTAMP_COUNT 1 -#define FIT_HR_MESG_FILTERED_BPM_COUNT 1 -#define FIT_HR_MESG_EVENT_TIMESTAMP_12_COUNT 1 - -typedef struct -{ - FIT_DATE_TIME timestamp; // - FIT_UINT32 event_timestamp[FIT_HR_MESG_EVENT_TIMESTAMP_COUNT]; // 1024 * s + 0, - FIT_UINT16 fractional_timestamp; // 32768 * s + 0, - FIT_UINT8 time256; // 256 * s + 0, - FIT_UINT8 filtered_bpm[FIT_HR_MESG_FILTERED_BPM_COUNT]; // 1 * bpm + 0, - FIT_BYTE event_timestamp_12[FIT_HR_MESG_EVENT_TIMESTAMP_12_COUNT]; // -} FIT_HR_MESG; - -typedef FIT_UINT8 FIT_HR_FIELD_NUM; - -#define FIT_HR_FIELD_NUM_TIMESTAMP ((FIT_HR_FIELD_NUM)253) -#define FIT_HR_FIELD_NUM_EVENT_TIMESTAMP ((FIT_HR_FIELD_NUM)9) -#define FIT_HR_FIELD_NUM_FRACTIONAL_TIMESTAMP ((FIT_HR_FIELD_NUM)0) -#define FIT_HR_FIELD_NUM_TIME256 ((FIT_HR_FIELD_NUM)1) -#define FIT_HR_FIELD_NUM_FILTERED_BPM ((FIT_HR_FIELD_NUM)6) -#define FIT_HR_FIELD_NUM_EVENT_TIMESTAMP_12 ((FIT_HR_FIELD_NUM)10) - -typedef enum -{ - FIT_HR_MESG_TIMESTAMP, - FIT_HR_MESG_EVENT_TIMESTAMP, - FIT_HR_MESG_FRACTIONAL_TIMESTAMP, - FIT_HR_MESG_TIME256, - FIT_HR_MESG_FILTERED_BPM, - FIT_HR_MESG_EVENT_TIMESTAMP_12, - FIT_HR_MESG_FIELDS -} FIT_HR_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_HR_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_HR_MESG_DEF; - -// ant_rx message - -#define FIT_ANT_RX_MESG_SIZE 25 -#define FIT_ANT_RX_MESG_DEF_SIZE 23 -#define FIT_ANT_RX_MESG_DATA_COUNT 8 -#define FIT_ANT_RX_MESG_MESG_DATA_COUNT 9 - -typedef struct -{ - FIT_DATE_TIME timestamp; // 1 * s + 0, - FIT_BYTE data[FIT_ANT_RX_MESG_DATA_COUNT]; // - FIT_UINT16 fractional_timestamp; // 32768 * s + 0, - FIT_BYTE mesg_id; // - FIT_BYTE mesg_data[FIT_ANT_RX_MESG_MESG_DATA_COUNT]; // - FIT_UINT8 channel_number; // -} FIT_ANT_RX_MESG; - -typedef FIT_UINT8 FIT_ANT_RX_FIELD_NUM; - -#define FIT_ANT_RX_FIELD_NUM_TIMESTAMP ((FIT_ANT_RX_FIELD_NUM)253) -#define FIT_ANT_RX_FIELD_NUM_DATA ((FIT_ANT_RX_FIELD_NUM)4) -#define FIT_ANT_RX_FIELD_NUM_FRACTIONAL_TIMESTAMP ((FIT_ANT_RX_FIELD_NUM)0) -#define FIT_ANT_RX_FIELD_NUM_MESG_ID ((FIT_ANT_RX_FIELD_NUM)1) -#define FIT_ANT_RX_FIELD_NUM_MESG_DATA ((FIT_ANT_RX_FIELD_NUM)2) -#define FIT_ANT_RX_FIELD_NUM_CHANNEL_NUMBER ((FIT_ANT_RX_FIELD_NUM)3) - -typedef enum -{ - FIT_ANT_RX_MESG_TIMESTAMP, - FIT_ANT_RX_MESG_DATA, - FIT_ANT_RX_MESG_FRACTIONAL_TIMESTAMP, - FIT_ANT_RX_MESG_MESG_ID, - FIT_ANT_RX_MESG_MESG_DATA, - FIT_ANT_RX_MESG_CHANNEL_NUMBER, - FIT_ANT_RX_MESG_FIELDS -} FIT_ANT_RX_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_ANT_RX_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_ANT_RX_MESG_DEF; - -// ant_tx message - -#define FIT_ANT_TX_MESG_SIZE 25 -#define FIT_ANT_TX_MESG_DEF_SIZE 23 -#define FIT_ANT_TX_MESG_DATA_COUNT 8 -#define FIT_ANT_TX_MESG_MESG_DATA_COUNT 9 - -typedef struct -{ - FIT_DATE_TIME timestamp; // 1 * s + 0, - FIT_BYTE data[FIT_ANT_TX_MESG_DATA_COUNT]; // - FIT_UINT16 fractional_timestamp; // 32768 * s + 0, - FIT_BYTE mesg_id; // - FIT_BYTE mesg_data[FIT_ANT_TX_MESG_MESG_DATA_COUNT]; // - FIT_UINT8 channel_number; // -} FIT_ANT_TX_MESG; - -typedef FIT_UINT8 FIT_ANT_TX_FIELD_NUM; - -#define FIT_ANT_TX_FIELD_NUM_TIMESTAMP ((FIT_ANT_TX_FIELD_NUM)253) -#define FIT_ANT_TX_FIELD_NUM_DATA ((FIT_ANT_TX_FIELD_NUM)4) -#define FIT_ANT_TX_FIELD_NUM_FRACTIONAL_TIMESTAMP ((FIT_ANT_TX_FIELD_NUM)0) -#define FIT_ANT_TX_FIELD_NUM_MESG_ID ((FIT_ANT_TX_FIELD_NUM)1) -#define FIT_ANT_TX_FIELD_NUM_MESG_DATA ((FIT_ANT_TX_FIELD_NUM)2) -#define FIT_ANT_TX_FIELD_NUM_CHANNEL_NUMBER ((FIT_ANT_TX_FIELD_NUM)3) - -typedef enum -{ - FIT_ANT_TX_MESG_TIMESTAMP, - FIT_ANT_TX_MESG_DATA, - FIT_ANT_TX_MESG_FRACTIONAL_TIMESTAMP, - FIT_ANT_TX_MESG_MESG_ID, - FIT_ANT_TX_MESG_MESG_DATA, - FIT_ANT_TX_MESG_CHANNEL_NUMBER, - FIT_ANT_TX_MESG_FIELDS -} FIT_ANT_TX_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_ANT_TX_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_ANT_TX_MESG_DEF; - -// exd_screen_configuration message - -#define FIT_EXD_SCREEN_CONFIGURATION_MESG_SIZE 4 -#define FIT_EXD_SCREEN_CONFIGURATION_MESG_DEF_SIZE 17 - -typedef struct -{ - FIT_UINT8 screen_index; // - FIT_UINT8 field_count; // number of fields in screen - FIT_EXD_LAYOUT layout; // - FIT_BOOL screen_enabled; // -} FIT_EXD_SCREEN_CONFIGURATION_MESG; - -typedef FIT_UINT8 FIT_EXD_SCREEN_CONFIGURATION_FIELD_NUM; - -#define FIT_EXD_SCREEN_CONFIGURATION_FIELD_NUM_SCREEN_INDEX ((FIT_EXD_SCREEN_CONFIGURATION_FIELD_NUM)0) -#define FIT_EXD_SCREEN_CONFIGURATION_FIELD_NUM_FIELD_COUNT ((FIT_EXD_SCREEN_CONFIGURATION_FIELD_NUM)1) -#define FIT_EXD_SCREEN_CONFIGURATION_FIELD_NUM_LAYOUT ((FIT_EXD_SCREEN_CONFIGURATION_FIELD_NUM)2) -#define FIT_EXD_SCREEN_CONFIGURATION_FIELD_NUM_SCREEN_ENABLED ((FIT_EXD_SCREEN_CONFIGURATION_FIELD_NUM)3) - -typedef enum -{ - FIT_EXD_SCREEN_CONFIGURATION_MESG_SCREEN_INDEX, - FIT_EXD_SCREEN_CONFIGURATION_MESG_FIELD_COUNT, - FIT_EXD_SCREEN_CONFIGURATION_MESG_LAYOUT, - FIT_EXD_SCREEN_CONFIGURATION_MESG_SCREEN_ENABLED, - FIT_EXD_SCREEN_CONFIGURATION_MESG_FIELDS -} FIT_EXD_SCREEN_CONFIGURATION_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_EXD_SCREEN_CONFIGURATION_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_EXD_SCREEN_CONFIGURATION_MESG_DEF; - -// exd_data_field_configuration message - -#define FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_SIZE 6 -#define FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_DEF_SIZE 23 -#define FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_TITLE_COUNT 1 - -typedef struct -{ - FIT_UINT8 screen_index; // - FIT_BYTE concept_field; // - FIT_UINT8 field_id; // - FIT_UINT8 concept_count; // - FIT_EXD_DISPLAY_TYPE display_type; // - FIT_STRING title[FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_TITLE_COUNT]; // -} FIT_EXD_DATA_FIELD_CONFIGURATION_MESG; - -typedef FIT_UINT8 FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM; - -#define FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM_SCREEN_INDEX ((FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM)0) -#define FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM_CONCEPT_FIELD ((FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM)1) -#define FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM_FIELD_ID ((FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM)2) -#define FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM_CONCEPT_COUNT ((FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM)3) -#define FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM_DISPLAY_TYPE ((FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM)4) -#define FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM_TITLE ((FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM)5) - -typedef enum -{ - FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_SCREEN_INDEX, - FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_CONCEPT_FIELD, - FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_FIELD_ID, - FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_CONCEPT_COUNT, - FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_DISPLAY_TYPE, - FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_TITLE, - FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_FIELDS -} FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_DEF; - -// exd_data_concept_configuration message - -#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_SIZE 11 -#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_DEF_SIZE 38 - -typedef struct -{ - FIT_UINT8 screen_index; // - FIT_BYTE concept_field; // - FIT_UINT8 field_id; // - FIT_UINT8 concept_index; // - FIT_UINT8 data_page; // - FIT_UINT8 concept_key; // - FIT_UINT8 scaling; // - FIT_EXD_DATA_UNITS data_units; // - FIT_EXD_QUALIFIERS qualifier; // - FIT_EXD_DESCRIPTORS descriptor; // - FIT_BOOL is_signed; // -} FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG; - -typedef FIT_UINT8 FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM; - -#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_SCREEN_INDEX ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)0) -#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_CONCEPT_FIELD ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)1) -#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_FIELD_ID ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)2) -#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_CONCEPT_INDEX ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)3) -#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_DATA_PAGE ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)4) -#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_CONCEPT_KEY ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)5) -#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_SCALING ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)6) -#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_DATA_UNITS ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)8) -#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_QUALIFIER ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)9) -#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_DESCRIPTOR ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)10) -#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_IS_SIGNED ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)11) - -typedef enum -{ - FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_SCREEN_INDEX, - FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_CONCEPT_FIELD, - FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_FIELD_ID, - FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_CONCEPT_INDEX, - FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_DATA_PAGE, - FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_CONCEPT_KEY, - FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_SCALING, - FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_DATA_UNITS, - FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_QUALIFIER, - FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_DESCRIPTOR, - FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_IS_SIGNED, - FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_FIELDS -} FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_DEF; - -// hrv message - -#define FIT_HRV_MESG_SIZE 2 -#define FIT_HRV_MESG_DEF_SIZE 8 -#define FIT_HRV_MESG_TIME_COUNT 1 - -typedef struct -{ - FIT_UINT16 time[FIT_HRV_MESG_TIME_COUNT]; // 1000 * s + 0, Time between beats -} FIT_HRV_MESG; - -typedef FIT_UINT8 FIT_HRV_FIELD_NUM; - -#define FIT_HRV_FIELD_NUM_TIME ((FIT_HRV_FIELD_NUM)0) - -typedef enum -{ - FIT_HRV_MESG_TIME, - FIT_HRV_MESG_FIELDS -} FIT_HRV_MESG_FIELD; - -typedef struct -{ - FIT_UINT8 reserved_1; - FIT_UINT8 arch; - FIT_MESG_NUM global_mesg_num; - FIT_UINT8 num_fields; - FIT_UINT8 fields[FIT_HRV_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; -} FIT_HRV_MESG_DEF; - -typedef enum { - FIT_MESG_PAD, - FIT_MESG_FILE_ID, - FIT_MESG_FILE_CREATOR, - FIT_MESG_SOFTWARE, - FIT_MESG_SLAVE_DEVICE, - FIT_MESG_CAPABILITIES, - FIT_MESG_FILE_CAPABILITIES, - FIT_MESG_MESG_CAPABILITIES, - FIT_MESG_FIELD_CAPABILITIES, - FIT_MESG_DEVICE_SETTINGS, - FIT_MESG_USER_PROFILE, - FIT_MESG_HRM_PROFILE, - FIT_MESG_SDM_PROFILE, - FIT_MESG_BIKE_PROFILE, - FIT_MESG_CONNECTIVITY, - FIT_MESG_ZONES_TARGET, - FIT_MESG_SPORT, - FIT_MESG_HR_ZONE, - FIT_MESG_SPEED_ZONE, - FIT_MESG_CADENCE_ZONE, - FIT_MESG_POWER_ZONE, - FIT_MESG_MET_ZONE, - FIT_MESG_DIVE_SETTINGS, - FIT_MESG_GOAL, - FIT_MESG_ACTIVITY, - FIT_MESG_SESSION, - FIT_MESG_LAP, - FIT_MESG_LENGTH, - FIT_MESG_RECORD, - FIT_MESG_EVENT, - FIT_MESG_DEVICE_INFO, - FIT_MESG_DEVICE_AUX_BATTERY_INFO, - FIT_MESG_TRAINING_FILE, - FIT_MESG_WEATHER_CONDITIONS, - FIT_MESG_WEATHER_ALERT, - FIT_MESG_NMEA_SENTENCE, - FIT_MESG_AVIATION_ATTITUDE, - FIT_MESG_VIDEO_TITLE, - FIT_MESG_VIDEO_DESCRIPTION, - FIT_MESG_SET, - FIT_MESG_FIELD_DESCRIPTION, - FIT_MESG_DEVELOPER_DATA_ID, - FIT_MESG_COURSE, - FIT_MESG_COURSE_POINT, - FIT_MESG_SEGMENT_ID, - FIT_MESG_SEGMENT_LEADERBOARD_ENTRY, - FIT_MESG_SEGMENT_POINT, - FIT_MESG_SEGMENT_LAP, - FIT_MESG_SEGMENT_FILE, - FIT_MESG_WORKOUT, - FIT_MESG_WORKOUT_SESSION, - FIT_MESG_WORKOUT_STEP, - FIT_MESG_EXERCISE_TITLE, - FIT_MESG_SCHEDULE, - FIT_MESG_TOTALS, - FIT_MESG_WEIGHT_SCALE, - FIT_MESG_BLOOD_PRESSURE, - FIT_MESG_MONITORING_INFO, - FIT_MESG_MONITORING, - FIT_MESG_MONITORING_HR_DATA, - FIT_MESG_HR, - FIT_MESG_ANT_RX, - FIT_MESG_ANT_TX, - FIT_MESG_EXD_SCREEN_CONFIGURATION, - FIT_MESG_EXD_DATA_FIELD_CONFIGURATION, - FIT_MESG_EXD_DATA_CONCEPT_CONFIGURATION, - FIT_MESG_HRV, - FIT_MESGS -} FIT_MESG; - -typedef const FIT_MESG_DEF * FIT_CONST_MESG_DEF_PTR; -extern const FIT_CONST_MESG_DEF_PTR fit_mesg_defs[FIT_MESGS]; - - - - -/////////////////////////////////////////////////////////////////////// -// Files -// Use FIT_MESG_OFFSET macro get byte offset of messages in a file. -/////////////////////////////////////////////////////////////////////// - -#define FIT_FILE_DATA_SIZE ((FIT_UINT32)63) -#define FIT_FILE_SIZE (FIT_FILE_HDR_SIZE + FIT_FILE_DATA_SIZE + sizeof(FIT_UINT16)) -#define FIT_FILE_MESG_COUNT 1 - -typedef enum { - FIT_FILE_DEF_DEVICE, - FIT_FILE_DEFS -} FIT_FILE_DEF_ENUM; - -typedef enum { - FIT_FILE_INDEX_DEVICE_0, - FIT_FILE_INDEX_COUNT -} FIT_FILE_INDEX; - -#define FIT_FILE_INDEX_DEVICE FIT_FILE_INDEX_DEVICE_0 - -#define FIT_DEVICE_FILE_FILE_ID_MESGS 1 -#define FIT_DEVICE_FILE_DATA_SIZE ((FIT_UINT32)63) -#define FIT_DEVICE_FILE_SIZE (FIT_FILE_HDR_SIZE + FIT_DEVICE_FILE_DATA_SIZE + sizeof(FIT_UINT16)) -#define FIT_DEVICE_FILE_MESG_COUNT 1 -#define FIT_DEVICE_FILE_COUNT 1 - - - -#define FIT_DEVICE_FILE_CRC_PAD_SIZE ((FIT_ALIGNMENT - FIT_FILE_CRC_SIZE) % FIT_ALIGNMENT) - -typedef struct -{ - FIT_UINT8 hdr[FIT_FILE_HDR_SIZE]; - FIT_UINT8 file_id_mesg_def[FIT_HDR_SIZE + FIT_FILE_ID_MESG_DEF_SIZE]; - FIT_UINT8 file_id_mesg[FIT_DEVICE_FILE_FILE_ID_MESGS][FIT_HDR_SIZE + FIT_FILE_ID_MESG_SIZE]; - FIT_UINT8 crc[2]; -} FIT_DEVICE_FILE; - -extern const FIT_DEVICE_FILE fit_device_file; - - -extern const FIT_FILE_DEF fit_file_defs[FIT_FILE_DEFS]; - - - - - -#if defined(__cplusplus) - } -#endif - -#endif // !defined(FIT_EXAMPLE_H) - +///////////////////////////////////////////////////////////////////////////////////////////// +// Copyright 2023 Garmin International, Inc. +// Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +// may not use this file except in compliance with the Flexible and Interoperable Data +// Transfer (FIT) Protocol License. +///////////////////////////////////////////////////////////////////////////////////////////// +// ****WARNING**** This file is auto-generated! Do NOT edit this file. +// Profile Version = 21.115Release +// Tag = production/release/21.115.00-0-gfe0a7f8 +// Product = EXAMPLE +// Alignment = 4 bytes, padding disabled. +///////////////////////////////////////////////////////////////////////////////////////////// + + +#if !defined(FIT_EXAMPLE_H) +#define FIT_EXAMPLE_H + +#include "fit.h" + +#if defined(__cplusplus) + extern "C" { +#endif + + +/////////////////////////////////////////////////////////////////////// +// Public Definitions +/////////////////////////////////////////////////////////////////////// + +#define FIT_ALIGNMENT 4 + +/////////////////////////////////////////////////////////////////////// +// Types +/////////////////////////////////////////////////////////////////////// + + +typedef FIT_ENUM FIT_FILE; +#define FIT_FILE_INVALID FIT_ENUM_INVALID +#define FIT_FILE_DEVICE ((FIT_FILE)1) // Read only, single file. Must be in root directory. +#define FIT_FILE_SETTINGS ((FIT_FILE)2) // Read/write, single file. Directory=Settings +#define FIT_FILE_SPORT ((FIT_FILE)3) // Read/write, multiple files, file number = sport type. Directory=Sports +#define FIT_FILE_ACTIVITY ((FIT_FILE)4) // Read/erase, multiple files. Directory=Activities +#define FIT_FILE_WORKOUT ((FIT_FILE)5) // Read/write/erase, multiple files. Directory=Workouts +#define FIT_FILE_COURSE ((FIT_FILE)6) // Read/write/erase, multiple files. Directory=Courses +#define FIT_FILE_SCHEDULES ((FIT_FILE)7) // Read/write, single file. Directory=Schedules +#define FIT_FILE_WEIGHT ((FIT_FILE)9) // Read only, single file. Circular buffer. All message definitions at start of file. Directory=Weight +#define FIT_FILE_TOTALS ((FIT_FILE)10) // Read only, single file. Directory=Totals +#define FIT_FILE_GOALS ((FIT_FILE)11) // Read/write, single file. Directory=Goals +#define FIT_FILE_BLOOD_PRESSURE ((FIT_FILE)14) // Read only. Directory=Blood Pressure +#define FIT_FILE_MONITORING_A ((FIT_FILE)15) // Read only. Directory=Monitoring. File number=sub type. +#define FIT_FILE_ACTIVITY_SUMMARY ((FIT_FILE)20) // Read/erase, multiple files. Directory=Activities +#define FIT_FILE_MONITORING_DAILY ((FIT_FILE)28) +#define FIT_FILE_MONITORING_B ((FIT_FILE)32) // Read only. Directory=Monitoring. File number=identifier +#define FIT_FILE_SEGMENT ((FIT_FILE)34) // Read/write/erase. Multiple Files. Directory=Segments +#define FIT_FILE_SEGMENT_LIST ((FIT_FILE)35) // Read/write/erase. Single File. Directory=Segments +#define FIT_FILE_EXD_CONFIGURATION ((FIT_FILE)40) // Read/write/erase. Single File. Directory=Settings +#define FIT_FILE_MFG_RANGE_MIN ((FIT_FILE)0xF7) // 0xF7 - 0xFE reserved for manufacturer specific file types +#define FIT_FILE_MFG_RANGE_MAX ((FIT_FILE)0xFE) // 0xF7 - 0xFE reserved for manufacturer specific file types +#define FIT_FILE_COUNT 20 + +typedef FIT_UINT16 FIT_MESG_NUM; +#define FIT_MESG_NUM_INVALID FIT_UINT16_INVALID +#define FIT_MESG_NUM_FILE_ID ((FIT_MESG_NUM)0) +#define FIT_MESG_NUM_CAPABILITIES ((FIT_MESG_NUM)1) +#define FIT_MESG_NUM_DEVICE_SETTINGS ((FIT_MESG_NUM)2) +#define FIT_MESG_NUM_USER_PROFILE ((FIT_MESG_NUM)3) +#define FIT_MESG_NUM_HRM_PROFILE ((FIT_MESG_NUM)4) +#define FIT_MESG_NUM_SDM_PROFILE ((FIT_MESG_NUM)5) +#define FIT_MESG_NUM_BIKE_PROFILE ((FIT_MESG_NUM)6) +#define FIT_MESG_NUM_ZONES_TARGET ((FIT_MESG_NUM)7) +#define FIT_MESG_NUM_HR_ZONE ((FIT_MESG_NUM)8) +#define FIT_MESG_NUM_POWER_ZONE ((FIT_MESG_NUM)9) +#define FIT_MESG_NUM_MET_ZONE ((FIT_MESG_NUM)10) +#define FIT_MESG_NUM_SPORT ((FIT_MESG_NUM)12) +#define FIT_MESG_NUM_GOAL ((FIT_MESG_NUM)15) +#define FIT_MESG_NUM_SESSION ((FIT_MESG_NUM)18) +#define FIT_MESG_NUM_LAP ((FIT_MESG_NUM)19) +#define FIT_MESG_NUM_RECORD ((FIT_MESG_NUM)20) +#define FIT_MESG_NUM_EVENT ((FIT_MESG_NUM)21) +#define FIT_MESG_NUM_DEVICE_INFO ((FIT_MESG_NUM)23) +#define FIT_MESG_NUM_WORKOUT ((FIT_MESG_NUM)26) +#define FIT_MESG_NUM_WORKOUT_STEP ((FIT_MESG_NUM)27) +#define FIT_MESG_NUM_SCHEDULE ((FIT_MESG_NUM)28) +#define FIT_MESG_NUM_WEIGHT_SCALE ((FIT_MESG_NUM)30) +#define FIT_MESG_NUM_COURSE ((FIT_MESG_NUM)31) +#define FIT_MESG_NUM_COURSE_POINT ((FIT_MESG_NUM)32) +#define FIT_MESG_NUM_TOTALS ((FIT_MESG_NUM)33) +#define FIT_MESG_NUM_ACTIVITY ((FIT_MESG_NUM)34) +#define FIT_MESG_NUM_SOFTWARE ((FIT_MESG_NUM)35) +#define FIT_MESG_NUM_FILE_CAPABILITIES ((FIT_MESG_NUM)37) +#define FIT_MESG_NUM_MESG_CAPABILITIES ((FIT_MESG_NUM)38) +#define FIT_MESG_NUM_FIELD_CAPABILITIES ((FIT_MESG_NUM)39) +#define FIT_MESG_NUM_FILE_CREATOR ((FIT_MESG_NUM)49) +#define FIT_MESG_NUM_BLOOD_PRESSURE ((FIT_MESG_NUM)51) +#define FIT_MESG_NUM_SPEED_ZONE ((FIT_MESG_NUM)53) +#define FIT_MESG_NUM_MONITORING ((FIT_MESG_NUM)55) +#define FIT_MESG_NUM_TRAINING_FILE ((FIT_MESG_NUM)72) +#define FIT_MESG_NUM_HRV ((FIT_MESG_NUM)78) +#define FIT_MESG_NUM_ANT_RX ((FIT_MESG_NUM)80) +#define FIT_MESG_NUM_ANT_TX ((FIT_MESG_NUM)81) +#define FIT_MESG_NUM_ANT_CHANNEL_ID ((FIT_MESG_NUM)82) +#define FIT_MESG_NUM_LENGTH ((FIT_MESG_NUM)101) +#define FIT_MESG_NUM_MONITORING_INFO ((FIT_MESG_NUM)103) +#define FIT_MESG_NUM_PAD ((FIT_MESG_NUM)105) +#define FIT_MESG_NUM_SLAVE_DEVICE ((FIT_MESG_NUM)106) +#define FIT_MESG_NUM_CONNECTIVITY ((FIT_MESG_NUM)127) +#define FIT_MESG_NUM_WEATHER_CONDITIONS ((FIT_MESG_NUM)128) +#define FIT_MESG_NUM_WEATHER_ALERT ((FIT_MESG_NUM)129) +#define FIT_MESG_NUM_CADENCE_ZONE ((FIT_MESG_NUM)131) +#define FIT_MESG_NUM_HR ((FIT_MESG_NUM)132) +#define FIT_MESG_NUM_SEGMENT_LAP ((FIT_MESG_NUM)142) +#define FIT_MESG_NUM_MEMO_GLOB ((FIT_MESG_NUM)145) +#define FIT_MESG_NUM_SEGMENT_ID ((FIT_MESG_NUM)148) +#define FIT_MESG_NUM_SEGMENT_LEADERBOARD_ENTRY ((FIT_MESG_NUM)149) +#define FIT_MESG_NUM_SEGMENT_POINT ((FIT_MESG_NUM)150) +#define FIT_MESG_NUM_SEGMENT_FILE ((FIT_MESG_NUM)151) +#define FIT_MESG_NUM_WORKOUT_SESSION ((FIT_MESG_NUM)158) +#define FIT_MESG_NUM_WATCHFACE_SETTINGS ((FIT_MESG_NUM)159) +#define FIT_MESG_NUM_GPS_METADATA ((FIT_MESG_NUM)160) +#define FIT_MESG_NUM_CAMERA_EVENT ((FIT_MESG_NUM)161) +#define FIT_MESG_NUM_TIMESTAMP_CORRELATION ((FIT_MESG_NUM)162) +#define FIT_MESG_NUM_GYROSCOPE_DATA ((FIT_MESG_NUM)164) +#define FIT_MESG_NUM_ACCELEROMETER_DATA ((FIT_MESG_NUM)165) +#define FIT_MESG_NUM_THREE_D_SENSOR_CALIBRATION ((FIT_MESG_NUM)167) +#define FIT_MESG_NUM_VIDEO_FRAME ((FIT_MESG_NUM)169) +#define FIT_MESG_NUM_OBDII_DATA ((FIT_MESG_NUM)174) +#define FIT_MESG_NUM_NMEA_SENTENCE ((FIT_MESG_NUM)177) +#define FIT_MESG_NUM_AVIATION_ATTITUDE ((FIT_MESG_NUM)178) +#define FIT_MESG_NUM_VIDEO ((FIT_MESG_NUM)184) +#define FIT_MESG_NUM_VIDEO_TITLE ((FIT_MESG_NUM)185) +#define FIT_MESG_NUM_VIDEO_DESCRIPTION ((FIT_MESG_NUM)186) +#define FIT_MESG_NUM_VIDEO_CLIP ((FIT_MESG_NUM)187) +#define FIT_MESG_NUM_OHR_SETTINGS ((FIT_MESG_NUM)188) +#define FIT_MESG_NUM_EXD_SCREEN_CONFIGURATION ((FIT_MESG_NUM)200) +#define FIT_MESG_NUM_EXD_DATA_FIELD_CONFIGURATION ((FIT_MESG_NUM)201) +#define FIT_MESG_NUM_EXD_DATA_CONCEPT_CONFIGURATION ((FIT_MESG_NUM)202) +#define FIT_MESG_NUM_FIELD_DESCRIPTION ((FIT_MESG_NUM)206) +#define FIT_MESG_NUM_DEVELOPER_DATA_ID ((FIT_MESG_NUM)207) +#define FIT_MESG_NUM_MAGNETOMETER_DATA ((FIT_MESG_NUM)208) +#define FIT_MESG_NUM_BAROMETER_DATA ((FIT_MESG_NUM)209) +#define FIT_MESG_NUM_ONE_D_SENSOR_CALIBRATION ((FIT_MESG_NUM)210) +#define FIT_MESG_NUM_MONITORING_HR_DATA ((FIT_MESG_NUM)211) +#define FIT_MESG_NUM_TIME_IN_ZONE ((FIT_MESG_NUM)216) +#define FIT_MESG_NUM_SET ((FIT_MESG_NUM)225) +#define FIT_MESG_NUM_STRESS_LEVEL ((FIT_MESG_NUM)227) +#define FIT_MESG_NUM_MAX_MET_DATA ((FIT_MESG_NUM)229) +#define FIT_MESG_NUM_DIVE_SETTINGS ((FIT_MESG_NUM)258) +#define FIT_MESG_NUM_DIVE_GAS ((FIT_MESG_NUM)259) +#define FIT_MESG_NUM_DIVE_ALARM ((FIT_MESG_NUM)262) +#define FIT_MESG_NUM_EXERCISE_TITLE ((FIT_MESG_NUM)264) +#define FIT_MESG_NUM_DIVE_SUMMARY ((FIT_MESG_NUM)268) +#define FIT_MESG_NUM_SPO2_DATA ((FIT_MESG_NUM)269) +#define FIT_MESG_NUM_SLEEP_LEVEL ((FIT_MESG_NUM)275) +#define FIT_MESG_NUM_JUMP ((FIT_MESG_NUM)285) +#define FIT_MESG_NUM_BEAT_INTERVALS ((FIT_MESG_NUM)290) +#define FIT_MESG_NUM_RESPIRATION_RATE ((FIT_MESG_NUM)297) +#define FIT_MESG_NUM_SPLIT ((FIT_MESG_NUM)312) +#define FIT_MESG_NUM_CLIMB_PRO ((FIT_MESG_NUM)317) +#define FIT_MESG_NUM_TANK_UPDATE ((FIT_MESG_NUM)319) +#define FIT_MESG_NUM_TANK_SUMMARY ((FIT_MESG_NUM)323) +#define FIT_MESG_NUM_SLEEP_ASSESSMENT ((FIT_MESG_NUM)346) +#define FIT_MESG_NUM_HRV_STATUS_SUMMARY ((FIT_MESG_NUM)370) +#define FIT_MESG_NUM_HRV_VALUE ((FIT_MESG_NUM)371) +#define FIT_MESG_NUM_DEVICE_AUX_BATTERY_INFO ((FIT_MESG_NUM)375) +#define FIT_MESG_NUM_DIVE_APNEA_ALARM ((FIT_MESG_NUM)393) +#define FIT_MESG_NUM_MFG_RANGE_MIN ((FIT_MESG_NUM)0xFF00) // 0xFF00 - 0xFFFE reserved for manufacturer specific messages +#define FIT_MESG_NUM_MFG_RANGE_MAX ((FIT_MESG_NUM)0xFFFE) // 0xFF00 - 0xFFFE reserved for manufacturer specific messages +#define FIT_MESG_NUM_COUNT 105 + +typedef FIT_UINT8 FIT_CHECKSUM; +#define FIT_CHECKSUM_INVALID FIT_UINT8_INVALID +#define FIT_CHECKSUM_CLEAR ((FIT_CHECKSUM)0) // Allows clear of checksum for flash memory where can only write 1 to 0 without erasing sector. +#define FIT_CHECKSUM_OK ((FIT_CHECKSUM)1) // Set to mark checksum as valid if computes to invalid values 0 or 0xFF. Checksum can also be set to ok to save encoding computation time. +#define FIT_CHECKSUM_COUNT 2 + +typedef FIT_UINT8Z FIT_FILE_FLAGS; +#define FIT_FILE_FLAGS_INVALID FIT_UINT8Z_INVALID +#define FIT_FILE_FLAGS_READ ((FIT_FILE_FLAGS)0x02) +#define FIT_FILE_FLAGS_WRITE ((FIT_FILE_FLAGS)0x04) +#define FIT_FILE_FLAGS_ERASE ((FIT_FILE_FLAGS)0x08) +#define FIT_FILE_FLAGS_COUNT 3 + +typedef FIT_ENUM FIT_MESG_COUNT; +#define FIT_MESG_COUNT_INVALID FIT_ENUM_INVALID +#define FIT_MESG_COUNT_NUM_PER_FILE ((FIT_MESG_COUNT)0) +#define FIT_MESG_COUNT_MAX_PER_FILE ((FIT_MESG_COUNT)1) +#define FIT_MESG_COUNT_MAX_PER_FILE_TYPE ((FIT_MESG_COUNT)2) +#define FIT_MESG_COUNT_COUNT 3 + +typedef FIT_UINT32 FIT_DATE_TIME; // seconds since UTC 00:00 Dec 31 1989 +#define FIT_DATE_TIME_INVALID FIT_UINT32_INVALID +#define FIT_DATE_TIME_MIN ((FIT_DATE_TIME)0x10000000) // if date_time is < 0x10000000 then it is system time (seconds from device power on) +#define FIT_DATE_TIME_COUNT 1 + +typedef FIT_UINT32 FIT_LOCAL_DATE_TIME; // seconds since 00:00 Dec 31 1989 in local time zone +#define FIT_LOCAL_DATE_TIME_INVALID FIT_UINT32_INVALID +#define FIT_LOCAL_DATE_TIME_MIN ((FIT_LOCAL_DATE_TIME)0x10000000) // if date_time is < 0x10000000 then it is system time (seconds from device power on) +#define FIT_LOCAL_DATE_TIME_COUNT 1 + +typedef FIT_UINT16 FIT_MESSAGE_INDEX; +#define FIT_MESSAGE_INDEX_INVALID FIT_UINT16_INVALID +#define FIT_MESSAGE_INDEX_SELECTED ((FIT_MESSAGE_INDEX)0x8000) // message is selected if set +#define FIT_MESSAGE_INDEX_RESERVED ((FIT_MESSAGE_INDEX)0x7000) // reserved (default 0) +#define FIT_MESSAGE_INDEX_MASK ((FIT_MESSAGE_INDEX)0x0FFF) // index +#define FIT_MESSAGE_INDEX_COUNT 3 + +typedef FIT_UINT8 FIT_DEVICE_INDEX; +#define FIT_DEVICE_INDEX_INVALID FIT_UINT8_INVALID +#define FIT_DEVICE_INDEX_CREATOR ((FIT_DEVICE_INDEX)0) // Creator of the file is always device index 0. +#define FIT_DEVICE_INDEX_COUNT 1 + +typedef FIT_ENUM FIT_GENDER; +#define FIT_GENDER_INVALID FIT_ENUM_INVALID +#define FIT_GENDER_FEMALE ((FIT_GENDER)0) +#define FIT_GENDER_MALE ((FIT_GENDER)1) +#define FIT_GENDER_COUNT 2 + +typedef FIT_ENUM FIT_LANGUAGE; +#define FIT_LANGUAGE_INVALID FIT_ENUM_INVALID +#define FIT_LANGUAGE_ENGLISH ((FIT_LANGUAGE)0) +#define FIT_LANGUAGE_FRENCH ((FIT_LANGUAGE)1) +#define FIT_LANGUAGE_ITALIAN ((FIT_LANGUAGE)2) +#define FIT_LANGUAGE_GERMAN ((FIT_LANGUAGE)3) +#define FIT_LANGUAGE_SPANISH ((FIT_LANGUAGE)4) +#define FIT_LANGUAGE_CROATIAN ((FIT_LANGUAGE)5) +#define FIT_LANGUAGE_CZECH ((FIT_LANGUAGE)6) +#define FIT_LANGUAGE_DANISH ((FIT_LANGUAGE)7) +#define FIT_LANGUAGE_DUTCH ((FIT_LANGUAGE)8) +#define FIT_LANGUAGE_FINNISH ((FIT_LANGUAGE)9) +#define FIT_LANGUAGE_GREEK ((FIT_LANGUAGE)10) +#define FIT_LANGUAGE_HUNGARIAN ((FIT_LANGUAGE)11) +#define FIT_LANGUAGE_NORWEGIAN ((FIT_LANGUAGE)12) +#define FIT_LANGUAGE_POLISH ((FIT_LANGUAGE)13) +#define FIT_LANGUAGE_PORTUGUESE ((FIT_LANGUAGE)14) +#define FIT_LANGUAGE_SLOVAKIAN ((FIT_LANGUAGE)15) +#define FIT_LANGUAGE_SLOVENIAN ((FIT_LANGUAGE)16) +#define FIT_LANGUAGE_SWEDISH ((FIT_LANGUAGE)17) +#define FIT_LANGUAGE_RUSSIAN ((FIT_LANGUAGE)18) +#define FIT_LANGUAGE_TURKISH ((FIT_LANGUAGE)19) +#define FIT_LANGUAGE_LATVIAN ((FIT_LANGUAGE)20) +#define FIT_LANGUAGE_UKRAINIAN ((FIT_LANGUAGE)21) +#define FIT_LANGUAGE_ARABIC ((FIT_LANGUAGE)22) +#define FIT_LANGUAGE_FARSI ((FIT_LANGUAGE)23) +#define FIT_LANGUAGE_BULGARIAN ((FIT_LANGUAGE)24) +#define FIT_LANGUAGE_ROMANIAN ((FIT_LANGUAGE)25) +#define FIT_LANGUAGE_CHINESE ((FIT_LANGUAGE)26) +#define FIT_LANGUAGE_JAPANESE ((FIT_LANGUAGE)27) +#define FIT_LANGUAGE_KOREAN ((FIT_LANGUAGE)28) +#define FIT_LANGUAGE_TAIWANESE ((FIT_LANGUAGE)29) +#define FIT_LANGUAGE_THAI ((FIT_LANGUAGE)30) +#define FIT_LANGUAGE_HEBREW ((FIT_LANGUAGE)31) +#define FIT_LANGUAGE_BRAZILIAN_PORTUGUESE ((FIT_LANGUAGE)32) +#define FIT_LANGUAGE_INDONESIAN ((FIT_LANGUAGE)33) +#define FIT_LANGUAGE_MALAYSIAN ((FIT_LANGUAGE)34) +#define FIT_LANGUAGE_VIETNAMESE ((FIT_LANGUAGE)35) +#define FIT_LANGUAGE_BURMESE ((FIT_LANGUAGE)36) +#define FIT_LANGUAGE_MONGOLIAN ((FIT_LANGUAGE)37) +#define FIT_LANGUAGE_CUSTOM ((FIT_LANGUAGE)254) +#define FIT_LANGUAGE_COUNT 39 + +typedef FIT_UINT8Z FIT_LANGUAGE_BITS_0; // Bit field corresponding to language enum type (1 << language). +#define FIT_LANGUAGE_BITS_0_INVALID FIT_UINT8Z_INVALID +#define FIT_LANGUAGE_BITS_0_ENGLISH ((FIT_LANGUAGE_BITS_0)0x01) +#define FIT_LANGUAGE_BITS_0_FRENCH ((FIT_LANGUAGE_BITS_0)0x02) +#define FIT_LANGUAGE_BITS_0_ITALIAN ((FIT_LANGUAGE_BITS_0)0x04) +#define FIT_LANGUAGE_BITS_0_GERMAN ((FIT_LANGUAGE_BITS_0)0x08) +#define FIT_LANGUAGE_BITS_0_SPANISH ((FIT_LANGUAGE_BITS_0)0x10) +#define FIT_LANGUAGE_BITS_0_CROATIAN ((FIT_LANGUAGE_BITS_0)0x20) +#define FIT_LANGUAGE_BITS_0_CZECH ((FIT_LANGUAGE_BITS_0)0x40) +#define FIT_LANGUAGE_BITS_0_DANISH ((FIT_LANGUAGE_BITS_0)0x80) +#define FIT_LANGUAGE_BITS_0_COUNT 8 + +typedef FIT_UINT8Z FIT_LANGUAGE_BITS_1; +#define FIT_LANGUAGE_BITS_1_INVALID FIT_UINT8Z_INVALID +#define FIT_LANGUAGE_BITS_1_DUTCH ((FIT_LANGUAGE_BITS_1)0x01) +#define FIT_LANGUAGE_BITS_1_FINNISH ((FIT_LANGUAGE_BITS_1)0x02) +#define FIT_LANGUAGE_BITS_1_GREEK ((FIT_LANGUAGE_BITS_1)0x04) +#define FIT_LANGUAGE_BITS_1_HUNGARIAN ((FIT_LANGUAGE_BITS_1)0x08) +#define FIT_LANGUAGE_BITS_1_NORWEGIAN ((FIT_LANGUAGE_BITS_1)0x10) +#define FIT_LANGUAGE_BITS_1_POLISH ((FIT_LANGUAGE_BITS_1)0x20) +#define FIT_LANGUAGE_BITS_1_PORTUGUESE ((FIT_LANGUAGE_BITS_1)0x40) +#define FIT_LANGUAGE_BITS_1_SLOVAKIAN ((FIT_LANGUAGE_BITS_1)0x80) +#define FIT_LANGUAGE_BITS_1_COUNT 8 + +typedef FIT_UINT8Z FIT_LANGUAGE_BITS_2; +#define FIT_LANGUAGE_BITS_2_INVALID FIT_UINT8Z_INVALID +#define FIT_LANGUAGE_BITS_2_SLOVENIAN ((FIT_LANGUAGE_BITS_2)0x01) +#define FIT_LANGUAGE_BITS_2_SWEDISH ((FIT_LANGUAGE_BITS_2)0x02) +#define FIT_LANGUAGE_BITS_2_RUSSIAN ((FIT_LANGUAGE_BITS_2)0x04) +#define FIT_LANGUAGE_BITS_2_TURKISH ((FIT_LANGUAGE_BITS_2)0x08) +#define FIT_LANGUAGE_BITS_2_LATVIAN ((FIT_LANGUAGE_BITS_2)0x10) +#define FIT_LANGUAGE_BITS_2_UKRAINIAN ((FIT_LANGUAGE_BITS_2)0x20) +#define FIT_LANGUAGE_BITS_2_ARABIC ((FIT_LANGUAGE_BITS_2)0x40) +#define FIT_LANGUAGE_BITS_2_FARSI ((FIT_LANGUAGE_BITS_2)0x80) +#define FIT_LANGUAGE_BITS_2_COUNT 8 + +typedef FIT_UINT8Z FIT_LANGUAGE_BITS_3; +#define FIT_LANGUAGE_BITS_3_INVALID FIT_UINT8Z_INVALID +#define FIT_LANGUAGE_BITS_3_BULGARIAN ((FIT_LANGUAGE_BITS_3)0x01) +#define FIT_LANGUAGE_BITS_3_ROMANIAN ((FIT_LANGUAGE_BITS_3)0x02) +#define FIT_LANGUAGE_BITS_3_CHINESE ((FIT_LANGUAGE_BITS_3)0x04) +#define FIT_LANGUAGE_BITS_3_JAPANESE ((FIT_LANGUAGE_BITS_3)0x08) +#define FIT_LANGUAGE_BITS_3_KOREAN ((FIT_LANGUAGE_BITS_3)0x10) +#define FIT_LANGUAGE_BITS_3_TAIWANESE ((FIT_LANGUAGE_BITS_3)0x20) +#define FIT_LANGUAGE_BITS_3_THAI ((FIT_LANGUAGE_BITS_3)0x40) +#define FIT_LANGUAGE_BITS_3_HEBREW ((FIT_LANGUAGE_BITS_3)0x80) +#define FIT_LANGUAGE_BITS_3_COUNT 8 + +typedef FIT_UINT8Z FIT_LANGUAGE_BITS_4; +#define FIT_LANGUAGE_BITS_4_INVALID FIT_UINT8Z_INVALID +#define FIT_LANGUAGE_BITS_4_BRAZILIAN_PORTUGUESE ((FIT_LANGUAGE_BITS_4)0x01) +#define FIT_LANGUAGE_BITS_4_INDONESIAN ((FIT_LANGUAGE_BITS_4)0x02) +#define FIT_LANGUAGE_BITS_4_MALAYSIAN ((FIT_LANGUAGE_BITS_4)0x04) +#define FIT_LANGUAGE_BITS_4_VIETNAMESE ((FIT_LANGUAGE_BITS_4)0x08) +#define FIT_LANGUAGE_BITS_4_BURMESE ((FIT_LANGUAGE_BITS_4)0x10) +#define FIT_LANGUAGE_BITS_4_MONGOLIAN ((FIT_LANGUAGE_BITS_4)0x20) +#define FIT_LANGUAGE_BITS_4_COUNT 6 + +typedef FIT_ENUM FIT_TIME_ZONE; +#define FIT_TIME_ZONE_INVALID FIT_ENUM_INVALID +#define FIT_TIME_ZONE_ALMATY ((FIT_TIME_ZONE)0) +#define FIT_TIME_ZONE_BANGKOK ((FIT_TIME_ZONE)1) +#define FIT_TIME_ZONE_BOMBAY ((FIT_TIME_ZONE)2) +#define FIT_TIME_ZONE_BRASILIA ((FIT_TIME_ZONE)3) +#define FIT_TIME_ZONE_CAIRO ((FIT_TIME_ZONE)4) +#define FIT_TIME_ZONE_CAPE_VERDE_IS ((FIT_TIME_ZONE)5) +#define FIT_TIME_ZONE_DARWIN ((FIT_TIME_ZONE)6) +#define FIT_TIME_ZONE_ENIWETOK ((FIT_TIME_ZONE)7) +#define FIT_TIME_ZONE_FIJI ((FIT_TIME_ZONE)8) +#define FIT_TIME_ZONE_HONG_KONG ((FIT_TIME_ZONE)9) +#define FIT_TIME_ZONE_ISLAMABAD ((FIT_TIME_ZONE)10) +#define FIT_TIME_ZONE_KABUL ((FIT_TIME_ZONE)11) +#define FIT_TIME_ZONE_MAGADAN ((FIT_TIME_ZONE)12) +#define FIT_TIME_ZONE_MID_ATLANTIC ((FIT_TIME_ZONE)13) +#define FIT_TIME_ZONE_MOSCOW ((FIT_TIME_ZONE)14) +#define FIT_TIME_ZONE_MUSCAT ((FIT_TIME_ZONE)15) +#define FIT_TIME_ZONE_NEWFOUNDLAND ((FIT_TIME_ZONE)16) +#define FIT_TIME_ZONE_SAMOA ((FIT_TIME_ZONE)17) +#define FIT_TIME_ZONE_SYDNEY ((FIT_TIME_ZONE)18) +#define FIT_TIME_ZONE_TEHRAN ((FIT_TIME_ZONE)19) +#define FIT_TIME_ZONE_TOKYO ((FIT_TIME_ZONE)20) +#define FIT_TIME_ZONE_US_ALASKA ((FIT_TIME_ZONE)21) +#define FIT_TIME_ZONE_US_ATLANTIC ((FIT_TIME_ZONE)22) +#define FIT_TIME_ZONE_US_CENTRAL ((FIT_TIME_ZONE)23) +#define FIT_TIME_ZONE_US_EASTERN ((FIT_TIME_ZONE)24) +#define FIT_TIME_ZONE_US_HAWAII ((FIT_TIME_ZONE)25) +#define FIT_TIME_ZONE_US_MOUNTAIN ((FIT_TIME_ZONE)26) +#define FIT_TIME_ZONE_US_PACIFIC ((FIT_TIME_ZONE)27) +#define FIT_TIME_ZONE_OTHER ((FIT_TIME_ZONE)28) +#define FIT_TIME_ZONE_AUCKLAND ((FIT_TIME_ZONE)29) +#define FIT_TIME_ZONE_KATHMANDU ((FIT_TIME_ZONE)30) +#define FIT_TIME_ZONE_EUROPE_WESTERN_WET ((FIT_TIME_ZONE)31) +#define FIT_TIME_ZONE_EUROPE_CENTRAL_CET ((FIT_TIME_ZONE)32) +#define FIT_TIME_ZONE_EUROPE_EASTERN_EET ((FIT_TIME_ZONE)33) +#define FIT_TIME_ZONE_JAKARTA ((FIT_TIME_ZONE)34) +#define FIT_TIME_ZONE_PERTH ((FIT_TIME_ZONE)35) +#define FIT_TIME_ZONE_ADELAIDE ((FIT_TIME_ZONE)36) +#define FIT_TIME_ZONE_BRISBANE ((FIT_TIME_ZONE)37) +#define FIT_TIME_ZONE_TASMANIA ((FIT_TIME_ZONE)38) +#define FIT_TIME_ZONE_ICELAND ((FIT_TIME_ZONE)39) +#define FIT_TIME_ZONE_AMSTERDAM ((FIT_TIME_ZONE)40) +#define FIT_TIME_ZONE_ATHENS ((FIT_TIME_ZONE)41) +#define FIT_TIME_ZONE_BARCELONA ((FIT_TIME_ZONE)42) +#define FIT_TIME_ZONE_BERLIN ((FIT_TIME_ZONE)43) +#define FIT_TIME_ZONE_BRUSSELS ((FIT_TIME_ZONE)44) +#define FIT_TIME_ZONE_BUDAPEST ((FIT_TIME_ZONE)45) +#define FIT_TIME_ZONE_COPENHAGEN ((FIT_TIME_ZONE)46) +#define FIT_TIME_ZONE_DUBLIN ((FIT_TIME_ZONE)47) +#define FIT_TIME_ZONE_HELSINKI ((FIT_TIME_ZONE)48) +#define FIT_TIME_ZONE_LISBON ((FIT_TIME_ZONE)49) +#define FIT_TIME_ZONE_LONDON ((FIT_TIME_ZONE)50) +#define FIT_TIME_ZONE_MADRID ((FIT_TIME_ZONE)51) +#define FIT_TIME_ZONE_MUNICH ((FIT_TIME_ZONE)52) +#define FIT_TIME_ZONE_OSLO ((FIT_TIME_ZONE)53) +#define FIT_TIME_ZONE_PARIS ((FIT_TIME_ZONE)54) +#define FIT_TIME_ZONE_PRAGUE ((FIT_TIME_ZONE)55) +#define FIT_TIME_ZONE_REYKJAVIK ((FIT_TIME_ZONE)56) +#define FIT_TIME_ZONE_ROME ((FIT_TIME_ZONE)57) +#define FIT_TIME_ZONE_STOCKHOLM ((FIT_TIME_ZONE)58) +#define FIT_TIME_ZONE_VIENNA ((FIT_TIME_ZONE)59) +#define FIT_TIME_ZONE_WARSAW ((FIT_TIME_ZONE)60) +#define FIT_TIME_ZONE_ZURICH ((FIT_TIME_ZONE)61) +#define FIT_TIME_ZONE_QUEBEC ((FIT_TIME_ZONE)62) +#define FIT_TIME_ZONE_ONTARIO ((FIT_TIME_ZONE)63) +#define FIT_TIME_ZONE_MANITOBA ((FIT_TIME_ZONE)64) +#define FIT_TIME_ZONE_SASKATCHEWAN ((FIT_TIME_ZONE)65) +#define FIT_TIME_ZONE_ALBERTA ((FIT_TIME_ZONE)66) +#define FIT_TIME_ZONE_BRITISH_COLUMBIA ((FIT_TIME_ZONE)67) +#define FIT_TIME_ZONE_BOISE ((FIT_TIME_ZONE)68) +#define FIT_TIME_ZONE_BOSTON ((FIT_TIME_ZONE)69) +#define FIT_TIME_ZONE_CHICAGO ((FIT_TIME_ZONE)70) +#define FIT_TIME_ZONE_DALLAS ((FIT_TIME_ZONE)71) +#define FIT_TIME_ZONE_DENVER ((FIT_TIME_ZONE)72) +#define FIT_TIME_ZONE_KANSAS_CITY ((FIT_TIME_ZONE)73) +#define FIT_TIME_ZONE_LAS_VEGAS ((FIT_TIME_ZONE)74) +#define FIT_TIME_ZONE_LOS_ANGELES ((FIT_TIME_ZONE)75) +#define FIT_TIME_ZONE_MIAMI ((FIT_TIME_ZONE)76) +#define FIT_TIME_ZONE_MINNEAPOLIS ((FIT_TIME_ZONE)77) +#define FIT_TIME_ZONE_NEW_YORK ((FIT_TIME_ZONE)78) +#define FIT_TIME_ZONE_NEW_ORLEANS ((FIT_TIME_ZONE)79) +#define FIT_TIME_ZONE_PHOENIX ((FIT_TIME_ZONE)80) +#define FIT_TIME_ZONE_SANTA_FE ((FIT_TIME_ZONE)81) +#define FIT_TIME_ZONE_SEATTLE ((FIT_TIME_ZONE)82) +#define FIT_TIME_ZONE_WASHINGTON_DC ((FIT_TIME_ZONE)83) +#define FIT_TIME_ZONE_US_ARIZONA ((FIT_TIME_ZONE)84) +#define FIT_TIME_ZONE_CHITA ((FIT_TIME_ZONE)85) +#define FIT_TIME_ZONE_EKATERINBURG ((FIT_TIME_ZONE)86) +#define FIT_TIME_ZONE_IRKUTSK ((FIT_TIME_ZONE)87) +#define FIT_TIME_ZONE_KALININGRAD ((FIT_TIME_ZONE)88) +#define FIT_TIME_ZONE_KRASNOYARSK ((FIT_TIME_ZONE)89) +#define FIT_TIME_ZONE_NOVOSIBIRSK ((FIT_TIME_ZONE)90) +#define FIT_TIME_ZONE_PETROPAVLOVSK_KAMCHATSKIY ((FIT_TIME_ZONE)91) +#define FIT_TIME_ZONE_SAMARA ((FIT_TIME_ZONE)92) +#define FIT_TIME_ZONE_VLADIVOSTOK ((FIT_TIME_ZONE)93) +#define FIT_TIME_ZONE_MEXICO_CENTRAL ((FIT_TIME_ZONE)94) +#define FIT_TIME_ZONE_MEXICO_MOUNTAIN ((FIT_TIME_ZONE)95) +#define FIT_TIME_ZONE_MEXICO_PACIFIC ((FIT_TIME_ZONE)96) +#define FIT_TIME_ZONE_CAPE_TOWN ((FIT_TIME_ZONE)97) +#define FIT_TIME_ZONE_WINKHOEK ((FIT_TIME_ZONE)98) +#define FIT_TIME_ZONE_LAGOS ((FIT_TIME_ZONE)99) +#define FIT_TIME_ZONE_RIYAHD ((FIT_TIME_ZONE)100) +#define FIT_TIME_ZONE_VENEZUELA ((FIT_TIME_ZONE)101) +#define FIT_TIME_ZONE_AUSTRALIA_LH ((FIT_TIME_ZONE)102) +#define FIT_TIME_ZONE_SANTIAGO ((FIT_TIME_ZONE)103) +#define FIT_TIME_ZONE_MANUAL ((FIT_TIME_ZONE)253) +#define FIT_TIME_ZONE_AUTOMATIC ((FIT_TIME_ZONE)254) +#define FIT_TIME_ZONE_COUNT 106 + +typedef FIT_ENUM FIT_DISPLAY_MEASURE; +#define FIT_DISPLAY_MEASURE_INVALID FIT_ENUM_INVALID +#define FIT_DISPLAY_MEASURE_METRIC ((FIT_DISPLAY_MEASURE)0) +#define FIT_DISPLAY_MEASURE_STATUTE ((FIT_DISPLAY_MEASURE)1) +#define FIT_DISPLAY_MEASURE_NAUTICAL ((FIT_DISPLAY_MEASURE)2) +#define FIT_DISPLAY_MEASURE_COUNT 3 + +typedef FIT_ENUM FIT_DISPLAY_HEART; +#define FIT_DISPLAY_HEART_INVALID FIT_ENUM_INVALID +#define FIT_DISPLAY_HEART_BPM ((FIT_DISPLAY_HEART)0) +#define FIT_DISPLAY_HEART_MAX ((FIT_DISPLAY_HEART)1) +#define FIT_DISPLAY_HEART_RESERVE ((FIT_DISPLAY_HEART)2) +#define FIT_DISPLAY_HEART_COUNT 3 + +typedef FIT_ENUM FIT_DISPLAY_POWER; +#define FIT_DISPLAY_POWER_INVALID FIT_ENUM_INVALID +#define FIT_DISPLAY_POWER_WATTS ((FIT_DISPLAY_POWER)0) +#define FIT_DISPLAY_POWER_PERCENT_FTP ((FIT_DISPLAY_POWER)1) +#define FIT_DISPLAY_POWER_COUNT 2 + +typedef FIT_ENUM FIT_DISPLAY_POSITION; +#define FIT_DISPLAY_POSITION_INVALID FIT_ENUM_INVALID +#define FIT_DISPLAY_POSITION_DEGREE ((FIT_DISPLAY_POSITION)0) // dd.dddddd +#define FIT_DISPLAY_POSITION_DEGREE_MINUTE ((FIT_DISPLAY_POSITION)1) // dddmm.mmm +#define FIT_DISPLAY_POSITION_DEGREE_MINUTE_SECOND ((FIT_DISPLAY_POSITION)2) // dddmmss +#define FIT_DISPLAY_POSITION_AUSTRIAN_GRID ((FIT_DISPLAY_POSITION)3) // Austrian Grid (BMN) +#define FIT_DISPLAY_POSITION_BRITISH_GRID ((FIT_DISPLAY_POSITION)4) // British National Grid +#define FIT_DISPLAY_POSITION_DUTCH_GRID ((FIT_DISPLAY_POSITION)5) // Dutch grid system +#define FIT_DISPLAY_POSITION_HUNGARIAN_GRID ((FIT_DISPLAY_POSITION)6) // Hungarian grid system +#define FIT_DISPLAY_POSITION_FINNISH_GRID ((FIT_DISPLAY_POSITION)7) // Finnish grid system Zone3 KKJ27 +#define FIT_DISPLAY_POSITION_GERMAN_GRID ((FIT_DISPLAY_POSITION)8) // Gausss Krueger (German) +#define FIT_DISPLAY_POSITION_ICELANDIC_GRID ((FIT_DISPLAY_POSITION)9) // Icelandic Grid +#define FIT_DISPLAY_POSITION_INDONESIAN_EQUATORIAL ((FIT_DISPLAY_POSITION)10) // Indonesian Equatorial LCO +#define FIT_DISPLAY_POSITION_INDONESIAN_IRIAN ((FIT_DISPLAY_POSITION)11) // Indonesian Irian LCO +#define FIT_DISPLAY_POSITION_INDONESIAN_SOUTHERN ((FIT_DISPLAY_POSITION)12) // Indonesian Southern LCO +#define FIT_DISPLAY_POSITION_INDIA_ZONE_0 ((FIT_DISPLAY_POSITION)13) // India zone 0 +#define FIT_DISPLAY_POSITION_INDIA_ZONE_IA ((FIT_DISPLAY_POSITION)14) // India zone IA +#define FIT_DISPLAY_POSITION_INDIA_ZONE_IB ((FIT_DISPLAY_POSITION)15) // India zone IB +#define FIT_DISPLAY_POSITION_INDIA_ZONE_IIA ((FIT_DISPLAY_POSITION)16) // India zone IIA +#define FIT_DISPLAY_POSITION_INDIA_ZONE_IIB ((FIT_DISPLAY_POSITION)17) // India zone IIB +#define FIT_DISPLAY_POSITION_INDIA_ZONE_IIIA ((FIT_DISPLAY_POSITION)18) // India zone IIIA +#define FIT_DISPLAY_POSITION_INDIA_ZONE_IIIB ((FIT_DISPLAY_POSITION)19) // India zone IIIB +#define FIT_DISPLAY_POSITION_INDIA_ZONE_IVA ((FIT_DISPLAY_POSITION)20) // India zone IVA +#define FIT_DISPLAY_POSITION_INDIA_ZONE_IVB ((FIT_DISPLAY_POSITION)21) // India zone IVB +#define FIT_DISPLAY_POSITION_IRISH_TRANSVERSE ((FIT_DISPLAY_POSITION)22) // Irish Transverse Mercator +#define FIT_DISPLAY_POSITION_IRISH_GRID ((FIT_DISPLAY_POSITION)23) // Irish Grid +#define FIT_DISPLAY_POSITION_LORAN ((FIT_DISPLAY_POSITION)24) // Loran TD +#define FIT_DISPLAY_POSITION_MAIDENHEAD_GRID ((FIT_DISPLAY_POSITION)25) // Maidenhead grid system +#define FIT_DISPLAY_POSITION_MGRS_GRID ((FIT_DISPLAY_POSITION)26) // MGRS grid system +#define FIT_DISPLAY_POSITION_NEW_ZEALAND_GRID ((FIT_DISPLAY_POSITION)27) // New Zealand grid system +#define FIT_DISPLAY_POSITION_NEW_ZEALAND_TRANSVERSE ((FIT_DISPLAY_POSITION)28) // New Zealand Transverse Mercator +#define FIT_DISPLAY_POSITION_QATAR_GRID ((FIT_DISPLAY_POSITION)29) // Qatar National Grid +#define FIT_DISPLAY_POSITION_MODIFIED_SWEDISH_GRID ((FIT_DISPLAY_POSITION)30) // Modified RT-90 (Sweden) +#define FIT_DISPLAY_POSITION_SWEDISH_GRID ((FIT_DISPLAY_POSITION)31) // RT-90 (Sweden) +#define FIT_DISPLAY_POSITION_SOUTH_AFRICAN_GRID ((FIT_DISPLAY_POSITION)32) // South African Grid +#define FIT_DISPLAY_POSITION_SWISS_GRID ((FIT_DISPLAY_POSITION)33) // Swiss CH-1903 grid +#define FIT_DISPLAY_POSITION_TAIWAN_GRID ((FIT_DISPLAY_POSITION)34) // Taiwan Grid +#define FIT_DISPLAY_POSITION_UNITED_STATES_GRID ((FIT_DISPLAY_POSITION)35) // United States National Grid +#define FIT_DISPLAY_POSITION_UTM_UPS_GRID ((FIT_DISPLAY_POSITION)36) // UTM/UPS grid system +#define FIT_DISPLAY_POSITION_WEST_MALAYAN ((FIT_DISPLAY_POSITION)37) // West Malayan RSO +#define FIT_DISPLAY_POSITION_BORNEO_RSO ((FIT_DISPLAY_POSITION)38) // Borneo RSO +#define FIT_DISPLAY_POSITION_ESTONIAN_GRID ((FIT_DISPLAY_POSITION)39) // Estonian grid system +#define FIT_DISPLAY_POSITION_LATVIAN_GRID ((FIT_DISPLAY_POSITION)40) // Latvian Transverse Mercator +#define FIT_DISPLAY_POSITION_SWEDISH_REF_99_GRID ((FIT_DISPLAY_POSITION)41) // Reference Grid 99 TM (Swedish) +#define FIT_DISPLAY_POSITION_COUNT 42 + +typedef FIT_ENUM FIT_SWITCH; +#define FIT_SWITCH_INVALID FIT_ENUM_INVALID +#define FIT_SWITCH_OFF ((FIT_SWITCH)0) +#define FIT_SWITCH_ON ((FIT_SWITCH)1) +#define FIT_SWITCH_AUTO ((FIT_SWITCH)2) +#define FIT_SWITCH_COUNT 3 + +typedef FIT_ENUM FIT_SPORT; +#define FIT_SPORT_INVALID FIT_ENUM_INVALID +#define FIT_SPORT_GENERIC ((FIT_SPORT)0) +#define FIT_SPORT_RUNNING ((FIT_SPORT)1) +#define FIT_SPORT_CYCLING ((FIT_SPORT)2) +#define FIT_SPORT_TRANSITION ((FIT_SPORT)3) // Mulitsport transition +#define FIT_SPORT_FITNESS_EQUIPMENT ((FIT_SPORT)4) +#define FIT_SPORT_SWIMMING ((FIT_SPORT)5) +#define FIT_SPORT_BASKETBALL ((FIT_SPORT)6) +#define FIT_SPORT_SOCCER ((FIT_SPORT)7) +#define FIT_SPORT_TENNIS ((FIT_SPORT)8) +#define FIT_SPORT_AMERICAN_FOOTBALL ((FIT_SPORT)9) +#define FIT_SPORT_TRAINING ((FIT_SPORT)10) +#define FIT_SPORT_WALKING ((FIT_SPORT)11) +#define FIT_SPORT_CROSS_COUNTRY_SKIING ((FIT_SPORT)12) +#define FIT_SPORT_ALPINE_SKIING ((FIT_SPORT)13) +#define FIT_SPORT_SNOWBOARDING ((FIT_SPORT)14) +#define FIT_SPORT_ROWING ((FIT_SPORT)15) +#define FIT_SPORT_MOUNTAINEERING ((FIT_SPORT)16) +#define FIT_SPORT_HIKING ((FIT_SPORT)17) +#define FIT_SPORT_MULTISPORT ((FIT_SPORT)18) +#define FIT_SPORT_PADDLING ((FIT_SPORT)19) +#define FIT_SPORT_FLYING ((FIT_SPORT)20) +#define FIT_SPORT_E_BIKING ((FIT_SPORT)21) +#define FIT_SPORT_MOTORCYCLING ((FIT_SPORT)22) +#define FIT_SPORT_BOATING ((FIT_SPORT)23) +#define FIT_SPORT_DRIVING ((FIT_SPORT)24) +#define FIT_SPORT_GOLF ((FIT_SPORT)25) +#define FIT_SPORT_HANG_GLIDING ((FIT_SPORT)26) +#define FIT_SPORT_HORSEBACK_RIDING ((FIT_SPORT)27) +#define FIT_SPORT_HUNTING ((FIT_SPORT)28) +#define FIT_SPORT_FISHING ((FIT_SPORT)29) +#define FIT_SPORT_INLINE_SKATING ((FIT_SPORT)30) +#define FIT_SPORT_ROCK_CLIMBING ((FIT_SPORT)31) +#define FIT_SPORT_SAILING ((FIT_SPORT)32) +#define FIT_SPORT_ICE_SKATING ((FIT_SPORT)33) +#define FIT_SPORT_SKY_DIVING ((FIT_SPORT)34) +#define FIT_SPORT_SNOWSHOEING ((FIT_SPORT)35) +#define FIT_SPORT_SNOWMOBILING ((FIT_SPORT)36) +#define FIT_SPORT_STAND_UP_PADDLEBOARDING ((FIT_SPORT)37) +#define FIT_SPORT_SURFING ((FIT_SPORT)38) +#define FIT_SPORT_WAKEBOARDING ((FIT_SPORT)39) +#define FIT_SPORT_WATER_SKIING ((FIT_SPORT)40) +#define FIT_SPORT_KAYAKING ((FIT_SPORT)41) +#define FIT_SPORT_RAFTING ((FIT_SPORT)42) +#define FIT_SPORT_WINDSURFING ((FIT_SPORT)43) +#define FIT_SPORT_KITESURFING ((FIT_SPORT)44) +#define FIT_SPORT_TACTICAL ((FIT_SPORT)45) +#define FIT_SPORT_JUMPMASTER ((FIT_SPORT)46) +#define FIT_SPORT_BOXING ((FIT_SPORT)47) +#define FIT_SPORT_FLOOR_CLIMBING ((FIT_SPORT)48) +#define FIT_SPORT_DIVING ((FIT_SPORT)53) +#define FIT_SPORT_HIIT ((FIT_SPORT)62) +#define FIT_SPORT_RACKET ((FIT_SPORT)64) +#define FIT_SPORT_WATER_TUBING ((FIT_SPORT)76) +#define FIT_SPORT_WAKESURFING ((FIT_SPORT)77) +#define FIT_SPORT_ALL ((FIT_SPORT)254) // All is for goals only to include all sports. +#define FIT_SPORT_COUNT 55 + +typedef FIT_UINT8Z FIT_SPORT_BITS_0; // Bit field corresponding to sport enum type (1 << sport). +#define FIT_SPORT_BITS_0_INVALID FIT_UINT8Z_INVALID +#define FIT_SPORT_BITS_0_GENERIC ((FIT_SPORT_BITS_0)0x01) +#define FIT_SPORT_BITS_0_RUNNING ((FIT_SPORT_BITS_0)0x02) +#define FIT_SPORT_BITS_0_CYCLING ((FIT_SPORT_BITS_0)0x04) +#define FIT_SPORT_BITS_0_TRANSITION ((FIT_SPORT_BITS_0)0x08) // Mulitsport transition +#define FIT_SPORT_BITS_0_FITNESS_EQUIPMENT ((FIT_SPORT_BITS_0)0x10) +#define FIT_SPORT_BITS_0_SWIMMING ((FIT_SPORT_BITS_0)0x20) +#define FIT_SPORT_BITS_0_BASKETBALL ((FIT_SPORT_BITS_0)0x40) +#define FIT_SPORT_BITS_0_SOCCER ((FIT_SPORT_BITS_0)0x80) +#define FIT_SPORT_BITS_0_COUNT 8 + +typedef FIT_UINT8Z FIT_SPORT_BITS_1; // Bit field corresponding to sport enum type (1 << (sport-8)). +#define FIT_SPORT_BITS_1_INVALID FIT_UINT8Z_INVALID +#define FIT_SPORT_BITS_1_TENNIS ((FIT_SPORT_BITS_1)0x01) +#define FIT_SPORT_BITS_1_AMERICAN_FOOTBALL ((FIT_SPORT_BITS_1)0x02) +#define FIT_SPORT_BITS_1_TRAINING ((FIT_SPORT_BITS_1)0x04) +#define FIT_SPORT_BITS_1_WALKING ((FIT_SPORT_BITS_1)0x08) +#define FIT_SPORT_BITS_1_CROSS_COUNTRY_SKIING ((FIT_SPORT_BITS_1)0x10) +#define FIT_SPORT_BITS_1_ALPINE_SKIING ((FIT_SPORT_BITS_1)0x20) +#define FIT_SPORT_BITS_1_SNOWBOARDING ((FIT_SPORT_BITS_1)0x40) +#define FIT_SPORT_BITS_1_ROWING ((FIT_SPORT_BITS_1)0x80) +#define FIT_SPORT_BITS_1_COUNT 8 + +typedef FIT_UINT8Z FIT_SPORT_BITS_2; // Bit field corresponding to sport enum type (1 << (sport-16)). +#define FIT_SPORT_BITS_2_INVALID FIT_UINT8Z_INVALID +#define FIT_SPORT_BITS_2_MOUNTAINEERING ((FIT_SPORT_BITS_2)0x01) +#define FIT_SPORT_BITS_2_HIKING ((FIT_SPORT_BITS_2)0x02) +#define FIT_SPORT_BITS_2_MULTISPORT ((FIT_SPORT_BITS_2)0x04) +#define FIT_SPORT_BITS_2_PADDLING ((FIT_SPORT_BITS_2)0x08) +#define FIT_SPORT_BITS_2_FLYING ((FIT_SPORT_BITS_2)0x10) +#define FIT_SPORT_BITS_2_E_BIKING ((FIT_SPORT_BITS_2)0x20) +#define FIT_SPORT_BITS_2_MOTORCYCLING ((FIT_SPORT_BITS_2)0x40) +#define FIT_SPORT_BITS_2_BOATING ((FIT_SPORT_BITS_2)0x80) +#define FIT_SPORT_BITS_2_COUNT 8 + +typedef FIT_UINT8Z FIT_SPORT_BITS_3; // Bit field corresponding to sport enum type (1 << (sport-24)). +#define FIT_SPORT_BITS_3_INVALID FIT_UINT8Z_INVALID +#define FIT_SPORT_BITS_3_DRIVING ((FIT_SPORT_BITS_3)0x01) +#define FIT_SPORT_BITS_3_GOLF ((FIT_SPORT_BITS_3)0x02) +#define FIT_SPORT_BITS_3_HANG_GLIDING ((FIT_SPORT_BITS_3)0x04) +#define FIT_SPORT_BITS_3_HORSEBACK_RIDING ((FIT_SPORT_BITS_3)0x08) +#define FIT_SPORT_BITS_3_HUNTING ((FIT_SPORT_BITS_3)0x10) +#define FIT_SPORT_BITS_3_FISHING ((FIT_SPORT_BITS_3)0x20) +#define FIT_SPORT_BITS_3_INLINE_SKATING ((FIT_SPORT_BITS_3)0x40) +#define FIT_SPORT_BITS_3_ROCK_CLIMBING ((FIT_SPORT_BITS_3)0x80) +#define FIT_SPORT_BITS_3_COUNT 8 + +typedef FIT_UINT8Z FIT_SPORT_BITS_4; // Bit field corresponding to sport enum type (1 << (sport-32)). +#define FIT_SPORT_BITS_4_INVALID FIT_UINT8Z_INVALID +#define FIT_SPORT_BITS_4_SAILING ((FIT_SPORT_BITS_4)0x01) +#define FIT_SPORT_BITS_4_ICE_SKATING ((FIT_SPORT_BITS_4)0x02) +#define FIT_SPORT_BITS_4_SKY_DIVING ((FIT_SPORT_BITS_4)0x04) +#define FIT_SPORT_BITS_4_SNOWSHOEING ((FIT_SPORT_BITS_4)0x08) +#define FIT_SPORT_BITS_4_SNOWMOBILING ((FIT_SPORT_BITS_4)0x10) +#define FIT_SPORT_BITS_4_STAND_UP_PADDLEBOARDING ((FIT_SPORT_BITS_4)0x20) +#define FIT_SPORT_BITS_4_SURFING ((FIT_SPORT_BITS_4)0x40) +#define FIT_SPORT_BITS_4_WAKEBOARDING ((FIT_SPORT_BITS_4)0x80) +#define FIT_SPORT_BITS_4_COUNT 8 + +typedef FIT_UINT8Z FIT_SPORT_BITS_5; // Bit field corresponding to sport enum type (1 << (sport-40)). +#define FIT_SPORT_BITS_5_INVALID FIT_UINT8Z_INVALID +#define FIT_SPORT_BITS_5_WATER_SKIING ((FIT_SPORT_BITS_5)0x01) +#define FIT_SPORT_BITS_5_KAYAKING ((FIT_SPORT_BITS_5)0x02) +#define FIT_SPORT_BITS_5_RAFTING ((FIT_SPORT_BITS_5)0x04) +#define FIT_SPORT_BITS_5_WINDSURFING ((FIT_SPORT_BITS_5)0x08) +#define FIT_SPORT_BITS_5_KITESURFING ((FIT_SPORT_BITS_5)0x10) +#define FIT_SPORT_BITS_5_TACTICAL ((FIT_SPORT_BITS_5)0x20) +#define FIT_SPORT_BITS_5_JUMPMASTER ((FIT_SPORT_BITS_5)0x40) +#define FIT_SPORT_BITS_5_BOXING ((FIT_SPORT_BITS_5)0x80) +#define FIT_SPORT_BITS_5_COUNT 8 + +typedef FIT_UINT8Z FIT_SPORT_BITS_6; // Bit field corresponding to sport enum type (1 << (sport-48)). +#define FIT_SPORT_BITS_6_INVALID FIT_UINT8Z_INVALID +#define FIT_SPORT_BITS_6_FLOOR_CLIMBING ((FIT_SPORT_BITS_6)0x01) +#define FIT_SPORT_BITS_6_COUNT 1 + +typedef FIT_ENUM FIT_SUB_SPORT; +#define FIT_SUB_SPORT_INVALID FIT_ENUM_INVALID +#define FIT_SUB_SPORT_GENERIC ((FIT_SUB_SPORT)0) +#define FIT_SUB_SPORT_TREADMILL ((FIT_SUB_SPORT)1) // Run/Fitness Equipment +#define FIT_SUB_SPORT_STREET ((FIT_SUB_SPORT)2) // Run +#define FIT_SUB_SPORT_TRAIL ((FIT_SUB_SPORT)3) // Run +#define FIT_SUB_SPORT_TRACK ((FIT_SUB_SPORT)4) // Run +#define FIT_SUB_SPORT_SPIN ((FIT_SUB_SPORT)5) // Cycling +#define FIT_SUB_SPORT_INDOOR_CYCLING ((FIT_SUB_SPORT)6) // Cycling/Fitness Equipment +#define FIT_SUB_SPORT_ROAD ((FIT_SUB_SPORT)7) // Cycling +#define FIT_SUB_SPORT_MOUNTAIN ((FIT_SUB_SPORT)8) // Cycling +#define FIT_SUB_SPORT_DOWNHILL ((FIT_SUB_SPORT)9) // Cycling +#define FIT_SUB_SPORT_RECUMBENT ((FIT_SUB_SPORT)10) // Cycling +#define FIT_SUB_SPORT_CYCLOCROSS ((FIT_SUB_SPORT)11) // Cycling +#define FIT_SUB_SPORT_HAND_CYCLING ((FIT_SUB_SPORT)12) // Cycling +#define FIT_SUB_SPORT_TRACK_CYCLING ((FIT_SUB_SPORT)13) // Cycling +#define FIT_SUB_SPORT_INDOOR_ROWING ((FIT_SUB_SPORT)14) // Fitness Equipment +#define FIT_SUB_SPORT_ELLIPTICAL ((FIT_SUB_SPORT)15) // Fitness Equipment +#define FIT_SUB_SPORT_STAIR_CLIMBING ((FIT_SUB_SPORT)16) // Fitness Equipment +#define FIT_SUB_SPORT_LAP_SWIMMING ((FIT_SUB_SPORT)17) // Swimming +#define FIT_SUB_SPORT_OPEN_WATER ((FIT_SUB_SPORT)18) // Swimming +#define FIT_SUB_SPORT_FLEXIBILITY_TRAINING ((FIT_SUB_SPORT)19) // Training +#define FIT_SUB_SPORT_STRENGTH_TRAINING ((FIT_SUB_SPORT)20) // Training +#define FIT_SUB_SPORT_WARM_UP ((FIT_SUB_SPORT)21) // Tennis +#define FIT_SUB_SPORT_MATCH ((FIT_SUB_SPORT)22) // Tennis +#define FIT_SUB_SPORT_EXERCISE ((FIT_SUB_SPORT)23) // Tennis +#define FIT_SUB_SPORT_CHALLENGE ((FIT_SUB_SPORT)24) +#define FIT_SUB_SPORT_INDOOR_SKIING ((FIT_SUB_SPORT)25) // Fitness Equipment +#define FIT_SUB_SPORT_CARDIO_TRAINING ((FIT_SUB_SPORT)26) // Training +#define FIT_SUB_SPORT_INDOOR_WALKING ((FIT_SUB_SPORT)27) // Walking/Fitness Equipment +#define FIT_SUB_SPORT_E_BIKE_FITNESS ((FIT_SUB_SPORT)28) // E-Biking +#define FIT_SUB_SPORT_BMX ((FIT_SUB_SPORT)29) // Cycling +#define FIT_SUB_SPORT_CASUAL_WALKING ((FIT_SUB_SPORT)30) // Walking +#define FIT_SUB_SPORT_SPEED_WALKING ((FIT_SUB_SPORT)31) // Walking +#define FIT_SUB_SPORT_BIKE_TO_RUN_TRANSITION ((FIT_SUB_SPORT)32) // Transition +#define FIT_SUB_SPORT_RUN_TO_BIKE_TRANSITION ((FIT_SUB_SPORT)33) // Transition +#define FIT_SUB_SPORT_SWIM_TO_BIKE_TRANSITION ((FIT_SUB_SPORT)34) // Transition +#define FIT_SUB_SPORT_ATV ((FIT_SUB_SPORT)35) // Motorcycling +#define FIT_SUB_SPORT_MOTOCROSS ((FIT_SUB_SPORT)36) // Motorcycling +#define FIT_SUB_SPORT_BACKCOUNTRY ((FIT_SUB_SPORT)37) // Alpine Skiing/Snowboarding +#define FIT_SUB_SPORT_RESORT ((FIT_SUB_SPORT)38) // Alpine Skiing/Snowboarding +#define FIT_SUB_SPORT_RC_DRONE ((FIT_SUB_SPORT)39) // Flying +#define FIT_SUB_SPORT_WINGSUIT ((FIT_SUB_SPORT)40) // Flying +#define FIT_SUB_SPORT_WHITEWATER ((FIT_SUB_SPORT)41) // Kayaking/Rafting +#define FIT_SUB_SPORT_SKATE_SKIING ((FIT_SUB_SPORT)42) // Cross Country Skiing +#define FIT_SUB_SPORT_YOGA ((FIT_SUB_SPORT)43) // Training +#define FIT_SUB_SPORT_PILATES ((FIT_SUB_SPORT)44) // Fitness Equipment +#define FIT_SUB_SPORT_INDOOR_RUNNING ((FIT_SUB_SPORT)45) // Run +#define FIT_SUB_SPORT_GRAVEL_CYCLING ((FIT_SUB_SPORT)46) // Cycling +#define FIT_SUB_SPORT_E_BIKE_MOUNTAIN ((FIT_SUB_SPORT)47) // Cycling +#define FIT_SUB_SPORT_COMMUTING ((FIT_SUB_SPORT)48) // Cycling +#define FIT_SUB_SPORT_MIXED_SURFACE ((FIT_SUB_SPORT)49) // Cycling +#define FIT_SUB_SPORT_NAVIGATE ((FIT_SUB_SPORT)50) +#define FIT_SUB_SPORT_TRACK_ME ((FIT_SUB_SPORT)51) +#define FIT_SUB_SPORT_MAP ((FIT_SUB_SPORT)52) +#define FIT_SUB_SPORT_SINGLE_GAS_DIVING ((FIT_SUB_SPORT)53) // Diving +#define FIT_SUB_SPORT_MULTI_GAS_DIVING ((FIT_SUB_SPORT)54) // Diving +#define FIT_SUB_SPORT_GAUGE_DIVING ((FIT_SUB_SPORT)55) // Diving +#define FIT_SUB_SPORT_APNEA_DIVING ((FIT_SUB_SPORT)56) // Diving +#define FIT_SUB_SPORT_APNEA_HUNTING ((FIT_SUB_SPORT)57) // Diving +#define FIT_SUB_SPORT_VIRTUAL_ACTIVITY ((FIT_SUB_SPORT)58) +#define FIT_SUB_SPORT_OBSTACLE ((FIT_SUB_SPORT)59) // Used for events where participants run, crawl through mud, climb over walls, etc. +#define FIT_SUB_SPORT_BREATHING ((FIT_SUB_SPORT)62) +#define FIT_SUB_SPORT_SAIL_RACE ((FIT_SUB_SPORT)65) // Sailing +#define FIT_SUB_SPORT_ULTRA ((FIT_SUB_SPORT)67) // Ultramarathon +#define FIT_SUB_SPORT_INDOOR_CLIMBING ((FIT_SUB_SPORT)68) // Climbing +#define FIT_SUB_SPORT_BOULDERING ((FIT_SUB_SPORT)69) // Climbing +#define FIT_SUB_SPORT_HIIT ((FIT_SUB_SPORT)70) // High Intensity Interval Training +#define FIT_SUB_SPORT_AMRAP ((FIT_SUB_SPORT)73) // HIIT +#define FIT_SUB_SPORT_EMOM ((FIT_SUB_SPORT)74) // HIIT +#define FIT_SUB_SPORT_TABATA ((FIT_SUB_SPORT)75) // HIIT +#define FIT_SUB_SPORT_PICKLEBALL ((FIT_SUB_SPORT)84) // Racket +#define FIT_SUB_SPORT_PADEL ((FIT_SUB_SPORT)85) // Racket +#define FIT_SUB_SPORT_FLY_CANOPY ((FIT_SUB_SPORT)110) // Flying +#define FIT_SUB_SPORT_FLY_PARAGLIDE ((FIT_SUB_SPORT)111) // Flying +#define FIT_SUB_SPORT_FLY_PARAMOTOR ((FIT_SUB_SPORT)112) // Flying +#define FIT_SUB_SPORT_FLY_PRESSURIZED ((FIT_SUB_SPORT)113) // Flying +#define FIT_SUB_SPORT_FLY_NAVIGATE ((FIT_SUB_SPORT)114) // Flying +#define FIT_SUB_SPORT_FLY_TIMER ((FIT_SUB_SPORT)115) // Flying +#define FIT_SUB_SPORT_FLY_ALTIMETER ((FIT_SUB_SPORT)116) // Flying +#define FIT_SUB_SPORT_FLY_WX ((FIT_SUB_SPORT)117) // Flying +#define FIT_SUB_SPORT_FLY_VFR ((FIT_SUB_SPORT)118) // Flying +#define FIT_SUB_SPORT_FLY_IFR ((FIT_SUB_SPORT)119) // Flying +#define FIT_SUB_SPORT_ALL ((FIT_SUB_SPORT)254) +#define FIT_SUB_SPORT_COUNT 82 + +typedef FIT_ENUM FIT_SPORT_EVENT; +#define FIT_SPORT_EVENT_INVALID FIT_ENUM_INVALID +#define FIT_SPORT_EVENT_UNCATEGORIZED ((FIT_SPORT_EVENT)0) +#define FIT_SPORT_EVENT_GEOCACHING ((FIT_SPORT_EVENT)1) +#define FIT_SPORT_EVENT_FITNESS ((FIT_SPORT_EVENT)2) +#define FIT_SPORT_EVENT_RECREATION ((FIT_SPORT_EVENT)3) +#define FIT_SPORT_EVENT_RACE ((FIT_SPORT_EVENT)4) +#define FIT_SPORT_EVENT_SPECIAL_EVENT ((FIT_SPORT_EVENT)5) +#define FIT_SPORT_EVENT_TRAINING ((FIT_SPORT_EVENT)6) +#define FIT_SPORT_EVENT_TRANSPORTATION ((FIT_SPORT_EVENT)7) +#define FIT_SPORT_EVENT_TOURING ((FIT_SPORT_EVENT)8) +#define FIT_SPORT_EVENT_COUNT 9 + +typedef FIT_ENUM FIT_ACTIVITY; +#define FIT_ACTIVITY_INVALID FIT_ENUM_INVALID +#define FIT_ACTIVITY_MANUAL ((FIT_ACTIVITY)0) +#define FIT_ACTIVITY_AUTO_MULTI_SPORT ((FIT_ACTIVITY)1) +#define FIT_ACTIVITY_COUNT 2 + +typedef FIT_ENUM FIT_INTENSITY; +#define FIT_INTENSITY_INVALID FIT_ENUM_INVALID +#define FIT_INTENSITY_ACTIVE ((FIT_INTENSITY)0) +#define FIT_INTENSITY_REST ((FIT_INTENSITY)1) +#define FIT_INTENSITY_WARMUP ((FIT_INTENSITY)2) +#define FIT_INTENSITY_COOLDOWN ((FIT_INTENSITY)3) +#define FIT_INTENSITY_RECOVERY ((FIT_INTENSITY)4) +#define FIT_INTENSITY_INTERVAL ((FIT_INTENSITY)5) +#define FIT_INTENSITY_OTHER ((FIT_INTENSITY)6) +#define FIT_INTENSITY_COUNT 7 + +typedef FIT_ENUM FIT_SESSION_TRIGGER; +#define FIT_SESSION_TRIGGER_INVALID FIT_ENUM_INVALID +#define FIT_SESSION_TRIGGER_ACTIVITY_END ((FIT_SESSION_TRIGGER)0) +#define FIT_SESSION_TRIGGER_MANUAL ((FIT_SESSION_TRIGGER)1) // User changed sport. +#define FIT_SESSION_TRIGGER_AUTO_MULTI_SPORT ((FIT_SESSION_TRIGGER)2) // Auto multi-sport feature is enabled and user pressed lap button to advance session. +#define FIT_SESSION_TRIGGER_FITNESS_EQUIPMENT ((FIT_SESSION_TRIGGER)3) // Auto sport change caused by user linking to fitness equipment. +#define FIT_SESSION_TRIGGER_COUNT 4 + +typedef FIT_ENUM FIT_AUTOLAP_TRIGGER; +#define FIT_AUTOLAP_TRIGGER_INVALID FIT_ENUM_INVALID +#define FIT_AUTOLAP_TRIGGER_TIME ((FIT_AUTOLAP_TRIGGER)0) +#define FIT_AUTOLAP_TRIGGER_DISTANCE ((FIT_AUTOLAP_TRIGGER)1) +#define FIT_AUTOLAP_TRIGGER_POSITION_START ((FIT_AUTOLAP_TRIGGER)2) +#define FIT_AUTOLAP_TRIGGER_POSITION_LAP ((FIT_AUTOLAP_TRIGGER)3) +#define FIT_AUTOLAP_TRIGGER_POSITION_WAYPOINT ((FIT_AUTOLAP_TRIGGER)4) +#define FIT_AUTOLAP_TRIGGER_POSITION_MARKED ((FIT_AUTOLAP_TRIGGER)5) +#define FIT_AUTOLAP_TRIGGER_OFF ((FIT_AUTOLAP_TRIGGER)6) +#define FIT_AUTOLAP_TRIGGER_COUNT 7 + +typedef FIT_ENUM FIT_LAP_TRIGGER; +#define FIT_LAP_TRIGGER_INVALID FIT_ENUM_INVALID +#define FIT_LAP_TRIGGER_MANUAL ((FIT_LAP_TRIGGER)0) +#define FIT_LAP_TRIGGER_TIME ((FIT_LAP_TRIGGER)1) +#define FIT_LAP_TRIGGER_DISTANCE ((FIT_LAP_TRIGGER)2) +#define FIT_LAP_TRIGGER_POSITION_START ((FIT_LAP_TRIGGER)3) +#define FIT_LAP_TRIGGER_POSITION_LAP ((FIT_LAP_TRIGGER)4) +#define FIT_LAP_TRIGGER_POSITION_WAYPOINT ((FIT_LAP_TRIGGER)5) +#define FIT_LAP_TRIGGER_POSITION_MARKED ((FIT_LAP_TRIGGER)6) +#define FIT_LAP_TRIGGER_SESSION_END ((FIT_LAP_TRIGGER)7) +#define FIT_LAP_TRIGGER_FITNESS_EQUIPMENT ((FIT_LAP_TRIGGER)8) +#define FIT_LAP_TRIGGER_COUNT 9 + +typedef FIT_ENUM FIT_TIME_MODE; +#define FIT_TIME_MODE_INVALID FIT_ENUM_INVALID +#define FIT_TIME_MODE_HOUR12 ((FIT_TIME_MODE)0) +#define FIT_TIME_MODE_HOUR24 ((FIT_TIME_MODE)1) // Does not use a leading zero and has a colon +#define FIT_TIME_MODE_MILITARY ((FIT_TIME_MODE)2) // Uses a leading zero and does not have a colon +#define FIT_TIME_MODE_HOUR_12_WITH_SECONDS ((FIT_TIME_MODE)3) +#define FIT_TIME_MODE_HOUR_24_WITH_SECONDS ((FIT_TIME_MODE)4) +#define FIT_TIME_MODE_UTC ((FIT_TIME_MODE)5) +#define FIT_TIME_MODE_COUNT 6 + +typedef FIT_ENUM FIT_BACKLIGHT_MODE; +#define FIT_BACKLIGHT_MODE_INVALID FIT_ENUM_INVALID +#define FIT_BACKLIGHT_MODE_OFF ((FIT_BACKLIGHT_MODE)0) +#define FIT_BACKLIGHT_MODE_MANUAL ((FIT_BACKLIGHT_MODE)1) +#define FIT_BACKLIGHT_MODE_KEY_AND_MESSAGES ((FIT_BACKLIGHT_MODE)2) +#define FIT_BACKLIGHT_MODE_AUTO_BRIGHTNESS ((FIT_BACKLIGHT_MODE)3) +#define FIT_BACKLIGHT_MODE_SMART_NOTIFICATIONS ((FIT_BACKLIGHT_MODE)4) +#define FIT_BACKLIGHT_MODE_KEY_AND_MESSAGES_NIGHT ((FIT_BACKLIGHT_MODE)5) +#define FIT_BACKLIGHT_MODE_KEY_AND_MESSAGES_AND_SMART_NOTIFICATIONS ((FIT_BACKLIGHT_MODE)6) +#define FIT_BACKLIGHT_MODE_COUNT 7 + +typedef FIT_ENUM FIT_DATE_MODE; +#define FIT_DATE_MODE_INVALID FIT_ENUM_INVALID +#define FIT_DATE_MODE_DAY_MONTH ((FIT_DATE_MODE)0) +#define FIT_DATE_MODE_MONTH_DAY ((FIT_DATE_MODE)1) +#define FIT_DATE_MODE_COUNT 2 + +typedef FIT_UINT8 FIT_BACKLIGHT_TIMEOUT; // Timeout in seconds. +#define FIT_BACKLIGHT_TIMEOUT_INVALID FIT_UINT8_INVALID +#define FIT_BACKLIGHT_TIMEOUT_INFINITE ((FIT_BACKLIGHT_TIMEOUT)0) // Backlight stays on forever. +#define FIT_BACKLIGHT_TIMEOUT_COUNT 1 + +typedef FIT_ENUM FIT_EVENT; +#define FIT_EVENT_INVALID FIT_ENUM_INVALID +#define FIT_EVENT_TIMER ((FIT_EVENT)0) // Group 0. Start / stop_all +#define FIT_EVENT_WORKOUT ((FIT_EVENT)3) // start / stop +#define FIT_EVENT_WORKOUT_STEP ((FIT_EVENT)4) // Start at beginning of workout. Stop at end of each step. +#define FIT_EVENT_POWER_DOWN ((FIT_EVENT)5) // stop_all group 0 +#define FIT_EVENT_POWER_UP ((FIT_EVENT)6) // stop_all group 0 +#define FIT_EVENT_OFF_COURSE ((FIT_EVENT)7) // start / stop group 0 +#define FIT_EVENT_SESSION ((FIT_EVENT)8) // Stop at end of each session. +#define FIT_EVENT_LAP ((FIT_EVENT)9) // Stop at end of each lap. +#define FIT_EVENT_COURSE_POINT ((FIT_EVENT)10) // marker +#define FIT_EVENT_BATTERY ((FIT_EVENT)11) // marker +#define FIT_EVENT_VIRTUAL_PARTNER_PACE ((FIT_EVENT)12) // Group 1. Start at beginning of activity if VP enabled, when VP pace is changed during activity or VP enabled mid activity. stop_disable when VP disabled. +#define FIT_EVENT_HR_HIGH_ALERT ((FIT_EVENT)13) // Group 0. Start / stop when in alert condition. +#define FIT_EVENT_HR_LOW_ALERT ((FIT_EVENT)14) // Group 0. Start / stop when in alert condition. +#define FIT_EVENT_SPEED_HIGH_ALERT ((FIT_EVENT)15) // Group 0. Start / stop when in alert condition. +#define FIT_EVENT_SPEED_LOW_ALERT ((FIT_EVENT)16) // Group 0. Start / stop when in alert condition. +#define FIT_EVENT_CAD_HIGH_ALERT ((FIT_EVENT)17) // Group 0. Start / stop when in alert condition. +#define FIT_EVENT_CAD_LOW_ALERT ((FIT_EVENT)18) // Group 0. Start / stop when in alert condition. +#define FIT_EVENT_POWER_HIGH_ALERT ((FIT_EVENT)19) // Group 0. Start / stop when in alert condition. +#define FIT_EVENT_POWER_LOW_ALERT ((FIT_EVENT)20) // Group 0. Start / stop when in alert condition. +#define FIT_EVENT_RECOVERY_HR ((FIT_EVENT)21) // marker +#define FIT_EVENT_BATTERY_LOW ((FIT_EVENT)22) // marker +#define FIT_EVENT_TIME_DURATION_ALERT ((FIT_EVENT)23) // Group 1. Start if enabled mid activity (not required at start of activity). Stop when duration is reached. stop_disable if disabled. +#define FIT_EVENT_DISTANCE_DURATION_ALERT ((FIT_EVENT)24) // Group 1. Start if enabled mid activity (not required at start of activity). Stop when duration is reached. stop_disable if disabled. +#define FIT_EVENT_CALORIE_DURATION_ALERT ((FIT_EVENT)25) // Group 1. Start if enabled mid activity (not required at start of activity). Stop when duration is reached. stop_disable if disabled. +#define FIT_EVENT_ACTIVITY ((FIT_EVENT)26) // Group 1.. Stop at end of activity. +#define FIT_EVENT_FITNESS_EQUIPMENT ((FIT_EVENT)27) // marker +#define FIT_EVENT_LENGTH ((FIT_EVENT)28) // Stop at end of each length. +#define FIT_EVENT_USER_MARKER ((FIT_EVENT)32) // marker +#define FIT_EVENT_SPORT_POINT ((FIT_EVENT)33) // marker +#define FIT_EVENT_CALIBRATION ((FIT_EVENT)36) // start/stop/marker +#define FIT_EVENT_FRONT_GEAR_CHANGE ((FIT_EVENT)42) // marker +#define FIT_EVENT_REAR_GEAR_CHANGE ((FIT_EVENT)43) // marker +#define FIT_EVENT_RIDER_POSITION_CHANGE ((FIT_EVENT)44) // marker +#define FIT_EVENT_ELEV_HIGH_ALERT ((FIT_EVENT)45) // Group 0. Start / stop when in alert condition. +#define FIT_EVENT_ELEV_LOW_ALERT ((FIT_EVENT)46) // Group 0. Start / stop when in alert condition. +#define FIT_EVENT_COMM_TIMEOUT ((FIT_EVENT)47) // marker +#define FIT_EVENT_AUTO_ACTIVITY_DETECT ((FIT_EVENT)54) // marker +#define FIT_EVENT_DIVE_ALERT ((FIT_EVENT)56) // marker +#define FIT_EVENT_DIVE_GAS_SWITCHED ((FIT_EVENT)57) // marker +#define FIT_EVENT_TANK_PRESSURE_RESERVE ((FIT_EVENT)71) // marker +#define FIT_EVENT_TANK_PRESSURE_CRITICAL ((FIT_EVENT)72) // marker +#define FIT_EVENT_TANK_LOST ((FIT_EVENT)73) // marker +#define FIT_EVENT_RADAR_THREAT_ALERT ((FIT_EVENT)75) // start/stop/marker +#define FIT_EVENT_TANK_BATTERY_LOW ((FIT_EVENT)76) // marker +#define FIT_EVENT_TANK_POD_CONNECTED ((FIT_EVENT)81) // marker - tank pod has connected +#define FIT_EVENT_TANK_POD_DISCONNECTED ((FIT_EVENT)82) // marker - tank pod has lost connection +#define FIT_EVENT_COUNT 46 + +typedef FIT_ENUM FIT_EVENT_TYPE; +#define FIT_EVENT_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_EVENT_TYPE_START ((FIT_EVENT_TYPE)0) +#define FIT_EVENT_TYPE_STOP ((FIT_EVENT_TYPE)1) +#define FIT_EVENT_TYPE_CONSECUTIVE_DEPRECIATED ((FIT_EVENT_TYPE)2) +#define FIT_EVENT_TYPE_MARKER ((FIT_EVENT_TYPE)3) +#define FIT_EVENT_TYPE_STOP_ALL ((FIT_EVENT_TYPE)4) +#define FIT_EVENT_TYPE_BEGIN_DEPRECIATED ((FIT_EVENT_TYPE)5) +#define FIT_EVENT_TYPE_END_DEPRECIATED ((FIT_EVENT_TYPE)6) +#define FIT_EVENT_TYPE_END_ALL_DEPRECIATED ((FIT_EVENT_TYPE)7) +#define FIT_EVENT_TYPE_STOP_DISABLE ((FIT_EVENT_TYPE)8) +#define FIT_EVENT_TYPE_STOP_DISABLE_ALL ((FIT_EVENT_TYPE)9) +#define FIT_EVENT_TYPE_COUNT 10 + +typedef FIT_ENUM FIT_TIMER_TRIGGER; // timer event data +#define FIT_TIMER_TRIGGER_INVALID FIT_ENUM_INVALID +#define FIT_TIMER_TRIGGER_MANUAL ((FIT_TIMER_TRIGGER)0) +#define FIT_TIMER_TRIGGER_AUTO ((FIT_TIMER_TRIGGER)1) +#define FIT_TIMER_TRIGGER_FITNESS_EQUIPMENT ((FIT_TIMER_TRIGGER)2) +#define FIT_TIMER_TRIGGER_COUNT 3 + +typedef FIT_ENUM FIT_FITNESS_EQUIPMENT_STATE; // fitness equipment event data +#define FIT_FITNESS_EQUIPMENT_STATE_INVALID FIT_ENUM_INVALID +#define FIT_FITNESS_EQUIPMENT_STATE_READY ((FIT_FITNESS_EQUIPMENT_STATE)0) +#define FIT_FITNESS_EQUIPMENT_STATE_IN_USE ((FIT_FITNESS_EQUIPMENT_STATE)1) +#define FIT_FITNESS_EQUIPMENT_STATE_PAUSED ((FIT_FITNESS_EQUIPMENT_STATE)2) +#define FIT_FITNESS_EQUIPMENT_STATE_UNKNOWN ((FIT_FITNESS_EQUIPMENT_STATE)3) // lost connection to fitness equipment +#define FIT_FITNESS_EQUIPMENT_STATE_COUNT 4 + +typedef FIT_ENUM FIT_TONE; +#define FIT_TONE_INVALID FIT_ENUM_INVALID +#define FIT_TONE_OFF ((FIT_TONE)0) +#define FIT_TONE_TONE ((FIT_TONE)1) +#define FIT_TONE_VIBRATE ((FIT_TONE)2) +#define FIT_TONE_TONE_AND_VIBRATE ((FIT_TONE)3) +#define FIT_TONE_COUNT 4 + +typedef FIT_ENUM FIT_AUTOSCROLL; +#define FIT_AUTOSCROLL_INVALID FIT_ENUM_INVALID +#define FIT_AUTOSCROLL_NONE ((FIT_AUTOSCROLL)0) +#define FIT_AUTOSCROLL_SLOW ((FIT_AUTOSCROLL)1) +#define FIT_AUTOSCROLL_MEDIUM ((FIT_AUTOSCROLL)2) +#define FIT_AUTOSCROLL_FAST ((FIT_AUTOSCROLL)3) +#define FIT_AUTOSCROLL_COUNT 4 + +typedef FIT_ENUM FIT_ACTIVITY_CLASS; +#define FIT_ACTIVITY_CLASS_INVALID FIT_ENUM_INVALID +#define FIT_ACTIVITY_CLASS_LEVEL ((FIT_ACTIVITY_CLASS)0x7F) // 0 to 100 +#define FIT_ACTIVITY_CLASS_LEVEL_MAX ((FIT_ACTIVITY_CLASS)100) +#define FIT_ACTIVITY_CLASS_ATHLETE ((FIT_ACTIVITY_CLASS)0x80) +#define FIT_ACTIVITY_CLASS_COUNT 3 + +typedef FIT_ENUM FIT_HR_ZONE_CALC; +#define FIT_HR_ZONE_CALC_INVALID FIT_ENUM_INVALID +#define FIT_HR_ZONE_CALC_CUSTOM ((FIT_HR_ZONE_CALC)0) +#define FIT_HR_ZONE_CALC_PERCENT_MAX_HR ((FIT_HR_ZONE_CALC)1) +#define FIT_HR_ZONE_CALC_PERCENT_HRR ((FIT_HR_ZONE_CALC)2) +#define FIT_HR_ZONE_CALC_PERCENT_LTHR ((FIT_HR_ZONE_CALC)3) +#define FIT_HR_ZONE_CALC_COUNT 4 + +typedef FIT_ENUM FIT_PWR_ZONE_CALC; +#define FIT_PWR_ZONE_CALC_INVALID FIT_ENUM_INVALID +#define FIT_PWR_ZONE_CALC_CUSTOM ((FIT_PWR_ZONE_CALC)0) +#define FIT_PWR_ZONE_CALC_PERCENT_FTP ((FIT_PWR_ZONE_CALC)1) +#define FIT_PWR_ZONE_CALC_COUNT 2 + +typedef FIT_ENUM FIT_WKT_STEP_DURATION; +#define FIT_WKT_STEP_DURATION_INVALID FIT_ENUM_INVALID +#define FIT_WKT_STEP_DURATION_TIME ((FIT_WKT_STEP_DURATION)0) +#define FIT_WKT_STEP_DURATION_DISTANCE ((FIT_WKT_STEP_DURATION)1) +#define FIT_WKT_STEP_DURATION_HR_LESS_THAN ((FIT_WKT_STEP_DURATION)2) +#define FIT_WKT_STEP_DURATION_HR_GREATER_THAN ((FIT_WKT_STEP_DURATION)3) +#define FIT_WKT_STEP_DURATION_CALORIES ((FIT_WKT_STEP_DURATION)4) +#define FIT_WKT_STEP_DURATION_OPEN ((FIT_WKT_STEP_DURATION)5) +#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_STEPS_CMPLT ((FIT_WKT_STEP_DURATION)6) +#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_TIME ((FIT_WKT_STEP_DURATION)7) +#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_DISTANCE ((FIT_WKT_STEP_DURATION)8) +#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_CALORIES ((FIT_WKT_STEP_DURATION)9) +#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_HR_LESS_THAN ((FIT_WKT_STEP_DURATION)10) +#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_HR_GREATER_THAN ((FIT_WKT_STEP_DURATION)11) +#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_POWER_LESS_THAN ((FIT_WKT_STEP_DURATION)12) +#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_POWER_GREATER_THAN ((FIT_WKT_STEP_DURATION)13) +#define FIT_WKT_STEP_DURATION_POWER_LESS_THAN ((FIT_WKT_STEP_DURATION)14) +#define FIT_WKT_STEP_DURATION_POWER_GREATER_THAN ((FIT_WKT_STEP_DURATION)15) +#define FIT_WKT_STEP_DURATION_TRAINING_PEAKS_TSS ((FIT_WKT_STEP_DURATION)16) +#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_POWER_LAST_LAP_LESS_THAN ((FIT_WKT_STEP_DURATION)17) +#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_MAX_POWER_LAST_LAP_LESS_THAN ((FIT_WKT_STEP_DURATION)18) +#define FIT_WKT_STEP_DURATION_POWER_3S_LESS_THAN ((FIT_WKT_STEP_DURATION)19) +#define FIT_WKT_STEP_DURATION_POWER_10S_LESS_THAN ((FIT_WKT_STEP_DURATION)20) +#define FIT_WKT_STEP_DURATION_POWER_30S_LESS_THAN ((FIT_WKT_STEP_DURATION)21) +#define FIT_WKT_STEP_DURATION_POWER_3S_GREATER_THAN ((FIT_WKT_STEP_DURATION)22) +#define FIT_WKT_STEP_DURATION_POWER_10S_GREATER_THAN ((FIT_WKT_STEP_DURATION)23) +#define FIT_WKT_STEP_DURATION_POWER_30S_GREATER_THAN ((FIT_WKT_STEP_DURATION)24) +#define FIT_WKT_STEP_DURATION_POWER_LAP_LESS_THAN ((FIT_WKT_STEP_DURATION)25) +#define FIT_WKT_STEP_DURATION_POWER_LAP_GREATER_THAN ((FIT_WKT_STEP_DURATION)26) +#define FIT_WKT_STEP_DURATION_REPEAT_UNTIL_TRAINING_PEAKS_TSS ((FIT_WKT_STEP_DURATION)27) +#define FIT_WKT_STEP_DURATION_REPETITION_TIME ((FIT_WKT_STEP_DURATION)28) +#define FIT_WKT_STEP_DURATION_REPS ((FIT_WKT_STEP_DURATION)29) +#define FIT_WKT_STEP_DURATION_TIME_ONLY ((FIT_WKT_STEP_DURATION)31) +#define FIT_WKT_STEP_DURATION_COUNT 31 + +typedef FIT_ENUM FIT_WKT_STEP_TARGET; +#define FIT_WKT_STEP_TARGET_INVALID FIT_ENUM_INVALID +#define FIT_WKT_STEP_TARGET_SPEED ((FIT_WKT_STEP_TARGET)0) +#define FIT_WKT_STEP_TARGET_HEART_RATE ((FIT_WKT_STEP_TARGET)1) +#define FIT_WKT_STEP_TARGET_OPEN ((FIT_WKT_STEP_TARGET)2) +#define FIT_WKT_STEP_TARGET_CADENCE ((FIT_WKT_STEP_TARGET)3) +#define FIT_WKT_STEP_TARGET_POWER ((FIT_WKT_STEP_TARGET)4) +#define FIT_WKT_STEP_TARGET_GRADE ((FIT_WKT_STEP_TARGET)5) +#define FIT_WKT_STEP_TARGET_RESISTANCE ((FIT_WKT_STEP_TARGET)6) +#define FIT_WKT_STEP_TARGET_POWER_3S ((FIT_WKT_STEP_TARGET)7) +#define FIT_WKT_STEP_TARGET_POWER_10S ((FIT_WKT_STEP_TARGET)8) +#define FIT_WKT_STEP_TARGET_POWER_30S ((FIT_WKT_STEP_TARGET)9) +#define FIT_WKT_STEP_TARGET_POWER_LAP ((FIT_WKT_STEP_TARGET)10) +#define FIT_WKT_STEP_TARGET_SWIM_STROKE ((FIT_WKT_STEP_TARGET)11) +#define FIT_WKT_STEP_TARGET_SPEED_LAP ((FIT_WKT_STEP_TARGET)12) +#define FIT_WKT_STEP_TARGET_HEART_RATE_LAP ((FIT_WKT_STEP_TARGET)13) +#define FIT_WKT_STEP_TARGET_COUNT 14 + +typedef FIT_ENUM FIT_GOAL; +#define FIT_GOAL_INVALID FIT_ENUM_INVALID +#define FIT_GOAL_TIME ((FIT_GOAL)0) +#define FIT_GOAL_DISTANCE ((FIT_GOAL)1) +#define FIT_GOAL_CALORIES ((FIT_GOAL)2) +#define FIT_GOAL_FREQUENCY ((FIT_GOAL)3) +#define FIT_GOAL_STEPS ((FIT_GOAL)4) +#define FIT_GOAL_ASCENT ((FIT_GOAL)5) +#define FIT_GOAL_ACTIVE_MINUTES ((FIT_GOAL)6) +#define FIT_GOAL_COUNT 7 + +typedef FIT_ENUM FIT_GOAL_RECURRENCE; +#define FIT_GOAL_RECURRENCE_INVALID FIT_ENUM_INVALID +#define FIT_GOAL_RECURRENCE_OFF ((FIT_GOAL_RECURRENCE)0) +#define FIT_GOAL_RECURRENCE_DAILY ((FIT_GOAL_RECURRENCE)1) +#define FIT_GOAL_RECURRENCE_WEEKLY ((FIT_GOAL_RECURRENCE)2) +#define FIT_GOAL_RECURRENCE_MONTHLY ((FIT_GOAL_RECURRENCE)3) +#define FIT_GOAL_RECURRENCE_YEARLY ((FIT_GOAL_RECURRENCE)4) +#define FIT_GOAL_RECURRENCE_CUSTOM ((FIT_GOAL_RECURRENCE)5) +#define FIT_GOAL_RECURRENCE_COUNT 6 + +typedef FIT_ENUM FIT_GOAL_SOURCE; +#define FIT_GOAL_SOURCE_INVALID FIT_ENUM_INVALID +#define FIT_GOAL_SOURCE_AUTO ((FIT_GOAL_SOURCE)0) // Device generated +#define FIT_GOAL_SOURCE_COMMUNITY ((FIT_GOAL_SOURCE)1) // Social network sourced goal +#define FIT_GOAL_SOURCE_USER ((FIT_GOAL_SOURCE)2) // Manually generated +#define FIT_GOAL_SOURCE_COUNT 3 + +typedef FIT_ENUM FIT_SCHEDULE; +#define FIT_SCHEDULE_INVALID FIT_ENUM_INVALID +#define FIT_SCHEDULE_WORKOUT ((FIT_SCHEDULE)0) +#define FIT_SCHEDULE_COURSE ((FIT_SCHEDULE)1) +#define FIT_SCHEDULE_COUNT 2 + +typedef FIT_ENUM FIT_COURSE_POINT; +#define FIT_COURSE_POINT_INVALID FIT_ENUM_INVALID +#define FIT_COURSE_POINT_GENERIC ((FIT_COURSE_POINT)0) +#define FIT_COURSE_POINT_SUMMIT ((FIT_COURSE_POINT)1) +#define FIT_COURSE_POINT_VALLEY ((FIT_COURSE_POINT)2) +#define FIT_COURSE_POINT_WATER ((FIT_COURSE_POINT)3) +#define FIT_COURSE_POINT_FOOD ((FIT_COURSE_POINT)4) +#define FIT_COURSE_POINT_DANGER ((FIT_COURSE_POINT)5) +#define FIT_COURSE_POINT_LEFT ((FIT_COURSE_POINT)6) +#define FIT_COURSE_POINT_RIGHT ((FIT_COURSE_POINT)7) +#define FIT_COURSE_POINT_STRAIGHT ((FIT_COURSE_POINT)8) +#define FIT_COURSE_POINT_FIRST_AID ((FIT_COURSE_POINT)9) +#define FIT_COURSE_POINT_FOURTH_CATEGORY ((FIT_COURSE_POINT)10) +#define FIT_COURSE_POINT_THIRD_CATEGORY ((FIT_COURSE_POINT)11) +#define FIT_COURSE_POINT_SECOND_CATEGORY ((FIT_COURSE_POINT)12) +#define FIT_COURSE_POINT_FIRST_CATEGORY ((FIT_COURSE_POINT)13) +#define FIT_COURSE_POINT_HORS_CATEGORY ((FIT_COURSE_POINT)14) +#define FIT_COURSE_POINT_SPRINT ((FIT_COURSE_POINT)15) +#define FIT_COURSE_POINT_LEFT_FORK ((FIT_COURSE_POINT)16) +#define FIT_COURSE_POINT_RIGHT_FORK ((FIT_COURSE_POINT)17) +#define FIT_COURSE_POINT_MIDDLE_FORK ((FIT_COURSE_POINT)18) +#define FIT_COURSE_POINT_SLIGHT_LEFT ((FIT_COURSE_POINT)19) +#define FIT_COURSE_POINT_SHARP_LEFT ((FIT_COURSE_POINT)20) +#define FIT_COURSE_POINT_SLIGHT_RIGHT ((FIT_COURSE_POINT)21) +#define FIT_COURSE_POINT_SHARP_RIGHT ((FIT_COURSE_POINT)22) +#define FIT_COURSE_POINT_U_TURN ((FIT_COURSE_POINT)23) +#define FIT_COURSE_POINT_SEGMENT_START ((FIT_COURSE_POINT)24) +#define FIT_COURSE_POINT_SEGMENT_END ((FIT_COURSE_POINT)25) +#define FIT_COURSE_POINT_CAMPSITE ((FIT_COURSE_POINT)27) +#define FIT_COURSE_POINT_AID_STATION ((FIT_COURSE_POINT)28) +#define FIT_COURSE_POINT_REST_AREA ((FIT_COURSE_POINT)29) +#define FIT_COURSE_POINT_GENERAL_DISTANCE ((FIT_COURSE_POINT)30) // Used with UpAhead +#define FIT_COURSE_POINT_SERVICE ((FIT_COURSE_POINT)31) +#define FIT_COURSE_POINT_ENERGY_GEL ((FIT_COURSE_POINT)32) +#define FIT_COURSE_POINT_SPORTS_DRINK ((FIT_COURSE_POINT)33) +#define FIT_COURSE_POINT_MILE_MARKER ((FIT_COURSE_POINT)34) +#define FIT_COURSE_POINT_CHECKPOINT ((FIT_COURSE_POINT)35) +#define FIT_COURSE_POINT_SHELTER ((FIT_COURSE_POINT)36) +#define FIT_COURSE_POINT_MEETING_SPOT ((FIT_COURSE_POINT)37) +#define FIT_COURSE_POINT_OVERLOOK ((FIT_COURSE_POINT)38) +#define FIT_COURSE_POINT_TOILET ((FIT_COURSE_POINT)39) +#define FIT_COURSE_POINT_SHOWER ((FIT_COURSE_POINT)40) +#define FIT_COURSE_POINT_GEAR ((FIT_COURSE_POINT)41) +#define FIT_COURSE_POINT_SHARP_CURVE ((FIT_COURSE_POINT)42) +#define FIT_COURSE_POINT_STEEP_INCLINE ((FIT_COURSE_POINT)43) +#define FIT_COURSE_POINT_TUNNEL ((FIT_COURSE_POINT)44) +#define FIT_COURSE_POINT_BRIDGE ((FIT_COURSE_POINT)45) +#define FIT_COURSE_POINT_OBSTACLE ((FIT_COURSE_POINT)46) +#define FIT_COURSE_POINT_CROSSING ((FIT_COURSE_POINT)47) +#define FIT_COURSE_POINT_STORE ((FIT_COURSE_POINT)48) +#define FIT_COURSE_POINT_TRANSITION ((FIT_COURSE_POINT)49) +#define FIT_COURSE_POINT_NAVAID ((FIT_COURSE_POINT)50) +#define FIT_COURSE_POINT_TRANSPORT ((FIT_COURSE_POINT)51) +#define FIT_COURSE_POINT_ALERT ((FIT_COURSE_POINT)52) +#define FIT_COURSE_POINT_INFO ((FIT_COURSE_POINT)53) +#define FIT_COURSE_POINT_COUNT 53 + +typedef FIT_UINT16 FIT_MANUFACTURER; +#define FIT_MANUFACTURER_INVALID FIT_UINT16_INVALID +#define FIT_MANUFACTURER_GARMIN ((FIT_MANUFACTURER)1) +#define FIT_MANUFACTURER_GARMIN_FR405_ANTFS ((FIT_MANUFACTURER)2) // Do not use. Used by FR405 for ANTFS man id. +#define FIT_MANUFACTURER_ZEPHYR ((FIT_MANUFACTURER)3) +#define FIT_MANUFACTURER_DAYTON ((FIT_MANUFACTURER)4) +#define FIT_MANUFACTURER_IDT ((FIT_MANUFACTURER)5) +#define FIT_MANUFACTURER_SRM ((FIT_MANUFACTURER)6) +#define FIT_MANUFACTURER_QUARQ ((FIT_MANUFACTURER)7) +#define FIT_MANUFACTURER_IBIKE ((FIT_MANUFACTURER)8) +#define FIT_MANUFACTURER_SARIS ((FIT_MANUFACTURER)9) +#define FIT_MANUFACTURER_SPARK_HK ((FIT_MANUFACTURER)10) +#define FIT_MANUFACTURER_TANITA ((FIT_MANUFACTURER)11) +#define FIT_MANUFACTURER_ECHOWELL ((FIT_MANUFACTURER)12) +#define FIT_MANUFACTURER_DYNASTREAM_OEM ((FIT_MANUFACTURER)13) +#define FIT_MANUFACTURER_NAUTILUS ((FIT_MANUFACTURER)14) +#define FIT_MANUFACTURER_DYNASTREAM ((FIT_MANUFACTURER)15) +#define FIT_MANUFACTURER_TIMEX ((FIT_MANUFACTURER)16) +#define FIT_MANUFACTURER_METRIGEAR ((FIT_MANUFACTURER)17) +#define FIT_MANUFACTURER_XELIC ((FIT_MANUFACTURER)18) +#define FIT_MANUFACTURER_BEURER ((FIT_MANUFACTURER)19) +#define FIT_MANUFACTURER_CARDIOSPORT ((FIT_MANUFACTURER)20) +#define FIT_MANUFACTURER_A_AND_D ((FIT_MANUFACTURER)21) +#define FIT_MANUFACTURER_HMM ((FIT_MANUFACTURER)22) +#define FIT_MANUFACTURER_SUUNTO ((FIT_MANUFACTURER)23) +#define FIT_MANUFACTURER_THITA_ELEKTRONIK ((FIT_MANUFACTURER)24) +#define FIT_MANUFACTURER_GPULSE ((FIT_MANUFACTURER)25) +#define FIT_MANUFACTURER_CLEAN_MOBILE ((FIT_MANUFACTURER)26) +#define FIT_MANUFACTURER_PEDAL_BRAIN ((FIT_MANUFACTURER)27) +#define FIT_MANUFACTURER_PEAKSWARE ((FIT_MANUFACTURER)28) +#define FIT_MANUFACTURER_SAXONAR ((FIT_MANUFACTURER)29) +#define FIT_MANUFACTURER_LEMOND_FITNESS ((FIT_MANUFACTURER)30) +#define FIT_MANUFACTURER_DEXCOM ((FIT_MANUFACTURER)31) +#define FIT_MANUFACTURER_WAHOO_FITNESS ((FIT_MANUFACTURER)32) +#define FIT_MANUFACTURER_OCTANE_FITNESS ((FIT_MANUFACTURER)33) +#define FIT_MANUFACTURER_ARCHINOETICS ((FIT_MANUFACTURER)34) +#define FIT_MANUFACTURER_THE_HURT_BOX ((FIT_MANUFACTURER)35) +#define FIT_MANUFACTURER_CITIZEN_SYSTEMS ((FIT_MANUFACTURER)36) +#define FIT_MANUFACTURER_MAGELLAN ((FIT_MANUFACTURER)37) +#define FIT_MANUFACTURER_OSYNCE ((FIT_MANUFACTURER)38) +#define FIT_MANUFACTURER_HOLUX ((FIT_MANUFACTURER)39) +#define FIT_MANUFACTURER_CONCEPT2 ((FIT_MANUFACTURER)40) +#define FIT_MANUFACTURER_SHIMANO ((FIT_MANUFACTURER)41) +#define FIT_MANUFACTURER_ONE_GIANT_LEAP ((FIT_MANUFACTURER)42) +#define FIT_MANUFACTURER_ACE_SENSOR ((FIT_MANUFACTURER)43) +#define FIT_MANUFACTURER_BRIM_BROTHERS ((FIT_MANUFACTURER)44) +#define FIT_MANUFACTURER_XPLOVA ((FIT_MANUFACTURER)45) +#define FIT_MANUFACTURER_PERCEPTION_DIGITAL ((FIT_MANUFACTURER)46) +#define FIT_MANUFACTURER_BF1SYSTEMS ((FIT_MANUFACTURER)47) +#define FIT_MANUFACTURER_PIONEER ((FIT_MANUFACTURER)48) +#define FIT_MANUFACTURER_SPANTEC ((FIT_MANUFACTURER)49) +#define FIT_MANUFACTURER_METALOGICS ((FIT_MANUFACTURER)50) +#define FIT_MANUFACTURER_4IIIIS ((FIT_MANUFACTURER)51) +#define FIT_MANUFACTURER_SEIKO_EPSON ((FIT_MANUFACTURER)52) +#define FIT_MANUFACTURER_SEIKO_EPSON_OEM ((FIT_MANUFACTURER)53) +#define FIT_MANUFACTURER_IFOR_POWELL ((FIT_MANUFACTURER)54) +#define FIT_MANUFACTURER_MAXWELL_GUIDER ((FIT_MANUFACTURER)55) +#define FIT_MANUFACTURER_STAR_TRAC ((FIT_MANUFACTURER)56) +#define FIT_MANUFACTURER_BREAKAWAY ((FIT_MANUFACTURER)57) +#define FIT_MANUFACTURER_ALATECH_TECHNOLOGY_LTD ((FIT_MANUFACTURER)58) +#define FIT_MANUFACTURER_MIO_TECHNOLOGY_EUROPE ((FIT_MANUFACTURER)59) +#define FIT_MANUFACTURER_ROTOR ((FIT_MANUFACTURER)60) +#define FIT_MANUFACTURER_GEONAUTE ((FIT_MANUFACTURER)61) +#define FIT_MANUFACTURER_ID_BIKE ((FIT_MANUFACTURER)62) +#define FIT_MANUFACTURER_SPECIALIZED ((FIT_MANUFACTURER)63) +#define FIT_MANUFACTURER_WTEK ((FIT_MANUFACTURER)64) +#define FIT_MANUFACTURER_PHYSICAL_ENTERPRISES ((FIT_MANUFACTURER)65) +#define FIT_MANUFACTURER_NORTH_POLE_ENGINEERING ((FIT_MANUFACTURER)66) +#define FIT_MANUFACTURER_BKOOL ((FIT_MANUFACTURER)67) +#define FIT_MANUFACTURER_CATEYE ((FIT_MANUFACTURER)68) +#define FIT_MANUFACTURER_STAGES_CYCLING ((FIT_MANUFACTURER)69) +#define FIT_MANUFACTURER_SIGMASPORT ((FIT_MANUFACTURER)70) +#define FIT_MANUFACTURER_TOMTOM ((FIT_MANUFACTURER)71) +#define FIT_MANUFACTURER_PERIPEDAL ((FIT_MANUFACTURER)72) +#define FIT_MANUFACTURER_WATTBIKE ((FIT_MANUFACTURER)73) +#define FIT_MANUFACTURER_MOXY ((FIT_MANUFACTURER)76) +#define FIT_MANUFACTURER_CICLOSPORT ((FIT_MANUFACTURER)77) +#define FIT_MANUFACTURER_POWERBAHN ((FIT_MANUFACTURER)78) +#define FIT_MANUFACTURER_ACORN_PROJECTS_APS ((FIT_MANUFACTURER)79) +#define FIT_MANUFACTURER_LIFEBEAM ((FIT_MANUFACTURER)80) +#define FIT_MANUFACTURER_BONTRAGER ((FIT_MANUFACTURER)81) +#define FIT_MANUFACTURER_WELLGO ((FIT_MANUFACTURER)82) +#define FIT_MANUFACTURER_SCOSCHE ((FIT_MANUFACTURER)83) +#define FIT_MANUFACTURER_MAGURA ((FIT_MANUFACTURER)84) +#define FIT_MANUFACTURER_WOODWAY ((FIT_MANUFACTURER)85) +#define FIT_MANUFACTURER_ELITE ((FIT_MANUFACTURER)86) +#define FIT_MANUFACTURER_NIELSEN_KELLERMAN ((FIT_MANUFACTURER)87) +#define FIT_MANUFACTURER_DK_CITY ((FIT_MANUFACTURER)88) +#define FIT_MANUFACTURER_TACX ((FIT_MANUFACTURER)89) +#define FIT_MANUFACTURER_DIRECTION_TECHNOLOGY ((FIT_MANUFACTURER)90) +#define FIT_MANUFACTURER_MAGTONIC ((FIT_MANUFACTURER)91) +#define FIT_MANUFACTURER_1PARTCARBON ((FIT_MANUFACTURER)92) +#define FIT_MANUFACTURER_INSIDE_RIDE_TECHNOLOGIES ((FIT_MANUFACTURER)93) +#define FIT_MANUFACTURER_SOUND_OF_MOTION ((FIT_MANUFACTURER)94) +#define FIT_MANUFACTURER_STRYD ((FIT_MANUFACTURER)95) +#define FIT_MANUFACTURER_ICG ((FIT_MANUFACTURER)96) // Indoorcycling Group +#define FIT_MANUFACTURER_MIPULSE ((FIT_MANUFACTURER)97) +#define FIT_MANUFACTURER_BSX_ATHLETICS ((FIT_MANUFACTURER)98) +#define FIT_MANUFACTURER_LOOK ((FIT_MANUFACTURER)99) +#define FIT_MANUFACTURER_CAMPAGNOLO_SRL ((FIT_MANUFACTURER)100) +#define FIT_MANUFACTURER_BODY_BIKE_SMART ((FIT_MANUFACTURER)101) +#define FIT_MANUFACTURER_PRAXISWORKS ((FIT_MANUFACTURER)102) +#define FIT_MANUFACTURER_LIMITS_TECHNOLOGY ((FIT_MANUFACTURER)103) // Limits Technology Ltd. +#define FIT_MANUFACTURER_TOPACTION_TECHNOLOGY ((FIT_MANUFACTURER)104) // TopAction Technology Inc. +#define FIT_MANUFACTURER_COSINUSS ((FIT_MANUFACTURER)105) +#define FIT_MANUFACTURER_FITCARE ((FIT_MANUFACTURER)106) +#define FIT_MANUFACTURER_MAGENE ((FIT_MANUFACTURER)107) +#define FIT_MANUFACTURER_GIANT_MANUFACTURING_CO ((FIT_MANUFACTURER)108) +#define FIT_MANUFACTURER_TIGRASPORT ((FIT_MANUFACTURER)109) // Tigrasport +#define FIT_MANUFACTURER_SALUTRON ((FIT_MANUFACTURER)110) +#define FIT_MANUFACTURER_TECHNOGYM ((FIT_MANUFACTURER)111) +#define FIT_MANUFACTURER_BRYTON_SENSORS ((FIT_MANUFACTURER)112) +#define FIT_MANUFACTURER_LATITUDE_LIMITED ((FIT_MANUFACTURER)113) +#define FIT_MANUFACTURER_SOARING_TECHNOLOGY ((FIT_MANUFACTURER)114) +#define FIT_MANUFACTURER_IGPSPORT ((FIT_MANUFACTURER)115) +#define FIT_MANUFACTURER_THINKRIDER ((FIT_MANUFACTURER)116) +#define FIT_MANUFACTURER_GOPHER_SPORT ((FIT_MANUFACTURER)117) +#define FIT_MANUFACTURER_WATERROWER ((FIT_MANUFACTURER)118) +#define FIT_MANUFACTURER_ORANGETHEORY ((FIT_MANUFACTURER)119) +#define FIT_MANUFACTURER_INPEAK ((FIT_MANUFACTURER)120) +#define FIT_MANUFACTURER_KINETIC ((FIT_MANUFACTURER)121) +#define FIT_MANUFACTURER_JOHNSON_HEALTH_TECH ((FIT_MANUFACTURER)122) +#define FIT_MANUFACTURER_POLAR_ELECTRO ((FIT_MANUFACTURER)123) +#define FIT_MANUFACTURER_SEESENSE ((FIT_MANUFACTURER)124) +#define FIT_MANUFACTURER_NCI_TECHNOLOGY ((FIT_MANUFACTURER)125) +#define FIT_MANUFACTURER_IQSQUARE ((FIT_MANUFACTURER)126) +#define FIT_MANUFACTURER_LEOMO ((FIT_MANUFACTURER)127) +#define FIT_MANUFACTURER_IFIT_COM ((FIT_MANUFACTURER)128) +#define FIT_MANUFACTURER_COROS_BYTE ((FIT_MANUFACTURER)129) +#define FIT_MANUFACTURER_VERSA_DESIGN ((FIT_MANUFACTURER)130) +#define FIT_MANUFACTURER_CHILEAF ((FIT_MANUFACTURER)131) +#define FIT_MANUFACTURER_CYCPLUS ((FIT_MANUFACTURER)132) +#define FIT_MANUFACTURER_GRAVAA_BYTE ((FIT_MANUFACTURER)133) +#define FIT_MANUFACTURER_SIGEYI ((FIT_MANUFACTURER)134) +#define FIT_MANUFACTURER_COOSPO ((FIT_MANUFACTURER)135) +#define FIT_MANUFACTURER_GEOID ((FIT_MANUFACTURER)136) +#define FIT_MANUFACTURER_BOSCH ((FIT_MANUFACTURER)137) +#define FIT_MANUFACTURER_KYTO ((FIT_MANUFACTURER)138) +#define FIT_MANUFACTURER_KINETIC_SPORTS ((FIT_MANUFACTURER)139) +#define FIT_MANUFACTURER_DECATHLON_BYTE ((FIT_MANUFACTURER)140) +#define FIT_MANUFACTURER_TQ_SYSTEMS ((FIT_MANUFACTURER)141) +#define FIT_MANUFACTURER_TAG_HEUER ((FIT_MANUFACTURER)142) +#define FIT_MANUFACTURER_KEISER_FITNESS ((FIT_MANUFACTURER)143) +#define FIT_MANUFACTURER_ZWIFT_BYTE ((FIT_MANUFACTURER)144) +#define FIT_MANUFACTURER_PORSCHE_EP ((FIT_MANUFACTURER)145) +#define FIT_MANUFACTURER_BLACKBIRD ((FIT_MANUFACTURER)146) +#define FIT_MANUFACTURER_MEILAN_BYTE ((FIT_MANUFACTURER)147) +#define FIT_MANUFACTURER_EZON ((FIT_MANUFACTURER)148) +#define FIT_MANUFACTURER_DEVELOPMENT ((FIT_MANUFACTURER)255) +#define FIT_MANUFACTURER_HEALTHANDLIFE ((FIT_MANUFACTURER)257) +#define FIT_MANUFACTURER_LEZYNE ((FIT_MANUFACTURER)258) +#define FIT_MANUFACTURER_SCRIBE_LABS ((FIT_MANUFACTURER)259) +#define FIT_MANUFACTURER_ZWIFT ((FIT_MANUFACTURER)260) +#define FIT_MANUFACTURER_WATTEAM ((FIT_MANUFACTURER)261) +#define FIT_MANUFACTURER_RECON ((FIT_MANUFACTURER)262) +#define FIT_MANUFACTURER_FAVERO_ELECTRONICS ((FIT_MANUFACTURER)263) +#define FIT_MANUFACTURER_DYNOVELO ((FIT_MANUFACTURER)264) +#define FIT_MANUFACTURER_STRAVA ((FIT_MANUFACTURER)265) +#define FIT_MANUFACTURER_PRECOR ((FIT_MANUFACTURER)266) // Amer Sports +#define FIT_MANUFACTURER_BRYTON ((FIT_MANUFACTURER)267) +#define FIT_MANUFACTURER_SRAM ((FIT_MANUFACTURER)268) +#define FIT_MANUFACTURER_NAVMAN ((FIT_MANUFACTURER)269) // MiTAC Global Corporation (Mio Technology) +#define FIT_MANUFACTURER_COBI ((FIT_MANUFACTURER)270) // COBI GmbH +#define FIT_MANUFACTURER_SPIVI ((FIT_MANUFACTURER)271) +#define FIT_MANUFACTURER_MIO_MAGELLAN ((FIT_MANUFACTURER)272) +#define FIT_MANUFACTURER_EVESPORTS ((FIT_MANUFACTURER)273) +#define FIT_MANUFACTURER_SENSITIVUS_GAUGE ((FIT_MANUFACTURER)274) +#define FIT_MANUFACTURER_PODOON ((FIT_MANUFACTURER)275) +#define FIT_MANUFACTURER_LIFE_TIME_FITNESS ((FIT_MANUFACTURER)276) +#define FIT_MANUFACTURER_FALCO_E_MOTORS ((FIT_MANUFACTURER)277) // Falco eMotors Inc. +#define FIT_MANUFACTURER_MINOURA ((FIT_MANUFACTURER)278) +#define FIT_MANUFACTURER_CYCLIQ ((FIT_MANUFACTURER)279) +#define FIT_MANUFACTURER_LUXOTTICA ((FIT_MANUFACTURER)280) +#define FIT_MANUFACTURER_TRAINER_ROAD ((FIT_MANUFACTURER)281) +#define FIT_MANUFACTURER_THE_SUFFERFEST ((FIT_MANUFACTURER)282) +#define FIT_MANUFACTURER_FULLSPEEDAHEAD ((FIT_MANUFACTURER)283) +#define FIT_MANUFACTURER_VIRTUALTRAINING ((FIT_MANUFACTURER)284) +#define FIT_MANUFACTURER_FEEDBACKSPORTS ((FIT_MANUFACTURER)285) +#define FIT_MANUFACTURER_OMATA ((FIT_MANUFACTURER)286) +#define FIT_MANUFACTURER_VDO ((FIT_MANUFACTURER)287) +#define FIT_MANUFACTURER_MAGNETICDAYS ((FIT_MANUFACTURER)288) +#define FIT_MANUFACTURER_HAMMERHEAD ((FIT_MANUFACTURER)289) +#define FIT_MANUFACTURER_KINETIC_BY_KURT ((FIT_MANUFACTURER)290) +#define FIT_MANUFACTURER_SHAPELOG ((FIT_MANUFACTURER)291) +#define FIT_MANUFACTURER_DABUZIDUO ((FIT_MANUFACTURER)292) +#define FIT_MANUFACTURER_JETBLACK ((FIT_MANUFACTURER)293) +#define FIT_MANUFACTURER_COROS ((FIT_MANUFACTURER)294) +#define FIT_MANUFACTURER_VIRTUGO ((FIT_MANUFACTURER)295) +#define FIT_MANUFACTURER_VELOSENSE ((FIT_MANUFACTURER)296) +#define FIT_MANUFACTURER_CYCLIGENTINC ((FIT_MANUFACTURER)297) +#define FIT_MANUFACTURER_TRAILFORKS ((FIT_MANUFACTURER)298) +#define FIT_MANUFACTURER_MAHLE_EBIKEMOTION ((FIT_MANUFACTURER)299) +#define FIT_MANUFACTURER_NURVV ((FIT_MANUFACTURER)300) +#define FIT_MANUFACTURER_MICROPROGRAM ((FIT_MANUFACTURER)301) +#define FIT_MANUFACTURER_ZONE5CLOUD ((FIT_MANUFACTURER)302) +#define FIT_MANUFACTURER_GREENTEG ((FIT_MANUFACTURER)303) +#define FIT_MANUFACTURER_YAMAHA_MOTORS ((FIT_MANUFACTURER)304) +#define FIT_MANUFACTURER_WHOOP ((FIT_MANUFACTURER)305) +#define FIT_MANUFACTURER_GRAVAA ((FIT_MANUFACTURER)306) +#define FIT_MANUFACTURER_ONELAP ((FIT_MANUFACTURER)307) +#define FIT_MANUFACTURER_MONARK_EXERCISE ((FIT_MANUFACTURER)308) +#define FIT_MANUFACTURER_FORM ((FIT_MANUFACTURER)309) +#define FIT_MANUFACTURER_DECATHLON ((FIT_MANUFACTURER)310) +#define FIT_MANUFACTURER_SYNCROS ((FIT_MANUFACTURER)311) +#define FIT_MANUFACTURER_HEATUP ((FIT_MANUFACTURER)312) +#define FIT_MANUFACTURER_CANNONDALE ((FIT_MANUFACTURER)313) +#define FIT_MANUFACTURER_TRUE_FITNESS ((FIT_MANUFACTURER)314) +#define FIT_MANUFACTURER_RGT_CYCLING ((FIT_MANUFACTURER)315) +#define FIT_MANUFACTURER_VASA ((FIT_MANUFACTURER)316) +#define FIT_MANUFACTURER_RACE_REPUBLIC ((FIT_MANUFACTURER)317) +#define FIT_MANUFACTURER_FAZUA ((FIT_MANUFACTURER)318) +#define FIT_MANUFACTURER_OREKA_TRAINING ((FIT_MANUFACTURER)319) +#define FIT_MANUFACTURER_LSEC ((FIT_MANUFACTURER)320) // Lishun Electric & Communication +#define FIT_MANUFACTURER_LULULEMON_STUDIO ((FIT_MANUFACTURER)321) +#define FIT_MANUFACTURER_SHANYUE ((FIT_MANUFACTURER)322) +#define FIT_MANUFACTURER_SPINNING_MDA ((FIT_MANUFACTURER)323) +#define FIT_MANUFACTURER_HILLDATING ((FIT_MANUFACTURER)324) +#define FIT_MANUFACTURER_ACTIGRAPHCORP ((FIT_MANUFACTURER)5759) +#define FIT_MANUFACTURER_COUNT 216 + +typedef FIT_UINT16 FIT_GARMIN_PRODUCT; +#define FIT_GARMIN_PRODUCT_INVALID FIT_UINT16_INVALID +#define FIT_GARMIN_PRODUCT_HRM1 ((FIT_GARMIN_PRODUCT)1) +#define FIT_GARMIN_PRODUCT_AXH01 ((FIT_GARMIN_PRODUCT)2) // AXH01 HRM chipset +#define FIT_GARMIN_PRODUCT_AXB01 ((FIT_GARMIN_PRODUCT)3) +#define FIT_GARMIN_PRODUCT_AXB02 ((FIT_GARMIN_PRODUCT)4) +#define FIT_GARMIN_PRODUCT_HRM2SS ((FIT_GARMIN_PRODUCT)5) +#define FIT_GARMIN_PRODUCT_DSI_ALF02 ((FIT_GARMIN_PRODUCT)6) +#define FIT_GARMIN_PRODUCT_HRM3SS ((FIT_GARMIN_PRODUCT)7) +#define FIT_GARMIN_PRODUCT_HRM_RUN_SINGLE_BYTE_PRODUCT_ID ((FIT_GARMIN_PRODUCT)8) // hrm_run model for HRM ANT+ messaging +#define FIT_GARMIN_PRODUCT_BSM ((FIT_GARMIN_PRODUCT)9) // BSM model for ANT+ messaging +#define FIT_GARMIN_PRODUCT_BCM ((FIT_GARMIN_PRODUCT)10) // BCM model for ANT+ messaging +#define FIT_GARMIN_PRODUCT_AXS01 ((FIT_GARMIN_PRODUCT)11) // AXS01 HRM Bike Chipset model for ANT+ messaging +#define FIT_GARMIN_PRODUCT_HRM_TRI_SINGLE_BYTE_PRODUCT_ID ((FIT_GARMIN_PRODUCT)12) // hrm_tri model for HRM ANT+ messaging +#define FIT_GARMIN_PRODUCT_HRM4_RUN_SINGLE_BYTE_PRODUCT_ID ((FIT_GARMIN_PRODUCT)13) // hrm4 run model for HRM ANT+ messaging +#define FIT_GARMIN_PRODUCT_FR225_SINGLE_BYTE_PRODUCT_ID ((FIT_GARMIN_PRODUCT)14) // fr225 model for HRM ANT+ messaging +#define FIT_GARMIN_PRODUCT_GEN3_BSM_SINGLE_BYTE_PRODUCT_ID ((FIT_GARMIN_PRODUCT)15) // gen3_bsm model for Bike Speed ANT+ messaging +#define FIT_GARMIN_PRODUCT_GEN3_BCM_SINGLE_BYTE_PRODUCT_ID ((FIT_GARMIN_PRODUCT)16) // gen3_bcm model for Bike Cadence ANT+ messaging +#define FIT_GARMIN_PRODUCT_OHR ((FIT_GARMIN_PRODUCT)255) // Garmin Wearable Optical Heart Rate Sensor for ANT+ HR Profile Broadcasting +#define FIT_GARMIN_PRODUCT_FR301_CHINA ((FIT_GARMIN_PRODUCT)473) +#define FIT_GARMIN_PRODUCT_FR301_JAPAN ((FIT_GARMIN_PRODUCT)474) +#define FIT_GARMIN_PRODUCT_FR301_KOREA ((FIT_GARMIN_PRODUCT)475) +#define FIT_GARMIN_PRODUCT_FR301_TAIWAN ((FIT_GARMIN_PRODUCT)494) +#define FIT_GARMIN_PRODUCT_FR405 ((FIT_GARMIN_PRODUCT)717) // Forerunner 405 +#define FIT_GARMIN_PRODUCT_FR50 ((FIT_GARMIN_PRODUCT)782) // Forerunner 50 +#define FIT_GARMIN_PRODUCT_FR405_JAPAN ((FIT_GARMIN_PRODUCT)987) +#define FIT_GARMIN_PRODUCT_FR60 ((FIT_GARMIN_PRODUCT)988) // Forerunner 60 +#define FIT_GARMIN_PRODUCT_DSI_ALF01 ((FIT_GARMIN_PRODUCT)1011) +#define FIT_GARMIN_PRODUCT_FR310XT ((FIT_GARMIN_PRODUCT)1018) // Forerunner 310 +#define FIT_GARMIN_PRODUCT_EDGE500 ((FIT_GARMIN_PRODUCT)1036) +#define FIT_GARMIN_PRODUCT_FR110 ((FIT_GARMIN_PRODUCT)1124) // Forerunner 110 +#define FIT_GARMIN_PRODUCT_EDGE800 ((FIT_GARMIN_PRODUCT)1169) +#define FIT_GARMIN_PRODUCT_EDGE500_TAIWAN ((FIT_GARMIN_PRODUCT)1199) +#define FIT_GARMIN_PRODUCT_EDGE500_JAPAN ((FIT_GARMIN_PRODUCT)1213) +#define FIT_GARMIN_PRODUCT_CHIRP ((FIT_GARMIN_PRODUCT)1253) +#define FIT_GARMIN_PRODUCT_FR110_JAPAN ((FIT_GARMIN_PRODUCT)1274) +#define FIT_GARMIN_PRODUCT_EDGE200 ((FIT_GARMIN_PRODUCT)1325) +#define FIT_GARMIN_PRODUCT_FR910XT ((FIT_GARMIN_PRODUCT)1328) +#define FIT_GARMIN_PRODUCT_EDGE800_TAIWAN ((FIT_GARMIN_PRODUCT)1333) +#define FIT_GARMIN_PRODUCT_EDGE800_JAPAN ((FIT_GARMIN_PRODUCT)1334) +#define FIT_GARMIN_PRODUCT_ALF04 ((FIT_GARMIN_PRODUCT)1341) +#define FIT_GARMIN_PRODUCT_FR610 ((FIT_GARMIN_PRODUCT)1345) +#define FIT_GARMIN_PRODUCT_FR210_JAPAN ((FIT_GARMIN_PRODUCT)1360) +#define FIT_GARMIN_PRODUCT_VECTOR_SS ((FIT_GARMIN_PRODUCT)1380) +#define FIT_GARMIN_PRODUCT_VECTOR_CP ((FIT_GARMIN_PRODUCT)1381) +#define FIT_GARMIN_PRODUCT_EDGE800_CHINA ((FIT_GARMIN_PRODUCT)1386) +#define FIT_GARMIN_PRODUCT_EDGE500_CHINA ((FIT_GARMIN_PRODUCT)1387) +#define FIT_GARMIN_PRODUCT_APPROACH_G10 ((FIT_GARMIN_PRODUCT)1405) +#define FIT_GARMIN_PRODUCT_FR610_JAPAN ((FIT_GARMIN_PRODUCT)1410) +#define FIT_GARMIN_PRODUCT_EDGE500_KOREA ((FIT_GARMIN_PRODUCT)1422) +#define FIT_GARMIN_PRODUCT_FR70 ((FIT_GARMIN_PRODUCT)1436) +#define FIT_GARMIN_PRODUCT_FR310XT_4T ((FIT_GARMIN_PRODUCT)1446) +#define FIT_GARMIN_PRODUCT_AMX ((FIT_GARMIN_PRODUCT)1461) +#define FIT_GARMIN_PRODUCT_FR10 ((FIT_GARMIN_PRODUCT)1482) +#define FIT_GARMIN_PRODUCT_EDGE800_KOREA ((FIT_GARMIN_PRODUCT)1497) +#define FIT_GARMIN_PRODUCT_SWIM ((FIT_GARMIN_PRODUCT)1499) +#define FIT_GARMIN_PRODUCT_FR910XT_CHINA ((FIT_GARMIN_PRODUCT)1537) +#define FIT_GARMIN_PRODUCT_FENIX ((FIT_GARMIN_PRODUCT)1551) +#define FIT_GARMIN_PRODUCT_EDGE200_TAIWAN ((FIT_GARMIN_PRODUCT)1555) +#define FIT_GARMIN_PRODUCT_EDGE510 ((FIT_GARMIN_PRODUCT)1561) +#define FIT_GARMIN_PRODUCT_EDGE810 ((FIT_GARMIN_PRODUCT)1567) +#define FIT_GARMIN_PRODUCT_TEMPE ((FIT_GARMIN_PRODUCT)1570) +#define FIT_GARMIN_PRODUCT_FR910XT_JAPAN ((FIT_GARMIN_PRODUCT)1600) +#define FIT_GARMIN_PRODUCT_FR620 ((FIT_GARMIN_PRODUCT)1623) +#define FIT_GARMIN_PRODUCT_FR220 ((FIT_GARMIN_PRODUCT)1632) +#define FIT_GARMIN_PRODUCT_FR910XT_KOREA ((FIT_GARMIN_PRODUCT)1664) +#define FIT_GARMIN_PRODUCT_FR10_JAPAN ((FIT_GARMIN_PRODUCT)1688) +#define FIT_GARMIN_PRODUCT_EDGE810_JAPAN ((FIT_GARMIN_PRODUCT)1721) +#define FIT_GARMIN_PRODUCT_VIRB_ELITE ((FIT_GARMIN_PRODUCT)1735) +#define FIT_GARMIN_PRODUCT_EDGE_TOURING ((FIT_GARMIN_PRODUCT)1736) // Also Edge Touring Plus +#define FIT_GARMIN_PRODUCT_EDGE510_JAPAN ((FIT_GARMIN_PRODUCT)1742) +#define FIT_GARMIN_PRODUCT_HRM_TRI ((FIT_GARMIN_PRODUCT)1743) // Also HRM-Swim +#define FIT_GARMIN_PRODUCT_HRM_RUN ((FIT_GARMIN_PRODUCT)1752) +#define FIT_GARMIN_PRODUCT_FR920XT ((FIT_GARMIN_PRODUCT)1765) +#define FIT_GARMIN_PRODUCT_EDGE510_ASIA ((FIT_GARMIN_PRODUCT)1821) +#define FIT_GARMIN_PRODUCT_EDGE810_CHINA ((FIT_GARMIN_PRODUCT)1822) +#define FIT_GARMIN_PRODUCT_EDGE810_TAIWAN ((FIT_GARMIN_PRODUCT)1823) +#define FIT_GARMIN_PRODUCT_EDGE1000 ((FIT_GARMIN_PRODUCT)1836) +#define FIT_GARMIN_PRODUCT_VIVO_FIT ((FIT_GARMIN_PRODUCT)1837) +#define FIT_GARMIN_PRODUCT_VIRB_REMOTE ((FIT_GARMIN_PRODUCT)1853) +#define FIT_GARMIN_PRODUCT_VIVO_KI ((FIT_GARMIN_PRODUCT)1885) +#define FIT_GARMIN_PRODUCT_FR15 ((FIT_GARMIN_PRODUCT)1903) +#define FIT_GARMIN_PRODUCT_VIVO_ACTIVE ((FIT_GARMIN_PRODUCT)1907) +#define FIT_GARMIN_PRODUCT_EDGE510_KOREA ((FIT_GARMIN_PRODUCT)1918) +#define FIT_GARMIN_PRODUCT_FR620_JAPAN ((FIT_GARMIN_PRODUCT)1928) +#define FIT_GARMIN_PRODUCT_FR620_CHINA ((FIT_GARMIN_PRODUCT)1929) +#define FIT_GARMIN_PRODUCT_FR220_JAPAN ((FIT_GARMIN_PRODUCT)1930) +#define FIT_GARMIN_PRODUCT_FR220_CHINA ((FIT_GARMIN_PRODUCT)1931) +#define FIT_GARMIN_PRODUCT_APPROACH_S6 ((FIT_GARMIN_PRODUCT)1936) +#define FIT_GARMIN_PRODUCT_VIVO_SMART ((FIT_GARMIN_PRODUCT)1956) +#define FIT_GARMIN_PRODUCT_FENIX2 ((FIT_GARMIN_PRODUCT)1967) +#define FIT_GARMIN_PRODUCT_EPIX ((FIT_GARMIN_PRODUCT)1988) +#define FIT_GARMIN_PRODUCT_FENIX3 ((FIT_GARMIN_PRODUCT)2050) +#define FIT_GARMIN_PRODUCT_EDGE1000_TAIWAN ((FIT_GARMIN_PRODUCT)2052) +#define FIT_GARMIN_PRODUCT_EDGE1000_JAPAN ((FIT_GARMIN_PRODUCT)2053) +#define FIT_GARMIN_PRODUCT_FR15_JAPAN ((FIT_GARMIN_PRODUCT)2061) +#define FIT_GARMIN_PRODUCT_EDGE520 ((FIT_GARMIN_PRODUCT)2067) +#define FIT_GARMIN_PRODUCT_EDGE1000_CHINA ((FIT_GARMIN_PRODUCT)2070) +#define FIT_GARMIN_PRODUCT_FR620_RUSSIA ((FIT_GARMIN_PRODUCT)2072) +#define FIT_GARMIN_PRODUCT_FR220_RUSSIA ((FIT_GARMIN_PRODUCT)2073) +#define FIT_GARMIN_PRODUCT_VECTOR_S ((FIT_GARMIN_PRODUCT)2079) +#define FIT_GARMIN_PRODUCT_EDGE1000_KOREA ((FIT_GARMIN_PRODUCT)2100) +#define FIT_GARMIN_PRODUCT_FR920XT_TAIWAN ((FIT_GARMIN_PRODUCT)2130) +#define FIT_GARMIN_PRODUCT_FR920XT_CHINA ((FIT_GARMIN_PRODUCT)2131) +#define FIT_GARMIN_PRODUCT_FR920XT_JAPAN ((FIT_GARMIN_PRODUCT)2132) +#define FIT_GARMIN_PRODUCT_VIRBX ((FIT_GARMIN_PRODUCT)2134) +#define FIT_GARMIN_PRODUCT_VIVO_SMART_APAC ((FIT_GARMIN_PRODUCT)2135) +#define FIT_GARMIN_PRODUCT_ETREX_TOUCH ((FIT_GARMIN_PRODUCT)2140) +#define FIT_GARMIN_PRODUCT_EDGE25 ((FIT_GARMIN_PRODUCT)2147) +#define FIT_GARMIN_PRODUCT_FR25 ((FIT_GARMIN_PRODUCT)2148) +#define FIT_GARMIN_PRODUCT_VIVO_FIT2 ((FIT_GARMIN_PRODUCT)2150) +#define FIT_GARMIN_PRODUCT_FR225 ((FIT_GARMIN_PRODUCT)2153) +#define FIT_GARMIN_PRODUCT_FR630 ((FIT_GARMIN_PRODUCT)2156) +#define FIT_GARMIN_PRODUCT_FR230 ((FIT_GARMIN_PRODUCT)2157) +#define FIT_GARMIN_PRODUCT_FR735XT ((FIT_GARMIN_PRODUCT)2158) +#define FIT_GARMIN_PRODUCT_VIVO_ACTIVE_APAC ((FIT_GARMIN_PRODUCT)2160) +#define FIT_GARMIN_PRODUCT_VECTOR_2 ((FIT_GARMIN_PRODUCT)2161) +#define FIT_GARMIN_PRODUCT_VECTOR_2S ((FIT_GARMIN_PRODUCT)2162) +#define FIT_GARMIN_PRODUCT_VIRBXE ((FIT_GARMIN_PRODUCT)2172) +#define FIT_GARMIN_PRODUCT_FR620_TAIWAN ((FIT_GARMIN_PRODUCT)2173) +#define FIT_GARMIN_PRODUCT_FR220_TAIWAN ((FIT_GARMIN_PRODUCT)2174) +#define FIT_GARMIN_PRODUCT_TRUSWING ((FIT_GARMIN_PRODUCT)2175) +#define FIT_GARMIN_PRODUCT_D2AIRVENU ((FIT_GARMIN_PRODUCT)2187) +#define FIT_GARMIN_PRODUCT_FENIX3_CHINA ((FIT_GARMIN_PRODUCT)2188) +#define FIT_GARMIN_PRODUCT_FENIX3_TWN ((FIT_GARMIN_PRODUCT)2189) +#define FIT_GARMIN_PRODUCT_VARIA_HEADLIGHT ((FIT_GARMIN_PRODUCT)2192) +#define FIT_GARMIN_PRODUCT_VARIA_TAILLIGHT_OLD ((FIT_GARMIN_PRODUCT)2193) +#define FIT_GARMIN_PRODUCT_EDGE_EXPLORE_1000 ((FIT_GARMIN_PRODUCT)2204) +#define FIT_GARMIN_PRODUCT_FR225_ASIA ((FIT_GARMIN_PRODUCT)2219) +#define FIT_GARMIN_PRODUCT_VARIA_RADAR_TAILLIGHT ((FIT_GARMIN_PRODUCT)2225) +#define FIT_GARMIN_PRODUCT_VARIA_RADAR_DISPLAY ((FIT_GARMIN_PRODUCT)2226) +#define FIT_GARMIN_PRODUCT_EDGE20 ((FIT_GARMIN_PRODUCT)2238) +#define FIT_GARMIN_PRODUCT_EDGE520_ASIA ((FIT_GARMIN_PRODUCT)2260) +#define FIT_GARMIN_PRODUCT_EDGE520_JAPAN ((FIT_GARMIN_PRODUCT)2261) +#define FIT_GARMIN_PRODUCT_D2_BRAVO ((FIT_GARMIN_PRODUCT)2262) +#define FIT_GARMIN_PRODUCT_APPROACH_S20 ((FIT_GARMIN_PRODUCT)2266) +#define FIT_GARMIN_PRODUCT_VIVO_SMART2 ((FIT_GARMIN_PRODUCT)2271) +#define FIT_GARMIN_PRODUCT_EDGE1000_THAI ((FIT_GARMIN_PRODUCT)2274) +#define FIT_GARMIN_PRODUCT_VARIA_REMOTE ((FIT_GARMIN_PRODUCT)2276) +#define FIT_GARMIN_PRODUCT_EDGE25_ASIA ((FIT_GARMIN_PRODUCT)2288) +#define FIT_GARMIN_PRODUCT_EDGE25_JPN ((FIT_GARMIN_PRODUCT)2289) +#define FIT_GARMIN_PRODUCT_EDGE20_ASIA ((FIT_GARMIN_PRODUCT)2290) +#define FIT_GARMIN_PRODUCT_APPROACH_X40 ((FIT_GARMIN_PRODUCT)2292) +#define FIT_GARMIN_PRODUCT_FENIX3_JAPAN ((FIT_GARMIN_PRODUCT)2293) +#define FIT_GARMIN_PRODUCT_VIVO_SMART_EMEA ((FIT_GARMIN_PRODUCT)2294) +#define FIT_GARMIN_PRODUCT_FR630_ASIA ((FIT_GARMIN_PRODUCT)2310) +#define FIT_GARMIN_PRODUCT_FR630_JPN ((FIT_GARMIN_PRODUCT)2311) +#define FIT_GARMIN_PRODUCT_FR230_JPN ((FIT_GARMIN_PRODUCT)2313) +#define FIT_GARMIN_PRODUCT_HRM4_RUN ((FIT_GARMIN_PRODUCT)2327) +#define FIT_GARMIN_PRODUCT_EPIX_JAPAN ((FIT_GARMIN_PRODUCT)2332) +#define FIT_GARMIN_PRODUCT_VIVO_ACTIVE_HR ((FIT_GARMIN_PRODUCT)2337) +#define FIT_GARMIN_PRODUCT_VIVO_SMART_GPS_HR ((FIT_GARMIN_PRODUCT)2347) +#define FIT_GARMIN_PRODUCT_VIVO_SMART_HR ((FIT_GARMIN_PRODUCT)2348) +#define FIT_GARMIN_PRODUCT_VIVO_SMART_HR_ASIA ((FIT_GARMIN_PRODUCT)2361) +#define FIT_GARMIN_PRODUCT_VIVO_SMART_GPS_HR_ASIA ((FIT_GARMIN_PRODUCT)2362) +#define FIT_GARMIN_PRODUCT_VIVO_MOVE ((FIT_GARMIN_PRODUCT)2368) +#define FIT_GARMIN_PRODUCT_VARIA_TAILLIGHT ((FIT_GARMIN_PRODUCT)2379) +#define FIT_GARMIN_PRODUCT_FR235_ASIA ((FIT_GARMIN_PRODUCT)2396) +#define FIT_GARMIN_PRODUCT_FR235_JAPAN ((FIT_GARMIN_PRODUCT)2397) +#define FIT_GARMIN_PRODUCT_VARIA_VISION ((FIT_GARMIN_PRODUCT)2398) +#define FIT_GARMIN_PRODUCT_VIVO_FIT3 ((FIT_GARMIN_PRODUCT)2406) +#define FIT_GARMIN_PRODUCT_FENIX3_KOREA ((FIT_GARMIN_PRODUCT)2407) +#define FIT_GARMIN_PRODUCT_FENIX3_SEA ((FIT_GARMIN_PRODUCT)2408) +#define FIT_GARMIN_PRODUCT_FENIX3_HR ((FIT_GARMIN_PRODUCT)2413) +#define FIT_GARMIN_PRODUCT_VIRB_ULTRA_30 ((FIT_GARMIN_PRODUCT)2417) +#define FIT_GARMIN_PRODUCT_INDEX_SMART_SCALE ((FIT_GARMIN_PRODUCT)2429) +#define FIT_GARMIN_PRODUCT_FR235 ((FIT_GARMIN_PRODUCT)2431) +#define FIT_GARMIN_PRODUCT_FENIX3_CHRONOS ((FIT_GARMIN_PRODUCT)2432) +#define FIT_GARMIN_PRODUCT_OREGON7XX ((FIT_GARMIN_PRODUCT)2441) +#define FIT_GARMIN_PRODUCT_RINO7XX ((FIT_GARMIN_PRODUCT)2444) +#define FIT_GARMIN_PRODUCT_EPIX_KOREA ((FIT_GARMIN_PRODUCT)2457) +#define FIT_GARMIN_PRODUCT_FENIX3_HR_CHN ((FIT_GARMIN_PRODUCT)2473) +#define FIT_GARMIN_PRODUCT_FENIX3_HR_TWN ((FIT_GARMIN_PRODUCT)2474) +#define FIT_GARMIN_PRODUCT_FENIX3_HR_JPN ((FIT_GARMIN_PRODUCT)2475) +#define FIT_GARMIN_PRODUCT_FENIX3_HR_SEA ((FIT_GARMIN_PRODUCT)2476) +#define FIT_GARMIN_PRODUCT_FENIX3_HR_KOR ((FIT_GARMIN_PRODUCT)2477) +#define FIT_GARMIN_PRODUCT_NAUTIX ((FIT_GARMIN_PRODUCT)2496) +#define FIT_GARMIN_PRODUCT_VIVO_ACTIVE_HR_APAC ((FIT_GARMIN_PRODUCT)2497) +#define FIT_GARMIN_PRODUCT_FR35 ((FIT_GARMIN_PRODUCT)2503) +#define FIT_GARMIN_PRODUCT_OREGON7XX_WW ((FIT_GARMIN_PRODUCT)2512) +#define FIT_GARMIN_PRODUCT_EDGE_820 ((FIT_GARMIN_PRODUCT)2530) +#define FIT_GARMIN_PRODUCT_EDGE_EXPLORE_820 ((FIT_GARMIN_PRODUCT)2531) +#define FIT_GARMIN_PRODUCT_FR735XT_APAC ((FIT_GARMIN_PRODUCT)2533) +#define FIT_GARMIN_PRODUCT_FR735XT_JAPAN ((FIT_GARMIN_PRODUCT)2534) +#define FIT_GARMIN_PRODUCT_FENIX5S ((FIT_GARMIN_PRODUCT)2544) +#define FIT_GARMIN_PRODUCT_D2_BRAVO_TITANIUM ((FIT_GARMIN_PRODUCT)2547) +#define FIT_GARMIN_PRODUCT_VARIA_UT800 ((FIT_GARMIN_PRODUCT)2567) // Varia UT 800 SW +#define FIT_GARMIN_PRODUCT_RUNNING_DYNAMICS_POD ((FIT_GARMIN_PRODUCT)2593) +#define FIT_GARMIN_PRODUCT_EDGE_820_CHINA ((FIT_GARMIN_PRODUCT)2599) +#define FIT_GARMIN_PRODUCT_EDGE_820_JAPAN ((FIT_GARMIN_PRODUCT)2600) +#define FIT_GARMIN_PRODUCT_FENIX5X ((FIT_GARMIN_PRODUCT)2604) +#define FIT_GARMIN_PRODUCT_VIVO_FIT_JR ((FIT_GARMIN_PRODUCT)2606) +#define FIT_GARMIN_PRODUCT_VIVO_SMART3 ((FIT_GARMIN_PRODUCT)2622) +#define FIT_GARMIN_PRODUCT_VIVO_SPORT ((FIT_GARMIN_PRODUCT)2623) +#define FIT_GARMIN_PRODUCT_EDGE_820_TAIWAN ((FIT_GARMIN_PRODUCT)2628) +#define FIT_GARMIN_PRODUCT_EDGE_820_KOREA ((FIT_GARMIN_PRODUCT)2629) +#define FIT_GARMIN_PRODUCT_EDGE_820_SEA ((FIT_GARMIN_PRODUCT)2630) +#define FIT_GARMIN_PRODUCT_FR35_HEBREW ((FIT_GARMIN_PRODUCT)2650) +#define FIT_GARMIN_PRODUCT_APPROACH_S60 ((FIT_GARMIN_PRODUCT)2656) +#define FIT_GARMIN_PRODUCT_FR35_APAC ((FIT_GARMIN_PRODUCT)2667) +#define FIT_GARMIN_PRODUCT_FR35_JAPAN ((FIT_GARMIN_PRODUCT)2668) +#define FIT_GARMIN_PRODUCT_FENIX3_CHRONOS_ASIA ((FIT_GARMIN_PRODUCT)2675) +#define FIT_GARMIN_PRODUCT_VIRB_360 ((FIT_GARMIN_PRODUCT)2687) +#define FIT_GARMIN_PRODUCT_FR935 ((FIT_GARMIN_PRODUCT)2691) +#define FIT_GARMIN_PRODUCT_FENIX5 ((FIT_GARMIN_PRODUCT)2697) +#define FIT_GARMIN_PRODUCT_VIVOACTIVE3 ((FIT_GARMIN_PRODUCT)2700) +#define FIT_GARMIN_PRODUCT_FR235_CHINA_NFC ((FIT_GARMIN_PRODUCT)2733) +#define FIT_GARMIN_PRODUCT_FORETREX_601_701 ((FIT_GARMIN_PRODUCT)2769) +#define FIT_GARMIN_PRODUCT_VIVO_MOVE_HR ((FIT_GARMIN_PRODUCT)2772) +#define FIT_GARMIN_PRODUCT_EDGE_1030 ((FIT_GARMIN_PRODUCT)2713) +#define FIT_GARMIN_PRODUCT_FR35_SEA ((FIT_GARMIN_PRODUCT)2727) +#define FIT_GARMIN_PRODUCT_VECTOR_3 ((FIT_GARMIN_PRODUCT)2787) +#define FIT_GARMIN_PRODUCT_FENIX5_ASIA ((FIT_GARMIN_PRODUCT)2796) +#define FIT_GARMIN_PRODUCT_FENIX5S_ASIA ((FIT_GARMIN_PRODUCT)2797) +#define FIT_GARMIN_PRODUCT_FENIX5X_ASIA ((FIT_GARMIN_PRODUCT)2798) +#define FIT_GARMIN_PRODUCT_APPROACH_Z80 ((FIT_GARMIN_PRODUCT)2806) +#define FIT_GARMIN_PRODUCT_FR35_KOREA ((FIT_GARMIN_PRODUCT)2814) +#define FIT_GARMIN_PRODUCT_D2CHARLIE ((FIT_GARMIN_PRODUCT)2819) +#define FIT_GARMIN_PRODUCT_VIVO_SMART3_APAC ((FIT_GARMIN_PRODUCT)2831) +#define FIT_GARMIN_PRODUCT_VIVO_SPORT_APAC ((FIT_GARMIN_PRODUCT)2832) +#define FIT_GARMIN_PRODUCT_FR935_ASIA ((FIT_GARMIN_PRODUCT)2833) +#define FIT_GARMIN_PRODUCT_DESCENT ((FIT_GARMIN_PRODUCT)2859) +#define FIT_GARMIN_PRODUCT_VIVO_FIT4 ((FIT_GARMIN_PRODUCT)2878) +#define FIT_GARMIN_PRODUCT_FR645 ((FIT_GARMIN_PRODUCT)2886) +#define FIT_GARMIN_PRODUCT_FR645M ((FIT_GARMIN_PRODUCT)2888) +#define FIT_GARMIN_PRODUCT_FR30 ((FIT_GARMIN_PRODUCT)2891) +#define FIT_GARMIN_PRODUCT_FENIX5S_PLUS ((FIT_GARMIN_PRODUCT)2900) +#define FIT_GARMIN_PRODUCT_EDGE_130 ((FIT_GARMIN_PRODUCT)2909) +#define FIT_GARMIN_PRODUCT_EDGE_1030_ASIA ((FIT_GARMIN_PRODUCT)2924) +#define FIT_GARMIN_PRODUCT_VIVOSMART_4 ((FIT_GARMIN_PRODUCT)2927) +#define FIT_GARMIN_PRODUCT_VIVO_MOVE_HR_ASIA ((FIT_GARMIN_PRODUCT)2945) +#define FIT_GARMIN_PRODUCT_APPROACH_X10 ((FIT_GARMIN_PRODUCT)2962) +#define FIT_GARMIN_PRODUCT_FR30_ASIA ((FIT_GARMIN_PRODUCT)2977) +#define FIT_GARMIN_PRODUCT_VIVOACTIVE3M_W ((FIT_GARMIN_PRODUCT)2988) +#define FIT_GARMIN_PRODUCT_FR645_ASIA ((FIT_GARMIN_PRODUCT)3003) +#define FIT_GARMIN_PRODUCT_FR645M_ASIA ((FIT_GARMIN_PRODUCT)3004) +#define FIT_GARMIN_PRODUCT_EDGE_EXPLORE ((FIT_GARMIN_PRODUCT)3011) +#define FIT_GARMIN_PRODUCT_GPSMAP66 ((FIT_GARMIN_PRODUCT)3028) +#define FIT_GARMIN_PRODUCT_APPROACH_S10 ((FIT_GARMIN_PRODUCT)3049) +#define FIT_GARMIN_PRODUCT_VIVOACTIVE3M_L ((FIT_GARMIN_PRODUCT)3066) +#define FIT_GARMIN_PRODUCT_APPROACH_G80 ((FIT_GARMIN_PRODUCT)3085) +#define FIT_GARMIN_PRODUCT_EDGE_130_ASIA ((FIT_GARMIN_PRODUCT)3092) +#define FIT_GARMIN_PRODUCT_EDGE_1030_BONTRAGER ((FIT_GARMIN_PRODUCT)3095) +#define FIT_GARMIN_PRODUCT_FENIX5_PLUS ((FIT_GARMIN_PRODUCT)3110) +#define FIT_GARMIN_PRODUCT_FENIX5X_PLUS ((FIT_GARMIN_PRODUCT)3111) +#define FIT_GARMIN_PRODUCT_EDGE_520_PLUS ((FIT_GARMIN_PRODUCT)3112) +#define FIT_GARMIN_PRODUCT_FR945 ((FIT_GARMIN_PRODUCT)3113) +#define FIT_GARMIN_PRODUCT_EDGE_530 ((FIT_GARMIN_PRODUCT)3121) +#define FIT_GARMIN_PRODUCT_EDGE_830 ((FIT_GARMIN_PRODUCT)3122) +#define FIT_GARMIN_PRODUCT_INSTINCT_ESPORTS ((FIT_GARMIN_PRODUCT)3126) +#define FIT_GARMIN_PRODUCT_FENIX5S_PLUS_APAC ((FIT_GARMIN_PRODUCT)3134) +#define FIT_GARMIN_PRODUCT_FENIX5X_PLUS_APAC ((FIT_GARMIN_PRODUCT)3135) +#define FIT_GARMIN_PRODUCT_EDGE_520_PLUS_APAC ((FIT_GARMIN_PRODUCT)3142) +#define FIT_GARMIN_PRODUCT_DESCENT_T1 ((FIT_GARMIN_PRODUCT)3143) +#define FIT_GARMIN_PRODUCT_FR235L_ASIA ((FIT_GARMIN_PRODUCT)3144) +#define FIT_GARMIN_PRODUCT_FR245_ASIA ((FIT_GARMIN_PRODUCT)3145) +#define FIT_GARMIN_PRODUCT_VIVO_ACTIVE3M_APAC ((FIT_GARMIN_PRODUCT)3163) +#define FIT_GARMIN_PRODUCT_GEN3_BSM ((FIT_GARMIN_PRODUCT)3192) // gen3 bike speed sensor +#define FIT_GARMIN_PRODUCT_GEN3_BCM ((FIT_GARMIN_PRODUCT)3193) // gen3 bike cadence sensor +#define FIT_GARMIN_PRODUCT_VIVO_SMART4_ASIA ((FIT_GARMIN_PRODUCT)3218) +#define FIT_GARMIN_PRODUCT_VIVOACTIVE4_SMALL ((FIT_GARMIN_PRODUCT)3224) +#define FIT_GARMIN_PRODUCT_VIVOACTIVE4_LARGE ((FIT_GARMIN_PRODUCT)3225) +#define FIT_GARMIN_PRODUCT_VENU ((FIT_GARMIN_PRODUCT)3226) +#define FIT_GARMIN_PRODUCT_MARQ_DRIVER ((FIT_GARMIN_PRODUCT)3246) +#define FIT_GARMIN_PRODUCT_MARQ_AVIATOR ((FIT_GARMIN_PRODUCT)3247) +#define FIT_GARMIN_PRODUCT_MARQ_CAPTAIN ((FIT_GARMIN_PRODUCT)3248) +#define FIT_GARMIN_PRODUCT_MARQ_COMMANDER ((FIT_GARMIN_PRODUCT)3249) +#define FIT_GARMIN_PRODUCT_MARQ_EXPEDITION ((FIT_GARMIN_PRODUCT)3250) +#define FIT_GARMIN_PRODUCT_MARQ_ATHLETE ((FIT_GARMIN_PRODUCT)3251) +#define FIT_GARMIN_PRODUCT_DESCENT_MK2 ((FIT_GARMIN_PRODUCT)3258) +#define FIT_GARMIN_PRODUCT_GPSMAP66I ((FIT_GARMIN_PRODUCT)3284) +#define FIT_GARMIN_PRODUCT_FENIX6S_SPORT ((FIT_GARMIN_PRODUCT)3287) +#define FIT_GARMIN_PRODUCT_FENIX6S ((FIT_GARMIN_PRODUCT)3288) +#define FIT_GARMIN_PRODUCT_FENIX6_SPORT ((FIT_GARMIN_PRODUCT)3289) +#define FIT_GARMIN_PRODUCT_FENIX6 ((FIT_GARMIN_PRODUCT)3290) +#define FIT_GARMIN_PRODUCT_FENIX6X ((FIT_GARMIN_PRODUCT)3291) +#define FIT_GARMIN_PRODUCT_HRM_DUAL ((FIT_GARMIN_PRODUCT)3299) // HRM-Dual +#define FIT_GARMIN_PRODUCT_HRM_PRO ((FIT_GARMIN_PRODUCT)3300) // HRM-Pro +#define FIT_GARMIN_PRODUCT_VIVO_MOVE3_PREMIUM ((FIT_GARMIN_PRODUCT)3308) +#define FIT_GARMIN_PRODUCT_APPROACH_S40 ((FIT_GARMIN_PRODUCT)3314) +#define FIT_GARMIN_PRODUCT_FR245M_ASIA ((FIT_GARMIN_PRODUCT)3321) +#define FIT_GARMIN_PRODUCT_EDGE_530_APAC ((FIT_GARMIN_PRODUCT)3349) +#define FIT_GARMIN_PRODUCT_EDGE_830_APAC ((FIT_GARMIN_PRODUCT)3350) +#define FIT_GARMIN_PRODUCT_VIVO_MOVE3 ((FIT_GARMIN_PRODUCT)3378) +#define FIT_GARMIN_PRODUCT_VIVO_ACTIVE4_SMALL_ASIA ((FIT_GARMIN_PRODUCT)3387) +#define FIT_GARMIN_PRODUCT_VIVO_ACTIVE4_LARGE_ASIA ((FIT_GARMIN_PRODUCT)3388) +#define FIT_GARMIN_PRODUCT_VIVO_ACTIVE4_OLED_ASIA ((FIT_GARMIN_PRODUCT)3389) +#define FIT_GARMIN_PRODUCT_SWIM2 ((FIT_GARMIN_PRODUCT)3405) +#define FIT_GARMIN_PRODUCT_MARQ_DRIVER_ASIA ((FIT_GARMIN_PRODUCT)3420) +#define FIT_GARMIN_PRODUCT_MARQ_AVIATOR_ASIA ((FIT_GARMIN_PRODUCT)3421) +#define FIT_GARMIN_PRODUCT_VIVO_MOVE3_ASIA ((FIT_GARMIN_PRODUCT)3422) +#define FIT_GARMIN_PRODUCT_FR945_ASIA ((FIT_GARMIN_PRODUCT)3441) +#define FIT_GARMIN_PRODUCT_VIVO_ACTIVE3T_CHN ((FIT_GARMIN_PRODUCT)3446) +#define FIT_GARMIN_PRODUCT_MARQ_CAPTAIN_ASIA ((FIT_GARMIN_PRODUCT)3448) +#define FIT_GARMIN_PRODUCT_MARQ_COMMANDER_ASIA ((FIT_GARMIN_PRODUCT)3449) +#define FIT_GARMIN_PRODUCT_MARQ_EXPEDITION_ASIA ((FIT_GARMIN_PRODUCT)3450) +#define FIT_GARMIN_PRODUCT_MARQ_ATHLETE_ASIA ((FIT_GARMIN_PRODUCT)3451) +#define FIT_GARMIN_PRODUCT_INSTINCT_SOLAR ((FIT_GARMIN_PRODUCT)3466) +#define FIT_GARMIN_PRODUCT_FR45_ASIA ((FIT_GARMIN_PRODUCT)3469) +#define FIT_GARMIN_PRODUCT_VIVOACTIVE3_DAIMLER ((FIT_GARMIN_PRODUCT)3473) +#define FIT_GARMIN_PRODUCT_LEGACY_REY ((FIT_GARMIN_PRODUCT)3498) +#define FIT_GARMIN_PRODUCT_LEGACY_DARTH_VADER ((FIT_GARMIN_PRODUCT)3499) +#define FIT_GARMIN_PRODUCT_LEGACY_CAPTAIN_MARVEL ((FIT_GARMIN_PRODUCT)3500) +#define FIT_GARMIN_PRODUCT_LEGACY_FIRST_AVENGER ((FIT_GARMIN_PRODUCT)3501) +#define FIT_GARMIN_PRODUCT_FENIX6S_SPORT_ASIA ((FIT_GARMIN_PRODUCT)3512) +#define FIT_GARMIN_PRODUCT_FENIX6S_ASIA ((FIT_GARMIN_PRODUCT)3513) +#define FIT_GARMIN_PRODUCT_FENIX6_SPORT_ASIA ((FIT_GARMIN_PRODUCT)3514) +#define FIT_GARMIN_PRODUCT_FENIX6_ASIA ((FIT_GARMIN_PRODUCT)3515) +#define FIT_GARMIN_PRODUCT_FENIX6X_ASIA ((FIT_GARMIN_PRODUCT)3516) +#define FIT_GARMIN_PRODUCT_LEGACY_CAPTAIN_MARVEL_ASIA ((FIT_GARMIN_PRODUCT)3535) +#define FIT_GARMIN_PRODUCT_LEGACY_FIRST_AVENGER_ASIA ((FIT_GARMIN_PRODUCT)3536) +#define FIT_GARMIN_PRODUCT_LEGACY_REY_ASIA ((FIT_GARMIN_PRODUCT)3537) +#define FIT_GARMIN_PRODUCT_LEGACY_DARTH_VADER_ASIA ((FIT_GARMIN_PRODUCT)3538) +#define FIT_GARMIN_PRODUCT_DESCENT_MK2S ((FIT_GARMIN_PRODUCT)3542) +#define FIT_GARMIN_PRODUCT_EDGE_130_PLUS ((FIT_GARMIN_PRODUCT)3558) +#define FIT_GARMIN_PRODUCT_EDGE_1030_PLUS ((FIT_GARMIN_PRODUCT)3570) +#define FIT_GARMIN_PRODUCT_RALLY_200 ((FIT_GARMIN_PRODUCT)3578) // Rally 100/200 Power Meter Series +#define FIT_GARMIN_PRODUCT_FR745 ((FIT_GARMIN_PRODUCT)3589) +#define FIT_GARMIN_PRODUCT_VENUSQ ((FIT_GARMIN_PRODUCT)3600) +#define FIT_GARMIN_PRODUCT_LILY ((FIT_GARMIN_PRODUCT)3615) +#define FIT_GARMIN_PRODUCT_MARQ_ADVENTURER ((FIT_GARMIN_PRODUCT)3624) +#define FIT_GARMIN_PRODUCT_ENDURO ((FIT_GARMIN_PRODUCT)3638) +#define FIT_GARMIN_PRODUCT_SWIM2_APAC ((FIT_GARMIN_PRODUCT)3639) +#define FIT_GARMIN_PRODUCT_MARQ_ADVENTURER_ASIA ((FIT_GARMIN_PRODUCT)3648) +#define FIT_GARMIN_PRODUCT_FR945_LTE ((FIT_GARMIN_PRODUCT)3652) +#define FIT_GARMIN_PRODUCT_DESCENT_MK2_ASIA ((FIT_GARMIN_PRODUCT)3702) // Mk2 and Mk2i +#define FIT_GARMIN_PRODUCT_VENU2 ((FIT_GARMIN_PRODUCT)3703) +#define FIT_GARMIN_PRODUCT_VENU2S ((FIT_GARMIN_PRODUCT)3704) +#define FIT_GARMIN_PRODUCT_VENU_DAIMLER_ASIA ((FIT_GARMIN_PRODUCT)3737) +#define FIT_GARMIN_PRODUCT_MARQ_GOLFER ((FIT_GARMIN_PRODUCT)3739) +#define FIT_GARMIN_PRODUCT_VENU_DAIMLER ((FIT_GARMIN_PRODUCT)3740) +#define FIT_GARMIN_PRODUCT_FR745_ASIA ((FIT_GARMIN_PRODUCT)3794) +#define FIT_GARMIN_PRODUCT_LILY_ASIA ((FIT_GARMIN_PRODUCT)3809) +#define FIT_GARMIN_PRODUCT_EDGE_1030_PLUS_ASIA ((FIT_GARMIN_PRODUCT)3812) +#define FIT_GARMIN_PRODUCT_EDGE_130_PLUS_ASIA ((FIT_GARMIN_PRODUCT)3813) +#define FIT_GARMIN_PRODUCT_APPROACH_S12 ((FIT_GARMIN_PRODUCT)3823) +#define FIT_GARMIN_PRODUCT_ENDURO_ASIA ((FIT_GARMIN_PRODUCT)3872) +#define FIT_GARMIN_PRODUCT_VENUSQ_ASIA ((FIT_GARMIN_PRODUCT)3837) +#define FIT_GARMIN_PRODUCT_EDGE_1040 ((FIT_GARMIN_PRODUCT)3843) +#define FIT_GARMIN_PRODUCT_MARQ_GOLFER_ASIA ((FIT_GARMIN_PRODUCT)3850) +#define FIT_GARMIN_PRODUCT_VENU2_PLUS ((FIT_GARMIN_PRODUCT)3851) +#define FIT_GARMIN_PRODUCT_GNSS ((FIT_GARMIN_PRODUCT)3865) +#define FIT_GARMIN_PRODUCT_FR55 ((FIT_GARMIN_PRODUCT)3869) +#define FIT_GARMIN_PRODUCT_INSTINCT_2 ((FIT_GARMIN_PRODUCT)3888) +#define FIT_GARMIN_PRODUCT_FENIX7S ((FIT_GARMIN_PRODUCT)3905) +#define FIT_GARMIN_PRODUCT_FENIX7 ((FIT_GARMIN_PRODUCT)3906) +#define FIT_GARMIN_PRODUCT_FENIX7X ((FIT_GARMIN_PRODUCT)3907) +#define FIT_GARMIN_PRODUCT_FENIX7S_APAC ((FIT_GARMIN_PRODUCT)3908) +#define FIT_GARMIN_PRODUCT_FENIX7_APAC ((FIT_GARMIN_PRODUCT)3909) +#define FIT_GARMIN_PRODUCT_FENIX7X_APAC ((FIT_GARMIN_PRODUCT)3910) +#define FIT_GARMIN_PRODUCT_APPROACH_G12 ((FIT_GARMIN_PRODUCT) 3927) +#define FIT_GARMIN_PRODUCT_DESCENT_MK2S_ASIA ((FIT_GARMIN_PRODUCT)3930) +#define FIT_GARMIN_PRODUCT_APPROACH_S42 ((FIT_GARMIN_PRODUCT)3934) +#define FIT_GARMIN_PRODUCT_EPIX_GEN2 ((FIT_GARMIN_PRODUCT)3943) +#define FIT_GARMIN_PRODUCT_EPIX_GEN2_APAC ((FIT_GARMIN_PRODUCT)3944) +#define FIT_GARMIN_PRODUCT_VENU2S_ASIA ((FIT_GARMIN_PRODUCT)3949) +#define FIT_GARMIN_PRODUCT_VENU2_ASIA ((FIT_GARMIN_PRODUCT)3950) +#define FIT_GARMIN_PRODUCT_FR945_LTE_ASIA ((FIT_GARMIN_PRODUCT)3978) +#define FIT_GARMIN_PRODUCT_VIVO_MOVE_SPORT ((FIT_GARMIN_PRODUCT)3982) +#define FIT_GARMIN_PRODUCT_VIVOMOVE_TREND ((FIT_GARMIN_PRODUCT)3983) +#define FIT_GARMIN_PRODUCT_APPROACH_S12_ASIA ((FIT_GARMIN_PRODUCT)3986) +#define FIT_GARMIN_PRODUCT_FR255_MUSIC ((FIT_GARMIN_PRODUCT)3990) +#define FIT_GARMIN_PRODUCT_FR255_SMALL_MUSIC ((FIT_GARMIN_PRODUCT)3991) +#define FIT_GARMIN_PRODUCT_FR255 ((FIT_GARMIN_PRODUCT)3992) +#define FIT_GARMIN_PRODUCT_FR255_SMALL ((FIT_GARMIN_PRODUCT)3993) +#define FIT_GARMIN_PRODUCT_APPROACH_G12_ASIA ((FIT_GARMIN_PRODUCT) 4001) +#define FIT_GARMIN_PRODUCT_APPROACH_S42_ASIA ((FIT_GARMIN_PRODUCT)4002) +#define FIT_GARMIN_PRODUCT_DESCENT_G1 ((FIT_GARMIN_PRODUCT)4005) +#define FIT_GARMIN_PRODUCT_VENU2_PLUS_ASIA ((FIT_GARMIN_PRODUCT)4017) +#define FIT_GARMIN_PRODUCT_FR955 ((FIT_GARMIN_PRODUCT)4024) +#define FIT_GARMIN_PRODUCT_FR55_ASIA ((FIT_GARMIN_PRODUCT)4033) +#define FIT_GARMIN_PRODUCT_EDGE_540 ((FIT_GARMIN_PRODUCT)4061) +#define FIT_GARMIN_PRODUCT_EDGE_840 ((FIT_GARMIN_PRODUCT)4062) +#define FIT_GARMIN_PRODUCT_VIVOSMART_5 ((FIT_GARMIN_PRODUCT)4063) +#define FIT_GARMIN_PRODUCT_INSTINCT_2_ASIA ((FIT_GARMIN_PRODUCT)4071) +#define FIT_GARMIN_PRODUCT_MARQ_GEN2 ((FIT_GARMIN_PRODUCT)4105) // Adventurer, Athlete, Captain, Golfer +#define FIT_GARMIN_PRODUCT_VENUSQ2 ((FIT_GARMIN_PRODUCT)4115) +#define FIT_GARMIN_PRODUCT_VENUSQ2MUSIC ((FIT_GARMIN_PRODUCT)4116) +#define FIT_GARMIN_PRODUCT_MARQ_GEN2_AVIATOR ((FIT_GARMIN_PRODUCT)4124) +#define FIT_GARMIN_PRODUCT_D2_AIR_X10 ((FIT_GARMIN_PRODUCT)4125) +#define FIT_GARMIN_PRODUCT_HRM_PRO_PLUS ((FIT_GARMIN_PRODUCT)4130) +#define FIT_GARMIN_PRODUCT_DESCENT_G1_ASIA ((FIT_GARMIN_PRODUCT)4132) +#define FIT_GARMIN_PRODUCT_TACTIX7 ((FIT_GARMIN_PRODUCT)4135) +#define FIT_GARMIN_PRODUCT_INSTINCT_CROSSOVER ((FIT_GARMIN_PRODUCT)4155) +#define FIT_GARMIN_PRODUCT_EDGE_EXPLORE2 ((FIT_GARMIN_PRODUCT)4169) +#define FIT_GARMIN_PRODUCT_APPROACH_S70 ((FIT_GARMIN_PRODUCT)4233) +#define FIT_GARMIN_PRODUCT_FR265_LARGE ((FIT_GARMIN_PRODUCT)4257) +#define FIT_GARMIN_PRODUCT_FR265_SMALL ((FIT_GARMIN_PRODUCT)4258) +#define FIT_GARMIN_PRODUCT_TACX_NEO_SMART ((FIT_GARMIN_PRODUCT)4265) // Neo Smart, Tacx +#define FIT_GARMIN_PRODUCT_TACX_NEO2_SMART ((FIT_GARMIN_PRODUCT)4266) // Neo 2 Smart, Tacx +#define FIT_GARMIN_PRODUCT_TACX_NEO2_T_SMART ((FIT_GARMIN_PRODUCT)4267) // Neo 2T Smart, Tacx +#define FIT_GARMIN_PRODUCT_TACX_NEO_SMART_BIKE ((FIT_GARMIN_PRODUCT)4268) // Neo Smart Bike, Tacx +#define FIT_GARMIN_PRODUCT_TACX_SATORI_SMART ((FIT_GARMIN_PRODUCT)4269) // Satori Smart, Tacx +#define FIT_GARMIN_PRODUCT_TACX_FLOW_SMART ((FIT_GARMIN_PRODUCT)4270) // Flow Smart, Tacx +#define FIT_GARMIN_PRODUCT_TACX_VORTEX_SMART ((FIT_GARMIN_PRODUCT)4271) // Vortex Smart, Tacx +#define FIT_GARMIN_PRODUCT_TACX_BUSHIDO_SMART ((FIT_GARMIN_PRODUCT)4272) // Bushido Smart, Tacx +#define FIT_GARMIN_PRODUCT_TACX_GENIUS_SMART ((FIT_GARMIN_PRODUCT)4273) // Genius Smart, Tacx +#define FIT_GARMIN_PRODUCT_TACX_FLUX_FLUX_S_SMART ((FIT_GARMIN_PRODUCT)4274) // Flux/Flux S Smart, Tacx +#define FIT_GARMIN_PRODUCT_TACX_FLUX2_SMART ((FIT_GARMIN_PRODUCT)4275) // Flux 2 Smart, Tacx +#define FIT_GARMIN_PRODUCT_TACX_MAGNUM ((FIT_GARMIN_PRODUCT)4276) // Magnum, Tacx +#define FIT_GARMIN_PRODUCT_EDGE_1040_ASIA ((FIT_GARMIN_PRODUCT)4305) +#define FIT_GARMIN_PRODUCT_EPIX_GEN2_PRO_42 ((FIT_GARMIN_PRODUCT)4312) +#define FIT_GARMIN_PRODUCT_EPIX_GEN2_PRO_47 ((FIT_GARMIN_PRODUCT)4313) +#define FIT_GARMIN_PRODUCT_EPIX_GEN2_PRO_51 ((FIT_GARMIN_PRODUCT)4314) +#define FIT_GARMIN_PRODUCT_FR965 ((FIT_GARMIN_PRODUCT)4315) +#define FIT_GARMIN_PRODUCT_ENDURO2 ((FIT_GARMIN_PRODUCT)4341) +#define FIT_GARMIN_PRODUCT_FENIX7_PRO_SOLAR ((FIT_GARMIN_PRODUCT)4375) +#define FIT_GARMIN_PRODUCT_INSTINCT_2X ((FIT_GARMIN_PRODUCT)4394) +#define FIT_GARMIN_PRODUCT_DESCENT_T2 ((FIT_GARMIN_PRODUCT)4442) +#define FIT_GARMIN_PRODUCT_SDM4 ((FIT_GARMIN_PRODUCT)10007) // SDM4 footpod +#define FIT_GARMIN_PRODUCT_EDGE_REMOTE ((FIT_GARMIN_PRODUCT)10014) +#define FIT_GARMIN_PRODUCT_TACX_TRAINING_APP_WIN ((FIT_GARMIN_PRODUCT)20533) +#define FIT_GARMIN_PRODUCT_TACX_TRAINING_APP_MAC ((FIT_GARMIN_PRODUCT)20534) +#define FIT_GARMIN_PRODUCT_TACX_TRAINING_APP_MAC_CATALYST ((FIT_GARMIN_PRODUCT)20565) +#define FIT_GARMIN_PRODUCT_TRAINING_CENTER ((FIT_GARMIN_PRODUCT)20119) +#define FIT_GARMIN_PRODUCT_TACX_TRAINING_APP_ANDROID ((FIT_GARMIN_PRODUCT)30045) +#define FIT_GARMIN_PRODUCT_TACX_TRAINING_APP_IOS ((FIT_GARMIN_PRODUCT)30046) +#define FIT_GARMIN_PRODUCT_TACX_TRAINING_APP_LEGACY ((FIT_GARMIN_PRODUCT)30047) +#define FIT_GARMIN_PRODUCT_CONNECTIQ_SIMULATOR ((FIT_GARMIN_PRODUCT)65531) +#define FIT_GARMIN_PRODUCT_ANDROID_ANTPLUS_PLUGIN ((FIT_GARMIN_PRODUCT)65532) +#define FIT_GARMIN_PRODUCT_CONNECT ((FIT_GARMIN_PRODUCT)65534) // Garmin Connect website +#define FIT_GARMIN_PRODUCT_COUNT 419 + +typedef FIT_UINT8 FIT_ANTPLUS_DEVICE_TYPE; +#define FIT_ANTPLUS_DEVICE_TYPE_INVALID FIT_UINT8_INVALID +#define FIT_ANTPLUS_DEVICE_TYPE_ANTFS ((FIT_ANTPLUS_DEVICE_TYPE)1) +#define FIT_ANTPLUS_DEVICE_TYPE_BIKE_POWER ((FIT_ANTPLUS_DEVICE_TYPE)11) +#define FIT_ANTPLUS_DEVICE_TYPE_ENVIRONMENT_SENSOR_LEGACY ((FIT_ANTPLUS_DEVICE_TYPE)12) +#define FIT_ANTPLUS_DEVICE_TYPE_MULTI_SPORT_SPEED_DISTANCE ((FIT_ANTPLUS_DEVICE_TYPE)15) +#define FIT_ANTPLUS_DEVICE_TYPE_CONTROL ((FIT_ANTPLUS_DEVICE_TYPE)16) +#define FIT_ANTPLUS_DEVICE_TYPE_FITNESS_EQUIPMENT ((FIT_ANTPLUS_DEVICE_TYPE)17) +#define FIT_ANTPLUS_DEVICE_TYPE_BLOOD_PRESSURE ((FIT_ANTPLUS_DEVICE_TYPE)18) +#define FIT_ANTPLUS_DEVICE_TYPE_GEOCACHE_NODE ((FIT_ANTPLUS_DEVICE_TYPE)19) +#define FIT_ANTPLUS_DEVICE_TYPE_LIGHT_ELECTRIC_VEHICLE ((FIT_ANTPLUS_DEVICE_TYPE)20) +#define FIT_ANTPLUS_DEVICE_TYPE_ENV_SENSOR ((FIT_ANTPLUS_DEVICE_TYPE)25) +#define FIT_ANTPLUS_DEVICE_TYPE_RACQUET ((FIT_ANTPLUS_DEVICE_TYPE)26) +#define FIT_ANTPLUS_DEVICE_TYPE_CONTROL_HUB ((FIT_ANTPLUS_DEVICE_TYPE)27) +#define FIT_ANTPLUS_DEVICE_TYPE_MUSCLE_OXYGEN ((FIT_ANTPLUS_DEVICE_TYPE)31) +#define FIT_ANTPLUS_DEVICE_TYPE_SHIFTING ((FIT_ANTPLUS_DEVICE_TYPE)34) +#define FIT_ANTPLUS_DEVICE_TYPE_BIKE_LIGHT_MAIN ((FIT_ANTPLUS_DEVICE_TYPE)35) +#define FIT_ANTPLUS_DEVICE_TYPE_BIKE_LIGHT_SHARED ((FIT_ANTPLUS_DEVICE_TYPE)36) +#define FIT_ANTPLUS_DEVICE_TYPE_EXD ((FIT_ANTPLUS_DEVICE_TYPE)38) +#define FIT_ANTPLUS_DEVICE_TYPE_BIKE_RADAR ((FIT_ANTPLUS_DEVICE_TYPE)40) +#define FIT_ANTPLUS_DEVICE_TYPE_BIKE_AERO ((FIT_ANTPLUS_DEVICE_TYPE)46) +#define FIT_ANTPLUS_DEVICE_TYPE_WEIGHT_SCALE ((FIT_ANTPLUS_DEVICE_TYPE)119) +#define FIT_ANTPLUS_DEVICE_TYPE_HEART_RATE ((FIT_ANTPLUS_DEVICE_TYPE)120) +#define FIT_ANTPLUS_DEVICE_TYPE_BIKE_SPEED_CADENCE ((FIT_ANTPLUS_DEVICE_TYPE)121) +#define FIT_ANTPLUS_DEVICE_TYPE_BIKE_CADENCE ((FIT_ANTPLUS_DEVICE_TYPE)122) +#define FIT_ANTPLUS_DEVICE_TYPE_BIKE_SPEED ((FIT_ANTPLUS_DEVICE_TYPE)123) +#define FIT_ANTPLUS_DEVICE_TYPE_STRIDE_SPEED_DISTANCE ((FIT_ANTPLUS_DEVICE_TYPE)124) +#define FIT_ANTPLUS_DEVICE_TYPE_COUNT 25 + +typedef FIT_ENUM FIT_ANT_NETWORK; +#define FIT_ANT_NETWORK_INVALID FIT_ENUM_INVALID +#define FIT_ANT_NETWORK_PUBLIC ((FIT_ANT_NETWORK)0) +#define FIT_ANT_NETWORK_ANTPLUS ((FIT_ANT_NETWORK)1) +#define FIT_ANT_NETWORK_ANTFS ((FIT_ANT_NETWORK)2) +#define FIT_ANT_NETWORK_PRIVATE ((FIT_ANT_NETWORK)3) +#define FIT_ANT_NETWORK_COUNT 4 + +typedef FIT_UINT32Z FIT_WORKOUT_CAPABILITIES; +#define FIT_WORKOUT_CAPABILITIES_INVALID FIT_UINT32Z_INVALID +#define FIT_WORKOUT_CAPABILITIES_INTERVAL ((FIT_WORKOUT_CAPABILITIES)0x00000001) +#define FIT_WORKOUT_CAPABILITIES_CUSTOM ((FIT_WORKOUT_CAPABILITIES)0x00000002) +#define FIT_WORKOUT_CAPABILITIES_FITNESS_EQUIPMENT ((FIT_WORKOUT_CAPABILITIES)0x00000004) +#define FIT_WORKOUT_CAPABILITIES_FIRSTBEAT ((FIT_WORKOUT_CAPABILITIES)0x00000008) +#define FIT_WORKOUT_CAPABILITIES_NEW_LEAF ((FIT_WORKOUT_CAPABILITIES)0x00000010) +#define FIT_WORKOUT_CAPABILITIES_TCX ((FIT_WORKOUT_CAPABILITIES)0x00000020) // For backwards compatibility. Watch should add missing id fields then clear flag. +#define FIT_WORKOUT_CAPABILITIES_SPEED ((FIT_WORKOUT_CAPABILITIES)0x00000080) // Speed source required for workout step. +#define FIT_WORKOUT_CAPABILITIES_HEART_RATE ((FIT_WORKOUT_CAPABILITIES)0x00000100) // Heart rate source required for workout step. +#define FIT_WORKOUT_CAPABILITIES_DISTANCE ((FIT_WORKOUT_CAPABILITIES)0x00000200) // Distance source required for workout step. +#define FIT_WORKOUT_CAPABILITIES_CADENCE ((FIT_WORKOUT_CAPABILITIES)0x00000400) // Cadence source required for workout step. +#define FIT_WORKOUT_CAPABILITIES_POWER ((FIT_WORKOUT_CAPABILITIES)0x00000800) // Power source required for workout step. +#define FIT_WORKOUT_CAPABILITIES_GRADE ((FIT_WORKOUT_CAPABILITIES)0x00001000) // Grade source required for workout step. +#define FIT_WORKOUT_CAPABILITIES_RESISTANCE ((FIT_WORKOUT_CAPABILITIES)0x00002000) // Resistance source required for workout step. +#define FIT_WORKOUT_CAPABILITIES_PROTECTED ((FIT_WORKOUT_CAPABILITIES)0x00004000) +#define FIT_WORKOUT_CAPABILITIES_COUNT 14 + +typedef FIT_UINT8 FIT_BATTERY_STATUS; +#define FIT_BATTERY_STATUS_INVALID FIT_UINT8_INVALID +#define FIT_BATTERY_STATUS_NEW ((FIT_BATTERY_STATUS)1) +#define FIT_BATTERY_STATUS_GOOD ((FIT_BATTERY_STATUS)2) +#define FIT_BATTERY_STATUS_OK ((FIT_BATTERY_STATUS)3) +#define FIT_BATTERY_STATUS_LOW ((FIT_BATTERY_STATUS)4) +#define FIT_BATTERY_STATUS_CRITICAL ((FIT_BATTERY_STATUS)5) +#define FIT_BATTERY_STATUS_CHARGING ((FIT_BATTERY_STATUS)6) +#define FIT_BATTERY_STATUS_UNKNOWN ((FIT_BATTERY_STATUS)7) +#define FIT_BATTERY_STATUS_COUNT 7 + +typedef FIT_ENUM FIT_HR_TYPE; +#define FIT_HR_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_HR_TYPE_NORMAL ((FIT_HR_TYPE)0) +#define FIT_HR_TYPE_IRREGULAR ((FIT_HR_TYPE)1) +#define FIT_HR_TYPE_COUNT 2 + +typedef FIT_UINT32Z FIT_COURSE_CAPABILITIES; +#define FIT_COURSE_CAPABILITIES_INVALID FIT_UINT32Z_INVALID +#define FIT_COURSE_CAPABILITIES_PROCESSED ((FIT_COURSE_CAPABILITIES)0x00000001) +#define FIT_COURSE_CAPABILITIES_VALID ((FIT_COURSE_CAPABILITIES)0x00000002) +#define FIT_COURSE_CAPABILITIES_TIME ((FIT_COURSE_CAPABILITIES)0x00000004) +#define FIT_COURSE_CAPABILITIES_DISTANCE ((FIT_COURSE_CAPABILITIES)0x00000008) +#define FIT_COURSE_CAPABILITIES_POSITION ((FIT_COURSE_CAPABILITIES)0x00000010) +#define FIT_COURSE_CAPABILITIES_HEART_RATE ((FIT_COURSE_CAPABILITIES)0x00000020) +#define FIT_COURSE_CAPABILITIES_POWER ((FIT_COURSE_CAPABILITIES)0x00000040) +#define FIT_COURSE_CAPABILITIES_CADENCE ((FIT_COURSE_CAPABILITIES)0x00000080) +#define FIT_COURSE_CAPABILITIES_TRAINING ((FIT_COURSE_CAPABILITIES)0x00000100) +#define FIT_COURSE_CAPABILITIES_NAVIGATION ((FIT_COURSE_CAPABILITIES)0x00000200) +#define FIT_COURSE_CAPABILITIES_BIKEWAY ((FIT_COURSE_CAPABILITIES)0x00000400) +#define FIT_COURSE_CAPABILITIES_AVIATION ((FIT_COURSE_CAPABILITIES)0x00001000) // Denote course files to be used as flight plans +#define FIT_COURSE_CAPABILITIES_COUNT 12 + +typedef FIT_UINT16 FIT_WEIGHT; +#define FIT_WEIGHT_INVALID FIT_UINT16_INVALID +#define FIT_WEIGHT_CALCULATING ((FIT_WEIGHT)0xFFFE) +#define FIT_WEIGHT_COUNT 1 + +typedef FIT_UINT32 FIT_WORKOUT_HR; // 0 - 100 indicates% of max hr; >100 indicates bpm (255 max) plus 100 +#define FIT_WORKOUT_HR_INVALID FIT_UINT32_INVALID +#define FIT_WORKOUT_HR_BPM_OFFSET ((FIT_WORKOUT_HR)100) +#define FIT_WORKOUT_HR_COUNT 1 + +typedef FIT_UINT32 FIT_WORKOUT_POWER; // 0 - 1000 indicates % of functional threshold power; >1000 indicates watts plus 1000. +#define FIT_WORKOUT_POWER_INVALID FIT_UINT32_INVALID +#define FIT_WORKOUT_POWER_WATTS_OFFSET ((FIT_WORKOUT_POWER)1000) +#define FIT_WORKOUT_POWER_COUNT 1 + +typedef FIT_ENUM FIT_BP_STATUS; +#define FIT_BP_STATUS_INVALID FIT_ENUM_INVALID +#define FIT_BP_STATUS_NO_ERROR ((FIT_BP_STATUS)0) +#define FIT_BP_STATUS_ERROR_INCOMPLETE_DATA ((FIT_BP_STATUS)1) +#define FIT_BP_STATUS_ERROR_NO_MEASUREMENT ((FIT_BP_STATUS)2) +#define FIT_BP_STATUS_ERROR_DATA_OUT_OF_RANGE ((FIT_BP_STATUS)3) +#define FIT_BP_STATUS_ERROR_IRREGULAR_HEART_RATE ((FIT_BP_STATUS)4) +#define FIT_BP_STATUS_COUNT 5 + +typedef FIT_UINT16 FIT_USER_LOCAL_ID; +#define FIT_USER_LOCAL_ID_INVALID FIT_UINT16_INVALID +#define FIT_USER_LOCAL_ID_LOCAL_MIN ((FIT_USER_LOCAL_ID)0x0000) +#define FIT_USER_LOCAL_ID_LOCAL_MAX ((FIT_USER_LOCAL_ID)0x000F) +#define FIT_USER_LOCAL_ID_STATIONARY_MIN ((FIT_USER_LOCAL_ID)0x0010) +#define FIT_USER_LOCAL_ID_STATIONARY_MAX ((FIT_USER_LOCAL_ID)0x00FF) +#define FIT_USER_LOCAL_ID_PORTABLE_MIN ((FIT_USER_LOCAL_ID)0x0100) +#define FIT_USER_LOCAL_ID_PORTABLE_MAX ((FIT_USER_LOCAL_ID)0xFFFE) +#define FIT_USER_LOCAL_ID_COUNT 6 + +typedef FIT_ENUM FIT_SWIM_STROKE; +#define FIT_SWIM_STROKE_INVALID FIT_ENUM_INVALID +#define FIT_SWIM_STROKE_FREESTYLE ((FIT_SWIM_STROKE)0) +#define FIT_SWIM_STROKE_BACKSTROKE ((FIT_SWIM_STROKE)1) +#define FIT_SWIM_STROKE_BREASTSTROKE ((FIT_SWIM_STROKE)2) +#define FIT_SWIM_STROKE_BUTTERFLY ((FIT_SWIM_STROKE)3) +#define FIT_SWIM_STROKE_DRILL ((FIT_SWIM_STROKE)4) +#define FIT_SWIM_STROKE_MIXED ((FIT_SWIM_STROKE)5) +#define FIT_SWIM_STROKE_IM ((FIT_SWIM_STROKE)6) // IM is a mixed interval containing the same number of lengths for each of: Butterfly, Backstroke, Breaststroke, Freestyle, swam in that order. +#define FIT_SWIM_STROKE_COUNT 7 + +typedef FIT_ENUM FIT_ACTIVITY_TYPE; +#define FIT_ACTIVITY_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_ACTIVITY_TYPE_GENERIC ((FIT_ACTIVITY_TYPE)0) +#define FIT_ACTIVITY_TYPE_RUNNING ((FIT_ACTIVITY_TYPE)1) +#define FIT_ACTIVITY_TYPE_CYCLING ((FIT_ACTIVITY_TYPE)2) +#define FIT_ACTIVITY_TYPE_TRANSITION ((FIT_ACTIVITY_TYPE)3) // Mulitsport transition +#define FIT_ACTIVITY_TYPE_FITNESS_EQUIPMENT ((FIT_ACTIVITY_TYPE)4) +#define FIT_ACTIVITY_TYPE_SWIMMING ((FIT_ACTIVITY_TYPE)5) +#define FIT_ACTIVITY_TYPE_WALKING ((FIT_ACTIVITY_TYPE)6) +#define FIT_ACTIVITY_TYPE_SEDENTARY ((FIT_ACTIVITY_TYPE)8) +#define FIT_ACTIVITY_TYPE_ALL ((FIT_ACTIVITY_TYPE)254) // All is for goals only to include all sports. +#define FIT_ACTIVITY_TYPE_COUNT 9 + +typedef FIT_ENUM FIT_ACTIVITY_SUBTYPE; +#define FIT_ACTIVITY_SUBTYPE_INVALID FIT_ENUM_INVALID +#define FIT_ACTIVITY_SUBTYPE_GENERIC ((FIT_ACTIVITY_SUBTYPE)0) +#define FIT_ACTIVITY_SUBTYPE_TREADMILL ((FIT_ACTIVITY_SUBTYPE)1) // Run +#define FIT_ACTIVITY_SUBTYPE_STREET ((FIT_ACTIVITY_SUBTYPE)2) // Run +#define FIT_ACTIVITY_SUBTYPE_TRAIL ((FIT_ACTIVITY_SUBTYPE)3) // Run +#define FIT_ACTIVITY_SUBTYPE_TRACK ((FIT_ACTIVITY_SUBTYPE)4) // Run +#define FIT_ACTIVITY_SUBTYPE_SPIN ((FIT_ACTIVITY_SUBTYPE)5) // Cycling +#define FIT_ACTIVITY_SUBTYPE_INDOOR_CYCLING ((FIT_ACTIVITY_SUBTYPE)6) // Cycling +#define FIT_ACTIVITY_SUBTYPE_ROAD ((FIT_ACTIVITY_SUBTYPE)7) // Cycling +#define FIT_ACTIVITY_SUBTYPE_MOUNTAIN ((FIT_ACTIVITY_SUBTYPE)8) // Cycling +#define FIT_ACTIVITY_SUBTYPE_DOWNHILL ((FIT_ACTIVITY_SUBTYPE)9) // Cycling +#define FIT_ACTIVITY_SUBTYPE_RECUMBENT ((FIT_ACTIVITY_SUBTYPE)10) // Cycling +#define FIT_ACTIVITY_SUBTYPE_CYCLOCROSS ((FIT_ACTIVITY_SUBTYPE)11) // Cycling +#define FIT_ACTIVITY_SUBTYPE_HAND_CYCLING ((FIT_ACTIVITY_SUBTYPE)12) // Cycling +#define FIT_ACTIVITY_SUBTYPE_TRACK_CYCLING ((FIT_ACTIVITY_SUBTYPE)13) // Cycling +#define FIT_ACTIVITY_SUBTYPE_INDOOR_ROWING ((FIT_ACTIVITY_SUBTYPE)14) // Fitness Equipment +#define FIT_ACTIVITY_SUBTYPE_ELLIPTICAL ((FIT_ACTIVITY_SUBTYPE)15) // Fitness Equipment +#define FIT_ACTIVITY_SUBTYPE_STAIR_CLIMBING ((FIT_ACTIVITY_SUBTYPE)16) // Fitness Equipment +#define FIT_ACTIVITY_SUBTYPE_LAP_SWIMMING ((FIT_ACTIVITY_SUBTYPE)17) // Swimming +#define FIT_ACTIVITY_SUBTYPE_OPEN_WATER ((FIT_ACTIVITY_SUBTYPE)18) // Swimming +#define FIT_ACTIVITY_SUBTYPE_ALL ((FIT_ACTIVITY_SUBTYPE)254) +#define FIT_ACTIVITY_SUBTYPE_COUNT 20 + +typedef FIT_ENUM FIT_ACTIVITY_LEVEL; +#define FIT_ACTIVITY_LEVEL_INVALID FIT_ENUM_INVALID +#define FIT_ACTIVITY_LEVEL_LOW ((FIT_ACTIVITY_LEVEL)0) +#define FIT_ACTIVITY_LEVEL_MEDIUM ((FIT_ACTIVITY_LEVEL)1) +#define FIT_ACTIVITY_LEVEL_HIGH ((FIT_ACTIVITY_LEVEL)2) +#define FIT_ACTIVITY_LEVEL_COUNT 3 + +typedef FIT_ENUM FIT_SIDE; +#define FIT_SIDE_INVALID FIT_ENUM_INVALID +#define FIT_SIDE_RIGHT ((FIT_SIDE)0) +#define FIT_SIDE_LEFT ((FIT_SIDE)1) +#define FIT_SIDE_COUNT 2 + +typedef FIT_UINT8 FIT_LEFT_RIGHT_BALANCE; +#define FIT_LEFT_RIGHT_BALANCE_INVALID FIT_UINT8_INVALID +#define FIT_LEFT_RIGHT_BALANCE_MASK ((FIT_LEFT_RIGHT_BALANCE)0x7F) // % contribution +#define FIT_LEFT_RIGHT_BALANCE_RIGHT ((FIT_LEFT_RIGHT_BALANCE)0x80) // data corresponds to right if set, otherwise unknown +#define FIT_LEFT_RIGHT_BALANCE_COUNT 2 + +typedef FIT_UINT16 FIT_LEFT_RIGHT_BALANCE_100; +#define FIT_LEFT_RIGHT_BALANCE_100_INVALID FIT_UINT16_INVALID +#define FIT_LEFT_RIGHT_BALANCE_100_MASK ((FIT_LEFT_RIGHT_BALANCE_100)0x3FFF) // % contribution scaled by 100 +#define FIT_LEFT_RIGHT_BALANCE_100_RIGHT ((FIT_LEFT_RIGHT_BALANCE_100)0x8000) // data corresponds to right if set, otherwise unknown +#define FIT_LEFT_RIGHT_BALANCE_100_COUNT 2 + +typedef FIT_ENUM FIT_LENGTH_TYPE; +#define FIT_LENGTH_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_LENGTH_TYPE_IDLE ((FIT_LENGTH_TYPE)0) // Rest period. Length with no strokes +#define FIT_LENGTH_TYPE_ACTIVE ((FIT_LENGTH_TYPE)1) // Length with strokes. +#define FIT_LENGTH_TYPE_COUNT 2 + +typedef FIT_ENUM FIT_DAY_OF_WEEK; +#define FIT_DAY_OF_WEEK_INVALID FIT_ENUM_INVALID +#define FIT_DAY_OF_WEEK_SUNDAY ((FIT_DAY_OF_WEEK)0) +#define FIT_DAY_OF_WEEK_MONDAY ((FIT_DAY_OF_WEEK)1) +#define FIT_DAY_OF_WEEK_TUESDAY ((FIT_DAY_OF_WEEK)2) +#define FIT_DAY_OF_WEEK_WEDNESDAY ((FIT_DAY_OF_WEEK)3) +#define FIT_DAY_OF_WEEK_THURSDAY ((FIT_DAY_OF_WEEK)4) +#define FIT_DAY_OF_WEEK_FRIDAY ((FIT_DAY_OF_WEEK)5) +#define FIT_DAY_OF_WEEK_SATURDAY ((FIT_DAY_OF_WEEK)6) +#define FIT_DAY_OF_WEEK_COUNT 7 + +typedef FIT_UINT32Z FIT_CONNECTIVITY_CAPABILITIES; +#define FIT_CONNECTIVITY_CAPABILITIES_INVALID FIT_UINT32Z_INVALID +#define FIT_CONNECTIVITY_CAPABILITIES_BLUETOOTH ((FIT_CONNECTIVITY_CAPABILITIES)0x00000001) +#define FIT_CONNECTIVITY_CAPABILITIES_BLUETOOTH_LE ((FIT_CONNECTIVITY_CAPABILITIES)0x00000002) +#define FIT_CONNECTIVITY_CAPABILITIES_ANT ((FIT_CONNECTIVITY_CAPABILITIES)0x00000004) +#define FIT_CONNECTIVITY_CAPABILITIES_ACTIVITY_UPLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00000008) +#define FIT_CONNECTIVITY_CAPABILITIES_COURSE_DOWNLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00000010) +#define FIT_CONNECTIVITY_CAPABILITIES_WORKOUT_DOWNLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00000020) +#define FIT_CONNECTIVITY_CAPABILITIES_LIVE_TRACK ((FIT_CONNECTIVITY_CAPABILITIES)0x00000040) +#define FIT_CONNECTIVITY_CAPABILITIES_WEATHER_CONDITIONS ((FIT_CONNECTIVITY_CAPABILITIES)0x00000080) +#define FIT_CONNECTIVITY_CAPABILITIES_WEATHER_ALERTS ((FIT_CONNECTIVITY_CAPABILITIES)0x00000100) +#define FIT_CONNECTIVITY_CAPABILITIES_GPS_EPHEMERIS_DOWNLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00000200) +#define FIT_CONNECTIVITY_CAPABILITIES_EXPLICIT_ARCHIVE ((FIT_CONNECTIVITY_CAPABILITIES)0x00000400) +#define FIT_CONNECTIVITY_CAPABILITIES_SETUP_INCOMPLETE ((FIT_CONNECTIVITY_CAPABILITIES)0x00000800) +#define FIT_CONNECTIVITY_CAPABILITIES_CONTINUE_SYNC_AFTER_SOFTWARE_UPDATE ((FIT_CONNECTIVITY_CAPABILITIES)0x00001000) +#define FIT_CONNECTIVITY_CAPABILITIES_CONNECT_IQ_APP_DOWNLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00002000) +#define FIT_CONNECTIVITY_CAPABILITIES_GOLF_COURSE_DOWNLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00004000) +#define FIT_CONNECTIVITY_CAPABILITIES_DEVICE_INITIATES_SYNC ((FIT_CONNECTIVITY_CAPABILITIES)0x00008000) // Indicates device is in control of initiating all syncs +#define FIT_CONNECTIVITY_CAPABILITIES_CONNECT_IQ_WATCH_APP_DOWNLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00010000) +#define FIT_CONNECTIVITY_CAPABILITIES_CONNECT_IQ_WIDGET_DOWNLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00020000) +#define FIT_CONNECTIVITY_CAPABILITIES_CONNECT_IQ_WATCH_FACE_DOWNLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00040000) +#define FIT_CONNECTIVITY_CAPABILITIES_CONNECT_IQ_DATA_FIELD_DOWNLOAD ((FIT_CONNECTIVITY_CAPABILITIES)0x00080000) +#define FIT_CONNECTIVITY_CAPABILITIES_CONNECT_IQ_APP_MANAGMENT ((FIT_CONNECTIVITY_CAPABILITIES)0x00100000) // Device supports delete and reorder of apps via GCM +#define FIT_CONNECTIVITY_CAPABILITIES_SWING_SENSOR ((FIT_CONNECTIVITY_CAPABILITIES)0x00200000) +#define FIT_CONNECTIVITY_CAPABILITIES_SWING_SENSOR_REMOTE ((FIT_CONNECTIVITY_CAPABILITIES)0x00400000) +#define FIT_CONNECTIVITY_CAPABILITIES_INCIDENT_DETECTION ((FIT_CONNECTIVITY_CAPABILITIES)0x00800000) // Device supports incident detection +#define FIT_CONNECTIVITY_CAPABILITIES_AUDIO_PROMPTS ((FIT_CONNECTIVITY_CAPABILITIES)0x01000000) +#define FIT_CONNECTIVITY_CAPABILITIES_WIFI_VERIFICATION ((FIT_CONNECTIVITY_CAPABILITIES)0x02000000) // Device supports reporting wifi verification via GCM +#define FIT_CONNECTIVITY_CAPABILITIES_TRUE_UP ((FIT_CONNECTIVITY_CAPABILITIES)0x04000000) // Device supports True Up +#define FIT_CONNECTIVITY_CAPABILITIES_FIND_MY_WATCH ((FIT_CONNECTIVITY_CAPABILITIES)0x08000000) // Device supports Find My Watch +#define FIT_CONNECTIVITY_CAPABILITIES_REMOTE_MANUAL_SYNC ((FIT_CONNECTIVITY_CAPABILITIES)0x10000000) +#define FIT_CONNECTIVITY_CAPABILITIES_LIVE_TRACK_AUTO_START ((FIT_CONNECTIVITY_CAPABILITIES)0x20000000) // Device supports LiveTrack auto start +#define FIT_CONNECTIVITY_CAPABILITIES_LIVE_TRACK_MESSAGING ((FIT_CONNECTIVITY_CAPABILITIES)0x40000000) // Device supports LiveTrack Messaging +#define FIT_CONNECTIVITY_CAPABILITIES_INSTANT_INPUT ((FIT_CONNECTIVITY_CAPABILITIES)0x80000000) // Device supports instant input feature +#define FIT_CONNECTIVITY_CAPABILITIES_COUNT 32 + +typedef FIT_ENUM FIT_WEATHER_REPORT; +#define FIT_WEATHER_REPORT_INVALID FIT_ENUM_INVALID +#define FIT_WEATHER_REPORT_CURRENT ((FIT_WEATHER_REPORT)0) +#define FIT_WEATHER_REPORT_FORECAST ((FIT_WEATHER_REPORT)1) // Deprecated use hourly_forecast instead +#define FIT_WEATHER_REPORT_HOURLY_FORECAST ((FIT_WEATHER_REPORT)1) +#define FIT_WEATHER_REPORT_DAILY_FORECAST ((FIT_WEATHER_REPORT)2) +#define FIT_WEATHER_REPORT_COUNT 4 + +typedef FIT_ENUM FIT_WEATHER_STATUS; +#define FIT_WEATHER_STATUS_INVALID FIT_ENUM_INVALID +#define FIT_WEATHER_STATUS_CLEAR ((FIT_WEATHER_STATUS)0) +#define FIT_WEATHER_STATUS_PARTLY_CLOUDY ((FIT_WEATHER_STATUS)1) +#define FIT_WEATHER_STATUS_MOSTLY_CLOUDY ((FIT_WEATHER_STATUS)2) +#define FIT_WEATHER_STATUS_RAIN ((FIT_WEATHER_STATUS)3) +#define FIT_WEATHER_STATUS_SNOW ((FIT_WEATHER_STATUS)4) +#define FIT_WEATHER_STATUS_WINDY ((FIT_WEATHER_STATUS)5) +#define FIT_WEATHER_STATUS_THUNDERSTORMS ((FIT_WEATHER_STATUS)6) +#define FIT_WEATHER_STATUS_WINTRY_MIX ((FIT_WEATHER_STATUS)7) +#define FIT_WEATHER_STATUS_FOG ((FIT_WEATHER_STATUS)8) +#define FIT_WEATHER_STATUS_HAZY ((FIT_WEATHER_STATUS)11) +#define FIT_WEATHER_STATUS_HAIL ((FIT_WEATHER_STATUS)12) +#define FIT_WEATHER_STATUS_SCATTERED_SHOWERS ((FIT_WEATHER_STATUS)13) +#define FIT_WEATHER_STATUS_SCATTERED_THUNDERSTORMS ((FIT_WEATHER_STATUS)14) +#define FIT_WEATHER_STATUS_UNKNOWN_PRECIPITATION ((FIT_WEATHER_STATUS)15) +#define FIT_WEATHER_STATUS_LIGHT_RAIN ((FIT_WEATHER_STATUS)16) +#define FIT_WEATHER_STATUS_HEAVY_RAIN ((FIT_WEATHER_STATUS)17) +#define FIT_WEATHER_STATUS_LIGHT_SNOW ((FIT_WEATHER_STATUS)18) +#define FIT_WEATHER_STATUS_HEAVY_SNOW ((FIT_WEATHER_STATUS)19) +#define FIT_WEATHER_STATUS_LIGHT_RAIN_SNOW ((FIT_WEATHER_STATUS)20) +#define FIT_WEATHER_STATUS_HEAVY_RAIN_SNOW ((FIT_WEATHER_STATUS)21) +#define FIT_WEATHER_STATUS_CLOUDY ((FIT_WEATHER_STATUS)22) +#define FIT_WEATHER_STATUS_COUNT 21 + +typedef FIT_ENUM FIT_WEATHER_SEVERITY; +#define FIT_WEATHER_SEVERITY_INVALID FIT_ENUM_INVALID +#define FIT_WEATHER_SEVERITY_UNKNOWN ((FIT_WEATHER_SEVERITY)0) +#define FIT_WEATHER_SEVERITY_WARNING ((FIT_WEATHER_SEVERITY)1) +#define FIT_WEATHER_SEVERITY_WATCH ((FIT_WEATHER_SEVERITY)2) +#define FIT_WEATHER_SEVERITY_ADVISORY ((FIT_WEATHER_SEVERITY)3) +#define FIT_WEATHER_SEVERITY_STATEMENT ((FIT_WEATHER_SEVERITY)4) +#define FIT_WEATHER_SEVERITY_COUNT 5 + +typedef FIT_ENUM FIT_WEATHER_SEVERE_TYPE; +#define FIT_WEATHER_SEVERE_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_WEATHER_SEVERE_TYPE_UNSPECIFIED ((FIT_WEATHER_SEVERE_TYPE)0) +#define FIT_WEATHER_SEVERE_TYPE_TORNADO ((FIT_WEATHER_SEVERE_TYPE)1) +#define FIT_WEATHER_SEVERE_TYPE_TSUNAMI ((FIT_WEATHER_SEVERE_TYPE)2) +#define FIT_WEATHER_SEVERE_TYPE_HURRICANE ((FIT_WEATHER_SEVERE_TYPE)3) +#define FIT_WEATHER_SEVERE_TYPE_EXTREME_WIND ((FIT_WEATHER_SEVERE_TYPE)4) +#define FIT_WEATHER_SEVERE_TYPE_TYPHOON ((FIT_WEATHER_SEVERE_TYPE)5) +#define FIT_WEATHER_SEVERE_TYPE_INLAND_HURRICANE ((FIT_WEATHER_SEVERE_TYPE)6) +#define FIT_WEATHER_SEVERE_TYPE_HURRICANE_FORCE_WIND ((FIT_WEATHER_SEVERE_TYPE)7) +#define FIT_WEATHER_SEVERE_TYPE_WATERSPOUT ((FIT_WEATHER_SEVERE_TYPE)8) +#define FIT_WEATHER_SEVERE_TYPE_SEVERE_THUNDERSTORM ((FIT_WEATHER_SEVERE_TYPE)9) +#define FIT_WEATHER_SEVERE_TYPE_WRECKHOUSE_WINDS ((FIT_WEATHER_SEVERE_TYPE)10) +#define FIT_WEATHER_SEVERE_TYPE_LES_SUETES_WIND ((FIT_WEATHER_SEVERE_TYPE)11) +#define FIT_WEATHER_SEVERE_TYPE_AVALANCHE ((FIT_WEATHER_SEVERE_TYPE)12) +#define FIT_WEATHER_SEVERE_TYPE_FLASH_FLOOD ((FIT_WEATHER_SEVERE_TYPE)13) +#define FIT_WEATHER_SEVERE_TYPE_TROPICAL_STORM ((FIT_WEATHER_SEVERE_TYPE)14) +#define FIT_WEATHER_SEVERE_TYPE_INLAND_TROPICAL_STORM ((FIT_WEATHER_SEVERE_TYPE)15) +#define FIT_WEATHER_SEVERE_TYPE_BLIZZARD ((FIT_WEATHER_SEVERE_TYPE)16) +#define FIT_WEATHER_SEVERE_TYPE_ICE_STORM ((FIT_WEATHER_SEVERE_TYPE)17) +#define FIT_WEATHER_SEVERE_TYPE_FREEZING_RAIN ((FIT_WEATHER_SEVERE_TYPE)18) +#define FIT_WEATHER_SEVERE_TYPE_DEBRIS_FLOW ((FIT_WEATHER_SEVERE_TYPE)19) +#define FIT_WEATHER_SEVERE_TYPE_FLASH_FREEZE ((FIT_WEATHER_SEVERE_TYPE)20) +#define FIT_WEATHER_SEVERE_TYPE_DUST_STORM ((FIT_WEATHER_SEVERE_TYPE)21) +#define FIT_WEATHER_SEVERE_TYPE_HIGH_WIND ((FIT_WEATHER_SEVERE_TYPE)22) +#define FIT_WEATHER_SEVERE_TYPE_WINTER_STORM ((FIT_WEATHER_SEVERE_TYPE)23) +#define FIT_WEATHER_SEVERE_TYPE_HEAVY_FREEZING_SPRAY ((FIT_WEATHER_SEVERE_TYPE)24) +#define FIT_WEATHER_SEVERE_TYPE_EXTREME_COLD ((FIT_WEATHER_SEVERE_TYPE)25) +#define FIT_WEATHER_SEVERE_TYPE_WIND_CHILL ((FIT_WEATHER_SEVERE_TYPE)26) +#define FIT_WEATHER_SEVERE_TYPE_COLD_WAVE ((FIT_WEATHER_SEVERE_TYPE)27) +#define FIT_WEATHER_SEVERE_TYPE_HEAVY_SNOW_ALERT ((FIT_WEATHER_SEVERE_TYPE)28) +#define FIT_WEATHER_SEVERE_TYPE_LAKE_EFFECT_BLOWING_SNOW ((FIT_WEATHER_SEVERE_TYPE)29) +#define FIT_WEATHER_SEVERE_TYPE_SNOW_SQUALL ((FIT_WEATHER_SEVERE_TYPE)30) +#define FIT_WEATHER_SEVERE_TYPE_LAKE_EFFECT_SNOW ((FIT_WEATHER_SEVERE_TYPE)31) +#define FIT_WEATHER_SEVERE_TYPE_WINTER_WEATHER ((FIT_WEATHER_SEVERE_TYPE)32) +#define FIT_WEATHER_SEVERE_TYPE_SLEET ((FIT_WEATHER_SEVERE_TYPE)33) +#define FIT_WEATHER_SEVERE_TYPE_SNOWFALL ((FIT_WEATHER_SEVERE_TYPE)34) +#define FIT_WEATHER_SEVERE_TYPE_SNOW_AND_BLOWING_SNOW ((FIT_WEATHER_SEVERE_TYPE)35) +#define FIT_WEATHER_SEVERE_TYPE_BLOWING_SNOW ((FIT_WEATHER_SEVERE_TYPE)36) +#define FIT_WEATHER_SEVERE_TYPE_SNOW_ALERT ((FIT_WEATHER_SEVERE_TYPE)37) +#define FIT_WEATHER_SEVERE_TYPE_ARCTIC_OUTFLOW ((FIT_WEATHER_SEVERE_TYPE)38) +#define FIT_WEATHER_SEVERE_TYPE_FREEZING_DRIZZLE ((FIT_WEATHER_SEVERE_TYPE)39) +#define FIT_WEATHER_SEVERE_TYPE_STORM ((FIT_WEATHER_SEVERE_TYPE)40) +#define FIT_WEATHER_SEVERE_TYPE_STORM_SURGE ((FIT_WEATHER_SEVERE_TYPE)41) +#define FIT_WEATHER_SEVERE_TYPE_RAINFALL ((FIT_WEATHER_SEVERE_TYPE)42) +#define FIT_WEATHER_SEVERE_TYPE_AREAL_FLOOD ((FIT_WEATHER_SEVERE_TYPE)43) +#define FIT_WEATHER_SEVERE_TYPE_COASTAL_FLOOD ((FIT_WEATHER_SEVERE_TYPE)44) +#define FIT_WEATHER_SEVERE_TYPE_LAKESHORE_FLOOD ((FIT_WEATHER_SEVERE_TYPE)45) +#define FIT_WEATHER_SEVERE_TYPE_EXCESSIVE_HEAT ((FIT_WEATHER_SEVERE_TYPE)46) +#define FIT_WEATHER_SEVERE_TYPE_HEAT ((FIT_WEATHER_SEVERE_TYPE)47) +#define FIT_WEATHER_SEVERE_TYPE_WEATHER ((FIT_WEATHER_SEVERE_TYPE)48) +#define FIT_WEATHER_SEVERE_TYPE_HIGH_HEAT_AND_HUMIDITY ((FIT_WEATHER_SEVERE_TYPE)49) +#define FIT_WEATHER_SEVERE_TYPE_HUMIDEX_AND_HEALTH ((FIT_WEATHER_SEVERE_TYPE)50) +#define FIT_WEATHER_SEVERE_TYPE_HUMIDEX ((FIT_WEATHER_SEVERE_TYPE)51) +#define FIT_WEATHER_SEVERE_TYPE_GALE ((FIT_WEATHER_SEVERE_TYPE)52) +#define FIT_WEATHER_SEVERE_TYPE_FREEZING_SPRAY ((FIT_WEATHER_SEVERE_TYPE)53) +#define FIT_WEATHER_SEVERE_TYPE_SPECIAL_MARINE ((FIT_WEATHER_SEVERE_TYPE)54) +#define FIT_WEATHER_SEVERE_TYPE_SQUALL ((FIT_WEATHER_SEVERE_TYPE)55) +#define FIT_WEATHER_SEVERE_TYPE_STRONG_WIND ((FIT_WEATHER_SEVERE_TYPE)56) +#define FIT_WEATHER_SEVERE_TYPE_LAKE_WIND ((FIT_WEATHER_SEVERE_TYPE)57) +#define FIT_WEATHER_SEVERE_TYPE_MARINE_WEATHER ((FIT_WEATHER_SEVERE_TYPE)58) +#define FIT_WEATHER_SEVERE_TYPE_WIND ((FIT_WEATHER_SEVERE_TYPE)59) +#define FIT_WEATHER_SEVERE_TYPE_SMALL_CRAFT_HAZARDOUS_SEAS ((FIT_WEATHER_SEVERE_TYPE)60) +#define FIT_WEATHER_SEVERE_TYPE_HAZARDOUS_SEAS ((FIT_WEATHER_SEVERE_TYPE)61) +#define FIT_WEATHER_SEVERE_TYPE_SMALL_CRAFT ((FIT_WEATHER_SEVERE_TYPE)62) +#define FIT_WEATHER_SEVERE_TYPE_SMALL_CRAFT_WINDS ((FIT_WEATHER_SEVERE_TYPE)63) +#define FIT_WEATHER_SEVERE_TYPE_SMALL_CRAFT_ROUGH_BAR ((FIT_WEATHER_SEVERE_TYPE)64) +#define FIT_WEATHER_SEVERE_TYPE_HIGH_WATER_LEVEL ((FIT_WEATHER_SEVERE_TYPE)65) +#define FIT_WEATHER_SEVERE_TYPE_ASHFALL ((FIT_WEATHER_SEVERE_TYPE)66) +#define FIT_WEATHER_SEVERE_TYPE_FREEZING_FOG ((FIT_WEATHER_SEVERE_TYPE)67) +#define FIT_WEATHER_SEVERE_TYPE_DENSE_FOG ((FIT_WEATHER_SEVERE_TYPE)68) +#define FIT_WEATHER_SEVERE_TYPE_DENSE_SMOKE ((FIT_WEATHER_SEVERE_TYPE)69) +#define FIT_WEATHER_SEVERE_TYPE_BLOWING_DUST ((FIT_WEATHER_SEVERE_TYPE)70) +#define FIT_WEATHER_SEVERE_TYPE_HARD_FREEZE ((FIT_WEATHER_SEVERE_TYPE)71) +#define FIT_WEATHER_SEVERE_TYPE_FREEZE ((FIT_WEATHER_SEVERE_TYPE)72) +#define FIT_WEATHER_SEVERE_TYPE_FROST ((FIT_WEATHER_SEVERE_TYPE)73) +#define FIT_WEATHER_SEVERE_TYPE_FIRE_WEATHER ((FIT_WEATHER_SEVERE_TYPE)74) +#define FIT_WEATHER_SEVERE_TYPE_FLOOD ((FIT_WEATHER_SEVERE_TYPE)75) +#define FIT_WEATHER_SEVERE_TYPE_RIP_TIDE ((FIT_WEATHER_SEVERE_TYPE)76) +#define FIT_WEATHER_SEVERE_TYPE_HIGH_SURF ((FIT_WEATHER_SEVERE_TYPE)77) +#define FIT_WEATHER_SEVERE_TYPE_SMOG ((FIT_WEATHER_SEVERE_TYPE)78) +#define FIT_WEATHER_SEVERE_TYPE_AIR_QUALITY ((FIT_WEATHER_SEVERE_TYPE)79) +#define FIT_WEATHER_SEVERE_TYPE_BRISK_WIND ((FIT_WEATHER_SEVERE_TYPE)80) +#define FIT_WEATHER_SEVERE_TYPE_AIR_STAGNATION ((FIT_WEATHER_SEVERE_TYPE)81) +#define FIT_WEATHER_SEVERE_TYPE_LOW_WATER ((FIT_WEATHER_SEVERE_TYPE)82) +#define FIT_WEATHER_SEVERE_TYPE_HYDROLOGICAL ((FIT_WEATHER_SEVERE_TYPE)83) +#define FIT_WEATHER_SEVERE_TYPE_SPECIAL_WEATHER ((FIT_WEATHER_SEVERE_TYPE)84) +#define FIT_WEATHER_SEVERE_TYPE_COUNT 85 + +typedef FIT_UINT32 FIT_TIME_INTO_DAY; // number of seconds into the day since 00:00:00 UTC +#define FIT_TIME_INTO_DAY_INVALID FIT_UINT32_INVALID +#define FIT_TIME_INTO_DAY_COUNT 0 + +typedef FIT_UINT32 FIT_LOCALTIME_INTO_DAY; // number of seconds into the day since local 00:00:00 +#define FIT_LOCALTIME_INTO_DAY_INVALID FIT_UINT32_INVALID +#define FIT_LOCALTIME_INTO_DAY_COUNT 0 + +typedef FIT_ENUM FIT_STROKE_TYPE; +#define FIT_STROKE_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_STROKE_TYPE_NO_EVENT ((FIT_STROKE_TYPE)0) +#define FIT_STROKE_TYPE_OTHER ((FIT_STROKE_TYPE)1) // stroke was detected but cannot be identified +#define FIT_STROKE_TYPE_SERVE ((FIT_STROKE_TYPE)2) +#define FIT_STROKE_TYPE_FOREHAND ((FIT_STROKE_TYPE)3) +#define FIT_STROKE_TYPE_BACKHAND ((FIT_STROKE_TYPE)4) +#define FIT_STROKE_TYPE_SMASH ((FIT_STROKE_TYPE)5) +#define FIT_STROKE_TYPE_COUNT 6 + +typedef FIT_ENUM FIT_BODY_LOCATION; +#define FIT_BODY_LOCATION_INVALID FIT_ENUM_INVALID +#define FIT_BODY_LOCATION_LEFT_LEG ((FIT_BODY_LOCATION)0) +#define FIT_BODY_LOCATION_LEFT_CALF ((FIT_BODY_LOCATION)1) +#define FIT_BODY_LOCATION_LEFT_SHIN ((FIT_BODY_LOCATION)2) +#define FIT_BODY_LOCATION_LEFT_HAMSTRING ((FIT_BODY_LOCATION)3) +#define FIT_BODY_LOCATION_LEFT_QUAD ((FIT_BODY_LOCATION)4) +#define FIT_BODY_LOCATION_LEFT_GLUTE ((FIT_BODY_LOCATION)5) +#define FIT_BODY_LOCATION_RIGHT_LEG ((FIT_BODY_LOCATION)6) +#define FIT_BODY_LOCATION_RIGHT_CALF ((FIT_BODY_LOCATION)7) +#define FIT_BODY_LOCATION_RIGHT_SHIN ((FIT_BODY_LOCATION)8) +#define FIT_BODY_LOCATION_RIGHT_HAMSTRING ((FIT_BODY_LOCATION)9) +#define FIT_BODY_LOCATION_RIGHT_QUAD ((FIT_BODY_LOCATION)10) +#define FIT_BODY_LOCATION_RIGHT_GLUTE ((FIT_BODY_LOCATION)11) +#define FIT_BODY_LOCATION_TORSO_BACK ((FIT_BODY_LOCATION)12) +#define FIT_BODY_LOCATION_LEFT_LOWER_BACK ((FIT_BODY_LOCATION)13) +#define FIT_BODY_LOCATION_LEFT_UPPER_BACK ((FIT_BODY_LOCATION)14) +#define FIT_BODY_LOCATION_RIGHT_LOWER_BACK ((FIT_BODY_LOCATION)15) +#define FIT_BODY_LOCATION_RIGHT_UPPER_BACK ((FIT_BODY_LOCATION)16) +#define FIT_BODY_LOCATION_TORSO_FRONT ((FIT_BODY_LOCATION)17) +#define FIT_BODY_LOCATION_LEFT_ABDOMEN ((FIT_BODY_LOCATION)18) +#define FIT_BODY_LOCATION_LEFT_CHEST ((FIT_BODY_LOCATION)19) +#define FIT_BODY_LOCATION_RIGHT_ABDOMEN ((FIT_BODY_LOCATION)20) +#define FIT_BODY_LOCATION_RIGHT_CHEST ((FIT_BODY_LOCATION)21) +#define FIT_BODY_LOCATION_LEFT_ARM ((FIT_BODY_LOCATION)22) +#define FIT_BODY_LOCATION_LEFT_SHOULDER ((FIT_BODY_LOCATION)23) +#define FIT_BODY_LOCATION_LEFT_BICEP ((FIT_BODY_LOCATION)24) +#define FIT_BODY_LOCATION_LEFT_TRICEP ((FIT_BODY_LOCATION)25) +#define FIT_BODY_LOCATION_LEFT_BRACHIORADIALIS ((FIT_BODY_LOCATION)26) // Left anterior forearm +#define FIT_BODY_LOCATION_LEFT_FOREARM_EXTENSORS ((FIT_BODY_LOCATION)27) // Left posterior forearm +#define FIT_BODY_LOCATION_RIGHT_ARM ((FIT_BODY_LOCATION)28) +#define FIT_BODY_LOCATION_RIGHT_SHOULDER ((FIT_BODY_LOCATION)29) +#define FIT_BODY_LOCATION_RIGHT_BICEP ((FIT_BODY_LOCATION)30) +#define FIT_BODY_LOCATION_RIGHT_TRICEP ((FIT_BODY_LOCATION)31) +#define FIT_BODY_LOCATION_RIGHT_BRACHIORADIALIS ((FIT_BODY_LOCATION)32) // Right anterior forearm +#define FIT_BODY_LOCATION_RIGHT_FOREARM_EXTENSORS ((FIT_BODY_LOCATION)33) // Right posterior forearm +#define FIT_BODY_LOCATION_NECK ((FIT_BODY_LOCATION)34) +#define FIT_BODY_LOCATION_THROAT ((FIT_BODY_LOCATION)35) +#define FIT_BODY_LOCATION_WAIST_MID_BACK ((FIT_BODY_LOCATION)36) +#define FIT_BODY_LOCATION_WAIST_FRONT ((FIT_BODY_LOCATION)37) +#define FIT_BODY_LOCATION_WAIST_LEFT ((FIT_BODY_LOCATION)38) +#define FIT_BODY_LOCATION_WAIST_RIGHT ((FIT_BODY_LOCATION)39) +#define FIT_BODY_LOCATION_COUNT 40 + +typedef FIT_ENUM FIT_SEGMENT_LAP_STATUS; +#define FIT_SEGMENT_LAP_STATUS_INVALID FIT_ENUM_INVALID +#define FIT_SEGMENT_LAP_STATUS_END ((FIT_SEGMENT_LAP_STATUS)0) +#define FIT_SEGMENT_LAP_STATUS_FAIL ((FIT_SEGMENT_LAP_STATUS)1) +#define FIT_SEGMENT_LAP_STATUS_COUNT 2 + +typedef FIT_ENUM FIT_SEGMENT_LEADERBOARD_TYPE; +#define FIT_SEGMENT_LEADERBOARD_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_SEGMENT_LEADERBOARD_TYPE_OVERALL ((FIT_SEGMENT_LEADERBOARD_TYPE)0) +#define FIT_SEGMENT_LEADERBOARD_TYPE_PERSONAL_BEST ((FIT_SEGMENT_LEADERBOARD_TYPE)1) +#define FIT_SEGMENT_LEADERBOARD_TYPE_CONNECTIONS ((FIT_SEGMENT_LEADERBOARD_TYPE)2) +#define FIT_SEGMENT_LEADERBOARD_TYPE_GROUP ((FIT_SEGMENT_LEADERBOARD_TYPE)3) +#define FIT_SEGMENT_LEADERBOARD_TYPE_CHALLENGER ((FIT_SEGMENT_LEADERBOARD_TYPE)4) +#define FIT_SEGMENT_LEADERBOARD_TYPE_KOM ((FIT_SEGMENT_LEADERBOARD_TYPE)5) +#define FIT_SEGMENT_LEADERBOARD_TYPE_QOM ((FIT_SEGMENT_LEADERBOARD_TYPE)6) +#define FIT_SEGMENT_LEADERBOARD_TYPE_PR ((FIT_SEGMENT_LEADERBOARD_TYPE)7) +#define FIT_SEGMENT_LEADERBOARD_TYPE_GOAL ((FIT_SEGMENT_LEADERBOARD_TYPE)8) +#define FIT_SEGMENT_LEADERBOARD_TYPE_RIVAL ((FIT_SEGMENT_LEADERBOARD_TYPE)9) +#define FIT_SEGMENT_LEADERBOARD_TYPE_CLUB_LEADER ((FIT_SEGMENT_LEADERBOARD_TYPE)10) +#define FIT_SEGMENT_LEADERBOARD_TYPE_COUNT 11 + +typedef FIT_ENUM FIT_SEGMENT_DELETE_STATUS; +#define FIT_SEGMENT_DELETE_STATUS_INVALID FIT_ENUM_INVALID +#define FIT_SEGMENT_DELETE_STATUS_DO_NOT_DELETE ((FIT_SEGMENT_DELETE_STATUS)0) +#define FIT_SEGMENT_DELETE_STATUS_DELETE_ONE ((FIT_SEGMENT_DELETE_STATUS)1) +#define FIT_SEGMENT_DELETE_STATUS_DELETE_ALL ((FIT_SEGMENT_DELETE_STATUS)2) +#define FIT_SEGMENT_DELETE_STATUS_COUNT 3 + +typedef FIT_ENUM FIT_SEGMENT_SELECTION_TYPE; +#define FIT_SEGMENT_SELECTION_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_SEGMENT_SELECTION_TYPE_STARRED ((FIT_SEGMENT_SELECTION_TYPE)0) +#define FIT_SEGMENT_SELECTION_TYPE_SUGGESTED ((FIT_SEGMENT_SELECTION_TYPE)1) +#define FIT_SEGMENT_SELECTION_TYPE_COUNT 2 + +typedef FIT_ENUM FIT_SOURCE_TYPE; +#define FIT_SOURCE_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_SOURCE_TYPE_ANT ((FIT_SOURCE_TYPE)0) // External device connected with ANT +#define FIT_SOURCE_TYPE_ANTPLUS ((FIT_SOURCE_TYPE)1) // External device connected with ANT+ +#define FIT_SOURCE_TYPE_BLUETOOTH ((FIT_SOURCE_TYPE)2) // External device connected with BT +#define FIT_SOURCE_TYPE_BLUETOOTH_LOW_ENERGY ((FIT_SOURCE_TYPE)3) // External device connected with BLE +#define FIT_SOURCE_TYPE_WIFI ((FIT_SOURCE_TYPE)4) // External device connected with Wifi +#define FIT_SOURCE_TYPE_LOCAL ((FIT_SOURCE_TYPE)5) // Onboard device +#define FIT_SOURCE_TYPE_COUNT 6 + +typedef FIT_UINT8 FIT_LOCAL_DEVICE_TYPE; +#define FIT_LOCAL_DEVICE_TYPE_INVALID FIT_UINT8_INVALID +#define FIT_LOCAL_DEVICE_TYPE_GPS ((FIT_LOCAL_DEVICE_TYPE)0) // Onboard gps receiver +#define FIT_LOCAL_DEVICE_TYPE_GLONASS ((FIT_LOCAL_DEVICE_TYPE)1) // Onboard glonass receiver +#define FIT_LOCAL_DEVICE_TYPE_GPS_GLONASS ((FIT_LOCAL_DEVICE_TYPE)2) // Onboard gps glonass receiver +#define FIT_LOCAL_DEVICE_TYPE_ACCELEROMETER ((FIT_LOCAL_DEVICE_TYPE)3) // Onboard sensor +#define FIT_LOCAL_DEVICE_TYPE_BAROMETER ((FIT_LOCAL_DEVICE_TYPE)4) // Onboard sensor +#define FIT_LOCAL_DEVICE_TYPE_TEMPERATURE ((FIT_LOCAL_DEVICE_TYPE)5) // Onboard sensor +#define FIT_LOCAL_DEVICE_TYPE_WHR ((FIT_LOCAL_DEVICE_TYPE)10) // Onboard wrist HR sensor +#define FIT_LOCAL_DEVICE_TYPE_SENSOR_HUB ((FIT_LOCAL_DEVICE_TYPE)12) // Onboard software package +#define FIT_LOCAL_DEVICE_TYPE_COUNT 8 + +typedef FIT_UINT8 FIT_BLE_DEVICE_TYPE; +#define FIT_BLE_DEVICE_TYPE_INVALID FIT_UINT8_INVALID +#define FIT_BLE_DEVICE_TYPE_CONNECTED_GPS ((FIT_BLE_DEVICE_TYPE)0) // GPS that is provided over a proprietary bluetooth service +#define FIT_BLE_DEVICE_TYPE_HEART_RATE ((FIT_BLE_DEVICE_TYPE)1) +#define FIT_BLE_DEVICE_TYPE_BIKE_POWER ((FIT_BLE_DEVICE_TYPE)2) +#define FIT_BLE_DEVICE_TYPE_BIKE_SPEED_CADENCE ((FIT_BLE_DEVICE_TYPE)3) +#define FIT_BLE_DEVICE_TYPE_BIKE_SPEED ((FIT_BLE_DEVICE_TYPE)4) +#define FIT_BLE_DEVICE_TYPE_BIKE_CADENCE ((FIT_BLE_DEVICE_TYPE)5) +#define FIT_BLE_DEVICE_TYPE_FOOTPOD ((FIT_BLE_DEVICE_TYPE)6) +#define FIT_BLE_DEVICE_TYPE_BIKE_TRAINER ((FIT_BLE_DEVICE_TYPE)7) // Indoor-Bike FTMS protocol +#define FIT_BLE_DEVICE_TYPE_COUNT 8 + +typedef FIT_UINT32Z FIT_ANT_CHANNEL_ID; +#define FIT_ANT_CHANNEL_ID_INVALID FIT_UINT32Z_INVALID +#define FIT_ANT_CHANNEL_ID_ANT_EXTENDED_DEVICE_NUMBER_UPPER_NIBBLE ((FIT_ANT_CHANNEL_ID)0xF0000000) +#define FIT_ANT_CHANNEL_ID_ANT_TRANSMISSION_TYPE_LOWER_NIBBLE ((FIT_ANT_CHANNEL_ID)0x0F000000) +#define FIT_ANT_CHANNEL_ID_ANT_DEVICE_TYPE ((FIT_ANT_CHANNEL_ID)0x00FF0000) +#define FIT_ANT_CHANNEL_ID_ANT_DEVICE_NUMBER ((FIT_ANT_CHANNEL_ID)0x0000FFFF) +#define FIT_ANT_CHANNEL_ID_COUNT 4 + +typedef FIT_ENUM FIT_DISPLAY_ORIENTATION; +#define FIT_DISPLAY_ORIENTATION_INVALID FIT_ENUM_INVALID +#define FIT_DISPLAY_ORIENTATION_AUTO ((FIT_DISPLAY_ORIENTATION)0) // automatic if the device supports it +#define FIT_DISPLAY_ORIENTATION_PORTRAIT ((FIT_DISPLAY_ORIENTATION)1) +#define FIT_DISPLAY_ORIENTATION_LANDSCAPE ((FIT_DISPLAY_ORIENTATION)2) +#define FIT_DISPLAY_ORIENTATION_PORTRAIT_FLIPPED ((FIT_DISPLAY_ORIENTATION)3) // portrait mode but rotated 180 degrees +#define FIT_DISPLAY_ORIENTATION_LANDSCAPE_FLIPPED ((FIT_DISPLAY_ORIENTATION)4) // landscape mode but rotated 180 degrees +#define FIT_DISPLAY_ORIENTATION_COUNT 5 + +typedef FIT_ENUM FIT_WORKOUT_EQUIPMENT; +#define FIT_WORKOUT_EQUIPMENT_INVALID FIT_ENUM_INVALID +#define FIT_WORKOUT_EQUIPMENT_NONE ((FIT_WORKOUT_EQUIPMENT)0) +#define FIT_WORKOUT_EQUIPMENT_SWIM_FINS ((FIT_WORKOUT_EQUIPMENT)1) +#define FIT_WORKOUT_EQUIPMENT_SWIM_KICKBOARD ((FIT_WORKOUT_EQUIPMENT)2) +#define FIT_WORKOUT_EQUIPMENT_SWIM_PADDLES ((FIT_WORKOUT_EQUIPMENT)3) +#define FIT_WORKOUT_EQUIPMENT_SWIM_PULL_BUOY ((FIT_WORKOUT_EQUIPMENT)4) +#define FIT_WORKOUT_EQUIPMENT_SWIM_SNORKEL ((FIT_WORKOUT_EQUIPMENT)5) +#define FIT_WORKOUT_EQUIPMENT_COUNT 6 + +typedef FIT_ENUM FIT_WATCHFACE_MODE; +#define FIT_WATCHFACE_MODE_INVALID FIT_ENUM_INVALID +#define FIT_WATCHFACE_MODE_DIGITAL ((FIT_WATCHFACE_MODE)0) +#define FIT_WATCHFACE_MODE_ANALOG ((FIT_WATCHFACE_MODE)1) +#define FIT_WATCHFACE_MODE_CONNECT_IQ ((FIT_WATCHFACE_MODE)2) +#define FIT_WATCHFACE_MODE_DISABLED ((FIT_WATCHFACE_MODE)3) +#define FIT_WATCHFACE_MODE_COUNT 4 + +typedef FIT_ENUM FIT_DIGITAL_WATCHFACE_LAYOUT; +#define FIT_DIGITAL_WATCHFACE_LAYOUT_INVALID FIT_ENUM_INVALID +#define FIT_DIGITAL_WATCHFACE_LAYOUT_TRADITIONAL ((FIT_DIGITAL_WATCHFACE_LAYOUT)0) +#define FIT_DIGITAL_WATCHFACE_LAYOUT_MODERN ((FIT_DIGITAL_WATCHFACE_LAYOUT)1) +#define FIT_DIGITAL_WATCHFACE_LAYOUT_BOLD ((FIT_DIGITAL_WATCHFACE_LAYOUT)2) +#define FIT_DIGITAL_WATCHFACE_LAYOUT_COUNT 3 + +typedef FIT_ENUM FIT_ANALOG_WATCHFACE_LAYOUT; +#define FIT_ANALOG_WATCHFACE_LAYOUT_INVALID FIT_ENUM_INVALID +#define FIT_ANALOG_WATCHFACE_LAYOUT_MINIMAL ((FIT_ANALOG_WATCHFACE_LAYOUT)0) +#define FIT_ANALOG_WATCHFACE_LAYOUT_TRADITIONAL ((FIT_ANALOG_WATCHFACE_LAYOUT)1) +#define FIT_ANALOG_WATCHFACE_LAYOUT_MODERN ((FIT_ANALOG_WATCHFACE_LAYOUT)2) +#define FIT_ANALOG_WATCHFACE_LAYOUT_COUNT 3 + +typedef FIT_ENUM FIT_RIDER_POSITION_TYPE; +#define FIT_RIDER_POSITION_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_RIDER_POSITION_TYPE_SEATED ((FIT_RIDER_POSITION_TYPE)0) +#define FIT_RIDER_POSITION_TYPE_STANDING ((FIT_RIDER_POSITION_TYPE)1) +#define FIT_RIDER_POSITION_TYPE_TRANSITION_TO_SEATED ((FIT_RIDER_POSITION_TYPE)2) +#define FIT_RIDER_POSITION_TYPE_TRANSITION_TO_STANDING ((FIT_RIDER_POSITION_TYPE)3) +#define FIT_RIDER_POSITION_TYPE_COUNT 4 + +typedef FIT_ENUM FIT_POWER_PHASE_TYPE; +#define FIT_POWER_PHASE_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_POWER_PHASE_TYPE_POWER_PHASE_START_ANGLE ((FIT_POWER_PHASE_TYPE)0) +#define FIT_POWER_PHASE_TYPE_POWER_PHASE_END_ANGLE ((FIT_POWER_PHASE_TYPE)1) +#define FIT_POWER_PHASE_TYPE_POWER_PHASE_ARC_LENGTH ((FIT_POWER_PHASE_TYPE)2) +#define FIT_POWER_PHASE_TYPE_POWER_PHASE_CENTER ((FIT_POWER_PHASE_TYPE)3) +#define FIT_POWER_PHASE_TYPE_COUNT 4 + +typedef FIT_ENUM FIT_CAMERA_EVENT_TYPE; +#define FIT_CAMERA_EVENT_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_CAMERA_EVENT_TYPE_VIDEO_START ((FIT_CAMERA_EVENT_TYPE)0) // Start of video recording +#define FIT_CAMERA_EVENT_TYPE_VIDEO_SPLIT ((FIT_CAMERA_EVENT_TYPE)1) // Mark of video file split (end of one file, beginning of the other) +#define FIT_CAMERA_EVENT_TYPE_VIDEO_END ((FIT_CAMERA_EVENT_TYPE)2) // End of video recording +#define FIT_CAMERA_EVENT_TYPE_PHOTO_TAKEN ((FIT_CAMERA_EVENT_TYPE)3) // Still photo taken +#define FIT_CAMERA_EVENT_TYPE_VIDEO_SECOND_STREAM_START ((FIT_CAMERA_EVENT_TYPE)4) +#define FIT_CAMERA_EVENT_TYPE_VIDEO_SECOND_STREAM_SPLIT ((FIT_CAMERA_EVENT_TYPE)5) +#define FIT_CAMERA_EVENT_TYPE_VIDEO_SECOND_STREAM_END ((FIT_CAMERA_EVENT_TYPE)6) +#define FIT_CAMERA_EVENT_TYPE_VIDEO_SPLIT_START ((FIT_CAMERA_EVENT_TYPE)7) // Mark of video file split start +#define FIT_CAMERA_EVENT_TYPE_VIDEO_SECOND_STREAM_SPLIT_START ((FIT_CAMERA_EVENT_TYPE)8) +#define FIT_CAMERA_EVENT_TYPE_VIDEO_PAUSE ((FIT_CAMERA_EVENT_TYPE)11) // Mark when a video recording has been paused +#define FIT_CAMERA_EVENT_TYPE_VIDEO_SECOND_STREAM_PAUSE ((FIT_CAMERA_EVENT_TYPE)12) +#define FIT_CAMERA_EVENT_TYPE_VIDEO_RESUME ((FIT_CAMERA_EVENT_TYPE)13) // Mark when a video recording has been resumed +#define FIT_CAMERA_EVENT_TYPE_VIDEO_SECOND_STREAM_RESUME ((FIT_CAMERA_EVENT_TYPE)14) +#define FIT_CAMERA_EVENT_TYPE_COUNT 13 + +typedef FIT_ENUM FIT_SENSOR_TYPE; +#define FIT_SENSOR_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_SENSOR_TYPE_ACCELEROMETER ((FIT_SENSOR_TYPE)0) +#define FIT_SENSOR_TYPE_GYROSCOPE ((FIT_SENSOR_TYPE)1) +#define FIT_SENSOR_TYPE_COMPASS ((FIT_SENSOR_TYPE)2) // Magnetometer +#define FIT_SENSOR_TYPE_BAROMETER ((FIT_SENSOR_TYPE)3) +#define FIT_SENSOR_TYPE_COUNT 4 + +typedef FIT_ENUM FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE; +#define FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE_AUTO ((FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE)0) +#define FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE_INDIVIDUAL ((FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE)4) +#define FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE_HIGH_VISIBILITY ((FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE)5) +#define FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE_TRAIL ((FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE)6) +#define FIT_BIKE_LIGHT_NETWORK_CONFIG_TYPE_COUNT 4 + +typedef FIT_UINT16 FIT_COMM_TIMEOUT_TYPE; +#define FIT_COMM_TIMEOUT_TYPE_INVALID FIT_UINT16_INVALID +#define FIT_COMM_TIMEOUT_TYPE_WILDCARD_PAIRING_TIMEOUT ((FIT_COMM_TIMEOUT_TYPE)0) // Timeout pairing to any device +#define FIT_COMM_TIMEOUT_TYPE_PAIRING_TIMEOUT ((FIT_COMM_TIMEOUT_TYPE)1) // Timeout pairing to previously paired device +#define FIT_COMM_TIMEOUT_TYPE_CONNECTION_LOST ((FIT_COMM_TIMEOUT_TYPE)2) // Temporary loss of communications +#define FIT_COMM_TIMEOUT_TYPE_CONNECTION_TIMEOUT ((FIT_COMM_TIMEOUT_TYPE)3) // Connection closed due to extended bad communications +#define FIT_COMM_TIMEOUT_TYPE_COUNT 4 + +typedef FIT_ENUM FIT_CAMERA_ORIENTATION_TYPE; +#define FIT_CAMERA_ORIENTATION_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_CAMERA_ORIENTATION_TYPE_CAMERA_ORIENTATION_0 ((FIT_CAMERA_ORIENTATION_TYPE)0) +#define FIT_CAMERA_ORIENTATION_TYPE_CAMERA_ORIENTATION_90 ((FIT_CAMERA_ORIENTATION_TYPE)1) +#define FIT_CAMERA_ORIENTATION_TYPE_CAMERA_ORIENTATION_180 ((FIT_CAMERA_ORIENTATION_TYPE)2) +#define FIT_CAMERA_ORIENTATION_TYPE_CAMERA_ORIENTATION_270 ((FIT_CAMERA_ORIENTATION_TYPE)3) +#define FIT_CAMERA_ORIENTATION_TYPE_COUNT 4 + +typedef FIT_ENUM FIT_ATTITUDE_STAGE; +#define FIT_ATTITUDE_STAGE_INVALID FIT_ENUM_INVALID +#define FIT_ATTITUDE_STAGE_FAILED ((FIT_ATTITUDE_STAGE)0) +#define FIT_ATTITUDE_STAGE_ALIGNING ((FIT_ATTITUDE_STAGE)1) +#define FIT_ATTITUDE_STAGE_DEGRADED ((FIT_ATTITUDE_STAGE)2) +#define FIT_ATTITUDE_STAGE_VALID ((FIT_ATTITUDE_STAGE)3) +#define FIT_ATTITUDE_STAGE_COUNT 4 + +typedef FIT_UINT16 FIT_ATTITUDE_VALIDITY; +#define FIT_ATTITUDE_VALIDITY_INVALID FIT_UINT16_INVALID +#define FIT_ATTITUDE_VALIDITY_TRACK_ANGLE_HEADING_VALID ((FIT_ATTITUDE_VALIDITY)0x0001) +#define FIT_ATTITUDE_VALIDITY_PITCH_VALID ((FIT_ATTITUDE_VALIDITY)0x0002) +#define FIT_ATTITUDE_VALIDITY_ROLL_VALID ((FIT_ATTITUDE_VALIDITY)0x0004) +#define FIT_ATTITUDE_VALIDITY_LATERAL_BODY_ACCEL_VALID ((FIT_ATTITUDE_VALIDITY)0x0008) +#define FIT_ATTITUDE_VALIDITY_NORMAL_BODY_ACCEL_VALID ((FIT_ATTITUDE_VALIDITY)0x0010) +#define FIT_ATTITUDE_VALIDITY_TURN_RATE_VALID ((FIT_ATTITUDE_VALIDITY)0x0020) +#define FIT_ATTITUDE_VALIDITY_HW_FAIL ((FIT_ATTITUDE_VALIDITY)0x0040) +#define FIT_ATTITUDE_VALIDITY_MAG_INVALID ((FIT_ATTITUDE_VALIDITY)0x0080) +#define FIT_ATTITUDE_VALIDITY_NO_GPS ((FIT_ATTITUDE_VALIDITY)0x0100) +#define FIT_ATTITUDE_VALIDITY_GPS_INVALID ((FIT_ATTITUDE_VALIDITY)0x0200) +#define FIT_ATTITUDE_VALIDITY_SOLUTION_COASTING ((FIT_ATTITUDE_VALIDITY)0x0400) +#define FIT_ATTITUDE_VALIDITY_TRUE_TRACK_ANGLE ((FIT_ATTITUDE_VALIDITY)0x0800) +#define FIT_ATTITUDE_VALIDITY_MAGNETIC_HEADING ((FIT_ATTITUDE_VALIDITY)0x1000) +#define FIT_ATTITUDE_VALIDITY_COUNT 13 + +typedef FIT_ENUM FIT_AUTO_SYNC_FREQUENCY; +#define FIT_AUTO_SYNC_FREQUENCY_INVALID FIT_ENUM_INVALID +#define FIT_AUTO_SYNC_FREQUENCY_NEVER ((FIT_AUTO_SYNC_FREQUENCY)0) +#define FIT_AUTO_SYNC_FREQUENCY_OCCASIONALLY ((FIT_AUTO_SYNC_FREQUENCY)1) +#define FIT_AUTO_SYNC_FREQUENCY_FREQUENT ((FIT_AUTO_SYNC_FREQUENCY)2) +#define FIT_AUTO_SYNC_FREQUENCY_ONCE_A_DAY ((FIT_AUTO_SYNC_FREQUENCY)3) +#define FIT_AUTO_SYNC_FREQUENCY_REMOTE ((FIT_AUTO_SYNC_FREQUENCY)4) +#define FIT_AUTO_SYNC_FREQUENCY_COUNT 5 + +typedef FIT_ENUM FIT_EXD_LAYOUT; +#define FIT_EXD_LAYOUT_INVALID FIT_ENUM_INVALID +#define FIT_EXD_LAYOUT_FULL_SCREEN ((FIT_EXD_LAYOUT)0) +#define FIT_EXD_LAYOUT_HALF_VERTICAL ((FIT_EXD_LAYOUT)1) +#define FIT_EXD_LAYOUT_HALF_HORIZONTAL ((FIT_EXD_LAYOUT)2) +#define FIT_EXD_LAYOUT_HALF_VERTICAL_RIGHT_SPLIT ((FIT_EXD_LAYOUT)3) +#define FIT_EXD_LAYOUT_HALF_HORIZONTAL_BOTTOM_SPLIT ((FIT_EXD_LAYOUT)4) +#define FIT_EXD_LAYOUT_FULL_QUARTER_SPLIT ((FIT_EXD_LAYOUT)5) +#define FIT_EXD_LAYOUT_HALF_VERTICAL_LEFT_SPLIT ((FIT_EXD_LAYOUT)6) +#define FIT_EXD_LAYOUT_HALF_HORIZONTAL_TOP_SPLIT ((FIT_EXD_LAYOUT)7) +#define FIT_EXD_LAYOUT_DYNAMIC ((FIT_EXD_LAYOUT)8) // The EXD may display the configured concepts in any layout it sees fit. +#define FIT_EXD_LAYOUT_COUNT 9 + +typedef FIT_ENUM FIT_EXD_DISPLAY_TYPE; +#define FIT_EXD_DISPLAY_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_EXD_DISPLAY_TYPE_NUMERICAL ((FIT_EXD_DISPLAY_TYPE)0) +#define FIT_EXD_DISPLAY_TYPE_SIMPLE ((FIT_EXD_DISPLAY_TYPE)1) +#define FIT_EXD_DISPLAY_TYPE_GRAPH ((FIT_EXD_DISPLAY_TYPE)2) +#define FIT_EXD_DISPLAY_TYPE_BAR ((FIT_EXD_DISPLAY_TYPE)3) +#define FIT_EXD_DISPLAY_TYPE_CIRCLE_GRAPH ((FIT_EXD_DISPLAY_TYPE)4) +#define FIT_EXD_DISPLAY_TYPE_VIRTUAL_PARTNER ((FIT_EXD_DISPLAY_TYPE)5) +#define FIT_EXD_DISPLAY_TYPE_BALANCE ((FIT_EXD_DISPLAY_TYPE)6) +#define FIT_EXD_DISPLAY_TYPE_STRING_LIST ((FIT_EXD_DISPLAY_TYPE)7) +#define FIT_EXD_DISPLAY_TYPE_STRING ((FIT_EXD_DISPLAY_TYPE)8) +#define FIT_EXD_DISPLAY_TYPE_SIMPLE_DYNAMIC_ICON ((FIT_EXD_DISPLAY_TYPE)9) +#define FIT_EXD_DISPLAY_TYPE_GAUGE ((FIT_EXD_DISPLAY_TYPE)10) +#define FIT_EXD_DISPLAY_TYPE_COUNT 11 + +typedef FIT_ENUM FIT_EXD_DATA_UNITS; +#define FIT_EXD_DATA_UNITS_INVALID FIT_ENUM_INVALID +#define FIT_EXD_DATA_UNITS_NO_UNITS ((FIT_EXD_DATA_UNITS)0) +#define FIT_EXD_DATA_UNITS_LAPS ((FIT_EXD_DATA_UNITS)1) +#define FIT_EXD_DATA_UNITS_MILES_PER_HOUR ((FIT_EXD_DATA_UNITS)2) +#define FIT_EXD_DATA_UNITS_KILOMETERS_PER_HOUR ((FIT_EXD_DATA_UNITS)3) +#define FIT_EXD_DATA_UNITS_FEET_PER_HOUR ((FIT_EXD_DATA_UNITS)4) +#define FIT_EXD_DATA_UNITS_METERS_PER_HOUR ((FIT_EXD_DATA_UNITS)5) +#define FIT_EXD_DATA_UNITS_DEGREES_CELSIUS ((FIT_EXD_DATA_UNITS)6) +#define FIT_EXD_DATA_UNITS_DEGREES_FARENHEIT ((FIT_EXD_DATA_UNITS)7) +#define FIT_EXD_DATA_UNITS_ZONE ((FIT_EXD_DATA_UNITS)8) +#define FIT_EXD_DATA_UNITS_GEAR ((FIT_EXD_DATA_UNITS)9) +#define FIT_EXD_DATA_UNITS_RPM ((FIT_EXD_DATA_UNITS)10) +#define FIT_EXD_DATA_UNITS_BPM ((FIT_EXD_DATA_UNITS)11) +#define FIT_EXD_DATA_UNITS_DEGREES ((FIT_EXD_DATA_UNITS)12) +#define FIT_EXD_DATA_UNITS_MILLIMETERS ((FIT_EXD_DATA_UNITS)13) +#define FIT_EXD_DATA_UNITS_METERS ((FIT_EXD_DATA_UNITS)14) +#define FIT_EXD_DATA_UNITS_KILOMETERS ((FIT_EXD_DATA_UNITS)15) +#define FIT_EXD_DATA_UNITS_FEET ((FIT_EXD_DATA_UNITS)16) +#define FIT_EXD_DATA_UNITS_YARDS ((FIT_EXD_DATA_UNITS)17) +#define FIT_EXD_DATA_UNITS_KILOFEET ((FIT_EXD_DATA_UNITS)18) +#define FIT_EXD_DATA_UNITS_MILES ((FIT_EXD_DATA_UNITS)19) +#define FIT_EXD_DATA_UNITS_TIME ((FIT_EXD_DATA_UNITS)20) +#define FIT_EXD_DATA_UNITS_ENUM_TURN_TYPE ((FIT_EXD_DATA_UNITS)21) +#define FIT_EXD_DATA_UNITS_PERCENT ((FIT_EXD_DATA_UNITS)22) +#define FIT_EXD_DATA_UNITS_WATTS ((FIT_EXD_DATA_UNITS)23) +#define FIT_EXD_DATA_UNITS_WATTS_PER_KILOGRAM ((FIT_EXD_DATA_UNITS)24) +#define FIT_EXD_DATA_UNITS_ENUM_BATTERY_STATUS ((FIT_EXD_DATA_UNITS)25) +#define FIT_EXD_DATA_UNITS_ENUM_BIKE_LIGHT_BEAM_ANGLE_MODE ((FIT_EXD_DATA_UNITS)26) +#define FIT_EXD_DATA_UNITS_ENUM_BIKE_LIGHT_BATTERY_STATUS ((FIT_EXD_DATA_UNITS)27) +#define FIT_EXD_DATA_UNITS_ENUM_BIKE_LIGHT_NETWORK_CONFIG_TYPE ((FIT_EXD_DATA_UNITS)28) +#define FIT_EXD_DATA_UNITS_LIGHTS ((FIT_EXD_DATA_UNITS)29) +#define FIT_EXD_DATA_UNITS_SECONDS ((FIT_EXD_DATA_UNITS)30) +#define FIT_EXD_DATA_UNITS_MINUTES ((FIT_EXD_DATA_UNITS)31) +#define FIT_EXD_DATA_UNITS_HOURS ((FIT_EXD_DATA_UNITS)32) +#define FIT_EXD_DATA_UNITS_CALORIES ((FIT_EXD_DATA_UNITS)33) +#define FIT_EXD_DATA_UNITS_KILOJOULES ((FIT_EXD_DATA_UNITS)34) +#define FIT_EXD_DATA_UNITS_MILLISECONDS ((FIT_EXD_DATA_UNITS)35) +#define FIT_EXD_DATA_UNITS_SECOND_PER_MILE ((FIT_EXD_DATA_UNITS)36) +#define FIT_EXD_DATA_UNITS_SECOND_PER_KILOMETER ((FIT_EXD_DATA_UNITS)37) +#define FIT_EXD_DATA_UNITS_CENTIMETER ((FIT_EXD_DATA_UNITS)38) +#define FIT_EXD_DATA_UNITS_ENUM_COURSE_POINT ((FIT_EXD_DATA_UNITS)39) +#define FIT_EXD_DATA_UNITS_BRADIANS ((FIT_EXD_DATA_UNITS)40) +#define FIT_EXD_DATA_UNITS_ENUM_SPORT ((FIT_EXD_DATA_UNITS)41) +#define FIT_EXD_DATA_UNITS_INCHES_HG ((FIT_EXD_DATA_UNITS)42) +#define FIT_EXD_DATA_UNITS_MM_HG ((FIT_EXD_DATA_UNITS)43) +#define FIT_EXD_DATA_UNITS_MBARS ((FIT_EXD_DATA_UNITS)44) +#define FIT_EXD_DATA_UNITS_HECTO_PASCALS ((FIT_EXD_DATA_UNITS)45) +#define FIT_EXD_DATA_UNITS_FEET_PER_MIN ((FIT_EXD_DATA_UNITS)46) +#define FIT_EXD_DATA_UNITS_METERS_PER_MIN ((FIT_EXD_DATA_UNITS)47) +#define FIT_EXD_DATA_UNITS_METERS_PER_SEC ((FIT_EXD_DATA_UNITS)48) +#define FIT_EXD_DATA_UNITS_EIGHT_CARDINAL ((FIT_EXD_DATA_UNITS)49) +#define FIT_EXD_DATA_UNITS_COUNT 50 + +typedef FIT_ENUM FIT_EXD_QUALIFIERS; +#define FIT_EXD_QUALIFIERS_INVALID FIT_ENUM_INVALID +#define FIT_EXD_QUALIFIERS_NO_QUALIFIER ((FIT_EXD_QUALIFIERS)0) +#define FIT_EXD_QUALIFIERS_INSTANTANEOUS ((FIT_EXD_QUALIFIERS)1) +#define FIT_EXD_QUALIFIERS_AVERAGE ((FIT_EXD_QUALIFIERS)2) +#define FIT_EXD_QUALIFIERS_LAP ((FIT_EXD_QUALIFIERS)3) +#define FIT_EXD_QUALIFIERS_MAXIMUM ((FIT_EXD_QUALIFIERS)4) +#define FIT_EXD_QUALIFIERS_MAXIMUM_AVERAGE ((FIT_EXD_QUALIFIERS)5) +#define FIT_EXD_QUALIFIERS_MAXIMUM_LAP ((FIT_EXD_QUALIFIERS)6) +#define FIT_EXD_QUALIFIERS_LAST_LAP ((FIT_EXD_QUALIFIERS)7) +#define FIT_EXD_QUALIFIERS_AVERAGE_LAP ((FIT_EXD_QUALIFIERS)8) +#define FIT_EXD_QUALIFIERS_TO_DESTINATION ((FIT_EXD_QUALIFIERS)9) +#define FIT_EXD_QUALIFIERS_TO_GO ((FIT_EXD_QUALIFIERS)10) +#define FIT_EXD_QUALIFIERS_TO_NEXT ((FIT_EXD_QUALIFIERS)11) +#define FIT_EXD_QUALIFIERS_NEXT_COURSE_POINT ((FIT_EXD_QUALIFIERS)12) +#define FIT_EXD_QUALIFIERS_TOTAL ((FIT_EXD_QUALIFIERS)13) +#define FIT_EXD_QUALIFIERS_THREE_SECOND_AVERAGE ((FIT_EXD_QUALIFIERS)14) +#define FIT_EXD_QUALIFIERS_TEN_SECOND_AVERAGE ((FIT_EXD_QUALIFIERS)15) +#define FIT_EXD_QUALIFIERS_THIRTY_SECOND_AVERAGE ((FIT_EXD_QUALIFIERS)16) +#define FIT_EXD_QUALIFIERS_PERCENT_MAXIMUM ((FIT_EXD_QUALIFIERS)17) +#define FIT_EXD_QUALIFIERS_PERCENT_MAXIMUM_AVERAGE ((FIT_EXD_QUALIFIERS)18) +#define FIT_EXD_QUALIFIERS_LAP_PERCENT_MAXIMUM ((FIT_EXD_QUALIFIERS)19) +#define FIT_EXD_QUALIFIERS_ELAPSED ((FIT_EXD_QUALIFIERS)20) +#define FIT_EXD_QUALIFIERS_SUNRISE ((FIT_EXD_QUALIFIERS)21) +#define FIT_EXD_QUALIFIERS_SUNSET ((FIT_EXD_QUALIFIERS)22) +#define FIT_EXD_QUALIFIERS_COMPARED_TO_VIRTUAL_PARTNER ((FIT_EXD_QUALIFIERS)23) +#define FIT_EXD_QUALIFIERS_MAXIMUM_24H ((FIT_EXD_QUALIFIERS)24) +#define FIT_EXD_QUALIFIERS_MINIMUM_24H ((FIT_EXD_QUALIFIERS)25) +#define FIT_EXD_QUALIFIERS_MINIMUM ((FIT_EXD_QUALIFIERS)26) +#define FIT_EXD_QUALIFIERS_FIRST ((FIT_EXD_QUALIFIERS)27) +#define FIT_EXD_QUALIFIERS_SECOND ((FIT_EXD_QUALIFIERS)28) +#define FIT_EXD_QUALIFIERS_THIRD ((FIT_EXD_QUALIFIERS)29) +#define FIT_EXD_QUALIFIERS_SHIFTER ((FIT_EXD_QUALIFIERS)30) +#define FIT_EXD_QUALIFIERS_LAST_SPORT ((FIT_EXD_QUALIFIERS)31) +#define FIT_EXD_QUALIFIERS_MOVING ((FIT_EXD_QUALIFIERS)32) +#define FIT_EXD_QUALIFIERS_STOPPED ((FIT_EXD_QUALIFIERS)33) +#define FIT_EXD_QUALIFIERS_ESTIMATED_TOTAL ((FIT_EXD_QUALIFIERS)34) +#define FIT_EXD_QUALIFIERS_ZONE_9 ((FIT_EXD_QUALIFIERS)242) +#define FIT_EXD_QUALIFIERS_ZONE_8 ((FIT_EXD_QUALIFIERS)243) +#define FIT_EXD_QUALIFIERS_ZONE_7 ((FIT_EXD_QUALIFIERS)244) +#define FIT_EXD_QUALIFIERS_ZONE_6 ((FIT_EXD_QUALIFIERS)245) +#define FIT_EXD_QUALIFIERS_ZONE_5 ((FIT_EXD_QUALIFIERS)246) +#define FIT_EXD_QUALIFIERS_ZONE_4 ((FIT_EXD_QUALIFIERS)247) +#define FIT_EXD_QUALIFIERS_ZONE_3 ((FIT_EXD_QUALIFIERS)248) +#define FIT_EXD_QUALIFIERS_ZONE_2 ((FIT_EXD_QUALIFIERS)249) +#define FIT_EXD_QUALIFIERS_ZONE_1 ((FIT_EXD_QUALIFIERS)250) +#define FIT_EXD_QUALIFIERS_COUNT 44 + +typedef FIT_ENUM FIT_EXD_DESCRIPTORS; +#define FIT_EXD_DESCRIPTORS_INVALID FIT_ENUM_INVALID +#define FIT_EXD_DESCRIPTORS_BIKE_LIGHT_BATTERY_STATUS ((FIT_EXD_DESCRIPTORS)0) +#define FIT_EXD_DESCRIPTORS_BEAM_ANGLE_STATUS ((FIT_EXD_DESCRIPTORS)1) +#define FIT_EXD_DESCRIPTORS_BATERY_LEVEL ((FIT_EXD_DESCRIPTORS)2) +#define FIT_EXD_DESCRIPTORS_LIGHT_NETWORK_MODE ((FIT_EXD_DESCRIPTORS)3) +#define FIT_EXD_DESCRIPTORS_NUMBER_LIGHTS_CONNECTED ((FIT_EXD_DESCRIPTORS)4) +#define FIT_EXD_DESCRIPTORS_CADENCE ((FIT_EXD_DESCRIPTORS)5) +#define FIT_EXD_DESCRIPTORS_DISTANCE ((FIT_EXD_DESCRIPTORS)6) +#define FIT_EXD_DESCRIPTORS_ESTIMATED_TIME_OF_ARRIVAL ((FIT_EXD_DESCRIPTORS)7) +#define FIT_EXD_DESCRIPTORS_HEADING ((FIT_EXD_DESCRIPTORS)8) +#define FIT_EXD_DESCRIPTORS_TIME ((FIT_EXD_DESCRIPTORS)9) +#define FIT_EXD_DESCRIPTORS_BATTERY_LEVEL ((FIT_EXD_DESCRIPTORS)10) +#define FIT_EXD_DESCRIPTORS_TRAINER_RESISTANCE ((FIT_EXD_DESCRIPTORS)11) +#define FIT_EXD_DESCRIPTORS_TRAINER_TARGET_POWER ((FIT_EXD_DESCRIPTORS)12) +#define FIT_EXD_DESCRIPTORS_TIME_SEATED ((FIT_EXD_DESCRIPTORS)13) +#define FIT_EXD_DESCRIPTORS_TIME_STANDING ((FIT_EXD_DESCRIPTORS)14) +#define FIT_EXD_DESCRIPTORS_ELEVATION ((FIT_EXD_DESCRIPTORS)15) +#define FIT_EXD_DESCRIPTORS_GRADE ((FIT_EXD_DESCRIPTORS)16) +#define FIT_EXD_DESCRIPTORS_ASCENT ((FIT_EXD_DESCRIPTORS)17) +#define FIT_EXD_DESCRIPTORS_DESCENT ((FIT_EXD_DESCRIPTORS)18) +#define FIT_EXD_DESCRIPTORS_VERTICAL_SPEED ((FIT_EXD_DESCRIPTORS)19) +#define FIT_EXD_DESCRIPTORS_DI2_BATTERY_LEVEL ((FIT_EXD_DESCRIPTORS)20) +#define FIT_EXD_DESCRIPTORS_FRONT_GEAR ((FIT_EXD_DESCRIPTORS)21) +#define FIT_EXD_DESCRIPTORS_REAR_GEAR ((FIT_EXD_DESCRIPTORS)22) +#define FIT_EXD_DESCRIPTORS_GEAR_RATIO ((FIT_EXD_DESCRIPTORS)23) +#define FIT_EXD_DESCRIPTORS_HEART_RATE ((FIT_EXD_DESCRIPTORS)24) +#define FIT_EXD_DESCRIPTORS_HEART_RATE_ZONE ((FIT_EXD_DESCRIPTORS)25) +#define FIT_EXD_DESCRIPTORS_TIME_IN_HEART_RATE_ZONE ((FIT_EXD_DESCRIPTORS)26) +#define FIT_EXD_DESCRIPTORS_HEART_RATE_RESERVE ((FIT_EXD_DESCRIPTORS)27) +#define FIT_EXD_DESCRIPTORS_CALORIES ((FIT_EXD_DESCRIPTORS)28) +#define FIT_EXD_DESCRIPTORS_GPS_ACCURACY ((FIT_EXD_DESCRIPTORS)29) +#define FIT_EXD_DESCRIPTORS_GPS_SIGNAL_STRENGTH ((FIT_EXD_DESCRIPTORS)30) +#define FIT_EXD_DESCRIPTORS_TEMPERATURE ((FIT_EXD_DESCRIPTORS)31) +#define FIT_EXD_DESCRIPTORS_TIME_OF_DAY ((FIT_EXD_DESCRIPTORS)32) +#define FIT_EXD_DESCRIPTORS_BALANCE ((FIT_EXD_DESCRIPTORS)33) +#define FIT_EXD_DESCRIPTORS_PEDAL_SMOOTHNESS ((FIT_EXD_DESCRIPTORS)34) +#define FIT_EXD_DESCRIPTORS_POWER ((FIT_EXD_DESCRIPTORS)35) +#define FIT_EXD_DESCRIPTORS_FUNCTIONAL_THRESHOLD_POWER ((FIT_EXD_DESCRIPTORS)36) +#define FIT_EXD_DESCRIPTORS_INTENSITY_FACTOR ((FIT_EXD_DESCRIPTORS)37) +#define FIT_EXD_DESCRIPTORS_WORK ((FIT_EXD_DESCRIPTORS)38) +#define FIT_EXD_DESCRIPTORS_POWER_RATIO ((FIT_EXD_DESCRIPTORS)39) +#define FIT_EXD_DESCRIPTORS_NORMALIZED_POWER ((FIT_EXD_DESCRIPTORS)40) +#define FIT_EXD_DESCRIPTORS_TRAINING_STRESS_SCORE ((FIT_EXD_DESCRIPTORS)41) +#define FIT_EXD_DESCRIPTORS_TIME_ON_ZONE ((FIT_EXD_DESCRIPTORS)42) +#define FIT_EXD_DESCRIPTORS_SPEED ((FIT_EXD_DESCRIPTORS)43) +#define FIT_EXD_DESCRIPTORS_LAPS ((FIT_EXD_DESCRIPTORS)44) +#define FIT_EXD_DESCRIPTORS_REPS ((FIT_EXD_DESCRIPTORS)45) +#define FIT_EXD_DESCRIPTORS_WORKOUT_STEP ((FIT_EXD_DESCRIPTORS)46) +#define FIT_EXD_DESCRIPTORS_COURSE_DISTANCE ((FIT_EXD_DESCRIPTORS)47) +#define FIT_EXD_DESCRIPTORS_NAVIGATION_DISTANCE ((FIT_EXD_DESCRIPTORS)48) +#define FIT_EXD_DESCRIPTORS_COURSE_ESTIMATED_TIME_OF_ARRIVAL ((FIT_EXD_DESCRIPTORS)49) +#define FIT_EXD_DESCRIPTORS_NAVIGATION_ESTIMATED_TIME_OF_ARRIVAL ((FIT_EXD_DESCRIPTORS)50) +#define FIT_EXD_DESCRIPTORS_COURSE_TIME ((FIT_EXD_DESCRIPTORS)51) +#define FIT_EXD_DESCRIPTORS_NAVIGATION_TIME ((FIT_EXD_DESCRIPTORS)52) +#define FIT_EXD_DESCRIPTORS_COURSE_HEADING ((FIT_EXD_DESCRIPTORS)53) +#define FIT_EXD_DESCRIPTORS_NAVIGATION_HEADING ((FIT_EXD_DESCRIPTORS)54) +#define FIT_EXD_DESCRIPTORS_POWER_ZONE ((FIT_EXD_DESCRIPTORS)55) +#define FIT_EXD_DESCRIPTORS_TORQUE_EFFECTIVENESS ((FIT_EXD_DESCRIPTORS)56) +#define FIT_EXD_DESCRIPTORS_TIMER_TIME ((FIT_EXD_DESCRIPTORS)57) +#define FIT_EXD_DESCRIPTORS_POWER_WEIGHT_RATIO ((FIT_EXD_DESCRIPTORS)58) +#define FIT_EXD_DESCRIPTORS_LEFT_PLATFORM_CENTER_OFFSET ((FIT_EXD_DESCRIPTORS)59) +#define FIT_EXD_DESCRIPTORS_RIGHT_PLATFORM_CENTER_OFFSET ((FIT_EXD_DESCRIPTORS)60) +#define FIT_EXD_DESCRIPTORS_LEFT_POWER_PHASE_START_ANGLE ((FIT_EXD_DESCRIPTORS)61) +#define FIT_EXD_DESCRIPTORS_RIGHT_POWER_PHASE_START_ANGLE ((FIT_EXD_DESCRIPTORS)62) +#define FIT_EXD_DESCRIPTORS_LEFT_POWER_PHASE_FINISH_ANGLE ((FIT_EXD_DESCRIPTORS)63) +#define FIT_EXD_DESCRIPTORS_RIGHT_POWER_PHASE_FINISH_ANGLE ((FIT_EXD_DESCRIPTORS)64) +#define FIT_EXD_DESCRIPTORS_GEARS ((FIT_EXD_DESCRIPTORS)65) // Combined gear information +#define FIT_EXD_DESCRIPTORS_PACE ((FIT_EXD_DESCRIPTORS)66) +#define FIT_EXD_DESCRIPTORS_TRAINING_EFFECT ((FIT_EXD_DESCRIPTORS)67) +#define FIT_EXD_DESCRIPTORS_VERTICAL_OSCILLATION ((FIT_EXD_DESCRIPTORS)68) +#define FIT_EXD_DESCRIPTORS_VERTICAL_RATIO ((FIT_EXD_DESCRIPTORS)69) +#define FIT_EXD_DESCRIPTORS_GROUND_CONTACT_TIME ((FIT_EXD_DESCRIPTORS)70) +#define FIT_EXD_DESCRIPTORS_LEFT_GROUND_CONTACT_TIME_BALANCE ((FIT_EXD_DESCRIPTORS)71) +#define FIT_EXD_DESCRIPTORS_RIGHT_GROUND_CONTACT_TIME_BALANCE ((FIT_EXD_DESCRIPTORS)72) +#define FIT_EXD_DESCRIPTORS_STRIDE_LENGTH ((FIT_EXD_DESCRIPTORS)73) +#define FIT_EXD_DESCRIPTORS_RUNNING_CADENCE ((FIT_EXD_DESCRIPTORS)74) +#define FIT_EXD_DESCRIPTORS_PERFORMANCE_CONDITION ((FIT_EXD_DESCRIPTORS)75) +#define FIT_EXD_DESCRIPTORS_COURSE_TYPE ((FIT_EXD_DESCRIPTORS)76) +#define FIT_EXD_DESCRIPTORS_TIME_IN_POWER_ZONE ((FIT_EXD_DESCRIPTORS)77) +#define FIT_EXD_DESCRIPTORS_NAVIGATION_TURN ((FIT_EXD_DESCRIPTORS)78) +#define FIT_EXD_DESCRIPTORS_COURSE_LOCATION ((FIT_EXD_DESCRIPTORS)79) +#define FIT_EXD_DESCRIPTORS_NAVIGATION_LOCATION ((FIT_EXD_DESCRIPTORS)80) +#define FIT_EXD_DESCRIPTORS_COMPASS ((FIT_EXD_DESCRIPTORS)81) +#define FIT_EXD_DESCRIPTORS_GEAR_COMBO ((FIT_EXD_DESCRIPTORS)82) +#define FIT_EXD_DESCRIPTORS_MUSCLE_OXYGEN ((FIT_EXD_DESCRIPTORS)83) +#define FIT_EXD_DESCRIPTORS_ICON ((FIT_EXD_DESCRIPTORS)84) +#define FIT_EXD_DESCRIPTORS_COMPASS_HEADING ((FIT_EXD_DESCRIPTORS)85) +#define FIT_EXD_DESCRIPTORS_GPS_HEADING ((FIT_EXD_DESCRIPTORS)86) +#define FIT_EXD_DESCRIPTORS_GPS_ELEVATION ((FIT_EXD_DESCRIPTORS)87) +#define FIT_EXD_DESCRIPTORS_ANAEROBIC_TRAINING_EFFECT ((FIT_EXD_DESCRIPTORS)88) +#define FIT_EXD_DESCRIPTORS_COURSE ((FIT_EXD_DESCRIPTORS)89) +#define FIT_EXD_DESCRIPTORS_OFF_COURSE ((FIT_EXD_DESCRIPTORS)90) +#define FIT_EXD_DESCRIPTORS_GLIDE_RATIO ((FIT_EXD_DESCRIPTORS)91) +#define FIT_EXD_DESCRIPTORS_VERTICAL_DISTANCE ((FIT_EXD_DESCRIPTORS)92) +#define FIT_EXD_DESCRIPTORS_VMG ((FIT_EXD_DESCRIPTORS)93) +#define FIT_EXD_DESCRIPTORS_AMBIENT_PRESSURE ((FIT_EXD_DESCRIPTORS)94) +#define FIT_EXD_DESCRIPTORS_PRESSURE ((FIT_EXD_DESCRIPTORS)95) +#define FIT_EXD_DESCRIPTORS_VAM ((FIT_EXD_DESCRIPTORS)96) +#define FIT_EXD_DESCRIPTORS_COUNT 97 + +typedef FIT_UINT32 FIT_AUTO_ACTIVITY_DETECT; +#define FIT_AUTO_ACTIVITY_DETECT_INVALID FIT_UINT32_INVALID +#define FIT_AUTO_ACTIVITY_DETECT_NONE ((FIT_AUTO_ACTIVITY_DETECT)0x00000000) +#define FIT_AUTO_ACTIVITY_DETECT_RUNNING ((FIT_AUTO_ACTIVITY_DETECT)0x00000001) +#define FIT_AUTO_ACTIVITY_DETECT_CYCLING ((FIT_AUTO_ACTIVITY_DETECT)0x00000002) +#define FIT_AUTO_ACTIVITY_DETECT_SWIMMING ((FIT_AUTO_ACTIVITY_DETECT)0x00000004) +#define FIT_AUTO_ACTIVITY_DETECT_WALKING ((FIT_AUTO_ACTIVITY_DETECT)0x00000008) +#define FIT_AUTO_ACTIVITY_DETECT_ELLIPTICAL ((FIT_AUTO_ACTIVITY_DETECT)0x00000020) +#define FIT_AUTO_ACTIVITY_DETECT_SEDENTARY ((FIT_AUTO_ACTIVITY_DETECT)0x00000400) +#define FIT_AUTO_ACTIVITY_DETECT_COUNT 7 + +typedef FIT_UINT32Z FIT_SUPPORTED_EXD_SCREEN_LAYOUTS; +#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_INVALID FIT_UINT32Z_INVALID +#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_FULL_SCREEN ((FIT_SUPPORTED_EXD_SCREEN_LAYOUTS)0x00000001) +#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_HALF_VERTICAL ((FIT_SUPPORTED_EXD_SCREEN_LAYOUTS)0x00000002) +#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_HALF_HORIZONTAL ((FIT_SUPPORTED_EXD_SCREEN_LAYOUTS)0x00000004) +#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_HALF_VERTICAL_RIGHT_SPLIT ((FIT_SUPPORTED_EXD_SCREEN_LAYOUTS)0x00000008) +#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_HALF_HORIZONTAL_BOTTOM_SPLIT ((FIT_SUPPORTED_EXD_SCREEN_LAYOUTS)0x00000010) +#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_FULL_QUARTER_SPLIT ((FIT_SUPPORTED_EXD_SCREEN_LAYOUTS)0x00000020) +#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_HALF_VERTICAL_LEFT_SPLIT ((FIT_SUPPORTED_EXD_SCREEN_LAYOUTS)0x00000040) +#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_HALF_HORIZONTAL_TOP_SPLIT ((FIT_SUPPORTED_EXD_SCREEN_LAYOUTS)0x00000080) +#define FIT_SUPPORTED_EXD_SCREEN_LAYOUTS_COUNT 8 + +typedef FIT_UINT8 FIT_FIT_BASE_TYPE; +#define FIT_FIT_BASE_TYPE_INVALID FIT_UINT8_INVALID +#define FIT_FIT_BASE_TYPE_ENUM ((FIT_FIT_BASE_TYPE)0) +#define FIT_FIT_BASE_TYPE_SINT8 ((FIT_FIT_BASE_TYPE)1) +#define FIT_FIT_BASE_TYPE_UINT8 ((FIT_FIT_BASE_TYPE)2) +#define FIT_FIT_BASE_TYPE_SINT16 ((FIT_FIT_BASE_TYPE)131) +#define FIT_FIT_BASE_TYPE_UINT16 ((FIT_FIT_BASE_TYPE)132) +#define FIT_FIT_BASE_TYPE_SINT32 ((FIT_FIT_BASE_TYPE)133) +#define FIT_FIT_BASE_TYPE_UINT32 ((FIT_FIT_BASE_TYPE)134) +#define FIT_FIT_BASE_TYPE_STRING ((FIT_FIT_BASE_TYPE)7) +#define FIT_FIT_BASE_TYPE_FLOAT32 ((FIT_FIT_BASE_TYPE)136) +#define FIT_FIT_BASE_TYPE_FLOAT64 ((FIT_FIT_BASE_TYPE)137) +#define FIT_FIT_BASE_TYPE_UINT8Z ((FIT_FIT_BASE_TYPE)10) +#define FIT_FIT_BASE_TYPE_UINT16Z ((FIT_FIT_BASE_TYPE)139) +#define FIT_FIT_BASE_TYPE_UINT32Z ((FIT_FIT_BASE_TYPE)140) +#define FIT_FIT_BASE_TYPE_BYTE ((FIT_FIT_BASE_TYPE)13) +#define FIT_FIT_BASE_TYPE_SINT64 ((FIT_FIT_BASE_TYPE)142) +#define FIT_FIT_BASE_TYPE_UINT64 ((FIT_FIT_BASE_TYPE)143) +#define FIT_FIT_BASE_TYPE_UINT64Z ((FIT_FIT_BASE_TYPE)144) +#define FIT_FIT_BASE_TYPE_COUNT 17 + +typedef FIT_ENUM FIT_TURN_TYPE; +#define FIT_TURN_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_TURN_TYPE_ARRIVING_IDX ((FIT_TURN_TYPE)0) +#define FIT_TURN_TYPE_ARRIVING_LEFT_IDX ((FIT_TURN_TYPE)1) +#define FIT_TURN_TYPE_ARRIVING_RIGHT_IDX ((FIT_TURN_TYPE)2) +#define FIT_TURN_TYPE_ARRIVING_VIA_IDX ((FIT_TURN_TYPE)3) +#define FIT_TURN_TYPE_ARRIVING_VIA_LEFT_IDX ((FIT_TURN_TYPE)4) +#define FIT_TURN_TYPE_ARRIVING_VIA_RIGHT_IDX ((FIT_TURN_TYPE)5) +#define FIT_TURN_TYPE_BEAR_KEEP_LEFT_IDX ((FIT_TURN_TYPE)6) +#define FIT_TURN_TYPE_BEAR_KEEP_RIGHT_IDX ((FIT_TURN_TYPE)7) +#define FIT_TURN_TYPE_CONTINUE_IDX ((FIT_TURN_TYPE)8) +#define FIT_TURN_TYPE_EXIT_LEFT_IDX ((FIT_TURN_TYPE)9) +#define FIT_TURN_TYPE_EXIT_RIGHT_IDX ((FIT_TURN_TYPE)10) +#define FIT_TURN_TYPE_FERRY_IDX ((FIT_TURN_TYPE)11) +#define FIT_TURN_TYPE_ROUNDABOUT_45_IDX ((FIT_TURN_TYPE)12) +#define FIT_TURN_TYPE_ROUNDABOUT_90_IDX ((FIT_TURN_TYPE)13) +#define FIT_TURN_TYPE_ROUNDABOUT_135_IDX ((FIT_TURN_TYPE)14) +#define FIT_TURN_TYPE_ROUNDABOUT_180_IDX ((FIT_TURN_TYPE)15) +#define FIT_TURN_TYPE_ROUNDABOUT_225_IDX ((FIT_TURN_TYPE)16) +#define FIT_TURN_TYPE_ROUNDABOUT_270_IDX ((FIT_TURN_TYPE)17) +#define FIT_TURN_TYPE_ROUNDABOUT_315_IDX ((FIT_TURN_TYPE)18) +#define FIT_TURN_TYPE_ROUNDABOUT_360_IDX ((FIT_TURN_TYPE)19) +#define FIT_TURN_TYPE_ROUNDABOUT_NEG_45_IDX ((FIT_TURN_TYPE)20) +#define FIT_TURN_TYPE_ROUNDABOUT_NEG_90_IDX ((FIT_TURN_TYPE)21) +#define FIT_TURN_TYPE_ROUNDABOUT_NEG_135_IDX ((FIT_TURN_TYPE)22) +#define FIT_TURN_TYPE_ROUNDABOUT_NEG_180_IDX ((FIT_TURN_TYPE)23) +#define FIT_TURN_TYPE_ROUNDABOUT_NEG_225_IDX ((FIT_TURN_TYPE)24) +#define FIT_TURN_TYPE_ROUNDABOUT_NEG_270_IDX ((FIT_TURN_TYPE)25) +#define FIT_TURN_TYPE_ROUNDABOUT_NEG_315_IDX ((FIT_TURN_TYPE)26) +#define FIT_TURN_TYPE_ROUNDABOUT_NEG_360_IDX ((FIT_TURN_TYPE)27) +#define FIT_TURN_TYPE_ROUNDABOUT_GENERIC_IDX ((FIT_TURN_TYPE)28) +#define FIT_TURN_TYPE_ROUNDABOUT_NEG_GENERIC_IDX ((FIT_TURN_TYPE)29) +#define FIT_TURN_TYPE_SHARP_TURN_LEFT_IDX ((FIT_TURN_TYPE)30) +#define FIT_TURN_TYPE_SHARP_TURN_RIGHT_IDX ((FIT_TURN_TYPE)31) +#define FIT_TURN_TYPE_TURN_LEFT_IDX ((FIT_TURN_TYPE)32) +#define FIT_TURN_TYPE_TURN_RIGHT_IDX ((FIT_TURN_TYPE)33) +#define FIT_TURN_TYPE_UTURN_LEFT_IDX ((FIT_TURN_TYPE)34) +#define FIT_TURN_TYPE_UTURN_RIGHT_IDX ((FIT_TURN_TYPE)35) +#define FIT_TURN_TYPE_ICON_INV_IDX ((FIT_TURN_TYPE)36) +#define FIT_TURN_TYPE_ICON_IDX_CNT ((FIT_TURN_TYPE)37) +#define FIT_TURN_TYPE_COUNT 38 + +typedef FIT_UINT8 FIT_BIKE_LIGHT_BEAM_ANGLE_MODE; +#define FIT_BIKE_LIGHT_BEAM_ANGLE_MODE_INVALID FIT_UINT8_INVALID +#define FIT_BIKE_LIGHT_BEAM_ANGLE_MODE_MANUAL ((FIT_BIKE_LIGHT_BEAM_ANGLE_MODE)0) +#define FIT_BIKE_LIGHT_BEAM_ANGLE_MODE_AUTO ((FIT_BIKE_LIGHT_BEAM_ANGLE_MODE)1) +#define FIT_BIKE_LIGHT_BEAM_ANGLE_MODE_COUNT 2 + +typedef FIT_UINT16 FIT_FIT_BASE_UNIT; +#define FIT_FIT_BASE_UNIT_INVALID FIT_UINT16_INVALID +#define FIT_FIT_BASE_UNIT_OTHER ((FIT_FIT_BASE_UNIT)0) +#define FIT_FIT_BASE_UNIT_KILOGRAM ((FIT_FIT_BASE_UNIT)1) +#define FIT_FIT_BASE_UNIT_POUND ((FIT_FIT_BASE_UNIT)2) +#define FIT_FIT_BASE_UNIT_COUNT 3 + +typedef FIT_UINT8 FIT_SET_TYPE; +#define FIT_SET_TYPE_INVALID FIT_UINT8_INVALID +#define FIT_SET_TYPE_REST ((FIT_SET_TYPE)0) +#define FIT_SET_TYPE_ACTIVE ((FIT_SET_TYPE)1) +#define FIT_SET_TYPE_COUNT 2 + +typedef FIT_ENUM FIT_MAX_MET_CATEGORY; +#define FIT_MAX_MET_CATEGORY_INVALID FIT_ENUM_INVALID +#define FIT_MAX_MET_CATEGORY_GENERIC ((FIT_MAX_MET_CATEGORY)0) +#define FIT_MAX_MET_CATEGORY_CYCLING ((FIT_MAX_MET_CATEGORY)1) +#define FIT_MAX_MET_CATEGORY_COUNT 2 + +typedef FIT_UINT16 FIT_EXERCISE_CATEGORY; +#define FIT_EXERCISE_CATEGORY_INVALID FIT_UINT16_INVALID +#define FIT_EXERCISE_CATEGORY_BENCH_PRESS ((FIT_EXERCISE_CATEGORY)0) +#define FIT_EXERCISE_CATEGORY_CALF_RAISE ((FIT_EXERCISE_CATEGORY)1) +#define FIT_EXERCISE_CATEGORY_CARDIO ((FIT_EXERCISE_CATEGORY)2) +#define FIT_EXERCISE_CATEGORY_CARRY ((FIT_EXERCISE_CATEGORY)3) +#define FIT_EXERCISE_CATEGORY_CHOP ((FIT_EXERCISE_CATEGORY)4) +#define FIT_EXERCISE_CATEGORY_CORE ((FIT_EXERCISE_CATEGORY)5) +#define FIT_EXERCISE_CATEGORY_CRUNCH ((FIT_EXERCISE_CATEGORY)6) +#define FIT_EXERCISE_CATEGORY_CURL ((FIT_EXERCISE_CATEGORY)7) +#define FIT_EXERCISE_CATEGORY_DEADLIFT ((FIT_EXERCISE_CATEGORY)8) +#define FIT_EXERCISE_CATEGORY_FLYE ((FIT_EXERCISE_CATEGORY)9) +#define FIT_EXERCISE_CATEGORY_HIP_RAISE ((FIT_EXERCISE_CATEGORY)10) +#define FIT_EXERCISE_CATEGORY_HIP_STABILITY ((FIT_EXERCISE_CATEGORY)11) +#define FIT_EXERCISE_CATEGORY_HIP_SWING ((FIT_EXERCISE_CATEGORY)12) +#define FIT_EXERCISE_CATEGORY_HYPEREXTENSION ((FIT_EXERCISE_CATEGORY)13) +#define FIT_EXERCISE_CATEGORY_LATERAL_RAISE ((FIT_EXERCISE_CATEGORY)14) +#define FIT_EXERCISE_CATEGORY_LEG_CURL ((FIT_EXERCISE_CATEGORY)15) +#define FIT_EXERCISE_CATEGORY_LEG_RAISE ((FIT_EXERCISE_CATEGORY)16) +#define FIT_EXERCISE_CATEGORY_LUNGE ((FIT_EXERCISE_CATEGORY)17) +#define FIT_EXERCISE_CATEGORY_OLYMPIC_LIFT ((FIT_EXERCISE_CATEGORY)18) +#define FIT_EXERCISE_CATEGORY_PLANK ((FIT_EXERCISE_CATEGORY)19) +#define FIT_EXERCISE_CATEGORY_PLYO ((FIT_EXERCISE_CATEGORY)20) +#define FIT_EXERCISE_CATEGORY_PULL_UP ((FIT_EXERCISE_CATEGORY)21) +#define FIT_EXERCISE_CATEGORY_PUSH_UP ((FIT_EXERCISE_CATEGORY)22) +#define FIT_EXERCISE_CATEGORY_ROW ((FIT_EXERCISE_CATEGORY)23) +#define FIT_EXERCISE_CATEGORY_SHOULDER_PRESS ((FIT_EXERCISE_CATEGORY)24) +#define FIT_EXERCISE_CATEGORY_SHOULDER_STABILITY ((FIT_EXERCISE_CATEGORY)25) +#define FIT_EXERCISE_CATEGORY_SHRUG ((FIT_EXERCISE_CATEGORY)26) +#define FIT_EXERCISE_CATEGORY_SIT_UP ((FIT_EXERCISE_CATEGORY)27) +#define FIT_EXERCISE_CATEGORY_SQUAT ((FIT_EXERCISE_CATEGORY)28) +#define FIT_EXERCISE_CATEGORY_TOTAL_BODY ((FIT_EXERCISE_CATEGORY)29) +#define FIT_EXERCISE_CATEGORY_TRICEPS_EXTENSION ((FIT_EXERCISE_CATEGORY)30) +#define FIT_EXERCISE_CATEGORY_WARM_UP ((FIT_EXERCISE_CATEGORY)31) +#define FIT_EXERCISE_CATEGORY_RUN ((FIT_EXERCISE_CATEGORY)32) +#define FIT_EXERCISE_CATEGORY_UNKNOWN ((FIT_EXERCISE_CATEGORY)65534) +#define FIT_EXERCISE_CATEGORY_COUNT 34 + +typedef FIT_UINT16 FIT_BENCH_PRESS_EXERCISE_NAME; +#define FIT_BENCH_PRESS_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_BENCH_PRESS_EXERCISE_NAME_ALTERNATING_DUMBBELL_CHEST_PRESS_ON_SWISS_BALL ((FIT_BENCH_PRESS_EXERCISE_NAME)0) +#define FIT_BENCH_PRESS_EXERCISE_NAME_BARBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)1) +#define FIT_BENCH_PRESS_EXERCISE_NAME_BARBELL_BOARD_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)2) +#define FIT_BENCH_PRESS_EXERCISE_NAME_BARBELL_FLOOR_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)3) +#define FIT_BENCH_PRESS_EXERCISE_NAME_CLOSE_GRIP_BARBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)4) +#define FIT_BENCH_PRESS_EXERCISE_NAME_DECLINE_DUMBBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)5) +#define FIT_BENCH_PRESS_EXERCISE_NAME_DUMBBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)6) +#define FIT_BENCH_PRESS_EXERCISE_NAME_DUMBBELL_FLOOR_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)7) +#define FIT_BENCH_PRESS_EXERCISE_NAME_INCLINE_BARBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)8) +#define FIT_BENCH_PRESS_EXERCISE_NAME_INCLINE_DUMBBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)9) +#define FIT_BENCH_PRESS_EXERCISE_NAME_INCLINE_SMITH_MACHINE_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)10) +#define FIT_BENCH_PRESS_EXERCISE_NAME_ISOMETRIC_BARBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)11) +#define FIT_BENCH_PRESS_EXERCISE_NAME_KETTLEBELL_CHEST_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)12) +#define FIT_BENCH_PRESS_EXERCISE_NAME_NEUTRAL_GRIP_DUMBBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)13) +#define FIT_BENCH_PRESS_EXERCISE_NAME_NEUTRAL_GRIP_DUMBBELL_INCLINE_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)14) +#define FIT_BENCH_PRESS_EXERCISE_NAME_ONE_ARM_FLOOR_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)15) +#define FIT_BENCH_PRESS_EXERCISE_NAME_WEIGHTED_ONE_ARM_FLOOR_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)16) +#define FIT_BENCH_PRESS_EXERCISE_NAME_PARTIAL_LOCKOUT ((FIT_BENCH_PRESS_EXERCISE_NAME)17) +#define FIT_BENCH_PRESS_EXERCISE_NAME_REVERSE_GRIP_BARBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)18) +#define FIT_BENCH_PRESS_EXERCISE_NAME_REVERSE_GRIP_INCLINE_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)19) +#define FIT_BENCH_PRESS_EXERCISE_NAME_SINGLE_ARM_CABLE_CHEST_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)20) +#define FIT_BENCH_PRESS_EXERCISE_NAME_SINGLE_ARM_DUMBBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)21) +#define FIT_BENCH_PRESS_EXERCISE_NAME_SMITH_MACHINE_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)22) +#define FIT_BENCH_PRESS_EXERCISE_NAME_SWISS_BALL_DUMBBELL_CHEST_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)23) +#define FIT_BENCH_PRESS_EXERCISE_NAME_TRIPLE_STOP_BARBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)24) +#define FIT_BENCH_PRESS_EXERCISE_NAME_WIDE_GRIP_BARBELL_BENCH_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)25) +#define FIT_BENCH_PRESS_EXERCISE_NAME_ALTERNATING_DUMBBELL_CHEST_PRESS ((FIT_BENCH_PRESS_EXERCISE_NAME)26) +#define FIT_BENCH_PRESS_EXERCISE_NAME_COUNT 27 + +typedef FIT_UINT16 FIT_CALF_RAISE_EXERCISE_NAME; +#define FIT_CALF_RAISE_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_CALF_RAISE_EXERCISE_NAME_3_WAY_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)0) +#define FIT_CALF_RAISE_EXERCISE_NAME_3_WAY_WEIGHTED_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)1) +#define FIT_CALF_RAISE_EXERCISE_NAME_3_WAY_SINGLE_LEG_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)2) +#define FIT_CALF_RAISE_EXERCISE_NAME_3_WAY_WEIGHTED_SINGLE_LEG_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)3) +#define FIT_CALF_RAISE_EXERCISE_NAME_DONKEY_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)4) +#define FIT_CALF_RAISE_EXERCISE_NAME_WEIGHTED_DONKEY_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)5) +#define FIT_CALF_RAISE_EXERCISE_NAME_SEATED_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)6) +#define FIT_CALF_RAISE_EXERCISE_NAME_WEIGHTED_SEATED_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)7) +#define FIT_CALF_RAISE_EXERCISE_NAME_SEATED_DUMBBELL_TOE_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)8) +#define FIT_CALF_RAISE_EXERCISE_NAME_SINGLE_LEG_BENT_KNEE_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)9) +#define FIT_CALF_RAISE_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_BENT_KNEE_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)10) +#define FIT_CALF_RAISE_EXERCISE_NAME_SINGLE_LEG_DECLINE_PUSH_UP ((FIT_CALF_RAISE_EXERCISE_NAME)11) +#define FIT_CALF_RAISE_EXERCISE_NAME_SINGLE_LEG_DONKEY_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)12) +#define FIT_CALF_RAISE_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_DONKEY_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)13) +#define FIT_CALF_RAISE_EXERCISE_NAME_SINGLE_LEG_HIP_RAISE_WITH_KNEE_HOLD ((FIT_CALF_RAISE_EXERCISE_NAME)14) +#define FIT_CALF_RAISE_EXERCISE_NAME_SINGLE_LEG_STANDING_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)15) +#define FIT_CALF_RAISE_EXERCISE_NAME_SINGLE_LEG_STANDING_DUMBBELL_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)16) +#define FIT_CALF_RAISE_EXERCISE_NAME_STANDING_BARBELL_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)17) +#define FIT_CALF_RAISE_EXERCISE_NAME_STANDING_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)18) +#define FIT_CALF_RAISE_EXERCISE_NAME_WEIGHTED_STANDING_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)19) +#define FIT_CALF_RAISE_EXERCISE_NAME_STANDING_DUMBBELL_CALF_RAISE ((FIT_CALF_RAISE_EXERCISE_NAME)20) +#define FIT_CALF_RAISE_EXERCISE_NAME_COUNT 21 + +typedef FIT_UINT16 FIT_CARDIO_EXERCISE_NAME; +#define FIT_CARDIO_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_CARDIO_EXERCISE_NAME_BOB_AND_WEAVE_CIRCLE ((FIT_CARDIO_EXERCISE_NAME)0) +#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_BOB_AND_WEAVE_CIRCLE ((FIT_CARDIO_EXERCISE_NAME)1) +#define FIT_CARDIO_EXERCISE_NAME_CARDIO_CORE_CRAWL ((FIT_CARDIO_EXERCISE_NAME)2) +#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_CARDIO_CORE_CRAWL ((FIT_CARDIO_EXERCISE_NAME)3) +#define FIT_CARDIO_EXERCISE_NAME_DOUBLE_UNDER ((FIT_CARDIO_EXERCISE_NAME)4) +#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_DOUBLE_UNDER ((FIT_CARDIO_EXERCISE_NAME)5) +#define FIT_CARDIO_EXERCISE_NAME_JUMP_ROPE ((FIT_CARDIO_EXERCISE_NAME)6) +#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_JUMP_ROPE ((FIT_CARDIO_EXERCISE_NAME)7) +#define FIT_CARDIO_EXERCISE_NAME_JUMP_ROPE_CROSSOVER ((FIT_CARDIO_EXERCISE_NAME)8) +#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_JUMP_ROPE_CROSSOVER ((FIT_CARDIO_EXERCISE_NAME)9) +#define FIT_CARDIO_EXERCISE_NAME_JUMP_ROPE_JOG ((FIT_CARDIO_EXERCISE_NAME)10) +#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_JUMP_ROPE_JOG ((FIT_CARDIO_EXERCISE_NAME)11) +#define FIT_CARDIO_EXERCISE_NAME_JUMPING_JACKS ((FIT_CARDIO_EXERCISE_NAME)12) +#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_JUMPING_JACKS ((FIT_CARDIO_EXERCISE_NAME)13) +#define FIT_CARDIO_EXERCISE_NAME_SKI_MOGULS ((FIT_CARDIO_EXERCISE_NAME)14) +#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_SKI_MOGULS ((FIT_CARDIO_EXERCISE_NAME)15) +#define FIT_CARDIO_EXERCISE_NAME_SPLIT_JACKS ((FIT_CARDIO_EXERCISE_NAME)16) +#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_SPLIT_JACKS ((FIT_CARDIO_EXERCISE_NAME)17) +#define FIT_CARDIO_EXERCISE_NAME_SQUAT_JACKS ((FIT_CARDIO_EXERCISE_NAME)18) +#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_SQUAT_JACKS ((FIT_CARDIO_EXERCISE_NAME)19) +#define FIT_CARDIO_EXERCISE_NAME_TRIPLE_UNDER ((FIT_CARDIO_EXERCISE_NAME)20) +#define FIT_CARDIO_EXERCISE_NAME_WEIGHTED_TRIPLE_UNDER ((FIT_CARDIO_EXERCISE_NAME)21) +#define FIT_CARDIO_EXERCISE_NAME_COUNT 22 + +typedef FIT_UINT16 FIT_CARRY_EXERCISE_NAME; +#define FIT_CARRY_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_CARRY_EXERCISE_NAME_BAR_HOLDS ((FIT_CARRY_EXERCISE_NAME)0) +#define FIT_CARRY_EXERCISE_NAME_FARMERS_WALK ((FIT_CARRY_EXERCISE_NAME)1) +#define FIT_CARRY_EXERCISE_NAME_FARMERS_WALK_ON_TOES ((FIT_CARRY_EXERCISE_NAME)2) +#define FIT_CARRY_EXERCISE_NAME_HEX_DUMBBELL_HOLD ((FIT_CARRY_EXERCISE_NAME)3) +#define FIT_CARRY_EXERCISE_NAME_OVERHEAD_CARRY ((FIT_CARRY_EXERCISE_NAME)4) +#define FIT_CARRY_EXERCISE_NAME_COUNT 5 + +typedef FIT_UINT16 FIT_CHOP_EXERCISE_NAME; +#define FIT_CHOP_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_CHOP_EXERCISE_NAME_CABLE_PULL_THROUGH ((FIT_CHOP_EXERCISE_NAME)0) +#define FIT_CHOP_EXERCISE_NAME_CABLE_ROTATIONAL_LIFT ((FIT_CHOP_EXERCISE_NAME)1) +#define FIT_CHOP_EXERCISE_NAME_CABLE_WOODCHOP ((FIT_CHOP_EXERCISE_NAME)2) +#define FIT_CHOP_EXERCISE_NAME_CROSS_CHOP_TO_KNEE ((FIT_CHOP_EXERCISE_NAME)3) +#define FIT_CHOP_EXERCISE_NAME_WEIGHTED_CROSS_CHOP_TO_KNEE ((FIT_CHOP_EXERCISE_NAME)4) +#define FIT_CHOP_EXERCISE_NAME_DUMBBELL_CHOP ((FIT_CHOP_EXERCISE_NAME)5) +#define FIT_CHOP_EXERCISE_NAME_HALF_KNEELING_ROTATION ((FIT_CHOP_EXERCISE_NAME)6) +#define FIT_CHOP_EXERCISE_NAME_WEIGHTED_HALF_KNEELING_ROTATION ((FIT_CHOP_EXERCISE_NAME)7) +#define FIT_CHOP_EXERCISE_NAME_HALF_KNEELING_ROTATIONAL_CHOP ((FIT_CHOP_EXERCISE_NAME)8) +#define FIT_CHOP_EXERCISE_NAME_HALF_KNEELING_ROTATIONAL_REVERSE_CHOP ((FIT_CHOP_EXERCISE_NAME)9) +#define FIT_CHOP_EXERCISE_NAME_HALF_KNEELING_STABILITY_CHOP ((FIT_CHOP_EXERCISE_NAME)10) +#define FIT_CHOP_EXERCISE_NAME_HALF_KNEELING_STABILITY_REVERSE_CHOP ((FIT_CHOP_EXERCISE_NAME)11) +#define FIT_CHOP_EXERCISE_NAME_KNEELING_ROTATIONAL_CHOP ((FIT_CHOP_EXERCISE_NAME)12) +#define FIT_CHOP_EXERCISE_NAME_KNEELING_ROTATIONAL_REVERSE_CHOP ((FIT_CHOP_EXERCISE_NAME)13) +#define FIT_CHOP_EXERCISE_NAME_KNEELING_STABILITY_CHOP ((FIT_CHOP_EXERCISE_NAME)14) +#define FIT_CHOP_EXERCISE_NAME_KNEELING_WOODCHOPPER ((FIT_CHOP_EXERCISE_NAME)15) +#define FIT_CHOP_EXERCISE_NAME_MEDICINE_BALL_WOOD_CHOPS ((FIT_CHOP_EXERCISE_NAME)16) +#define FIT_CHOP_EXERCISE_NAME_POWER_SQUAT_CHOPS ((FIT_CHOP_EXERCISE_NAME)17) +#define FIT_CHOP_EXERCISE_NAME_WEIGHTED_POWER_SQUAT_CHOPS ((FIT_CHOP_EXERCISE_NAME)18) +#define FIT_CHOP_EXERCISE_NAME_STANDING_ROTATIONAL_CHOP ((FIT_CHOP_EXERCISE_NAME)19) +#define FIT_CHOP_EXERCISE_NAME_STANDING_SPLIT_ROTATIONAL_CHOP ((FIT_CHOP_EXERCISE_NAME)20) +#define FIT_CHOP_EXERCISE_NAME_STANDING_SPLIT_ROTATIONAL_REVERSE_CHOP ((FIT_CHOP_EXERCISE_NAME)21) +#define FIT_CHOP_EXERCISE_NAME_STANDING_STABILITY_REVERSE_CHOP ((FIT_CHOP_EXERCISE_NAME)22) +#define FIT_CHOP_EXERCISE_NAME_COUNT 23 + +typedef FIT_UINT16 FIT_CORE_EXERCISE_NAME; +#define FIT_CORE_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_CORE_EXERCISE_NAME_ABS_JABS ((FIT_CORE_EXERCISE_NAME)0) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_ABS_JABS ((FIT_CORE_EXERCISE_NAME)1) +#define FIT_CORE_EXERCISE_NAME_ALTERNATING_PLATE_REACH ((FIT_CORE_EXERCISE_NAME)2) +#define FIT_CORE_EXERCISE_NAME_BARBELL_ROLLOUT ((FIT_CORE_EXERCISE_NAME)3) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_BARBELL_ROLLOUT ((FIT_CORE_EXERCISE_NAME)4) +#define FIT_CORE_EXERCISE_NAME_BODY_BAR_OBLIQUE_TWIST ((FIT_CORE_EXERCISE_NAME)5) +#define FIT_CORE_EXERCISE_NAME_CABLE_CORE_PRESS ((FIT_CORE_EXERCISE_NAME)6) +#define FIT_CORE_EXERCISE_NAME_CABLE_SIDE_BEND ((FIT_CORE_EXERCISE_NAME)7) +#define FIT_CORE_EXERCISE_NAME_SIDE_BEND ((FIT_CORE_EXERCISE_NAME)8) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_SIDE_BEND ((FIT_CORE_EXERCISE_NAME)9) +#define FIT_CORE_EXERCISE_NAME_CRESCENT_CIRCLE ((FIT_CORE_EXERCISE_NAME)10) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_CRESCENT_CIRCLE ((FIT_CORE_EXERCISE_NAME)11) +#define FIT_CORE_EXERCISE_NAME_CYCLING_RUSSIAN_TWIST ((FIT_CORE_EXERCISE_NAME)12) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_CYCLING_RUSSIAN_TWIST ((FIT_CORE_EXERCISE_NAME)13) +#define FIT_CORE_EXERCISE_NAME_ELEVATED_FEET_RUSSIAN_TWIST ((FIT_CORE_EXERCISE_NAME)14) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_ELEVATED_FEET_RUSSIAN_TWIST ((FIT_CORE_EXERCISE_NAME)15) +#define FIT_CORE_EXERCISE_NAME_HALF_TURKISH_GET_UP ((FIT_CORE_EXERCISE_NAME)16) +#define FIT_CORE_EXERCISE_NAME_KETTLEBELL_WINDMILL ((FIT_CORE_EXERCISE_NAME)17) +#define FIT_CORE_EXERCISE_NAME_KNEELING_AB_WHEEL ((FIT_CORE_EXERCISE_NAME)18) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_KNEELING_AB_WHEEL ((FIT_CORE_EXERCISE_NAME)19) +#define FIT_CORE_EXERCISE_NAME_MODIFIED_FRONT_LEVER ((FIT_CORE_EXERCISE_NAME)20) +#define FIT_CORE_EXERCISE_NAME_OPEN_KNEE_TUCKS ((FIT_CORE_EXERCISE_NAME)21) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_OPEN_KNEE_TUCKS ((FIT_CORE_EXERCISE_NAME)22) +#define FIT_CORE_EXERCISE_NAME_SIDE_ABS_LEG_LIFT ((FIT_CORE_EXERCISE_NAME)23) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_SIDE_ABS_LEG_LIFT ((FIT_CORE_EXERCISE_NAME)24) +#define FIT_CORE_EXERCISE_NAME_SWISS_BALL_JACKKNIFE ((FIT_CORE_EXERCISE_NAME)25) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_SWISS_BALL_JACKKNIFE ((FIT_CORE_EXERCISE_NAME)26) +#define FIT_CORE_EXERCISE_NAME_SWISS_BALL_PIKE ((FIT_CORE_EXERCISE_NAME)27) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_SWISS_BALL_PIKE ((FIT_CORE_EXERCISE_NAME)28) +#define FIT_CORE_EXERCISE_NAME_SWISS_BALL_ROLLOUT ((FIT_CORE_EXERCISE_NAME)29) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_SWISS_BALL_ROLLOUT ((FIT_CORE_EXERCISE_NAME)30) +#define FIT_CORE_EXERCISE_NAME_TRIANGLE_HIP_PRESS ((FIT_CORE_EXERCISE_NAME)31) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_TRIANGLE_HIP_PRESS ((FIT_CORE_EXERCISE_NAME)32) +#define FIT_CORE_EXERCISE_NAME_TRX_SUSPENDED_JACKKNIFE ((FIT_CORE_EXERCISE_NAME)33) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_TRX_SUSPENDED_JACKKNIFE ((FIT_CORE_EXERCISE_NAME)34) +#define FIT_CORE_EXERCISE_NAME_U_BOAT ((FIT_CORE_EXERCISE_NAME)35) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_U_BOAT ((FIT_CORE_EXERCISE_NAME)36) +#define FIT_CORE_EXERCISE_NAME_WINDMILL_SWITCHES ((FIT_CORE_EXERCISE_NAME)37) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_WINDMILL_SWITCHES ((FIT_CORE_EXERCISE_NAME)38) +#define FIT_CORE_EXERCISE_NAME_ALTERNATING_SLIDE_OUT ((FIT_CORE_EXERCISE_NAME)39) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_ALTERNATING_SLIDE_OUT ((FIT_CORE_EXERCISE_NAME)40) +#define FIT_CORE_EXERCISE_NAME_GHD_BACK_EXTENSIONS ((FIT_CORE_EXERCISE_NAME)41) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_GHD_BACK_EXTENSIONS ((FIT_CORE_EXERCISE_NAME)42) +#define FIT_CORE_EXERCISE_NAME_OVERHEAD_WALK ((FIT_CORE_EXERCISE_NAME)43) +#define FIT_CORE_EXERCISE_NAME_INCHWORM ((FIT_CORE_EXERCISE_NAME)44) +#define FIT_CORE_EXERCISE_NAME_WEIGHTED_MODIFIED_FRONT_LEVER ((FIT_CORE_EXERCISE_NAME)45) +#define FIT_CORE_EXERCISE_NAME_RUSSIAN_TWIST ((FIT_CORE_EXERCISE_NAME)46) +#define FIT_CORE_EXERCISE_NAME_ABDOMINAL_LEG_ROTATIONS ((FIT_CORE_EXERCISE_NAME)47) // Deprecated do not use +#define FIT_CORE_EXERCISE_NAME_ARM_AND_LEG_EXTENSION_ON_KNEES ((FIT_CORE_EXERCISE_NAME)48) +#define FIT_CORE_EXERCISE_NAME_BICYCLE ((FIT_CORE_EXERCISE_NAME)49) +#define FIT_CORE_EXERCISE_NAME_BICEP_CURL_WITH_LEG_EXTENSION ((FIT_CORE_EXERCISE_NAME)50) +#define FIT_CORE_EXERCISE_NAME_CAT_COW ((FIT_CORE_EXERCISE_NAME)51) +#define FIT_CORE_EXERCISE_NAME_CORKSCREW ((FIT_CORE_EXERCISE_NAME)52) +#define FIT_CORE_EXERCISE_NAME_CRISS_CROSS ((FIT_CORE_EXERCISE_NAME)53) +#define FIT_CORE_EXERCISE_NAME_CRISS_CROSS_WITH_BALL ((FIT_CORE_EXERCISE_NAME)54) // Deprecated do not use +#define FIT_CORE_EXERCISE_NAME_DOUBLE_LEG_STRETCH ((FIT_CORE_EXERCISE_NAME)55) +#define FIT_CORE_EXERCISE_NAME_KNEE_FOLDS ((FIT_CORE_EXERCISE_NAME)56) +#define FIT_CORE_EXERCISE_NAME_LOWER_LIFT ((FIT_CORE_EXERCISE_NAME)57) +#define FIT_CORE_EXERCISE_NAME_NECK_PULL ((FIT_CORE_EXERCISE_NAME)58) +#define FIT_CORE_EXERCISE_NAME_PELVIC_CLOCKS ((FIT_CORE_EXERCISE_NAME)59) +#define FIT_CORE_EXERCISE_NAME_ROLL_OVER ((FIT_CORE_EXERCISE_NAME)60) +#define FIT_CORE_EXERCISE_NAME_ROLL_UP ((FIT_CORE_EXERCISE_NAME)61) +#define FIT_CORE_EXERCISE_NAME_ROLLING ((FIT_CORE_EXERCISE_NAME)62) +#define FIT_CORE_EXERCISE_NAME_ROWING_1 ((FIT_CORE_EXERCISE_NAME)63) +#define FIT_CORE_EXERCISE_NAME_ROWING_2 ((FIT_CORE_EXERCISE_NAME)64) +#define FIT_CORE_EXERCISE_NAME_SCISSORS ((FIT_CORE_EXERCISE_NAME)65) +#define FIT_CORE_EXERCISE_NAME_SINGLE_LEG_CIRCLES ((FIT_CORE_EXERCISE_NAME)66) +#define FIT_CORE_EXERCISE_NAME_SINGLE_LEG_STRETCH ((FIT_CORE_EXERCISE_NAME)67) +#define FIT_CORE_EXERCISE_NAME_SNAKE_TWIST_1_AND_2 ((FIT_CORE_EXERCISE_NAME)68) // Deprecated do not use +#define FIT_CORE_EXERCISE_NAME_SWAN ((FIT_CORE_EXERCISE_NAME)69) +#define FIT_CORE_EXERCISE_NAME_SWIMMING ((FIT_CORE_EXERCISE_NAME)70) +#define FIT_CORE_EXERCISE_NAME_TEASER ((FIT_CORE_EXERCISE_NAME)71) +#define FIT_CORE_EXERCISE_NAME_THE_HUNDRED ((FIT_CORE_EXERCISE_NAME)72) +#define FIT_CORE_EXERCISE_NAME_COUNT 73 + +typedef FIT_UINT16 FIT_CRUNCH_EXERCISE_NAME; +#define FIT_CRUNCH_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_CRUNCH_EXERCISE_NAME_BICYCLE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)0) +#define FIT_CRUNCH_EXERCISE_NAME_CABLE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)1) +#define FIT_CRUNCH_EXERCISE_NAME_CIRCULAR_ARM_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)2) +#define FIT_CRUNCH_EXERCISE_NAME_CROSSED_ARMS_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)3) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_CROSSED_ARMS_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)4) +#define FIT_CRUNCH_EXERCISE_NAME_CROSS_LEG_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)5) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_CROSS_LEG_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)6) +#define FIT_CRUNCH_EXERCISE_NAME_CRUNCH_CHOP ((FIT_CRUNCH_EXERCISE_NAME)7) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_CRUNCH_CHOP ((FIT_CRUNCH_EXERCISE_NAME)8) +#define FIT_CRUNCH_EXERCISE_NAME_DOUBLE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)9) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_DOUBLE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)10) +#define FIT_CRUNCH_EXERCISE_NAME_ELBOW_TO_KNEE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)11) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_ELBOW_TO_KNEE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)12) +#define FIT_CRUNCH_EXERCISE_NAME_FLUTTER_KICKS ((FIT_CRUNCH_EXERCISE_NAME)13) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_FLUTTER_KICKS ((FIT_CRUNCH_EXERCISE_NAME)14) +#define FIT_CRUNCH_EXERCISE_NAME_FOAM_ROLLER_REVERSE_CRUNCH_ON_BENCH ((FIT_CRUNCH_EXERCISE_NAME)15) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_FOAM_ROLLER_REVERSE_CRUNCH_ON_BENCH ((FIT_CRUNCH_EXERCISE_NAME)16) +#define FIT_CRUNCH_EXERCISE_NAME_FOAM_ROLLER_REVERSE_CRUNCH_WITH_DUMBBELL ((FIT_CRUNCH_EXERCISE_NAME)17) +#define FIT_CRUNCH_EXERCISE_NAME_FOAM_ROLLER_REVERSE_CRUNCH_WITH_MEDICINE_BALL ((FIT_CRUNCH_EXERCISE_NAME)18) +#define FIT_CRUNCH_EXERCISE_NAME_FROG_PRESS ((FIT_CRUNCH_EXERCISE_NAME)19) +#define FIT_CRUNCH_EXERCISE_NAME_HANGING_KNEE_RAISE_OBLIQUE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)20) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_HANGING_KNEE_RAISE_OBLIQUE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)21) +#define FIT_CRUNCH_EXERCISE_NAME_HIP_CROSSOVER ((FIT_CRUNCH_EXERCISE_NAME)22) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_HIP_CROSSOVER ((FIT_CRUNCH_EXERCISE_NAME)23) +#define FIT_CRUNCH_EXERCISE_NAME_HOLLOW_ROCK ((FIT_CRUNCH_EXERCISE_NAME)24) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_HOLLOW_ROCK ((FIT_CRUNCH_EXERCISE_NAME)25) +#define FIT_CRUNCH_EXERCISE_NAME_INCLINE_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)26) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_INCLINE_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)27) +#define FIT_CRUNCH_EXERCISE_NAME_KNEELING_CABLE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)28) +#define FIT_CRUNCH_EXERCISE_NAME_KNEELING_CROSS_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)29) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_KNEELING_CROSS_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)30) +#define FIT_CRUNCH_EXERCISE_NAME_KNEELING_OBLIQUE_CABLE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)31) +#define FIT_CRUNCH_EXERCISE_NAME_KNEES_TO_ELBOW ((FIT_CRUNCH_EXERCISE_NAME)32) +#define FIT_CRUNCH_EXERCISE_NAME_LEG_EXTENSIONS ((FIT_CRUNCH_EXERCISE_NAME)33) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_LEG_EXTENSIONS ((FIT_CRUNCH_EXERCISE_NAME)34) +#define FIT_CRUNCH_EXERCISE_NAME_LEG_LEVERS ((FIT_CRUNCH_EXERCISE_NAME)35) +#define FIT_CRUNCH_EXERCISE_NAME_MCGILL_CURL_UP ((FIT_CRUNCH_EXERCISE_NAME)36) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_MCGILL_CURL_UP ((FIT_CRUNCH_EXERCISE_NAME)37) +#define FIT_CRUNCH_EXERCISE_NAME_MODIFIED_PILATES_ROLL_UP_WITH_BALL ((FIT_CRUNCH_EXERCISE_NAME)38) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_MODIFIED_PILATES_ROLL_UP_WITH_BALL ((FIT_CRUNCH_EXERCISE_NAME)39) +#define FIT_CRUNCH_EXERCISE_NAME_PILATES_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)40) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_PILATES_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)41) +#define FIT_CRUNCH_EXERCISE_NAME_PILATES_ROLL_UP_WITH_BALL ((FIT_CRUNCH_EXERCISE_NAME)42) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_PILATES_ROLL_UP_WITH_BALL ((FIT_CRUNCH_EXERCISE_NAME)43) +#define FIT_CRUNCH_EXERCISE_NAME_RAISED_LEGS_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)44) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_RAISED_LEGS_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)45) +#define FIT_CRUNCH_EXERCISE_NAME_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)46) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)47) +#define FIT_CRUNCH_EXERCISE_NAME_REVERSE_CRUNCH_ON_A_BENCH ((FIT_CRUNCH_EXERCISE_NAME)48) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_REVERSE_CRUNCH_ON_A_BENCH ((FIT_CRUNCH_EXERCISE_NAME)49) +#define FIT_CRUNCH_EXERCISE_NAME_REVERSE_CURL_AND_LIFT ((FIT_CRUNCH_EXERCISE_NAME)50) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_REVERSE_CURL_AND_LIFT ((FIT_CRUNCH_EXERCISE_NAME)51) +#define FIT_CRUNCH_EXERCISE_NAME_ROTATIONAL_LIFT ((FIT_CRUNCH_EXERCISE_NAME)52) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_ROTATIONAL_LIFT ((FIT_CRUNCH_EXERCISE_NAME)53) +#define FIT_CRUNCH_EXERCISE_NAME_SEATED_ALTERNATING_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)54) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_SEATED_ALTERNATING_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)55) +#define FIT_CRUNCH_EXERCISE_NAME_SEATED_LEG_U ((FIT_CRUNCH_EXERCISE_NAME)56) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_SEATED_LEG_U ((FIT_CRUNCH_EXERCISE_NAME)57) +#define FIT_CRUNCH_EXERCISE_NAME_SIDE_TO_SIDE_CRUNCH_AND_WEAVE ((FIT_CRUNCH_EXERCISE_NAME)58) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_SIDE_TO_SIDE_CRUNCH_AND_WEAVE ((FIT_CRUNCH_EXERCISE_NAME)59) +#define FIT_CRUNCH_EXERCISE_NAME_SINGLE_LEG_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)60) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)61) +#define FIT_CRUNCH_EXERCISE_NAME_SKATER_CRUNCH_CROSS ((FIT_CRUNCH_EXERCISE_NAME)62) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_SKATER_CRUNCH_CROSS ((FIT_CRUNCH_EXERCISE_NAME)63) +#define FIT_CRUNCH_EXERCISE_NAME_STANDING_CABLE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)64) +#define FIT_CRUNCH_EXERCISE_NAME_STANDING_SIDE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)65) +#define FIT_CRUNCH_EXERCISE_NAME_STEP_CLIMB ((FIT_CRUNCH_EXERCISE_NAME)66) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_STEP_CLIMB ((FIT_CRUNCH_EXERCISE_NAME)67) +#define FIT_CRUNCH_EXERCISE_NAME_SWISS_BALL_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)68) +#define FIT_CRUNCH_EXERCISE_NAME_SWISS_BALL_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)69) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_SWISS_BALL_REVERSE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)70) +#define FIT_CRUNCH_EXERCISE_NAME_SWISS_BALL_RUSSIAN_TWIST ((FIT_CRUNCH_EXERCISE_NAME)71) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_SWISS_BALL_RUSSIAN_TWIST ((FIT_CRUNCH_EXERCISE_NAME)72) +#define FIT_CRUNCH_EXERCISE_NAME_SWISS_BALL_SIDE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)73) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_SWISS_BALL_SIDE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)74) +#define FIT_CRUNCH_EXERCISE_NAME_THORACIC_CRUNCHES_ON_FOAM_ROLLER ((FIT_CRUNCH_EXERCISE_NAME)75) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_THORACIC_CRUNCHES_ON_FOAM_ROLLER ((FIT_CRUNCH_EXERCISE_NAME)76) +#define FIT_CRUNCH_EXERCISE_NAME_TRICEPS_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)77) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_BICYCLE_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)78) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)79) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_SWISS_BALL_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)80) +#define FIT_CRUNCH_EXERCISE_NAME_TOES_TO_BAR ((FIT_CRUNCH_EXERCISE_NAME)81) +#define FIT_CRUNCH_EXERCISE_NAME_WEIGHTED_TOES_TO_BAR ((FIT_CRUNCH_EXERCISE_NAME)82) +#define FIT_CRUNCH_EXERCISE_NAME_CRUNCH ((FIT_CRUNCH_EXERCISE_NAME)83) +#define FIT_CRUNCH_EXERCISE_NAME_STRAIGHT_LEG_CRUNCH_WITH_BALL ((FIT_CRUNCH_EXERCISE_NAME)84) +#define FIT_CRUNCH_EXERCISE_NAME_COUNT 85 + +typedef FIT_UINT16 FIT_CURL_EXERCISE_NAME; +#define FIT_CURL_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_CURL_EXERCISE_NAME_ALTERNATING_DUMBBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)0) +#define FIT_CURL_EXERCISE_NAME_ALTERNATING_DUMBBELL_BICEPS_CURL_ON_SWISS_BALL ((FIT_CURL_EXERCISE_NAME)1) +#define FIT_CURL_EXERCISE_NAME_ALTERNATING_INCLINE_DUMBBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)2) +#define FIT_CURL_EXERCISE_NAME_BARBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)3) +#define FIT_CURL_EXERCISE_NAME_BARBELL_REVERSE_WRIST_CURL ((FIT_CURL_EXERCISE_NAME)4) +#define FIT_CURL_EXERCISE_NAME_BARBELL_WRIST_CURL ((FIT_CURL_EXERCISE_NAME)5) +#define FIT_CURL_EXERCISE_NAME_BEHIND_THE_BACK_BARBELL_REVERSE_WRIST_CURL ((FIT_CURL_EXERCISE_NAME)6) +#define FIT_CURL_EXERCISE_NAME_BEHIND_THE_BACK_ONE_ARM_CABLE_CURL ((FIT_CURL_EXERCISE_NAME)7) +#define FIT_CURL_EXERCISE_NAME_CABLE_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)8) +#define FIT_CURL_EXERCISE_NAME_CABLE_HAMMER_CURL ((FIT_CURL_EXERCISE_NAME)9) +#define FIT_CURL_EXERCISE_NAME_CHEATING_BARBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)10) +#define FIT_CURL_EXERCISE_NAME_CLOSE_GRIP_EZ_BAR_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)11) +#define FIT_CURL_EXERCISE_NAME_CROSS_BODY_DUMBBELL_HAMMER_CURL ((FIT_CURL_EXERCISE_NAME)12) +#define FIT_CURL_EXERCISE_NAME_DEAD_HANG_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)13) +#define FIT_CURL_EXERCISE_NAME_DECLINE_HAMMER_CURL ((FIT_CURL_EXERCISE_NAME)14) +#define FIT_CURL_EXERCISE_NAME_DUMBBELL_BICEPS_CURL_WITH_STATIC_HOLD ((FIT_CURL_EXERCISE_NAME)15) +#define FIT_CURL_EXERCISE_NAME_DUMBBELL_HAMMER_CURL ((FIT_CURL_EXERCISE_NAME)16) +#define FIT_CURL_EXERCISE_NAME_DUMBBELL_REVERSE_WRIST_CURL ((FIT_CURL_EXERCISE_NAME)17) +#define FIT_CURL_EXERCISE_NAME_DUMBBELL_WRIST_CURL ((FIT_CURL_EXERCISE_NAME)18) +#define FIT_CURL_EXERCISE_NAME_EZ_BAR_PREACHER_CURL ((FIT_CURL_EXERCISE_NAME)19) +#define FIT_CURL_EXERCISE_NAME_FORWARD_BEND_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)20) +#define FIT_CURL_EXERCISE_NAME_HAMMER_CURL_TO_PRESS ((FIT_CURL_EXERCISE_NAME)21) +#define FIT_CURL_EXERCISE_NAME_INCLINE_DUMBBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)22) +#define FIT_CURL_EXERCISE_NAME_INCLINE_OFFSET_THUMB_DUMBBELL_CURL ((FIT_CURL_EXERCISE_NAME)23) +#define FIT_CURL_EXERCISE_NAME_KETTLEBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)24) +#define FIT_CURL_EXERCISE_NAME_LYING_CONCENTRATION_CABLE_CURL ((FIT_CURL_EXERCISE_NAME)25) +#define FIT_CURL_EXERCISE_NAME_ONE_ARM_PREACHER_CURL ((FIT_CURL_EXERCISE_NAME)26) +#define FIT_CURL_EXERCISE_NAME_PLATE_PINCH_CURL ((FIT_CURL_EXERCISE_NAME)27) +#define FIT_CURL_EXERCISE_NAME_PREACHER_CURL_WITH_CABLE ((FIT_CURL_EXERCISE_NAME)28) +#define FIT_CURL_EXERCISE_NAME_REVERSE_EZ_BAR_CURL ((FIT_CURL_EXERCISE_NAME)29) +#define FIT_CURL_EXERCISE_NAME_REVERSE_GRIP_WRIST_CURL ((FIT_CURL_EXERCISE_NAME)30) +#define FIT_CURL_EXERCISE_NAME_REVERSE_GRIP_BARBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)31) +#define FIT_CURL_EXERCISE_NAME_SEATED_ALTERNATING_DUMBBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)32) +#define FIT_CURL_EXERCISE_NAME_SEATED_DUMBBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)33) +#define FIT_CURL_EXERCISE_NAME_SEATED_REVERSE_DUMBBELL_CURL ((FIT_CURL_EXERCISE_NAME)34) +#define FIT_CURL_EXERCISE_NAME_SPLIT_STANCE_OFFSET_PINKY_DUMBBELL_CURL ((FIT_CURL_EXERCISE_NAME)35) +#define FIT_CURL_EXERCISE_NAME_STANDING_ALTERNATING_DUMBBELL_CURLS ((FIT_CURL_EXERCISE_NAME)36) +#define FIT_CURL_EXERCISE_NAME_STANDING_DUMBBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)37) +#define FIT_CURL_EXERCISE_NAME_STANDING_EZ_BAR_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)38) +#define FIT_CURL_EXERCISE_NAME_STATIC_CURL ((FIT_CURL_EXERCISE_NAME)39) +#define FIT_CURL_EXERCISE_NAME_SWISS_BALL_DUMBBELL_OVERHEAD_TRICEPS_EXTENSION ((FIT_CURL_EXERCISE_NAME)40) +#define FIT_CURL_EXERCISE_NAME_SWISS_BALL_EZ_BAR_PREACHER_CURL ((FIT_CURL_EXERCISE_NAME)41) +#define FIT_CURL_EXERCISE_NAME_TWISTING_STANDING_DUMBBELL_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)42) +#define FIT_CURL_EXERCISE_NAME_WIDE_GRIP_EZ_BAR_BICEPS_CURL ((FIT_CURL_EXERCISE_NAME)43) +#define FIT_CURL_EXERCISE_NAME_COUNT 44 + +typedef FIT_UINT16 FIT_DEADLIFT_EXERCISE_NAME; +#define FIT_DEADLIFT_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_DEADLIFT_EXERCISE_NAME_BARBELL_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)0) +#define FIT_DEADLIFT_EXERCISE_NAME_BARBELL_STRAIGHT_LEG_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)1) +#define FIT_DEADLIFT_EXERCISE_NAME_DUMBBELL_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)2) +#define FIT_DEADLIFT_EXERCISE_NAME_DUMBBELL_SINGLE_LEG_DEADLIFT_TO_ROW ((FIT_DEADLIFT_EXERCISE_NAME)3) +#define FIT_DEADLIFT_EXERCISE_NAME_DUMBBELL_STRAIGHT_LEG_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)4) +#define FIT_DEADLIFT_EXERCISE_NAME_KETTLEBELL_FLOOR_TO_SHELF ((FIT_DEADLIFT_EXERCISE_NAME)5) +#define FIT_DEADLIFT_EXERCISE_NAME_ONE_ARM_ONE_LEG_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)6) +#define FIT_DEADLIFT_EXERCISE_NAME_RACK_PULL ((FIT_DEADLIFT_EXERCISE_NAME)7) +#define FIT_DEADLIFT_EXERCISE_NAME_ROTATIONAL_DUMBBELL_STRAIGHT_LEG_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)8) +#define FIT_DEADLIFT_EXERCISE_NAME_SINGLE_ARM_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)9) +#define FIT_DEADLIFT_EXERCISE_NAME_SINGLE_LEG_BARBELL_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)10) +#define FIT_DEADLIFT_EXERCISE_NAME_SINGLE_LEG_BARBELL_STRAIGHT_LEG_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)11) +#define FIT_DEADLIFT_EXERCISE_NAME_SINGLE_LEG_DEADLIFT_WITH_BARBELL ((FIT_DEADLIFT_EXERCISE_NAME)12) +#define FIT_DEADLIFT_EXERCISE_NAME_SINGLE_LEG_RDL_CIRCUIT ((FIT_DEADLIFT_EXERCISE_NAME)13) +#define FIT_DEADLIFT_EXERCISE_NAME_SINGLE_LEG_ROMANIAN_DEADLIFT_WITH_DUMBBELL ((FIT_DEADLIFT_EXERCISE_NAME)14) +#define FIT_DEADLIFT_EXERCISE_NAME_SUMO_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)15) +#define FIT_DEADLIFT_EXERCISE_NAME_SUMO_DEADLIFT_HIGH_PULL ((FIT_DEADLIFT_EXERCISE_NAME)16) +#define FIT_DEADLIFT_EXERCISE_NAME_TRAP_BAR_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)17) +#define FIT_DEADLIFT_EXERCISE_NAME_WIDE_GRIP_BARBELL_DEADLIFT ((FIT_DEADLIFT_EXERCISE_NAME)18) +#define FIT_DEADLIFT_EXERCISE_NAME_COUNT 19 + +typedef FIT_UINT16 FIT_FLYE_EXERCISE_NAME; +#define FIT_FLYE_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_FLYE_EXERCISE_NAME_CABLE_CROSSOVER ((FIT_FLYE_EXERCISE_NAME)0) +#define FIT_FLYE_EXERCISE_NAME_DECLINE_DUMBBELL_FLYE ((FIT_FLYE_EXERCISE_NAME)1) +#define FIT_FLYE_EXERCISE_NAME_DUMBBELL_FLYE ((FIT_FLYE_EXERCISE_NAME)2) +#define FIT_FLYE_EXERCISE_NAME_INCLINE_DUMBBELL_FLYE ((FIT_FLYE_EXERCISE_NAME)3) +#define FIT_FLYE_EXERCISE_NAME_KETTLEBELL_FLYE ((FIT_FLYE_EXERCISE_NAME)4) +#define FIT_FLYE_EXERCISE_NAME_KNEELING_REAR_FLYE ((FIT_FLYE_EXERCISE_NAME)5) +#define FIT_FLYE_EXERCISE_NAME_SINGLE_ARM_STANDING_CABLE_REVERSE_FLYE ((FIT_FLYE_EXERCISE_NAME)6) +#define FIT_FLYE_EXERCISE_NAME_SWISS_BALL_DUMBBELL_FLYE ((FIT_FLYE_EXERCISE_NAME)7) +#define FIT_FLYE_EXERCISE_NAME_ARM_ROTATIONS ((FIT_FLYE_EXERCISE_NAME)8) +#define FIT_FLYE_EXERCISE_NAME_HUG_A_TREE ((FIT_FLYE_EXERCISE_NAME)9) +#define FIT_FLYE_EXERCISE_NAME_COUNT 10 + +typedef FIT_UINT16 FIT_HIP_RAISE_EXERCISE_NAME; +#define FIT_HIP_RAISE_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_HIP_RAISE_EXERCISE_NAME_BARBELL_HIP_THRUST_ON_FLOOR ((FIT_HIP_RAISE_EXERCISE_NAME)0) +#define FIT_HIP_RAISE_EXERCISE_NAME_BARBELL_HIP_THRUST_WITH_BENCH ((FIT_HIP_RAISE_EXERCISE_NAME)1) +#define FIT_HIP_RAISE_EXERCISE_NAME_BENT_KNEE_SWISS_BALL_REVERSE_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)2) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_BENT_KNEE_SWISS_BALL_REVERSE_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)3) +#define FIT_HIP_RAISE_EXERCISE_NAME_BRIDGE_WITH_LEG_EXTENSION ((FIT_HIP_RAISE_EXERCISE_NAME)4) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_BRIDGE_WITH_LEG_EXTENSION ((FIT_HIP_RAISE_EXERCISE_NAME)5) +#define FIT_HIP_RAISE_EXERCISE_NAME_CLAM_BRIDGE ((FIT_HIP_RAISE_EXERCISE_NAME)6) +#define FIT_HIP_RAISE_EXERCISE_NAME_FRONT_KICK_TABLETOP ((FIT_HIP_RAISE_EXERCISE_NAME)7) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_FRONT_KICK_TABLETOP ((FIT_HIP_RAISE_EXERCISE_NAME)8) +#define FIT_HIP_RAISE_EXERCISE_NAME_HIP_EXTENSION_AND_CROSS ((FIT_HIP_RAISE_EXERCISE_NAME)9) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_HIP_EXTENSION_AND_CROSS ((FIT_HIP_RAISE_EXERCISE_NAME)10) +#define FIT_HIP_RAISE_EXERCISE_NAME_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)11) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)12) +#define FIT_HIP_RAISE_EXERCISE_NAME_HIP_RAISE_WITH_FEET_ON_SWISS_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)13) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_HIP_RAISE_WITH_FEET_ON_SWISS_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)14) +#define FIT_HIP_RAISE_EXERCISE_NAME_HIP_RAISE_WITH_HEAD_ON_BOSU_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)15) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_HIP_RAISE_WITH_HEAD_ON_BOSU_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)16) +#define FIT_HIP_RAISE_EXERCISE_NAME_HIP_RAISE_WITH_HEAD_ON_SWISS_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)17) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_HIP_RAISE_WITH_HEAD_ON_SWISS_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)18) +#define FIT_HIP_RAISE_EXERCISE_NAME_HIP_RAISE_WITH_KNEE_SQUEEZE ((FIT_HIP_RAISE_EXERCISE_NAME)19) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_HIP_RAISE_WITH_KNEE_SQUEEZE ((FIT_HIP_RAISE_EXERCISE_NAME)20) +#define FIT_HIP_RAISE_EXERCISE_NAME_INCLINE_REAR_LEG_EXTENSION ((FIT_HIP_RAISE_EXERCISE_NAME)21) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_INCLINE_REAR_LEG_EXTENSION ((FIT_HIP_RAISE_EXERCISE_NAME)22) +#define FIT_HIP_RAISE_EXERCISE_NAME_KETTLEBELL_SWING ((FIT_HIP_RAISE_EXERCISE_NAME)23) +#define FIT_HIP_RAISE_EXERCISE_NAME_MARCHING_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)24) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_MARCHING_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)25) +#define FIT_HIP_RAISE_EXERCISE_NAME_MARCHING_HIP_RAISE_WITH_FEET_ON_A_SWISS_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)26) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_MARCHING_HIP_RAISE_WITH_FEET_ON_A_SWISS_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)27) +#define FIT_HIP_RAISE_EXERCISE_NAME_REVERSE_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)28) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_REVERSE_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)29) +#define FIT_HIP_RAISE_EXERCISE_NAME_SINGLE_LEG_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)30) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_HIP_RAISE ((FIT_HIP_RAISE_EXERCISE_NAME)31) +#define FIT_HIP_RAISE_EXERCISE_NAME_SINGLE_LEG_HIP_RAISE_WITH_FOOT_ON_BENCH ((FIT_HIP_RAISE_EXERCISE_NAME)32) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_HIP_RAISE_WITH_FOOT_ON_BENCH ((FIT_HIP_RAISE_EXERCISE_NAME)33) +#define FIT_HIP_RAISE_EXERCISE_NAME_SINGLE_LEG_HIP_RAISE_WITH_FOOT_ON_BOSU_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)34) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_HIP_RAISE_WITH_FOOT_ON_BOSU_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)35) +#define FIT_HIP_RAISE_EXERCISE_NAME_SINGLE_LEG_HIP_RAISE_WITH_FOOT_ON_FOAM_ROLLER ((FIT_HIP_RAISE_EXERCISE_NAME)36) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_HIP_RAISE_WITH_FOOT_ON_FOAM_ROLLER ((FIT_HIP_RAISE_EXERCISE_NAME)37) +#define FIT_HIP_RAISE_EXERCISE_NAME_SINGLE_LEG_HIP_RAISE_WITH_FOOT_ON_MEDICINE_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)38) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_HIP_RAISE_WITH_FOOT_ON_MEDICINE_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)39) +#define FIT_HIP_RAISE_EXERCISE_NAME_SINGLE_LEG_HIP_RAISE_WITH_HEAD_ON_BOSU_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)40) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_HIP_RAISE_WITH_HEAD_ON_BOSU_BALL ((FIT_HIP_RAISE_EXERCISE_NAME)41) +#define FIT_HIP_RAISE_EXERCISE_NAME_WEIGHTED_CLAM_BRIDGE ((FIT_HIP_RAISE_EXERCISE_NAME)42) +#define FIT_HIP_RAISE_EXERCISE_NAME_SINGLE_LEG_SWISS_BALL_HIP_RAISE_AND_LEG_CURL ((FIT_HIP_RAISE_EXERCISE_NAME)43) +#define FIT_HIP_RAISE_EXERCISE_NAME_CLAMS ((FIT_HIP_RAISE_EXERCISE_NAME)44) +#define FIT_HIP_RAISE_EXERCISE_NAME_INNER_THIGH_CIRCLES ((FIT_HIP_RAISE_EXERCISE_NAME)45) // Deprecated do not use +#define FIT_HIP_RAISE_EXERCISE_NAME_INNER_THIGH_SIDE_LIFT ((FIT_HIP_RAISE_EXERCISE_NAME)46) // Deprecated do not use +#define FIT_HIP_RAISE_EXERCISE_NAME_LEG_CIRCLES ((FIT_HIP_RAISE_EXERCISE_NAME)47) +#define FIT_HIP_RAISE_EXERCISE_NAME_LEG_LIFT ((FIT_HIP_RAISE_EXERCISE_NAME)48) +#define FIT_HIP_RAISE_EXERCISE_NAME_LEG_LIFT_IN_EXTERNAL_ROTATION ((FIT_HIP_RAISE_EXERCISE_NAME)49) +#define FIT_HIP_RAISE_EXERCISE_NAME_COUNT 50 + +typedef FIT_UINT16 FIT_HIP_STABILITY_EXERCISE_NAME; +#define FIT_HIP_STABILITY_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_HIP_STABILITY_EXERCISE_NAME_BAND_SIDE_LYING_LEG_RAISE ((FIT_HIP_STABILITY_EXERCISE_NAME)0) +#define FIT_HIP_STABILITY_EXERCISE_NAME_DEAD_BUG ((FIT_HIP_STABILITY_EXERCISE_NAME)1) +#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_DEAD_BUG ((FIT_HIP_STABILITY_EXERCISE_NAME)2) +#define FIT_HIP_STABILITY_EXERCISE_NAME_EXTERNAL_HIP_RAISE ((FIT_HIP_STABILITY_EXERCISE_NAME)3) +#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_EXTERNAL_HIP_RAISE ((FIT_HIP_STABILITY_EXERCISE_NAME)4) +#define FIT_HIP_STABILITY_EXERCISE_NAME_FIRE_HYDRANT_KICKS ((FIT_HIP_STABILITY_EXERCISE_NAME)5) +#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_FIRE_HYDRANT_KICKS ((FIT_HIP_STABILITY_EXERCISE_NAME)6) +#define FIT_HIP_STABILITY_EXERCISE_NAME_HIP_CIRCLES ((FIT_HIP_STABILITY_EXERCISE_NAME)7) +#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_HIP_CIRCLES ((FIT_HIP_STABILITY_EXERCISE_NAME)8) +#define FIT_HIP_STABILITY_EXERCISE_NAME_INNER_THIGH_LIFT ((FIT_HIP_STABILITY_EXERCISE_NAME)9) +#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_INNER_THIGH_LIFT ((FIT_HIP_STABILITY_EXERCISE_NAME)10) +#define FIT_HIP_STABILITY_EXERCISE_NAME_LATERAL_WALKS_WITH_BAND_AT_ANKLES ((FIT_HIP_STABILITY_EXERCISE_NAME)11) +#define FIT_HIP_STABILITY_EXERCISE_NAME_PRETZEL_SIDE_KICK ((FIT_HIP_STABILITY_EXERCISE_NAME)12) +#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_PRETZEL_SIDE_KICK ((FIT_HIP_STABILITY_EXERCISE_NAME)13) +#define FIT_HIP_STABILITY_EXERCISE_NAME_PRONE_HIP_INTERNAL_ROTATION ((FIT_HIP_STABILITY_EXERCISE_NAME)14) +#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_PRONE_HIP_INTERNAL_ROTATION ((FIT_HIP_STABILITY_EXERCISE_NAME)15) +#define FIT_HIP_STABILITY_EXERCISE_NAME_QUADRUPED ((FIT_HIP_STABILITY_EXERCISE_NAME)16) +#define FIT_HIP_STABILITY_EXERCISE_NAME_QUADRUPED_HIP_EXTENSION ((FIT_HIP_STABILITY_EXERCISE_NAME)17) +#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_QUADRUPED_HIP_EXTENSION ((FIT_HIP_STABILITY_EXERCISE_NAME)18) +#define FIT_HIP_STABILITY_EXERCISE_NAME_QUADRUPED_WITH_LEG_LIFT ((FIT_HIP_STABILITY_EXERCISE_NAME)19) +#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_QUADRUPED_WITH_LEG_LIFT ((FIT_HIP_STABILITY_EXERCISE_NAME)20) +#define FIT_HIP_STABILITY_EXERCISE_NAME_SIDE_LYING_LEG_RAISE ((FIT_HIP_STABILITY_EXERCISE_NAME)21) +#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_SIDE_LYING_LEG_RAISE ((FIT_HIP_STABILITY_EXERCISE_NAME)22) +#define FIT_HIP_STABILITY_EXERCISE_NAME_SLIDING_HIP_ADDUCTION ((FIT_HIP_STABILITY_EXERCISE_NAME)23) +#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_SLIDING_HIP_ADDUCTION ((FIT_HIP_STABILITY_EXERCISE_NAME)24) +#define FIT_HIP_STABILITY_EXERCISE_NAME_STANDING_ADDUCTION ((FIT_HIP_STABILITY_EXERCISE_NAME)25) +#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_STANDING_ADDUCTION ((FIT_HIP_STABILITY_EXERCISE_NAME)26) +#define FIT_HIP_STABILITY_EXERCISE_NAME_STANDING_CABLE_HIP_ABDUCTION ((FIT_HIP_STABILITY_EXERCISE_NAME)27) +#define FIT_HIP_STABILITY_EXERCISE_NAME_STANDING_HIP_ABDUCTION ((FIT_HIP_STABILITY_EXERCISE_NAME)28) +#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_STANDING_HIP_ABDUCTION ((FIT_HIP_STABILITY_EXERCISE_NAME)29) +#define FIT_HIP_STABILITY_EXERCISE_NAME_STANDING_REAR_LEG_RAISE ((FIT_HIP_STABILITY_EXERCISE_NAME)30) +#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_STANDING_REAR_LEG_RAISE ((FIT_HIP_STABILITY_EXERCISE_NAME)31) +#define FIT_HIP_STABILITY_EXERCISE_NAME_SUPINE_HIP_INTERNAL_ROTATION ((FIT_HIP_STABILITY_EXERCISE_NAME)32) +#define FIT_HIP_STABILITY_EXERCISE_NAME_WEIGHTED_SUPINE_HIP_INTERNAL_ROTATION ((FIT_HIP_STABILITY_EXERCISE_NAME)33) +#define FIT_HIP_STABILITY_EXERCISE_NAME_COUNT 34 + +typedef FIT_UINT16 FIT_HIP_SWING_EXERCISE_NAME; +#define FIT_HIP_SWING_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_HIP_SWING_EXERCISE_NAME_SINGLE_ARM_KETTLEBELL_SWING ((FIT_HIP_SWING_EXERCISE_NAME)0) +#define FIT_HIP_SWING_EXERCISE_NAME_SINGLE_ARM_DUMBBELL_SWING ((FIT_HIP_SWING_EXERCISE_NAME)1) +#define FIT_HIP_SWING_EXERCISE_NAME_STEP_OUT_SWING ((FIT_HIP_SWING_EXERCISE_NAME)2) +#define FIT_HIP_SWING_EXERCISE_NAME_COUNT 3 + +typedef FIT_UINT16 FIT_HYPEREXTENSION_EXERCISE_NAME; +#define FIT_HYPEREXTENSION_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_HYPEREXTENSION_EXERCISE_NAME_BACK_EXTENSION_WITH_OPPOSITE_ARM_AND_LEG_REACH ((FIT_HYPEREXTENSION_EXERCISE_NAME)0) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_BACK_EXTENSION_WITH_OPPOSITE_ARM_AND_LEG_REACH ((FIT_HYPEREXTENSION_EXERCISE_NAME)1) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_BASE_ROTATIONS ((FIT_HYPEREXTENSION_EXERCISE_NAME)2) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_BASE_ROTATIONS ((FIT_HYPEREXTENSION_EXERCISE_NAME)3) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_BENT_KNEE_REVERSE_HYPEREXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)4) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_BENT_KNEE_REVERSE_HYPEREXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)5) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_HOLLOW_HOLD_AND_ROLL ((FIT_HYPEREXTENSION_EXERCISE_NAME)6) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_HOLLOW_HOLD_AND_ROLL ((FIT_HYPEREXTENSION_EXERCISE_NAME)7) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_KICKS ((FIT_HYPEREXTENSION_EXERCISE_NAME)8) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_KICKS ((FIT_HYPEREXTENSION_EXERCISE_NAME)9) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_KNEE_RAISES ((FIT_HYPEREXTENSION_EXERCISE_NAME)10) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_KNEE_RAISES ((FIT_HYPEREXTENSION_EXERCISE_NAME)11) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_KNEELING_SUPERMAN ((FIT_HYPEREXTENSION_EXERCISE_NAME)12) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_KNEELING_SUPERMAN ((FIT_HYPEREXTENSION_EXERCISE_NAME)13) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_LAT_PULL_DOWN_WITH_ROW ((FIT_HYPEREXTENSION_EXERCISE_NAME)14) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_MEDICINE_BALL_DEADLIFT_TO_REACH ((FIT_HYPEREXTENSION_EXERCISE_NAME)15) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_ONE_ARM_ONE_LEG_ROW ((FIT_HYPEREXTENSION_EXERCISE_NAME)16) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_ONE_ARM_ROW_WITH_BAND ((FIT_HYPEREXTENSION_EXERCISE_NAME)17) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_OVERHEAD_LUNGE_WITH_MEDICINE_BALL ((FIT_HYPEREXTENSION_EXERCISE_NAME)18) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_PLANK_KNEE_TUCKS ((FIT_HYPEREXTENSION_EXERCISE_NAME)19) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_PLANK_KNEE_TUCKS ((FIT_HYPEREXTENSION_EXERCISE_NAME)20) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_SIDE_STEP ((FIT_HYPEREXTENSION_EXERCISE_NAME)21) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_SIDE_STEP ((FIT_HYPEREXTENSION_EXERCISE_NAME)22) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_SINGLE_LEG_BACK_EXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)23) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_BACK_EXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)24) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_SPINE_EXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)25) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_SPINE_EXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)26) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_STATIC_BACK_EXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)27) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_STATIC_BACK_EXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)28) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_SUPERMAN_FROM_FLOOR ((FIT_HYPEREXTENSION_EXERCISE_NAME)29) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_SUPERMAN_FROM_FLOOR ((FIT_HYPEREXTENSION_EXERCISE_NAME)30) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_SWISS_BALL_BACK_EXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)31) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_SWISS_BALL_BACK_EXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)32) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_SWISS_BALL_HYPEREXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)33) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_SWISS_BALL_HYPEREXTENSION ((FIT_HYPEREXTENSION_EXERCISE_NAME)34) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_SWISS_BALL_OPPOSITE_ARM_AND_LEG_LIFT ((FIT_HYPEREXTENSION_EXERCISE_NAME)35) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_WEIGHTED_SWISS_BALL_OPPOSITE_ARM_AND_LEG_LIFT ((FIT_HYPEREXTENSION_EXERCISE_NAME)36) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_SUPERMAN_ON_SWISS_BALL ((FIT_HYPEREXTENSION_EXERCISE_NAME)37) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_COBRA ((FIT_HYPEREXTENSION_EXERCISE_NAME)38) +#define FIT_HYPEREXTENSION_EXERCISE_NAME_SUPINE_FLOOR_BARRE ((FIT_HYPEREXTENSION_EXERCISE_NAME)39) // Deprecated do not use +#define FIT_HYPEREXTENSION_EXERCISE_NAME_COUNT 40 + +typedef FIT_UINT16 FIT_LATERAL_RAISE_EXERCISE_NAME; +#define FIT_LATERAL_RAISE_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_LATERAL_RAISE_EXERCISE_NAME_45_DEGREE_CABLE_EXTERNAL_ROTATION ((FIT_LATERAL_RAISE_EXERCISE_NAME)0) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_ALTERNATING_LATERAL_RAISE_WITH_STATIC_HOLD ((FIT_LATERAL_RAISE_EXERCISE_NAME)1) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_BAR_MUSCLE_UP ((FIT_LATERAL_RAISE_EXERCISE_NAME)2) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_BENT_OVER_LATERAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)3) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_CABLE_DIAGONAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)4) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_CABLE_FRONT_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)5) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_CALORIE_ROW ((FIT_LATERAL_RAISE_EXERCISE_NAME)6) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_COMBO_SHOULDER_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)7) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_DUMBBELL_DIAGONAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)8) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_DUMBBELL_V_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)9) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_FRONT_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)10) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_LEANING_DUMBBELL_LATERAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)11) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_LYING_DUMBBELL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)12) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_MUSCLE_UP ((FIT_LATERAL_RAISE_EXERCISE_NAME)13) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_ONE_ARM_CABLE_LATERAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)14) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_OVERHAND_GRIP_REAR_LATERAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)15) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_PLATE_RAISES ((FIT_LATERAL_RAISE_EXERCISE_NAME)16) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_RING_DIP ((FIT_LATERAL_RAISE_EXERCISE_NAME)17) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_WEIGHTED_RING_DIP ((FIT_LATERAL_RAISE_EXERCISE_NAME)18) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_RING_MUSCLE_UP ((FIT_LATERAL_RAISE_EXERCISE_NAME)19) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_WEIGHTED_RING_MUSCLE_UP ((FIT_LATERAL_RAISE_EXERCISE_NAME)20) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_ROPE_CLIMB ((FIT_LATERAL_RAISE_EXERCISE_NAME)21) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_WEIGHTED_ROPE_CLIMB ((FIT_LATERAL_RAISE_EXERCISE_NAME)22) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_SCAPTION ((FIT_LATERAL_RAISE_EXERCISE_NAME)23) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_SEATED_LATERAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)24) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_SEATED_REAR_LATERAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)25) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_SIDE_LYING_LATERAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)26) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_STANDING_LIFT ((FIT_LATERAL_RAISE_EXERCISE_NAME)27) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_SUSPENDED_ROW ((FIT_LATERAL_RAISE_EXERCISE_NAME)28) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_UNDERHAND_GRIP_REAR_LATERAL_RAISE ((FIT_LATERAL_RAISE_EXERCISE_NAME)29) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_WALL_SLIDE ((FIT_LATERAL_RAISE_EXERCISE_NAME)30) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_WEIGHTED_WALL_SLIDE ((FIT_LATERAL_RAISE_EXERCISE_NAME)31) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_ARM_CIRCLES ((FIT_LATERAL_RAISE_EXERCISE_NAME)32) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_SHAVING_THE_HEAD ((FIT_LATERAL_RAISE_EXERCISE_NAME)33) +#define FIT_LATERAL_RAISE_EXERCISE_NAME_COUNT 34 + +typedef FIT_UINT16 FIT_LEG_CURL_EXERCISE_NAME; +#define FIT_LEG_CURL_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_LEG_CURL_EXERCISE_NAME_LEG_CURL ((FIT_LEG_CURL_EXERCISE_NAME)0) +#define FIT_LEG_CURL_EXERCISE_NAME_WEIGHTED_LEG_CURL ((FIT_LEG_CURL_EXERCISE_NAME)1) +#define FIT_LEG_CURL_EXERCISE_NAME_GOOD_MORNING ((FIT_LEG_CURL_EXERCISE_NAME)2) +#define FIT_LEG_CURL_EXERCISE_NAME_SEATED_BARBELL_GOOD_MORNING ((FIT_LEG_CURL_EXERCISE_NAME)3) +#define FIT_LEG_CURL_EXERCISE_NAME_SINGLE_LEG_BARBELL_GOOD_MORNING ((FIT_LEG_CURL_EXERCISE_NAME)4) +#define FIT_LEG_CURL_EXERCISE_NAME_SINGLE_LEG_SLIDING_LEG_CURL ((FIT_LEG_CURL_EXERCISE_NAME)5) +#define FIT_LEG_CURL_EXERCISE_NAME_SLIDING_LEG_CURL ((FIT_LEG_CURL_EXERCISE_NAME)6) +#define FIT_LEG_CURL_EXERCISE_NAME_SPLIT_BARBELL_GOOD_MORNING ((FIT_LEG_CURL_EXERCISE_NAME)7) +#define FIT_LEG_CURL_EXERCISE_NAME_SPLIT_STANCE_EXTENSION ((FIT_LEG_CURL_EXERCISE_NAME)8) +#define FIT_LEG_CURL_EXERCISE_NAME_STAGGERED_STANCE_GOOD_MORNING ((FIT_LEG_CURL_EXERCISE_NAME)9) +#define FIT_LEG_CURL_EXERCISE_NAME_SWISS_BALL_HIP_RAISE_AND_LEG_CURL ((FIT_LEG_CURL_EXERCISE_NAME)10) +#define FIT_LEG_CURL_EXERCISE_NAME_ZERCHER_GOOD_MORNING ((FIT_LEG_CURL_EXERCISE_NAME)11) +#define FIT_LEG_CURL_EXERCISE_NAME_COUNT 12 + +typedef FIT_UINT16 FIT_LEG_RAISE_EXERCISE_NAME; +#define FIT_LEG_RAISE_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_LEG_RAISE_EXERCISE_NAME_HANGING_KNEE_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)0) +#define FIT_LEG_RAISE_EXERCISE_NAME_HANGING_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)1) +#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_HANGING_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)2) +#define FIT_LEG_RAISE_EXERCISE_NAME_HANGING_SINGLE_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)3) +#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_HANGING_SINGLE_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)4) +#define FIT_LEG_RAISE_EXERCISE_NAME_KETTLEBELL_LEG_RAISES ((FIT_LEG_RAISE_EXERCISE_NAME)5) +#define FIT_LEG_RAISE_EXERCISE_NAME_LEG_LOWERING_DRILL ((FIT_LEG_RAISE_EXERCISE_NAME)6) +#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_LEG_LOWERING_DRILL ((FIT_LEG_RAISE_EXERCISE_NAME)7) +#define FIT_LEG_RAISE_EXERCISE_NAME_LYING_STRAIGHT_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)8) +#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_LYING_STRAIGHT_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)9) +#define FIT_LEG_RAISE_EXERCISE_NAME_MEDICINE_BALL_LEG_DROPS ((FIT_LEG_RAISE_EXERCISE_NAME)10) +#define FIT_LEG_RAISE_EXERCISE_NAME_QUADRUPED_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)11) +#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_QUADRUPED_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)12) +#define FIT_LEG_RAISE_EXERCISE_NAME_REVERSE_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)13) +#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_REVERSE_LEG_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)14) +#define FIT_LEG_RAISE_EXERCISE_NAME_REVERSE_LEG_RAISE_ON_SWISS_BALL ((FIT_LEG_RAISE_EXERCISE_NAME)15) +#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_REVERSE_LEG_RAISE_ON_SWISS_BALL ((FIT_LEG_RAISE_EXERCISE_NAME)16) +#define FIT_LEG_RAISE_EXERCISE_NAME_SINGLE_LEG_LOWERING_DRILL ((FIT_LEG_RAISE_EXERCISE_NAME)17) +#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_LOWERING_DRILL ((FIT_LEG_RAISE_EXERCISE_NAME)18) +#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_HANGING_KNEE_RAISE ((FIT_LEG_RAISE_EXERCISE_NAME)19) +#define FIT_LEG_RAISE_EXERCISE_NAME_LATERAL_STEPOVER ((FIT_LEG_RAISE_EXERCISE_NAME)20) +#define FIT_LEG_RAISE_EXERCISE_NAME_WEIGHTED_LATERAL_STEPOVER ((FIT_LEG_RAISE_EXERCISE_NAME)21) +#define FIT_LEG_RAISE_EXERCISE_NAME_COUNT 22 + +typedef FIT_UINT16 FIT_LUNGE_EXERCISE_NAME; +#define FIT_LUNGE_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_LUNGE_EXERCISE_NAME_OVERHEAD_LUNGE ((FIT_LUNGE_EXERCISE_NAME)0) +#define FIT_LUNGE_EXERCISE_NAME_LUNGE_MATRIX ((FIT_LUNGE_EXERCISE_NAME)1) +#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_LUNGE_MATRIX ((FIT_LUNGE_EXERCISE_NAME)2) +#define FIT_LUNGE_EXERCISE_NAME_ALTERNATING_BARBELL_FORWARD_LUNGE ((FIT_LUNGE_EXERCISE_NAME)3) +#define FIT_LUNGE_EXERCISE_NAME_ALTERNATING_DUMBBELL_LUNGE_WITH_REACH ((FIT_LUNGE_EXERCISE_NAME)4) +#define FIT_LUNGE_EXERCISE_NAME_BACK_FOOT_ELEVATED_DUMBBELL_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)5) +#define FIT_LUNGE_EXERCISE_NAME_BARBELL_BOX_LUNGE ((FIT_LUNGE_EXERCISE_NAME)6) +#define FIT_LUNGE_EXERCISE_NAME_BARBELL_BULGARIAN_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)7) +#define FIT_LUNGE_EXERCISE_NAME_BARBELL_CROSSOVER_LUNGE ((FIT_LUNGE_EXERCISE_NAME)8) +#define FIT_LUNGE_EXERCISE_NAME_BARBELL_FRONT_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)9) +#define FIT_LUNGE_EXERCISE_NAME_BARBELL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)10) +#define FIT_LUNGE_EXERCISE_NAME_BARBELL_REVERSE_LUNGE ((FIT_LUNGE_EXERCISE_NAME)11) +#define FIT_LUNGE_EXERCISE_NAME_BARBELL_SIDE_LUNGE ((FIT_LUNGE_EXERCISE_NAME)12) +#define FIT_LUNGE_EXERCISE_NAME_BARBELL_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)13) +#define FIT_LUNGE_EXERCISE_NAME_CORE_CONTROL_REAR_LUNGE ((FIT_LUNGE_EXERCISE_NAME)14) +#define FIT_LUNGE_EXERCISE_NAME_DIAGONAL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)15) +#define FIT_LUNGE_EXERCISE_NAME_DROP_LUNGE ((FIT_LUNGE_EXERCISE_NAME)16) +#define FIT_LUNGE_EXERCISE_NAME_DUMBBELL_BOX_LUNGE ((FIT_LUNGE_EXERCISE_NAME)17) +#define FIT_LUNGE_EXERCISE_NAME_DUMBBELL_BULGARIAN_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)18) +#define FIT_LUNGE_EXERCISE_NAME_DUMBBELL_CROSSOVER_LUNGE ((FIT_LUNGE_EXERCISE_NAME)19) +#define FIT_LUNGE_EXERCISE_NAME_DUMBBELL_DIAGONAL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)20) +#define FIT_LUNGE_EXERCISE_NAME_DUMBBELL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)21) +#define FIT_LUNGE_EXERCISE_NAME_DUMBBELL_LUNGE_AND_ROTATION ((FIT_LUNGE_EXERCISE_NAME)22) +#define FIT_LUNGE_EXERCISE_NAME_DUMBBELL_OVERHEAD_BULGARIAN_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)23) +#define FIT_LUNGE_EXERCISE_NAME_DUMBBELL_REVERSE_LUNGE_TO_HIGH_KNEE_AND_PRESS ((FIT_LUNGE_EXERCISE_NAME)24) +#define FIT_LUNGE_EXERCISE_NAME_DUMBBELL_SIDE_LUNGE ((FIT_LUNGE_EXERCISE_NAME)25) +#define FIT_LUNGE_EXERCISE_NAME_ELEVATED_FRONT_FOOT_BARBELL_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)26) +#define FIT_LUNGE_EXERCISE_NAME_FRONT_FOOT_ELEVATED_DUMBBELL_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)27) +#define FIT_LUNGE_EXERCISE_NAME_GUNSLINGER_LUNGE ((FIT_LUNGE_EXERCISE_NAME)28) +#define FIT_LUNGE_EXERCISE_NAME_LAWNMOWER_LUNGE ((FIT_LUNGE_EXERCISE_NAME)29) +#define FIT_LUNGE_EXERCISE_NAME_LOW_LUNGE_WITH_ISOMETRIC_ADDUCTION ((FIT_LUNGE_EXERCISE_NAME)30) +#define FIT_LUNGE_EXERCISE_NAME_LOW_SIDE_TO_SIDE_LUNGE ((FIT_LUNGE_EXERCISE_NAME)31) +#define FIT_LUNGE_EXERCISE_NAME_LUNGE ((FIT_LUNGE_EXERCISE_NAME)32) +#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_LUNGE ((FIT_LUNGE_EXERCISE_NAME)33) +#define FIT_LUNGE_EXERCISE_NAME_LUNGE_WITH_ARM_REACH ((FIT_LUNGE_EXERCISE_NAME)34) +#define FIT_LUNGE_EXERCISE_NAME_LUNGE_WITH_DIAGONAL_REACH ((FIT_LUNGE_EXERCISE_NAME)35) +#define FIT_LUNGE_EXERCISE_NAME_LUNGE_WITH_SIDE_BEND ((FIT_LUNGE_EXERCISE_NAME)36) +#define FIT_LUNGE_EXERCISE_NAME_OFFSET_DUMBBELL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)37) +#define FIT_LUNGE_EXERCISE_NAME_OFFSET_DUMBBELL_REVERSE_LUNGE ((FIT_LUNGE_EXERCISE_NAME)38) +#define FIT_LUNGE_EXERCISE_NAME_OVERHEAD_BULGARIAN_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)39) +#define FIT_LUNGE_EXERCISE_NAME_OVERHEAD_DUMBBELL_REVERSE_LUNGE ((FIT_LUNGE_EXERCISE_NAME)40) +#define FIT_LUNGE_EXERCISE_NAME_OVERHEAD_DUMBBELL_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)41) +#define FIT_LUNGE_EXERCISE_NAME_OVERHEAD_LUNGE_WITH_ROTATION ((FIT_LUNGE_EXERCISE_NAME)42) +#define FIT_LUNGE_EXERCISE_NAME_REVERSE_BARBELL_BOX_LUNGE ((FIT_LUNGE_EXERCISE_NAME)43) +#define FIT_LUNGE_EXERCISE_NAME_REVERSE_BOX_LUNGE ((FIT_LUNGE_EXERCISE_NAME)44) +#define FIT_LUNGE_EXERCISE_NAME_REVERSE_DUMBBELL_BOX_LUNGE ((FIT_LUNGE_EXERCISE_NAME)45) +#define FIT_LUNGE_EXERCISE_NAME_REVERSE_DUMBBELL_CROSSOVER_LUNGE ((FIT_LUNGE_EXERCISE_NAME)46) +#define FIT_LUNGE_EXERCISE_NAME_REVERSE_DUMBBELL_DIAGONAL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)47) +#define FIT_LUNGE_EXERCISE_NAME_REVERSE_LUNGE_WITH_REACH_BACK ((FIT_LUNGE_EXERCISE_NAME)48) +#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_REVERSE_LUNGE_WITH_REACH_BACK ((FIT_LUNGE_EXERCISE_NAME)49) +#define FIT_LUNGE_EXERCISE_NAME_REVERSE_LUNGE_WITH_TWIST_AND_OVERHEAD_REACH ((FIT_LUNGE_EXERCISE_NAME)50) +#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_REVERSE_LUNGE_WITH_TWIST_AND_OVERHEAD_REACH ((FIT_LUNGE_EXERCISE_NAME)51) +#define FIT_LUNGE_EXERCISE_NAME_REVERSE_SLIDING_BOX_LUNGE ((FIT_LUNGE_EXERCISE_NAME)52) +#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_REVERSE_SLIDING_BOX_LUNGE ((FIT_LUNGE_EXERCISE_NAME)53) +#define FIT_LUNGE_EXERCISE_NAME_REVERSE_SLIDING_LUNGE ((FIT_LUNGE_EXERCISE_NAME)54) +#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_REVERSE_SLIDING_LUNGE ((FIT_LUNGE_EXERCISE_NAME)55) +#define FIT_LUNGE_EXERCISE_NAME_RUNNERS_LUNGE_TO_BALANCE ((FIT_LUNGE_EXERCISE_NAME)56) +#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_RUNNERS_LUNGE_TO_BALANCE ((FIT_LUNGE_EXERCISE_NAME)57) +#define FIT_LUNGE_EXERCISE_NAME_SHIFTING_SIDE_LUNGE ((FIT_LUNGE_EXERCISE_NAME)58) +#define FIT_LUNGE_EXERCISE_NAME_SIDE_AND_CROSSOVER_LUNGE ((FIT_LUNGE_EXERCISE_NAME)59) +#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_SIDE_AND_CROSSOVER_LUNGE ((FIT_LUNGE_EXERCISE_NAME)60) +#define FIT_LUNGE_EXERCISE_NAME_SIDE_LUNGE ((FIT_LUNGE_EXERCISE_NAME)61) +#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_SIDE_LUNGE ((FIT_LUNGE_EXERCISE_NAME)62) +#define FIT_LUNGE_EXERCISE_NAME_SIDE_LUNGE_AND_PRESS ((FIT_LUNGE_EXERCISE_NAME)63) +#define FIT_LUNGE_EXERCISE_NAME_SIDE_LUNGE_JUMP_OFF ((FIT_LUNGE_EXERCISE_NAME)64) +#define FIT_LUNGE_EXERCISE_NAME_SIDE_LUNGE_SWEEP ((FIT_LUNGE_EXERCISE_NAME)65) +#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_SIDE_LUNGE_SWEEP ((FIT_LUNGE_EXERCISE_NAME)66) +#define FIT_LUNGE_EXERCISE_NAME_SIDE_LUNGE_TO_CROSSOVER_TAP ((FIT_LUNGE_EXERCISE_NAME)67) +#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_SIDE_LUNGE_TO_CROSSOVER_TAP ((FIT_LUNGE_EXERCISE_NAME)68) +#define FIT_LUNGE_EXERCISE_NAME_SIDE_TO_SIDE_LUNGE_CHOPS ((FIT_LUNGE_EXERCISE_NAME)69) +#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_SIDE_TO_SIDE_LUNGE_CHOPS ((FIT_LUNGE_EXERCISE_NAME)70) +#define FIT_LUNGE_EXERCISE_NAME_SIFF_JUMP_LUNGE ((FIT_LUNGE_EXERCISE_NAME)71) +#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_SIFF_JUMP_LUNGE ((FIT_LUNGE_EXERCISE_NAME)72) +#define FIT_LUNGE_EXERCISE_NAME_SINGLE_ARM_REVERSE_LUNGE_AND_PRESS ((FIT_LUNGE_EXERCISE_NAME)73) +#define FIT_LUNGE_EXERCISE_NAME_SLIDING_LATERAL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)74) +#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_SLIDING_LATERAL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)75) +#define FIT_LUNGE_EXERCISE_NAME_WALKING_BARBELL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)76) +#define FIT_LUNGE_EXERCISE_NAME_WALKING_DUMBBELL_LUNGE ((FIT_LUNGE_EXERCISE_NAME)77) +#define FIT_LUNGE_EXERCISE_NAME_WALKING_LUNGE ((FIT_LUNGE_EXERCISE_NAME)78) +#define FIT_LUNGE_EXERCISE_NAME_WEIGHTED_WALKING_LUNGE ((FIT_LUNGE_EXERCISE_NAME)79) +#define FIT_LUNGE_EXERCISE_NAME_WIDE_GRIP_OVERHEAD_BARBELL_SPLIT_SQUAT ((FIT_LUNGE_EXERCISE_NAME)80) +#define FIT_LUNGE_EXERCISE_NAME_COUNT 81 + +typedef FIT_UINT16 FIT_OLYMPIC_LIFT_EXERCISE_NAME; +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_HANG_POWER_CLEAN ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)0) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_HANG_SQUAT_CLEAN ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)1) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_POWER_CLEAN ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)2) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_POWER_SNATCH ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)3) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_SQUAT_CLEAN ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)4) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_CLEAN_AND_JERK ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)5) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_HANG_POWER_SNATCH ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)6) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_HANG_PULL ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)7) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_HIGH_PULL ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)8) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_SNATCH ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)9) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_BARBELL_SPLIT_JERK ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)10) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_CLEAN ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)11) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_DUMBBELL_CLEAN ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)12) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_DUMBBELL_HANG_PULL ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)13) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_ONE_HAND_DUMBBELL_SPLIT_SNATCH ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)14) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_PUSH_JERK ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)15) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_SINGLE_ARM_DUMBBELL_SNATCH ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)16) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_SINGLE_ARM_HANG_SNATCH ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)17) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_SINGLE_ARM_KETTLEBELL_SNATCH ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)18) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_SPLIT_JERK ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)19) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_SQUAT_CLEAN_AND_JERK ((FIT_OLYMPIC_LIFT_EXERCISE_NAME)20) +#define FIT_OLYMPIC_LIFT_EXERCISE_NAME_COUNT 21 + +typedef FIT_UINT16 FIT_PLANK_EXERCISE_NAME; +#define FIT_PLANK_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_PLANK_EXERCISE_NAME_45_DEGREE_PLANK ((FIT_PLANK_EXERCISE_NAME)0) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_45_DEGREE_PLANK ((FIT_PLANK_EXERCISE_NAME)1) +#define FIT_PLANK_EXERCISE_NAME_90_DEGREE_STATIC_HOLD ((FIT_PLANK_EXERCISE_NAME)2) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_90_DEGREE_STATIC_HOLD ((FIT_PLANK_EXERCISE_NAME)3) +#define FIT_PLANK_EXERCISE_NAME_BEAR_CRAWL ((FIT_PLANK_EXERCISE_NAME)4) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_BEAR_CRAWL ((FIT_PLANK_EXERCISE_NAME)5) +#define FIT_PLANK_EXERCISE_NAME_CROSS_BODY_MOUNTAIN_CLIMBER ((FIT_PLANK_EXERCISE_NAME)6) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_CROSS_BODY_MOUNTAIN_CLIMBER ((FIT_PLANK_EXERCISE_NAME)7) +#define FIT_PLANK_EXERCISE_NAME_ELBOW_PLANK_PIKE_JACKS ((FIT_PLANK_EXERCISE_NAME)8) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_ELBOW_PLANK_PIKE_JACKS ((FIT_PLANK_EXERCISE_NAME)9) +#define FIT_PLANK_EXERCISE_NAME_ELEVATED_FEET_PLANK ((FIT_PLANK_EXERCISE_NAME)10) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_ELEVATED_FEET_PLANK ((FIT_PLANK_EXERCISE_NAME)11) +#define FIT_PLANK_EXERCISE_NAME_ELEVATOR_ABS ((FIT_PLANK_EXERCISE_NAME)12) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_ELEVATOR_ABS ((FIT_PLANK_EXERCISE_NAME)13) +#define FIT_PLANK_EXERCISE_NAME_EXTENDED_PLANK ((FIT_PLANK_EXERCISE_NAME)14) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_EXTENDED_PLANK ((FIT_PLANK_EXERCISE_NAME)15) +#define FIT_PLANK_EXERCISE_NAME_FULL_PLANK_PASSE_TWIST ((FIT_PLANK_EXERCISE_NAME)16) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_FULL_PLANK_PASSE_TWIST ((FIT_PLANK_EXERCISE_NAME)17) +#define FIT_PLANK_EXERCISE_NAME_INCHING_ELBOW_PLANK ((FIT_PLANK_EXERCISE_NAME)18) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_INCHING_ELBOW_PLANK ((FIT_PLANK_EXERCISE_NAME)19) +#define FIT_PLANK_EXERCISE_NAME_INCHWORM_TO_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)20) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_INCHWORM_TO_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)21) +#define FIT_PLANK_EXERCISE_NAME_KNEELING_PLANK ((FIT_PLANK_EXERCISE_NAME)22) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_KNEELING_PLANK ((FIT_PLANK_EXERCISE_NAME)23) +#define FIT_PLANK_EXERCISE_NAME_KNEELING_SIDE_PLANK_WITH_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)24) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_KNEELING_SIDE_PLANK_WITH_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)25) +#define FIT_PLANK_EXERCISE_NAME_LATERAL_ROLL ((FIT_PLANK_EXERCISE_NAME)26) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_LATERAL_ROLL ((FIT_PLANK_EXERCISE_NAME)27) +#define FIT_PLANK_EXERCISE_NAME_LYING_REVERSE_PLANK ((FIT_PLANK_EXERCISE_NAME)28) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_LYING_REVERSE_PLANK ((FIT_PLANK_EXERCISE_NAME)29) +#define FIT_PLANK_EXERCISE_NAME_MEDICINE_BALL_MOUNTAIN_CLIMBER ((FIT_PLANK_EXERCISE_NAME)30) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_MEDICINE_BALL_MOUNTAIN_CLIMBER ((FIT_PLANK_EXERCISE_NAME)31) +#define FIT_PLANK_EXERCISE_NAME_MODIFIED_MOUNTAIN_CLIMBER_AND_EXTENSION ((FIT_PLANK_EXERCISE_NAME)32) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_MODIFIED_MOUNTAIN_CLIMBER_AND_EXTENSION ((FIT_PLANK_EXERCISE_NAME)33) +#define FIT_PLANK_EXERCISE_NAME_MOUNTAIN_CLIMBER ((FIT_PLANK_EXERCISE_NAME)34) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_MOUNTAIN_CLIMBER ((FIT_PLANK_EXERCISE_NAME)35) +#define FIT_PLANK_EXERCISE_NAME_MOUNTAIN_CLIMBER_ON_SLIDING_DISCS ((FIT_PLANK_EXERCISE_NAME)36) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_MOUNTAIN_CLIMBER_ON_SLIDING_DISCS ((FIT_PLANK_EXERCISE_NAME)37) +#define FIT_PLANK_EXERCISE_NAME_MOUNTAIN_CLIMBER_WITH_FEET_ON_BOSU_BALL ((FIT_PLANK_EXERCISE_NAME)38) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_MOUNTAIN_CLIMBER_WITH_FEET_ON_BOSU_BALL ((FIT_PLANK_EXERCISE_NAME)39) +#define FIT_PLANK_EXERCISE_NAME_MOUNTAIN_CLIMBER_WITH_HANDS_ON_BENCH ((FIT_PLANK_EXERCISE_NAME)40) +#define FIT_PLANK_EXERCISE_NAME_MOUNTAIN_CLIMBER_WITH_HANDS_ON_SWISS_BALL ((FIT_PLANK_EXERCISE_NAME)41) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_MOUNTAIN_CLIMBER_WITH_HANDS_ON_SWISS_BALL ((FIT_PLANK_EXERCISE_NAME)42) +#define FIT_PLANK_EXERCISE_NAME_PLANK ((FIT_PLANK_EXERCISE_NAME)43) +#define FIT_PLANK_EXERCISE_NAME_PLANK_JACKS_WITH_FEET_ON_SLIDING_DISCS ((FIT_PLANK_EXERCISE_NAME)44) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLANK_JACKS_WITH_FEET_ON_SLIDING_DISCS ((FIT_PLANK_EXERCISE_NAME)45) +#define FIT_PLANK_EXERCISE_NAME_PLANK_KNEE_TWIST ((FIT_PLANK_EXERCISE_NAME)46) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLANK_KNEE_TWIST ((FIT_PLANK_EXERCISE_NAME)47) +#define FIT_PLANK_EXERCISE_NAME_PLANK_PIKE_JUMPS ((FIT_PLANK_EXERCISE_NAME)48) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLANK_PIKE_JUMPS ((FIT_PLANK_EXERCISE_NAME)49) +#define FIT_PLANK_EXERCISE_NAME_PLANK_PIKES ((FIT_PLANK_EXERCISE_NAME)50) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLANK_PIKES ((FIT_PLANK_EXERCISE_NAME)51) +#define FIT_PLANK_EXERCISE_NAME_PLANK_TO_STAND_UP ((FIT_PLANK_EXERCISE_NAME)52) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLANK_TO_STAND_UP ((FIT_PLANK_EXERCISE_NAME)53) +#define FIT_PLANK_EXERCISE_NAME_PLANK_WITH_ARM_RAISE ((FIT_PLANK_EXERCISE_NAME)54) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLANK_WITH_ARM_RAISE ((FIT_PLANK_EXERCISE_NAME)55) +#define FIT_PLANK_EXERCISE_NAME_PLANK_WITH_KNEE_TO_ELBOW ((FIT_PLANK_EXERCISE_NAME)56) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLANK_WITH_KNEE_TO_ELBOW ((FIT_PLANK_EXERCISE_NAME)57) +#define FIT_PLANK_EXERCISE_NAME_PLANK_WITH_OBLIQUE_CRUNCH ((FIT_PLANK_EXERCISE_NAME)58) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLANK_WITH_OBLIQUE_CRUNCH ((FIT_PLANK_EXERCISE_NAME)59) +#define FIT_PLANK_EXERCISE_NAME_PLYOMETRIC_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)60) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLYOMETRIC_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)61) +#define FIT_PLANK_EXERCISE_NAME_ROLLING_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)62) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_ROLLING_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)63) +#define FIT_PLANK_EXERCISE_NAME_SIDE_KICK_PLANK ((FIT_PLANK_EXERCISE_NAME)64) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_KICK_PLANK ((FIT_PLANK_EXERCISE_NAME)65) +#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)66) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)67) +#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK_AND_ROW ((FIT_PLANK_EXERCISE_NAME)68) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_PLANK_AND_ROW ((FIT_PLANK_EXERCISE_NAME)69) +#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK_LIFT ((FIT_PLANK_EXERCISE_NAME)70) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_PLANK_LIFT ((FIT_PLANK_EXERCISE_NAME)71) +#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK_WITH_ELBOW_ON_BOSU_BALL ((FIT_PLANK_EXERCISE_NAME)72) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_PLANK_WITH_ELBOW_ON_BOSU_BALL ((FIT_PLANK_EXERCISE_NAME)73) +#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK_WITH_FEET_ON_BENCH ((FIT_PLANK_EXERCISE_NAME)74) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_PLANK_WITH_FEET_ON_BENCH ((FIT_PLANK_EXERCISE_NAME)75) +#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK_WITH_KNEE_CIRCLE ((FIT_PLANK_EXERCISE_NAME)76) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_PLANK_WITH_KNEE_CIRCLE ((FIT_PLANK_EXERCISE_NAME)77) +#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK_WITH_KNEE_TUCK ((FIT_PLANK_EXERCISE_NAME)78) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_PLANK_WITH_KNEE_TUCK ((FIT_PLANK_EXERCISE_NAME)79) +#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK_WITH_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)80) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_PLANK_WITH_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)81) +#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK_WITH_REACH_UNDER ((FIT_PLANK_EXERCISE_NAME)82) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SIDE_PLANK_WITH_REACH_UNDER ((FIT_PLANK_EXERCISE_NAME)83) +#define FIT_PLANK_EXERCISE_NAME_SINGLE_LEG_ELEVATED_FEET_PLANK ((FIT_PLANK_EXERCISE_NAME)84) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_ELEVATED_FEET_PLANK ((FIT_PLANK_EXERCISE_NAME)85) +#define FIT_PLANK_EXERCISE_NAME_SINGLE_LEG_FLEX_AND_EXTEND ((FIT_PLANK_EXERCISE_NAME)86) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_FLEX_AND_EXTEND ((FIT_PLANK_EXERCISE_NAME)87) +#define FIT_PLANK_EXERCISE_NAME_SINGLE_LEG_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)88) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)89) +#define FIT_PLANK_EXERCISE_NAME_SPIDERMAN_PLANK ((FIT_PLANK_EXERCISE_NAME)90) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SPIDERMAN_PLANK ((FIT_PLANK_EXERCISE_NAME)91) +#define FIT_PLANK_EXERCISE_NAME_STRAIGHT_ARM_PLANK ((FIT_PLANK_EXERCISE_NAME)92) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_STRAIGHT_ARM_PLANK ((FIT_PLANK_EXERCISE_NAME)93) +#define FIT_PLANK_EXERCISE_NAME_STRAIGHT_ARM_PLANK_WITH_SHOULDER_TOUCH ((FIT_PLANK_EXERCISE_NAME)94) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_STRAIGHT_ARM_PLANK_WITH_SHOULDER_TOUCH ((FIT_PLANK_EXERCISE_NAME)95) +#define FIT_PLANK_EXERCISE_NAME_SWISS_BALL_PLANK ((FIT_PLANK_EXERCISE_NAME)96) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SWISS_BALL_PLANK ((FIT_PLANK_EXERCISE_NAME)97) +#define FIT_PLANK_EXERCISE_NAME_SWISS_BALL_PLANK_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)98) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SWISS_BALL_PLANK_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)99) +#define FIT_PLANK_EXERCISE_NAME_SWISS_BALL_PLANK_LEG_LIFT_AND_HOLD ((FIT_PLANK_EXERCISE_NAME)100) +#define FIT_PLANK_EXERCISE_NAME_SWISS_BALL_PLANK_WITH_FEET_ON_BENCH ((FIT_PLANK_EXERCISE_NAME)101) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SWISS_BALL_PLANK_WITH_FEET_ON_BENCH ((FIT_PLANK_EXERCISE_NAME)102) +#define FIT_PLANK_EXERCISE_NAME_SWISS_BALL_PRONE_JACKKNIFE ((FIT_PLANK_EXERCISE_NAME)103) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SWISS_BALL_PRONE_JACKKNIFE ((FIT_PLANK_EXERCISE_NAME)104) +#define FIT_PLANK_EXERCISE_NAME_SWISS_BALL_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)105) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SWISS_BALL_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)106) +#define FIT_PLANK_EXERCISE_NAME_THREE_WAY_PLANK ((FIT_PLANK_EXERCISE_NAME)107) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_THREE_WAY_PLANK ((FIT_PLANK_EXERCISE_NAME)108) +#define FIT_PLANK_EXERCISE_NAME_TOWEL_PLANK_AND_KNEE_IN ((FIT_PLANK_EXERCISE_NAME)109) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_TOWEL_PLANK_AND_KNEE_IN ((FIT_PLANK_EXERCISE_NAME)110) +#define FIT_PLANK_EXERCISE_NAME_T_STABILIZATION ((FIT_PLANK_EXERCISE_NAME)111) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_T_STABILIZATION ((FIT_PLANK_EXERCISE_NAME)112) +#define FIT_PLANK_EXERCISE_NAME_TURKISH_GET_UP_TO_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)113) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_TURKISH_GET_UP_TO_SIDE_PLANK ((FIT_PLANK_EXERCISE_NAME)114) +#define FIT_PLANK_EXERCISE_NAME_TWO_POINT_PLANK ((FIT_PLANK_EXERCISE_NAME)115) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_TWO_POINT_PLANK ((FIT_PLANK_EXERCISE_NAME)116) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_PLANK ((FIT_PLANK_EXERCISE_NAME)117) +#define FIT_PLANK_EXERCISE_NAME_WIDE_STANCE_PLANK_WITH_DIAGONAL_ARM_LIFT ((FIT_PLANK_EXERCISE_NAME)118) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_WIDE_STANCE_PLANK_WITH_DIAGONAL_ARM_LIFT ((FIT_PLANK_EXERCISE_NAME)119) +#define FIT_PLANK_EXERCISE_NAME_WIDE_STANCE_PLANK_WITH_DIAGONAL_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)120) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_WIDE_STANCE_PLANK_WITH_DIAGONAL_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)121) +#define FIT_PLANK_EXERCISE_NAME_WIDE_STANCE_PLANK_WITH_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)122) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_WIDE_STANCE_PLANK_WITH_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)123) +#define FIT_PLANK_EXERCISE_NAME_WIDE_STANCE_PLANK_WITH_OPPOSITE_ARM_AND_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)124) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_MOUNTAIN_CLIMBER_WITH_HANDS_ON_BENCH ((FIT_PLANK_EXERCISE_NAME)125) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_SWISS_BALL_PLANK_LEG_LIFT_AND_HOLD ((FIT_PLANK_EXERCISE_NAME)126) +#define FIT_PLANK_EXERCISE_NAME_WEIGHTED_WIDE_STANCE_PLANK_WITH_OPPOSITE_ARM_AND_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)127) +#define FIT_PLANK_EXERCISE_NAME_PLANK_WITH_FEET_ON_SWISS_BALL ((FIT_PLANK_EXERCISE_NAME)128) +#define FIT_PLANK_EXERCISE_NAME_SIDE_PLANK_TO_PLANK_WITH_REACH_UNDER ((FIT_PLANK_EXERCISE_NAME)129) +#define FIT_PLANK_EXERCISE_NAME_BRIDGE_WITH_GLUTE_LOWER_LIFT ((FIT_PLANK_EXERCISE_NAME)130) +#define FIT_PLANK_EXERCISE_NAME_BRIDGE_ONE_LEG_BRIDGE ((FIT_PLANK_EXERCISE_NAME)131) +#define FIT_PLANK_EXERCISE_NAME_PLANK_WITH_ARM_VARIATIONS ((FIT_PLANK_EXERCISE_NAME)132) +#define FIT_PLANK_EXERCISE_NAME_PLANK_WITH_LEG_LIFT ((FIT_PLANK_EXERCISE_NAME)133) +#define FIT_PLANK_EXERCISE_NAME_REVERSE_PLANK_WITH_LEG_PULL ((FIT_PLANK_EXERCISE_NAME)134) +#define FIT_PLANK_EXERCISE_NAME_COUNT 135 + +typedef FIT_UINT16 FIT_PLYO_EXERCISE_NAME; +#define FIT_PLYO_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_PLYO_EXERCISE_NAME_ALTERNATING_JUMP_LUNGE ((FIT_PLYO_EXERCISE_NAME)0) +#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_ALTERNATING_JUMP_LUNGE ((FIT_PLYO_EXERCISE_NAME)1) +#define FIT_PLYO_EXERCISE_NAME_BARBELL_JUMP_SQUAT ((FIT_PLYO_EXERCISE_NAME)2) +#define FIT_PLYO_EXERCISE_NAME_BODY_WEIGHT_JUMP_SQUAT ((FIT_PLYO_EXERCISE_NAME)3) +#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_JUMP_SQUAT ((FIT_PLYO_EXERCISE_NAME)4) +#define FIT_PLYO_EXERCISE_NAME_CROSS_KNEE_STRIKE ((FIT_PLYO_EXERCISE_NAME)5) +#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_CROSS_KNEE_STRIKE ((FIT_PLYO_EXERCISE_NAME)6) +#define FIT_PLYO_EXERCISE_NAME_DEPTH_JUMP ((FIT_PLYO_EXERCISE_NAME)7) +#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_DEPTH_JUMP ((FIT_PLYO_EXERCISE_NAME)8) +#define FIT_PLYO_EXERCISE_NAME_DUMBBELL_JUMP_SQUAT ((FIT_PLYO_EXERCISE_NAME)9) +#define FIT_PLYO_EXERCISE_NAME_DUMBBELL_SPLIT_JUMP ((FIT_PLYO_EXERCISE_NAME)10) +#define FIT_PLYO_EXERCISE_NAME_FRONT_KNEE_STRIKE ((FIT_PLYO_EXERCISE_NAME)11) +#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_FRONT_KNEE_STRIKE ((FIT_PLYO_EXERCISE_NAME)12) +#define FIT_PLYO_EXERCISE_NAME_HIGH_BOX_JUMP ((FIT_PLYO_EXERCISE_NAME)13) +#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_HIGH_BOX_JUMP ((FIT_PLYO_EXERCISE_NAME)14) +#define FIT_PLYO_EXERCISE_NAME_ISOMETRIC_EXPLOSIVE_BODY_WEIGHT_JUMP_SQUAT ((FIT_PLYO_EXERCISE_NAME)15) +#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_ISOMETRIC_EXPLOSIVE_JUMP_SQUAT ((FIT_PLYO_EXERCISE_NAME)16) +#define FIT_PLYO_EXERCISE_NAME_LATERAL_LEAP_AND_HOP ((FIT_PLYO_EXERCISE_NAME)17) +#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_LATERAL_LEAP_AND_HOP ((FIT_PLYO_EXERCISE_NAME)18) +#define FIT_PLYO_EXERCISE_NAME_LATERAL_PLYO_SQUATS ((FIT_PLYO_EXERCISE_NAME)19) +#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_LATERAL_PLYO_SQUATS ((FIT_PLYO_EXERCISE_NAME)20) +#define FIT_PLYO_EXERCISE_NAME_LATERAL_SLIDE ((FIT_PLYO_EXERCISE_NAME)21) +#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_LATERAL_SLIDE ((FIT_PLYO_EXERCISE_NAME)22) +#define FIT_PLYO_EXERCISE_NAME_MEDICINE_BALL_OVERHEAD_THROWS ((FIT_PLYO_EXERCISE_NAME)23) +#define FIT_PLYO_EXERCISE_NAME_MEDICINE_BALL_SIDE_THROW ((FIT_PLYO_EXERCISE_NAME)24) +#define FIT_PLYO_EXERCISE_NAME_MEDICINE_BALL_SLAM ((FIT_PLYO_EXERCISE_NAME)25) +#define FIT_PLYO_EXERCISE_NAME_SIDE_TO_SIDE_MEDICINE_BALL_THROWS ((FIT_PLYO_EXERCISE_NAME)26) +#define FIT_PLYO_EXERCISE_NAME_SIDE_TO_SIDE_SHUFFLE_JUMP ((FIT_PLYO_EXERCISE_NAME)27) +#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_SIDE_TO_SIDE_SHUFFLE_JUMP ((FIT_PLYO_EXERCISE_NAME)28) +#define FIT_PLYO_EXERCISE_NAME_SQUAT_JUMP_ONTO_BOX ((FIT_PLYO_EXERCISE_NAME)29) +#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_SQUAT_JUMP_ONTO_BOX ((FIT_PLYO_EXERCISE_NAME)30) +#define FIT_PLYO_EXERCISE_NAME_SQUAT_JUMPS_IN_AND_OUT ((FIT_PLYO_EXERCISE_NAME)31) +#define FIT_PLYO_EXERCISE_NAME_WEIGHTED_SQUAT_JUMPS_IN_AND_OUT ((FIT_PLYO_EXERCISE_NAME)32) +#define FIT_PLYO_EXERCISE_NAME_COUNT 33 + +typedef FIT_UINT16 FIT_PULL_UP_EXERCISE_NAME; +#define FIT_PULL_UP_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_PULL_UP_EXERCISE_NAME_BANDED_PULL_UPS ((FIT_PULL_UP_EXERCISE_NAME)0) +#define FIT_PULL_UP_EXERCISE_NAME_30_DEGREE_LAT_PULLDOWN ((FIT_PULL_UP_EXERCISE_NAME)1) +#define FIT_PULL_UP_EXERCISE_NAME_BAND_ASSISTED_CHIN_UP ((FIT_PULL_UP_EXERCISE_NAME)2) +#define FIT_PULL_UP_EXERCISE_NAME_CLOSE_GRIP_CHIN_UP ((FIT_PULL_UP_EXERCISE_NAME)3) +#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_CLOSE_GRIP_CHIN_UP ((FIT_PULL_UP_EXERCISE_NAME)4) +#define FIT_PULL_UP_EXERCISE_NAME_CLOSE_GRIP_LAT_PULLDOWN ((FIT_PULL_UP_EXERCISE_NAME)5) +#define FIT_PULL_UP_EXERCISE_NAME_CROSSOVER_CHIN_UP ((FIT_PULL_UP_EXERCISE_NAME)6) +#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_CROSSOVER_CHIN_UP ((FIT_PULL_UP_EXERCISE_NAME)7) +#define FIT_PULL_UP_EXERCISE_NAME_EZ_BAR_PULLOVER ((FIT_PULL_UP_EXERCISE_NAME)8) +#define FIT_PULL_UP_EXERCISE_NAME_HANGING_HURDLE ((FIT_PULL_UP_EXERCISE_NAME)9) +#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_HANGING_HURDLE ((FIT_PULL_UP_EXERCISE_NAME)10) +#define FIT_PULL_UP_EXERCISE_NAME_KNEELING_LAT_PULLDOWN ((FIT_PULL_UP_EXERCISE_NAME)11) +#define FIT_PULL_UP_EXERCISE_NAME_KNEELING_UNDERHAND_GRIP_LAT_PULLDOWN ((FIT_PULL_UP_EXERCISE_NAME)12) +#define FIT_PULL_UP_EXERCISE_NAME_LAT_PULLDOWN ((FIT_PULL_UP_EXERCISE_NAME)13) +#define FIT_PULL_UP_EXERCISE_NAME_MIXED_GRIP_CHIN_UP ((FIT_PULL_UP_EXERCISE_NAME)14) +#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_MIXED_GRIP_CHIN_UP ((FIT_PULL_UP_EXERCISE_NAME)15) +#define FIT_PULL_UP_EXERCISE_NAME_MIXED_GRIP_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)16) +#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_MIXED_GRIP_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)17) +#define FIT_PULL_UP_EXERCISE_NAME_REVERSE_GRIP_PULLDOWN ((FIT_PULL_UP_EXERCISE_NAME)18) +#define FIT_PULL_UP_EXERCISE_NAME_STANDING_CABLE_PULLOVER ((FIT_PULL_UP_EXERCISE_NAME)19) +#define FIT_PULL_UP_EXERCISE_NAME_STRAIGHT_ARM_PULLDOWN ((FIT_PULL_UP_EXERCISE_NAME)20) +#define FIT_PULL_UP_EXERCISE_NAME_SWISS_BALL_EZ_BAR_PULLOVER ((FIT_PULL_UP_EXERCISE_NAME)21) +#define FIT_PULL_UP_EXERCISE_NAME_TOWEL_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)22) +#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_TOWEL_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)23) +#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)24) +#define FIT_PULL_UP_EXERCISE_NAME_WIDE_GRIP_LAT_PULLDOWN ((FIT_PULL_UP_EXERCISE_NAME)25) +#define FIT_PULL_UP_EXERCISE_NAME_WIDE_GRIP_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)26) +#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_WIDE_GRIP_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)27) +#define FIT_PULL_UP_EXERCISE_NAME_BURPEE_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)28) +#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_BURPEE_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)29) +#define FIT_PULL_UP_EXERCISE_NAME_JUMPING_PULL_UPS ((FIT_PULL_UP_EXERCISE_NAME)30) +#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_JUMPING_PULL_UPS ((FIT_PULL_UP_EXERCISE_NAME)31) +#define FIT_PULL_UP_EXERCISE_NAME_KIPPING_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)32) +#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_KIPPING_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)33) +#define FIT_PULL_UP_EXERCISE_NAME_L_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)34) +#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_L_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)35) +#define FIT_PULL_UP_EXERCISE_NAME_SUSPENDED_CHIN_UP ((FIT_PULL_UP_EXERCISE_NAME)36) +#define FIT_PULL_UP_EXERCISE_NAME_WEIGHTED_SUSPENDED_CHIN_UP ((FIT_PULL_UP_EXERCISE_NAME)37) +#define FIT_PULL_UP_EXERCISE_NAME_PULL_UP ((FIT_PULL_UP_EXERCISE_NAME)38) +#define FIT_PULL_UP_EXERCISE_NAME_COUNT 39 + +typedef FIT_UINT16 FIT_PUSH_UP_EXERCISE_NAME; +#define FIT_PUSH_UP_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_PUSH_UP_EXERCISE_NAME_CHEST_PRESS_WITH_BAND ((FIT_PUSH_UP_EXERCISE_NAME)0) +#define FIT_PUSH_UP_EXERCISE_NAME_ALTERNATING_STAGGERED_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)1) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_ALTERNATING_STAGGERED_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)2) +#define FIT_PUSH_UP_EXERCISE_NAME_ALTERNATING_HANDS_MEDICINE_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)3) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_ALTERNATING_HANDS_MEDICINE_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)4) +#define FIT_PUSH_UP_EXERCISE_NAME_BOSU_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)5) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_BOSU_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)6) +#define FIT_PUSH_UP_EXERCISE_NAME_CLAPPING_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)7) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_CLAPPING_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)8) +#define FIT_PUSH_UP_EXERCISE_NAME_CLOSE_GRIP_MEDICINE_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)9) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_CLOSE_GRIP_MEDICINE_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)10) +#define FIT_PUSH_UP_EXERCISE_NAME_CLOSE_HANDS_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)11) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_CLOSE_HANDS_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)12) +#define FIT_PUSH_UP_EXERCISE_NAME_DECLINE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)13) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_DECLINE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)14) +#define FIT_PUSH_UP_EXERCISE_NAME_DIAMOND_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)15) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_DIAMOND_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)16) +#define FIT_PUSH_UP_EXERCISE_NAME_EXPLOSIVE_CROSSOVER_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)17) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_EXPLOSIVE_CROSSOVER_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)18) +#define FIT_PUSH_UP_EXERCISE_NAME_EXPLOSIVE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)19) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_EXPLOSIVE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)20) +#define FIT_PUSH_UP_EXERCISE_NAME_FEET_ELEVATED_SIDE_TO_SIDE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)21) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_FEET_ELEVATED_SIDE_TO_SIDE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)22) +#define FIT_PUSH_UP_EXERCISE_NAME_HAND_RELEASE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)23) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_HAND_RELEASE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)24) +#define FIT_PUSH_UP_EXERCISE_NAME_HANDSTAND_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)25) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_HANDSTAND_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)26) +#define FIT_PUSH_UP_EXERCISE_NAME_INCLINE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)27) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_INCLINE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)28) +#define FIT_PUSH_UP_EXERCISE_NAME_ISOMETRIC_EXPLOSIVE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)29) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_ISOMETRIC_EXPLOSIVE_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)30) +#define FIT_PUSH_UP_EXERCISE_NAME_JUDO_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)31) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_JUDO_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)32) +#define FIT_PUSH_UP_EXERCISE_NAME_KNEELING_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)33) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_KNEELING_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)34) +#define FIT_PUSH_UP_EXERCISE_NAME_MEDICINE_BALL_CHEST_PASS ((FIT_PUSH_UP_EXERCISE_NAME)35) +#define FIT_PUSH_UP_EXERCISE_NAME_MEDICINE_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)36) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_MEDICINE_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)37) +#define FIT_PUSH_UP_EXERCISE_NAME_ONE_ARM_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)38) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_ONE_ARM_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)39) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)40) +#define FIT_PUSH_UP_EXERCISE_NAME_PUSH_UP_AND_ROW ((FIT_PUSH_UP_EXERCISE_NAME)41) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_PUSH_UP_AND_ROW ((FIT_PUSH_UP_EXERCISE_NAME)42) +#define FIT_PUSH_UP_EXERCISE_NAME_PUSH_UP_PLUS ((FIT_PUSH_UP_EXERCISE_NAME)43) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_PUSH_UP_PLUS ((FIT_PUSH_UP_EXERCISE_NAME)44) +#define FIT_PUSH_UP_EXERCISE_NAME_PUSH_UP_WITH_FEET_ON_SWISS_BALL ((FIT_PUSH_UP_EXERCISE_NAME)45) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_PUSH_UP_WITH_FEET_ON_SWISS_BALL ((FIT_PUSH_UP_EXERCISE_NAME)46) +#define FIT_PUSH_UP_EXERCISE_NAME_PUSH_UP_WITH_ONE_HAND_ON_MEDICINE_BALL ((FIT_PUSH_UP_EXERCISE_NAME)47) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_PUSH_UP_WITH_ONE_HAND_ON_MEDICINE_BALL ((FIT_PUSH_UP_EXERCISE_NAME)48) +#define FIT_PUSH_UP_EXERCISE_NAME_SHOULDER_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)49) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_SHOULDER_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)50) +#define FIT_PUSH_UP_EXERCISE_NAME_SINGLE_ARM_MEDICINE_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)51) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_SINGLE_ARM_MEDICINE_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)52) +#define FIT_PUSH_UP_EXERCISE_NAME_SPIDERMAN_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)53) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_SPIDERMAN_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)54) +#define FIT_PUSH_UP_EXERCISE_NAME_STACKED_FEET_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)55) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_STACKED_FEET_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)56) +#define FIT_PUSH_UP_EXERCISE_NAME_STAGGERED_HANDS_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)57) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_STAGGERED_HANDS_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)58) +#define FIT_PUSH_UP_EXERCISE_NAME_SUSPENDED_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)59) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_SUSPENDED_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)60) +#define FIT_PUSH_UP_EXERCISE_NAME_SWISS_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)61) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_SWISS_BALL_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)62) +#define FIT_PUSH_UP_EXERCISE_NAME_SWISS_BALL_PUSH_UP_PLUS ((FIT_PUSH_UP_EXERCISE_NAME)63) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_SWISS_BALL_PUSH_UP_PLUS ((FIT_PUSH_UP_EXERCISE_NAME)64) +#define FIT_PUSH_UP_EXERCISE_NAME_T_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)65) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_T_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)66) +#define FIT_PUSH_UP_EXERCISE_NAME_TRIPLE_STOP_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)67) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_TRIPLE_STOP_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)68) +#define FIT_PUSH_UP_EXERCISE_NAME_WIDE_HANDS_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)69) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_WIDE_HANDS_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)70) +#define FIT_PUSH_UP_EXERCISE_NAME_PARALLETTE_HANDSTAND_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)71) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_PARALLETTE_HANDSTAND_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)72) +#define FIT_PUSH_UP_EXERCISE_NAME_RING_HANDSTAND_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)73) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_RING_HANDSTAND_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)74) +#define FIT_PUSH_UP_EXERCISE_NAME_RING_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)75) +#define FIT_PUSH_UP_EXERCISE_NAME_WEIGHTED_RING_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)76) +#define FIT_PUSH_UP_EXERCISE_NAME_PUSH_UP ((FIT_PUSH_UP_EXERCISE_NAME)77) +#define FIT_PUSH_UP_EXERCISE_NAME_PILATES_PUSHUP ((FIT_PUSH_UP_EXERCISE_NAME)78) +#define FIT_PUSH_UP_EXERCISE_NAME_COUNT 79 + +typedef FIT_UINT16 FIT_ROW_EXERCISE_NAME; +#define FIT_ROW_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_ROW_EXERCISE_NAME_BARBELL_STRAIGHT_LEG_DEADLIFT_TO_ROW ((FIT_ROW_EXERCISE_NAME)0) +#define FIT_ROW_EXERCISE_NAME_CABLE_ROW_STANDING ((FIT_ROW_EXERCISE_NAME)1) +#define FIT_ROW_EXERCISE_NAME_DUMBBELL_ROW ((FIT_ROW_EXERCISE_NAME)2) +#define FIT_ROW_EXERCISE_NAME_ELEVATED_FEET_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)3) +#define FIT_ROW_EXERCISE_NAME_WEIGHTED_ELEVATED_FEET_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)4) +#define FIT_ROW_EXERCISE_NAME_FACE_PULL ((FIT_ROW_EXERCISE_NAME)5) +#define FIT_ROW_EXERCISE_NAME_FACE_PULL_WITH_EXTERNAL_ROTATION ((FIT_ROW_EXERCISE_NAME)6) +#define FIT_ROW_EXERCISE_NAME_INVERTED_ROW_WITH_FEET_ON_SWISS_BALL ((FIT_ROW_EXERCISE_NAME)7) +#define FIT_ROW_EXERCISE_NAME_WEIGHTED_INVERTED_ROW_WITH_FEET_ON_SWISS_BALL ((FIT_ROW_EXERCISE_NAME)8) +#define FIT_ROW_EXERCISE_NAME_KETTLEBELL_ROW ((FIT_ROW_EXERCISE_NAME)9) +#define FIT_ROW_EXERCISE_NAME_MODIFIED_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)10) +#define FIT_ROW_EXERCISE_NAME_WEIGHTED_MODIFIED_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)11) +#define FIT_ROW_EXERCISE_NAME_NEUTRAL_GRIP_ALTERNATING_DUMBBELL_ROW ((FIT_ROW_EXERCISE_NAME)12) +#define FIT_ROW_EXERCISE_NAME_ONE_ARM_BENT_OVER_ROW ((FIT_ROW_EXERCISE_NAME)13) +#define FIT_ROW_EXERCISE_NAME_ONE_LEGGED_DUMBBELL_ROW ((FIT_ROW_EXERCISE_NAME)14) +#define FIT_ROW_EXERCISE_NAME_RENEGADE_ROW ((FIT_ROW_EXERCISE_NAME)15) +#define FIT_ROW_EXERCISE_NAME_REVERSE_GRIP_BARBELL_ROW ((FIT_ROW_EXERCISE_NAME)16) +#define FIT_ROW_EXERCISE_NAME_ROPE_HANDLE_CABLE_ROW ((FIT_ROW_EXERCISE_NAME)17) +#define FIT_ROW_EXERCISE_NAME_SEATED_CABLE_ROW ((FIT_ROW_EXERCISE_NAME)18) +#define FIT_ROW_EXERCISE_NAME_SEATED_DUMBBELL_ROW ((FIT_ROW_EXERCISE_NAME)19) +#define FIT_ROW_EXERCISE_NAME_SINGLE_ARM_CABLE_ROW ((FIT_ROW_EXERCISE_NAME)20) +#define FIT_ROW_EXERCISE_NAME_SINGLE_ARM_CABLE_ROW_AND_ROTATION ((FIT_ROW_EXERCISE_NAME)21) +#define FIT_ROW_EXERCISE_NAME_SINGLE_ARM_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)22) +#define FIT_ROW_EXERCISE_NAME_WEIGHTED_SINGLE_ARM_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)23) +#define FIT_ROW_EXERCISE_NAME_SINGLE_ARM_NEUTRAL_GRIP_DUMBBELL_ROW ((FIT_ROW_EXERCISE_NAME)24) +#define FIT_ROW_EXERCISE_NAME_SINGLE_ARM_NEUTRAL_GRIP_DUMBBELL_ROW_AND_ROTATION ((FIT_ROW_EXERCISE_NAME)25) +#define FIT_ROW_EXERCISE_NAME_SUSPENDED_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)26) +#define FIT_ROW_EXERCISE_NAME_WEIGHTED_SUSPENDED_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)27) +#define FIT_ROW_EXERCISE_NAME_T_BAR_ROW ((FIT_ROW_EXERCISE_NAME)28) +#define FIT_ROW_EXERCISE_NAME_TOWEL_GRIP_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)29) +#define FIT_ROW_EXERCISE_NAME_WEIGHTED_TOWEL_GRIP_INVERTED_ROW ((FIT_ROW_EXERCISE_NAME)30) +#define FIT_ROW_EXERCISE_NAME_UNDERHAND_GRIP_CABLE_ROW ((FIT_ROW_EXERCISE_NAME)31) +#define FIT_ROW_EXERCISE_NAME_V_GRIP_CABLE_ROW ((FIT_ROW_EXERCISE_NAME)32) +#define FIT_ROW_EXERCISE_NAME_WIDE_GRIP_SEATED_CABLE_ROW ((FIT_ROW_EXERCISE_NAME)33) +#define FIT_ROW_EXERCISE_NAME_COUNT 34 + +typedef FIT_UINT16 FIT_SHOULDER_PRESS_EXERCISE_NAME; +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_ALTERNATING_DUMBBELL_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)0) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_ARNOLD_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)1) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_BARBELL_FRONT_SQUAT_TO_PUSH_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)2) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_BARBELL_PUSH_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)3) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_BARBELL_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)4) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_DEAD_CURL_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)5) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_DUMBBELL_ALTERNATING_SHOULDER_PRESS_AND_TWIST ((FIT_SHOULDER_PRESS_EXERCISE_NAME)6) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_DUMBBELL_HAMMER_CURL_TO_LUNGE_TO_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)7) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_DUMBBELL_PUSH_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)8) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_FLOOR_INVERTED_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)9) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_WEIGHTED_FLOOR_INVERTED_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)10) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_INVERTED_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)11) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_WEIGHTED_INVERTED_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)12) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_ONE_ARM_PUSH_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)13) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_OVERHEAD_BARBELL_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)14) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_OVERHEAD_DUMBBELL_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)15) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_SEATED_BARBELL_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)16) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_SEATED_DUMBBELL_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)17) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_SINGLE_ARM_DUMBBELL_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)18) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_SINGLE_ARM_STEP_UP_AND_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)19) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_SMITH_MACHINE_OVERHEAD_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)20) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_SPLIT_STANCE_HAMMER_CURL_TO_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)21) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_SWISS_BALL_DUMBBELL_SHOULDER_PRESS ((FIT_SHOULDER_PRESS_EXERCISE_NAME)22) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_WEIGHT_PLATE_FRONT_RAISE ((FIT_SHOULDER_PRESS_EXERCISE_NAME)23) +#define FIT_SHOULDER_PRESS_EXERCISE_NAME_COUNT 24 + +typedef FIT_UINT16 FIT_SHOULDER_STABILITY_EXERCISE_NAME; +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_90_DEGREE_CABLE_EXTERNAL_ROTATION ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)0) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_BAND_EXTERNAL_ROTATION ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)1) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_BAND_INTERNAL_ROTATION ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)2) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_BENT_ARM_LATERAL_RAISE_AND_EXTERNAL_ROTATION ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)3) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_CABLE_EXTERNAL_ROTATION ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)4) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_DUMBBELL_FACE_PULL_WITH_EXTERNAL_ROTATION ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)5) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_FLOOR_I_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)6) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_FLOOR_I_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)7) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_FLOOR_T_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)8) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_FLOOR_T_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)9) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_FLOOR_Y_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)10) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_FLOOR_Y_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)11) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_INCLINE_I_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)12) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_INCLINE_I_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)13) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_INCLINE_L_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)14) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_INCLINE_L_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)15) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_INCLINE_T_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)16) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_INCLINE_T_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)17) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_INCLINE_W_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)18) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_INCLINE_W_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)19) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_INCLINE_Y_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)20) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_INCLINE_Y_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)21) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_LYING_EXTERNAL_ROTATION ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)22) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_SEATED_DUMBBELL_EXTERNAL_ROTATION ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)23) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_STANDING_L_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)24) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_SWISS_BALL_I_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)25) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_SWISS_BALL_I_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)26) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_SWISS_BALL_T_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)27) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_SWISS_BALL_T_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)28) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_SWISS_BALL_W_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)29) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_SWISS_BALL_W_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)30) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_SWISS_BALL_Y_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)31) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_WEIGHTED_SWISS_BALL_Y_RAISE ((FIT_SHOULDER_STABILITY_EXERCISE_NAME)32) +#define FIT_SHOULDER_STABILITY_EXERCISE_NAME_COUNT 33 + +typedef FIT_UINT16 FIT_SHRUG_EXERCISE_NAME; +#define FIT_SHRUG_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_SHRUG_EXERCISE_NAME_BARBELL_JUMP_SHRUG ((FIT_SHRUG_EXERCISE_NAME)0) +#define FIT_SHRUG_EXERCISE_NAME_BARBELL_SHRUG ((FIT_SHRUG_EXERCISE_NAME)1) +#define FIT_SHRUG_EXERCISE_NAME_BARBELL_UPRIGHT_ROW ((FIT_SHRUG_EXERCISE_NAME)2) +#define FIT_SHRUG_EXERCISE_NAME_BEHIND_THE_BACK_SMITH_MACHINE_SHRUG ((FIT_SHRUG_EXERCISE_NAME)3) +#define FIT_SHRUG_EXERCISE_NAME_DUMBBELL_JUMP_SHRUG ((FIT_SHRUG_EXERCISE_NAME)4) +#define FIT_SHRUG_EXERCISE_NAME_DUMBBELL_SHRUG ((FIT_SHRUG_EXERCISE_NAME)5) +#define FIT_SHRUG_EXERCISE_NAME_DUMBBELL_UPRIGHT_ROW ((FIT_SHRUG_EXERCISE_NAME)6) +#define FIT_SHRUG_EXERCISE_NAME_INCLINE_DUMBBELL_SHRUG ((FIT_SHRUG_EXERCISE_NAME)7) +#define FIT_SHRUG_EXERCISE_NAME_OVERHEAD_BARBELL_SHRUG ((FIT_SHRUG_EXERCISE_NAME)8) +#define FIT_SHRUG_EXERCISE_NAME_OVERHEAD_DUMBBELL_SHRUG ((FIT_SHRUG_EXERCISE_NAME)9) +#define FIT_SHRUG_EXERCISE_NAME_SCAPTION_AND_SHRUG ((FIT_SHRUG_EXERCISE_NAME)10) +#define FIT_SHRUG_EXERCISE_NAME_SCAPULAR_RETRACTION ((FIT_SHRUG_EXERCISE_NAME)11) +#define FIT_SHRUG_EXERCISE_NAME_SERRATUS_CHAIR_SHRUG ((FIT_SHRUG_EXERCISE_NAME)12) +#define FIT_SHRUG_EXERCISE_NAME_WEIGHTED_SERRATUS_CHAIR_SHRUG ((FIT_SHRUG_EXERCISE_NAME)13) +#define FIT_SHRUG_EXERCISE_NAME_SERRATUS_SHRUG ((FIT_SHRUG_EXERCISE_NAME)14) +#define FIT_SHRUG_EXERCISE_NAME_WEIGHTED_SERRATUS_SHRUG ((FIT_SHRUG_EXERCISE_NAME)15) +#define FIT_SHRUG_EXERCISE_NAME_WIDE_GRIP_JUMP_SHRUG ((FIT_SHRUG_EXERCISE_NAME)16) +#define FIT_SHRUG_EXERCISE_NAME_COUNT 17 + +typedef FIT_UINT16 FIT_SIT_UP_EXERCISE_NAME; +#define FIT_SIT_UP_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_SIT_UP_EXERCISE_NAME_ALTERNATING_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)0) +#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_ALTERNATING_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)1) +#define FIT_SIT_UP_EXERCISE_NAME_BENT_KNEE_V_UP ((FIT_SIT_UP_EXERCISE_NAME)2) +#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_BENT_KNEE_V_UP ((FIT_SIT_UP_EXERCISE_NAME)3) +#define FIT_SIT_UP_EXERCISE_NAME_BUTTERFLY_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)4) +#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_BUTTERFLY_SITUP ((FIT_SIT_UP_EXERCISE_NAME)5) +#define FIT_SIT_UP_EXERCISE_NAME_CROSS_PUNCH_ROLL_UP ((FIT_SIT_UP_EXERCISE_NAME)6) +#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_CROSS_PUNCH_ROLL_UP ((FIT_SIT_UP_EXERCISE_NAME)7) +#define FIT_SIT_UP_EXERCISE_NAME_CROSSED_ARMS_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)8) +#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_CROSSED_ARMS_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)9) +#define FIT_SIT_UP_EXERCISE_NAME_GET_UP_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)10) +#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_GET_UP_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)11) +#define FIT_SIT_UP_EXERCISE_NAME_HOVERING_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)12) +#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_HOVERING_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)13) +#define FIT_SIT_UP_EXERCISE_NAME_KETTLEBELL_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)14) +#define FIT_SIT_UP_EXERCISE_NAME_MEDICINE_BALL_ALTERNATING_V_UP ((FIT_SIT_UP_EXERCISE_NAME)15) +#define FIT_SIT_UP_EXERCISE_NAME_MEDICINE_BALL_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)16) +#define FIT_SIT_UP_EXERCISE_NAME_MEDICINE_BALL_V_UP ((FIT_SIT_UP_EXERCISE_NAME)17) +#define FIT_SIT_UP_EXERCISE_NAME_MODIFIED_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)18) +#define FIT_SIT_UP_EXERCISE_NAME_NEGATIVE_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)19) +#define FIT_SIT_UP_EXERCISE_NAME_ONE_ARM_FULL_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)20) +#define FIT_SIT_UP_EXERCISE_NAME_RECLINING_CIRCLE ((FIT_SIT_UP_EXERCISE_NAME)21) +#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_RECLINING_CIRCLE ((FIT_SIT_UP_EXERCISE_NAME)22) +#define FIT_SIT_UP_EXERCISE_NAME_REVERSE_CURL_UP ((FIT_SIT_UP_EXERCISE_NAME)23) +#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_REVERSE_CURL_UP ((FIT_SIT_UP_EXERCISE_NAME)24) +#define FIT_SIT_UP_EXERCISE_NAME_SINGLE_LEG_SWISS_BALL_JACKKNIFE ((FIT_SIT_UP_EXERCISE_NAME)25) +#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_SWISS_BALL_JACKKNIFE ((FIT_SIT_UP_EXERCISE_NAME)26) +#define FIT_SIT_UP_EXERCISE_NAME_THE_TEASER ((FIT_SIT_UP_EXERCISE_NAME)27) +#define FIT_SIT_UP_EXERCISE_NAME_THE_TEASER_WEIGHTED ((FIT_SIT_UP_EXERCISE_NAME)28) +#define FIT_SIT_UP_EXERCISE_NAME_THREE_PART_ROLL_DOWN ((FIT_SIT_UP_EXERCISE_NAME)29) +#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_THREE_PART_ROLL_DOWN ((FIT_SIT_UP_EXERCISE_NAME)30) +#define FIT_SIT_UP_EXERCISE_NAME_V_UP ((FIT_SIT_UP_EXERCISE_NAME)31) +#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_V_UP ((FIT_SIT_UP_EXERCISE_NAME)32) +#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_RUSSIAN_TWIST_ON_SWISS_BALL ((FIT_SIT_UP_EXERCISE_NAME)33) +#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)34) +#define FIT_SIT_UP_EXERCISE_NAME_X_ABS ((FIT_SIT_UP_EXERCISE_NAME)35) +#define FIT_SIT_UP_EXERCISE_NAME_WEIGHTED_X_ABS ((FIT_SIT_UP_EXERCISE_NAME)36) +#define FIT_SIT_UP_EXERCISE_NAME_SIT_UP ((FIT_SIT_UP_EXERCISE_NAME)37) +#define FIT_SIT_UP_EXERCISE_NAME_COUNT 38 + +typedef FIT_UINT16 FIT_SQUAT_EXERCISE_NAME; +#define FIT_SQUAT_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_SQUAT_EXERCISE_NAME_LEG_PRESS ((FIT_SQUAT_EXERCISE_NAME)0) +#define FIT_SQUAT_EXERCISE_NAME_BACK_SQUAT_WITH_BODY_BAR ((FIT_SQUAT_EXERCISE_NAME)1) +#define FIT_SQUAT_EXERCISE_NAME_BACK_SQUATS ((FIT_SQUAT_EXERCISE_NAME)2) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_BACK_SQUATS ((FIT_SQUAT_EXERCISE_NAME)3) +#define FIT_SQUAT_EXERCISE_NAME_BALANCING_SQUAT ((FIT_SQUAT_EXERCISE_NAME)4) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_BALANCING_SQUAT ((FIT_SQUAT_EXERCISE_NAME)5) +#define FIT_SQUAT_EXERCISE_NAME_BARBELL_BACK_SQUAT ((FIT_SQUAT_EXERCISE_NAME)6) +#define FIT_SQUAT_EXERCISE_NAME_BARBELL_BOX_SQUAT ((FIT_SQUAT_EXERCISE_NAME)7) +#define FIT_SQUAT_EXERCISE_NAME_BARBELL_FRONT_SQUAT ((FIT_SQUAT_EXERCISE_NAME)8) +#define FIT_SQUAT_EXERCISE_NAME_BARBELL_HACK_SQUAT ((FIT_SQUAT_EXERCISE_NAME)9) +#define FIT_SQUAT_EXERCISE_NAME_BARBELL_HANG_SQUAT_SNATCH ((FIT_SQUAT_EXERCISE_NAME)10) +#define FIT_SQUAT_EXERCISE_NAME_BARBELL_LATERAL_STEP_UP ((FIT_SQUAT_EXERCISE_NAME)11) +#define FIT_SQUAT_EXERCISE_NAME_BARBELL_QUARTER_SQUAT ((FIT_SQUAT_EXERCISE_NAME)12) +#define FIT_SQUAT_EXERCISE_NAME_BARBELL_SIFF_SQUAT ((FIT_SQUAT_EXERCISE_NAME)13) +#define FIT_SQUAT_EXERCISE_NAME_BARBELL_SQUAT_SNATCH ((FIT_SQUAT_EXERCISE_NAME)14) +#define FIT_SQUAT_EXERCISE_NAME_BARBELL_SQUAT_WITH_HEELS_RAISED ((FIT_SQUAT_EXERCISE_NAME)15) +#define FIT_SQUAT_EXERCISE_NAME_BARBELL_STEPOVER ((FIT_SQUAT_EXERCISE_NAME)16) +#define FIT_SQUAT_EXERCISE_NAME_BARBELL_STEP_UP ((FIT_SQUAT_EXERCISE_NAME)17) +#define FIT_SQUAT_EXERCISE_NAME_BENCH_SQUAT_WITH_ROTATIONAL_CHOP ((FIT_SQUAT_EXERCISE_NAME)18) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_BENCH_SQUAT_WITH_ROTATIONAL_CHOP ((FIT_SQUAT_EXERCISE_NAME)19) +#define FIT_SQUAT_EXERCISE_NAME_BODY_WEIGHT_WALL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)20) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_WALL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)21) +#define FIT_SQUAT_EXERCISE_NAME_BOX_STEP_SQUAT ((FIT_SQUAT_EXERCISE_NAME)22) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_BOX_STEP_SQUAT ((FIT_SQUAT_EXERCISE_NAME)23) +#define FIT_SQUAT_EXERCISE_NAME_BRACED_SQUAT ((FIT_SQUAT_EXERCISE_NAME)24) +#define FIT_SQUAT_EXERCISE_NAME_CROSSED_ARM_BARBELL_FRONT_SQUAT ((FIT_SQUAT_EXERCISE_NAME)25) +#define FIT_SQUAT_EXERCISE_NAME_CROSSOVER_DUMBBELL_STEP_UP ((FIT_SQUAT_EXERCISE_NAME)26) +#define FIT_SQUAT_EXERCISE_NAME_DUMBBELL_FRONT_SQUAT ((FIT_SQUAT_EXERCISE_NAME)27) +#define FIT_SQUAT_EXERCISE_NAME_DUMBBELL_SPLIT_SQUAT ((FIT_SQUAT_EXERCISE_NAME)28) +#define FIT_SQUAT_EXERCISE_NAME_DUMBBELL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)29) +#define FIT_SQUAT_EXERCISE_NAME_DUMBBELL_SQUAT_CLEAN ((FIT_SQUAT_EXERCISE_NAME)30) +#define FIT_SQUAT_EXERCISE_NAME_DUMBBELL_STEPOVER ((FIT_SQUAT_EXERCISE_NAME)31) +#define FIT_SQUAT_EXERCISE_NAME_DUMBBELL_STEP_UP ((FIT_SQUAT_EXERCISE_NAME)32) +#define FIT_SQUAT_EXERCISE_NAME_ELEVATED_SINGLE_LEG_SQUAT ((FIT_SQUAT_EXERCISE_NAME)33) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_ELEVATED_SINGLE_LEG_SQUAT ((FIT_SQUAT_EXERCISE_NAME)34) +#define FIT_SQUAT_EXERCISE_NAME_FIGURE_FOUR_SQUATS ((FIT_SQUAT_EXERCISE_NAME)35) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_FIGURE_FOUR_SQUATS ((FIT_SQUAT_EXERCISE_NAME)36) +#define FIT_SQUAT_EXERCISE_NAME_GOBLET_SQUAT ((FIT_SQUAT_EXERCISE_NAME)37) +#define FIT_SQUAT_EXERCISE_NAME_KETTLEBELL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)38) +#define FIT_SQUAT_EXERCISE_NAME_KETTLEBELL_SWING_OVERHEAD ((FIT_SQUAT_EXERCISE_NAME)39) +#define FIT_SQUAT_EXERCISE_NAME_KETTLEBELL_SWING_WITH_FLIP_TO_SQUAT ((FIT_SQUAT_EXERCISE_NAME)40) +#define FIT_SQUAT_EXERCISE_NAME_LATERAL_DUMBBELL_STEP_UP ((FIT_SQUAT_EXERCISE_NAME)41) +#define FIT_SQUAT_EXERCISE_NAME_ONE_LEGGED_SQUAT ((FIT_SQUAT_EXERCISE_NAME)42) +#define FIT_SQUAT_EXERCISE_NAME_OVERHEAD_DUMBBELL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)43) +#define FIT_SQUAT_EXERCISE_NAME_OVERHEAD_SQUAT ((FIT_SQUAT_EXERCISE_NAME)44) +#define FIT_SQUAT_EXERCISE_NAME_PARTIAL_SINGLE_LEG_SQUAT ((FIT_SQUAT_EXERCISE_NAME)45) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_PARTIAL_SINGLE_LEG_SQUAT ((FIT_SQUAT_EXERCISE_NAME)46) +#define FIT_SQUAT_EXERCISE_NAME_PISTOL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)47) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_PISTOL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)48) +#define FIT_SQUAT_EXERCISE_NAME_PLIE_SLIDES ((FIT_SQUAT_EXERCISE_NAME)49) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_PLIE_SLIDES ((FIT_SQUAT_EXERCISE_NAME)50) +#define FIT_SQUAT_EXERCISE_NAME_PLIE_SQUAT ((FIT_SQUAT_EXERCISE_NAME)51) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_PLIE_SQUAT ((FIT_SQUAT_EXERCISE_NAME)52) +#define FIT_SQUAT_EXERCISE_NAME_PRISONER_SQUAT ((FIT_SQUAT_EXERCISE_NAME)53) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_PRISONER_SQUAT ((FIT_SQUAT_EXERCISE_NAME)54) +#define FIT_SQUAT_EXERCISE_NAME_SINGLE_LEG_BENCH_GET_UP ((FIT_SQUAT_EXERCISE_NAME)55) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_BENCH_GET_UP ((FIT_SQUAT_EXERCISE_NAME)56) +#define FIT_SQUAT_EXERCISE_NAME_SINGLE_LEG_BENCH_SQUAT ((FIT_SQUAT_EXERCISE_NAME)57) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_BENCH_SQUAT ((FIT_SQUAT_EXERCISE_NAME)58) +#define FIT_SQUAT_EXERCISE_NAME_SINGLE_LEG_SQUAT_ON_SWISS_BALL ((FIT_SQUAT_EXERCISE_NAME)59) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_SQUAT_ON_SWISS_BALL ((FIT_SQUAT_EXERCISE_NAME)60) +#define FIT_SQUAT_EXERCISE_NAME_SQUAT ((FIT_SQUAT_EXERCISE_NAME)61) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_SQUAT ((FIT_SQUAT_EXERCISE_NAME)62) +#define FIT_SQUAT_EXERCISE_NAME_SQUATS_WITH_BAND ((FIT_SQUAT_EXERCISE_NAME)63) +#define FIT_SQUAT_EXERCISE_NAME_STAGGERED_SQUAT ((FIT_SQUAT_EXERCISE_NAME)64) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_STAGGERED_SQUAT ((FIT_SQUAT_EXERCISE_NAME)65) +#define FIT_SQUAT_EXERCISE_NAME_STEP_UP ((FIT_SQUAT_EXERCISE_NAME)66) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_STEP_UP ((FIT_SQUAT_EXERCISE_NAME)67) +#define FIT_SQUAT_EXERCISE_NAME_SUITCASE_SQUATS ((FIT_SQUAT_EXERCISE_NAME)68) +#define FIT_SQUAT_EXERCISE_NAME_SUMO_SQUAT ((FIT_SQUAT_EXERCISE_NAME)69) +#define FIT_SQUAT_EXERCISE_NAME_SUMO_SQUAT_SLIDE_IN ((FIT_SQUAT_EXERCISE_NAME)70) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_SUMO_SQUAT_SLIDE_IN ((FIT_SQUAT_EXERCISE_NAME)71) +#define FIT_SQUAT_EXERCISE_NAME_SUMO_SQUAT_TO_HIGH_PULL ((FIT_SQUAT_EXERCISE_NAME)72) +#define FIT_SQUAT_EXERCISE_NAME_SUMO_SQUAT_TO_STAND ((FIT_SQUAT_EXERCISE_NAME)73) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_SUMO_SQUAT_TO_STAND ((FIT_SQUAT_EXERCISE_NAME)74) +#define FIT_SQUAT_EXERCISE_NAME_SUMO_SQUAT_WITH_ROTATION ((FIT_SQUAT_EXERCISE_NAME)75) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_SUMO_SQUAT_WITH_ROTATION ((FIT_SQUAT_EXERCISE_NAME)76) +#define FIT_SQUAT_EXERCISE_NAME_SWISS_BALL_BODY_WEIGHT_WALL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)77) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_SWISS_BALL_WALL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)78) +#define FIT_SQUAT_EXERCISE_NAME_THRUSTERS ((FIT_SQUAT_EXERCISE_NAME)79) +#define FIT_SQUAT_EXERCISE_NAME_UNEVEN_SQUAT ((FIT_SQUAT_EXERCISE_NAME)80) +#define FIT_SQUAT_EXERCISE_NAME_WEIGHTED_UNEVEN_SQUAT ((FIT_SQUAT_EXERCISE_NAME)81) +#define FIT_SQUAT_EXERCISE_NAME_WAIST_SLIMMING_SQUAT ((FIT_SQUAT_EXERCISE_NAME)82) +#define FIT_SQUAT_EXERCISE_NAME_WALL_BALL ((FIT_SQUAT_EXERCISE_NAME)83) +#define FIT_SQUAT_EXERCISE_NAME_WIDE_STANCE_BARBELL_SQUAT ((FIT_SQUAT_EXERCISE_NAME)84) +#define FIT_SQUAT_EXERCISE_NAME_WIDE_STANCE_GOBLET_SQUAT ((FIT_SQUAT_EXERCISE_NAME)85) +#define FIT_SQUAT_EXERCISE_NAME_ZERCHER_SQUAT ((FIT_SQUAT_EXERCISE_NAME)86) +#define FIT_SQUAT_EXERCISE_NAME_KBS_OVERHEAD ((FIT_SQUAT_EXERCISE_NAME)87) // Deprecated do not use +#define FIT_SQUAT_EXERCISE_NAME_SQUAT_AND_SIDE_KICK ((FIT_SQUAT_EXERCISE_NAME)88) +#define FIT_SQUAT_EXERCISE_NAME_SQUAT_JUMPS_IN_N_OUT ((FIT_SQUAT_EXERCISE_NAME)89) +#define FIT_SQUAT_EXERCISE_NAME_PILATES_PLIE_SQUATS_PARALLEL_TURNED_OUT_FLAT_AND_HEELS ((FIT_SQUAT_EXERCISE_NAME)90) +#define FIT_SQUAT_EXERCISE_NAME_RELEVE_STRAIGHT_LEG_AND_KNEE_BENT_WITH_ONE_LEG_VARIATION ((FIT_SQUAT_EXERCISE_NAME)91) +#define FIT_SQUAT_EXERCISE_NAME_COUNT 92 + +typedef FIT_UINT16 FIT_TOTAL_BODY_EXERCISE_NAME; +#define FIT_TOTAL_BODY_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_TOTAL_BODY_EXERCISE_NAME_BURPEE ((FIT_TOTAL_BODY_EXERCISE_NAME)0) +#define FIT_TOTAL_BODY_EXERCISE_NAME_WEIGHTED_BURPEE ((FIT_TOTAL_BODY_EXERCISE_NAME)1) +#define FIT_TOTAL_BODY_EXERCISE_NAME_BURPEE_BOX_JUMP ((FIT_TOTAL_BODY_EXERCISE_NAME)2) +#define FIT_TOTAL_BODY_EXERCISE_NAME_WEIGHTED_BURPEE_BOX_JUMP ((FIT_TOTAL_BODY_EXERCISE_NAME)3) +#define FIT_TOTAL_BODY_EXERCISE_NAME_HIGH_PULL_BURPEE ((FIT_TOTAL_BODY_EXERCISE_NAME)4) +#define FIT_TOTAL_BODY_EXERCISE_NAME_MAN_MAKERS ((FIT_TOTAL_BODY_EXERCISE_NAME)5) +#define FIT_TOTAL_BODY_EXERCISE_NAME_ONE_ARM_BURPEE ((FIT_TOTAL_BODY_EXERCISE_NAME)6) +#define FIT_TOTAL_BODY_EXERCISE_NAME_SQUAT_THRUSTS ((FIT_TOTAL_BODY_EXERCISE_NAME)7) +#define FIT_TOTAL_BODY_EXERCISE_NAME_WEIGHTED_SQUAT_THRUSTS ((FIT_TOTAL_BODY_EXERCISE_NAME)8) +#define FIT_TOTAL_BODY_EXERCISE_NAME_SQUAT_PLANK_PUSH_UP ((FIT_TOTAL_BODY_EXERCISE_NAME)9) +#define FIT_TOTAL_BODY_EXERCISE_NAME_WEIGHTED_SQUAT_PLANK_PUSH_UP ((FIT_TOTAL_BODY_EXERCISE_NAME)10) +#define FIT_TOTAL_BODY_EXERCISE_NAME_STANDING_T_ROTATION_BALANCE ((FIT_TOTAL_BODY_EXERCISE_NAME)11) +#define FIT_TOTAL_BODY_EXERCISE_NAME_WEIGHTED_STANDING_T_ROTATION_BALANCE ((FIT_TOTAL_BODY_EXERCISE_NAME)12) +#define FIT_TOTAL_BODY_EXERCISE_NAME_COUNT 13 + +typedef FIT_UINT16 FIT_TRICEPS_EXTENSION_EXERCISE_NAME; +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_BENCH_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)0) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_WEIGHTED_BENCH_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)1) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_BODY_WEIGHT_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)2) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_CABLE_KICKBACK ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)3) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_CABLE_LYING_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)4) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_CABLE_OVERHEAD_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)5) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_DUMBBELL_KICKBACK ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)6) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_DUMBBELL_LYING_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)7) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_EZ_BAR_OVERHEAD_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)8) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_INCLINE_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)9) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_WEIGHTED_INCLINE_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)10) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_INCLINE_EZ_BAR_LYING_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)11) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_LYING_DUMBBELL_PULLOVER_TO_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)12) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_LYING_EZ_BAR_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)13) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_LYING_TRICEPS_EXTENSION_TO_CLOSE_GRIP_BENCH_PRESS ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)14) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_OVERHEAD_DUMBBELL_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)15) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_RECLINING_TRICEPS_PRESS ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)16) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_REVERSE_GRIP_PRESSDOWN ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)17) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_REVERSE_GRIP_TRICEPS_PRESSDOWN ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)18) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_ROPE_PRESSDOWN ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)19) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SEATED_BARBELL_OVERHEAD_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)20) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SEATED_DUMBBELL_OVERHEAD_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)21) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SEATED_EZ_BAR_OVERHEAD_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)22) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SEATED_SINGLE_ARM_OVERHEAD_DUMBBELL_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)23) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SINGLE_ARM_DUMBBELL_OVERHEAD_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)24) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SINGLE_DUMBBELL_SEATED_OVERHEAD_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)25) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SINGLE_LEG_BENCH_DIP_AND_KICK ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)26) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_BENCH_DIP_AND_KICK ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)27) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SINGLE_LEG_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)28) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_WEIGHTED_SINGLE_LEG_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)29) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_STATIC_LYING_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)30) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SUSPENDED_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)31) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_WEIGHTED_SUSPENDED_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)32) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SWISS_BALL_DUMBBELL_LYING_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)33) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SWISS_BALL_EZ_BAR_LYING_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)34) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_SWISS_BALL_EZ_BAR_OVERHEAD_TRICEPS_EXTENSION ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)35) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_TABLETOP_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)36) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_WEIGHTED_TABLETOP_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)37) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_TRICEPS_EXTENSION_ON_FLOOR ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)38) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_TRICEPS_PRESSDOWN ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)39) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_WEIGHTED_DIP ((FIT_TRICEPS_EXTENSION_EXERCISE_NAME)40) +#define FIT_TRICEPS_EXTENSION_EXERCISE_NAME_COUNT 41 + +typedef FIT_UINT16 FIT_WARM_UP_EXERCISE_NAME; +#define FIT_WARM_UP_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_WARM_UP_EXERCISE_NAME_QUADRUPED_ROCKING ((FIT_WARM_UP_EXERCISE_NAME)0) +#define FIT_WARM_UP_EXERCISE_NAME_NECK_TILTS ((FIT_WARM_UP_EXERCISE_NAME)1) +#define FIT_WARM_UP_EXERCISE_NAME_ANKLE_CIRCLES ((FIT_WARM_UP_EXERCISE_NAME)2) +#define FIT_WARM_UP_EXERCISE_NAME_ANKLE_DORSIFLEXION_WITH_BAND ((FIT_WARM_UP_EXERCISE_NAME)3) +#define FIT_WARM_UP_EXERCISE_NAME_ANKLE_INTERNAL_ROTATION ((FIT_WARM_UP_EXERCISE_NAME)4) +#define FIT_WARM_UP_EXERCISE_NAME_ARM_CIRCLES ((FIT_WARM_UP_EXERCISE_NAME)5) +#define FIT_WARM_UP_EXERCISE_NAME_BENT_OVER_REACH_TO_SKY ((FIT_WARM_UP_EXERCISE_NAME)6) +#define FIT_WARM_UP_EXERCISE_NAME_CAT_CAMEL ((FIT_WARM_UP_EXERCISE_NAME)7) +#define FIT_WARM_UP_EXERCISE_NAME_ELBOW_TO_FOOT_LUNGE ((FIT_WARM_UP_EXERCISE_NAME)8) +#define FIT_WARM_UP_EXERCISE_NAME_FORWARD_AND_BACKWARD_LEG_SWINGS ((FIT_WARM_UP_EXERCISE_NAME)9) +#define FIT_WARM_UP_EXERCISE_NAME_GROINERS ((FIT_WARM_UP_EXERCISE_NAME)10) +#define FIT_WARM_UP_EXERCISE_NAME_INVERTED_HAMSTRING_STRETCH ((FIT_WARM_UP_EXERCISE_NAME)11) +#define FIT_WARM_UP_EXERCISE_NAME_LATERAL_DUCK_UNDER ((FIT_WARM_UP_EXERCISE_NAME)12) +#define FIT_WARM_UP_EXERCISE_NAME_NECK_ROTATIONS ((FIT_WARM_UP_EXERCISE_NAME)13) +#define FIT_WARM_UP_EXERCISE_NAME_OPPOSITE_ARM_AND_LEG_BALANCE ((FIT_WARM_UP_EXERCISE_NAME)14) +#define FIT_WARM_UP_EXERCISE_NAME_REACH_ROLL_AND_LIFT ((FIT_WARM_UP_EXERCISE_NAME)15) +#define FIT_WARM_UP_EXERCISE_NAME_SCORPION ((FIT_WARM_UP_EXERCISE_NAME)16) // Deprecated do not use +#define FIT_WARM_UP_EXERCISE_NAME_SHOULDER_CIRCLES ((FIT_WARM_UP_EXERCISE_NAME)17) +#define FIT_WARM_UP_EXERCISE_NAME_SIDE_TO_SIDE_LEG_SWINGS ((FIT_WARM_UP_EXERCISE_NAME)18) +#define FIT_WARM_UP_EXERCISE_NAME_SLEEPER_STRETCH ((FIT_WARM_UP_EXERCISE_NAME)19) +#define FIT_WARM_UP_EXERCISE_NAME_SLIDE_OUT ((FIT_WARM_UP_EXERCISE_NAME)20) +#define FIT_WARM_UP_EXERCISE_NAME_SWISS_BALL_HIP_CROSSOVER ((FIT_WARM_UP_EXERCISE_NAME)21) +#define FIT_WARM_UP_EXERCISE_NAME_SWISS_BALL_REACH_ROLL_AND_LIFT ((FIT_WARM_UP_EXERCISE_NAME)22) +#define FIT_WARM_UP_EXERCISE_NAME_SWISS_BALL_WINDSHIELD_WIPERS ((FIT_WARM_UP_EXERCISE_NAME)23) +#define FIT_WARM_UP_EXERCISE_NAME_THORACIC_ROTATION ((FIT_WARM_UP_EXERCISE_NAME)24) +#define FIT_WARM_UP_EXERCISE_NAME_WALKING_HIGH_KICKS ((FIT_WARM_UP_EXERCISE_NAME)25) +#define FIT_WARM_UP_EXERCISE_NAME_WALKING_HIGH_KNEES ((FIT_WARM_UP_EXERCISE_NAME)26) +#define FIT_WARM_UP_EXERCISE_NAME_WALKING_KNEE_HUGS ((FIT_WARM_UP_EXERCISE_NAME)27) +#define FIT_WARM_UP_EXERCISE_NAME_WALKING_LEG_CRADLES ((FIT_WARM_UP_EXERCISE_NAME)28) +#define FIT_WARM_UP_EXERCISE_NAME_WALKOUT ((FIT_WARM_UP_EXERCISE_NAME)29) +#define FIT_WARM_UP_EXERCISE_NAME_WALKOUT_FROM_PUSH_UP_POSITION ((FIT_WARM_UP_EXERCISE_NAME)30) +#define FIT_WARM_UP_EXERCISE_NAME_COUNT 31 + +typedef FIT_UINT16 FIT_RUN_EXERCISE_NAME; +#define FIT_RUN_EXERCISE_NAME_INVALID FIT_UINT16_INVALID +#define FIT_RUN_EXERCISE_NAME_RUN ((FIT_RUN_EXERCISE_NAME)0) +#define FIT_RUN_EXERCISE_NAME_WALK ((FIT_RUN_EXERCISE_NAME)1) +#define FIT_RUN_EXERCISE_NAME_JOG ((FIT_RUN_EXERCISE_NAME)2) +#define FIT_RUN_EXERCISE_NAME_SPRINT ((FIT_RUN_EXERCISE_NAME)3) +#define FIT_RUN_EXERCISE_NAME_COUNT 4 + +typedef FIT_ENUM FIT_WATER_TYPE; +#define FIT_WATER_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_WATER_TYPE_FRESH ((FIT_WATER_TYPE)0) +#define FIT_WATER_TYPE_SALT ((FIT_WATER_TYPE)1) +#define FIT_WATER_TYPE_EN13319 ((FIT_WATER_TYPE)2) +#define FIT_WATER_TYPE_CUSTOM ((FIT_WATER_TYPE)3) +#define FIT_WATER_TYPE_COUNT 4 + +typedef FIT_ENUM FIT_TISSUE_MODEL_TYPE; +#define FIT_TISSUE_MODEL_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_TISSUE_MODEL_TYPE_ZHL_16C ((FIT_TISSUE_MODEL_TYPE)0) // Buhlmann's decompression algorithm, version C +#define FIT_TISSUE_MODEL_TYPE_COUNT 1 + +typedef FIT_ENUM FIT_DIVE_GAS_STATUS; +#define FIT_DIVE_GAS_STATUS_INVALID FIT_ENUM_INVALID +#define FIT_DIVE_GAS_STATUS_DISABLED ((FIT_DIVE_GAS_STATUS)0) +#define FIT_DIVE_GAS_STATUS_ENABLED ((FIT_DIVE_GAS_STATUS)1) +#define FIT_DIVE_GAS_STATUS_BACKUP_ONLY ((FIT_DIVE_GAS_STATUS)2) +#define FIT_DIVE_GAS_STATUS_COUNT 3 + +typedef FIT_ENUM FIT_DIVE_ALERT; +#define FIT_DIVE_ALERT_INVALID FIT_ENUM_INVALID +#define FIT_DIVE_ALERT_NDL_REACHED ((FIT_DIVE_ALERT)0) +#define FIT_DIVE_ALERT_GAS_SWITCH_PROMPTED ((FIT_DIVE_ALERT)1) +#define FIT_DIVE_ALERT_NEAR_SURFACE ((FIT_DIVE_ALERT)2) +#define FIT_DIVE_ALERT_APPROACHING_NDL ((FIT_DIVE_ALERT)3) +#define FIT_DIVE_ALERT_PO2_WARN ((FIT_DIVE_ALERT)4) +#define FIT_DIVE_ALERT_PO2_CRIT_HIGH ((FIT_DIVE_ALERT)5) +#define FIT_DIVE_ALERT_PO2_CRIT_LOW ((FIT_DIVE_ALERT)6) +#define FIT_DIVE_ALERT_TIME_ALERT ((FIT_DIVE_ALERT)7) +#define FIT_DIVE_ALERT_DEPTH_ALERT ((FIT_DIVE_ALERT)8) +#define FIT_DIVE_ALERT_DECO_CEILING_BROKEN ((FIT_DIVE_ALERT)9) +#define FIT_DIVE_ALERT_DECO_COMPLETE ((FIT_DIVE_ALERT)10) +#define FIT_DIVE_ALERT_SAFETY_STOP_BROKEN ((FIT_DIVE_ALERT)11) +#define FIT_DIVE_ALERT_SAFETY_STOP_COMPLETE ((FIT_DIVE_ALERT)12) +#define FIT_DIVE_ALERT_CNS_WARNING ((FIT_DIVE_ALERT)13) +#define FIT_DIVE_ALERT_CNS_CRITICAL ((FIT_DIVE_ALERT)14) +#define FIT_DIVE_ALERT_OTU_WARNING ((FIT_DIVE_ALERT)15) +#define FIT_DIVE_ALERT_OTU_CRITICAL ((FIT_DIVE_ALERT)16) +#define FIT_DIVE_ALERT_ASCENT_CRITICAL ((FIT_DIVE_ALERT)17) +#define FIT_DIVE_ALERT_ALERT_DISMISSED_BY_KEY ((FIT_DIVE_ALERT)18) +#define FIT_DIVE_ALERT_ALERT_DISMISSED_BY_TIMEOUT ((FIT_DIVE_ALERT)19) +#define FIT_DIVE_ALERT_BATTERY_LOW ((FIT_DIVE_ALERT)20) +#define FIT_DIVE_ALERT_BATTERY_CRITICAL ((FIT_DIVE_ALERT)21) +#define FIT_DIVE_ALERT_SAFETY_STOP_STARTED ((FIT_DIVE_ALERT)22) +#define FIT_DIVE_ALERT_APPROACHING_FIRST_DECO_STOP ((FIT_DIVE_ALERT)23) +#define FIT_DIVE_ALERT_SETPOINT_SWITCH_AUTO_LOW ((FIT_DIVE_ALERT)24) +#define FIT_DIVE_ALERT_SETPOINT_SWITCH_AUTO_HIGH ((FIT_DIVE_ALERT)25) +#define FIT_DIVE_ALERT_SETPOINT_SWITCH_MANUAL_LOW ((FIT_DIVE_ALERT)26) +#define FIT_DIVE_ALERT_SETPOINT_SWITCH_MANUAL_HIGH ((FIT_DIVE_ALERT)27) +#define FIT_DIVE_ALERT_AUTO_SETPOINT_SWITCH_IGNORED ((FIT_DIVE_ALERT)28) +#define FIT_DIVE_ALERT_SWITCHED_TO_OPEN_CIRCUIT ((FIT_DIVE_ALERT)29) +#define FIT_DIVE_ALERT_SWITCHED_TO_CLOSED_CIRCUIT ((FIT_DIVE_ALERT)30) +#define FIT_DIVE_ALERT_TANK_BATTERY_LOW ((FIT_DIVE_ALERT)32) +#define FIT_DIVE_ALERT_PO2_CCR_DIL_LOW ((FIT_DIVE_ALERT)33) // ccr diluent has low po2 +#define FIT_DIVE_ALERT_DECO_STOP_CLEARED ((FIT_DIVE_ALERT)34) // a deco stop has been cleared +#define FIT_DIVE_ALERT_APNEA_NEUTRAL_BUOYANCY ((FIT_DIVE_ALERT)35) // Target Depth Apnea Alarm triggered +#define FIT_DIVE_ALERT_APNEA_TARGET_DEPTH ((FIT_DIVE_ALERT)36) // Neutral Buoyance Apnea Alarm triggered +#define FIT_DIVE_ALERT_APNEA_SURFACE ((FIT_DIVE_ALERT)37) // Surface Apnea Alarm triggered +#define FIT_DIVE_ALERT_APNEA_HIGH_SPEED ((FIT_DIVE_ALERT)38) // High Speed Apnea Alarm triggered +#define FIT_DIVE_ALERT_APNEA_LOW_SPEED ((FIT_DIVE_ALERT)39) // Low Speed Apnea Alarm triggered +#define FIT_DIVE_ALERT_COUNT 39 + +typedef FIT_ENUM FIT_DIVE_ALARM_TYPE; +#define FIT_DIVE_ALARM_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_DIVE_ALARM_TYPE_DEPTH ((FIT_DIVE_ALARM_TYPE)0) // Alarm when a certain depth is crossed +#define FIT_DIVE_ALARM_TYPE_TIME ((FIT_DIVE_ALARM_TYPE)1) // Alarm when a certain time has transpired +#define FIT_DIVE_ALARM_TYPE_SPEED ((FIT_DIVE_ALARM_TYPE)2) // Alarm when a certain ascent or descent rate is exceeded +#define FIT_DIVE_ALARM_TYPE_COUNT 3 + +typedef FIT_ENUM FIT_DIVE_BACKLIGHT_MODE; +#define FIT_DIVE_BACKLIGHT_MODE_INVALID FIT_ENUM_INVALID +#define FIT_DIVE_BACKLIGHT_MODE_AT_DEPTH ((FIT_DIVE_BACKLIGHT_MODE)0) +#define FIT_DIVE_BACKLIGHT_MODE_ALWAYS_ON ((FIT_DIVE_BACKLIGHT_MODE)1) +#define FIT_DIVE_BACKLIGHT_MODE_COUNT 2 + +typedef FIT_ENUM FIT_SLEEP_LEVEL; +#define FIT_SLEEP_LEVEL_INVALID FIT_ENUM_INVALID +#define FIT_SLEEP_LEVEL_UNMEASURABLE ((FIT_SLEEP_LEVEL)0) +#define FIT_SLEEP_LEVEL_AWAKE ((FIT_SLEEP_LEVEL)1) +#define FIT_SLEEP_LEVEL_LIGHT ((FIT_SLEEP_LEVEL)2) +#define FIT_SLEEP_LEVEL_DEEP ((FIT_SLEEP_LEVEL)3) +#define FIT_SLEEP_LEVEL_REM ((FIT_SLEEP_LEVEL)4) +#define FIT_SLEEP_LEVEL_COUNT 5 + +typedef FIT_ENUM FIT_SPO2_MEASUREMENT_TYPE; +#define FIT_SPO2_MEASUREMENT_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_SPO2_MEASUREMENT_TYPE_OFF_WRIST ((FIT_SPO2_MEASUREMENT_TYPE)0) +#define FIT_SPO2_MEASUREMENT_TYPE_SPOT_CHECK ((FIT_SPO2_MEASUREMENT_TYPE)1) +#define FIT_SPO2_MEASUREMENT_TYPE_CONTINUOUS_CHECK ((FIT_SPO2_MEASUREMENT_TYPE)2) +#define FIT_SPO2_MEASUREMENT_TYPE_PERIODIC ((FIT_SPO2_MEASUREMENT_TYPE)3) +#define FIT_SPO2_MEASUREMENT_TYPE_COUNT 4 + +typedef FIT_ENUM FIT_CCR_SETPOINT_SWITCH_MODE; +#define FIT_CCR_SETPOINT_SWITCH_MODE_INVALID FIT_ENUM_INVALID +#define FIT_CCR_SETPOINT_SWITCH_MODE_MANUAL ((FIT_CCR_SETPOINT_SWITCH_MODE)0) // User switches setpoints manually +#define FIT_CCR_SETPOINT_SWITCH_MODE_AUTOMATIC ((FIT_CCR_SETPOINT_SWITCH_MODE)1) // Switch automatically based on depth +#define FIT_CCR_SETPOINT_SWITCH_MODE_COUNT 2 + +typedef FIT_ENUM FIT_DIVE_GAS_MODE; +#define FIT_DIVE_GAS_MODE_INVALID FIT_ENUM_INVALID +#define FIT_DIVE_GAS_MODE_OPEN_CIRCUIT ((FIT_DIVE_GAS_MODE)0) +#define FIT_DIVE_GAS_MODE_CLOSED_CIRCUIT_DILUENT ((FIT_DIVE_GAS_MODE)1) +#define FIT_DIVE_GAS_MODE_COUNT 2 + +typedef FIT_UINT16 FIT_FAVERO_PRODUCT; +#define FIT_FAVERO_PRODUCT_INVALID FIT_UINT16_INVALID +#define FIT_FAVERO_PRODUCT_ASSIOMA_UNO ((FIT_FAVERO_PRODUCT)10) +#define FIT_FAVERO_PRODUCT_ASSIOMA_DUO ((FIT_FAVERO_PRODUCT)12) +#define FIT_FAVERO_PRODUCT_COUNT 2 + +typedef FIT_ENUM FIT_SPLIT_TYPE; +#define FIT_SPLIT_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_SPLIT_TYPE_ASCENT_SPLIT ((FIT_SPLIT_TYPE)1) +#define FIT_SPLIT_TYPE_DESCENT_SPLIT ((FIT_SPLIT_TYPE)2) +#define FIT_SPLIT_TYPE_INTERVAL_ACTIVE ((FIT_SPLIT_TYPE)3) +#define FIT_SPLIT_TYPE_INTERVAL_REST ((FIT_SPLIT_TYPE)4) +#define FIT_SPLIT_TYPE_INTERVAL_WARMUP ((FIT_SPLIT_TYPE)5) +#define FIT_SPLIT_TYPE_INTERVAL_COOLDOWN ((FIT_SPLIT_TYPE)6) +#define FIT_SPLIT_TYPE_INTERVAL_RECOVERY ((FIT_SPLIT_TYPE)7) +#define FIT_SPLIT_TYPE_INTERVAL_OTHER ((FIT_SPLIT_TYPE)8) +#define FIT_SPLIT_TYPE_CLIMB_ACTIVE ((FIT_SPLIT_TYPE)9) +#define FIT_SPLIT_TYPE_CLIMB_REST ((FIT_SPLIT_TYPE)10) +#define FIT_SPLIT_TYPE_SURF_ACTIVE ((FIT_SPLIT_TYPE)11) +#define FIT_SPLIT_TYPE_RUN_ACTIVE ((FIT_SPLIT_TYPE)12) +#define FIT_SPLIT_TYPE_RUN_REST ((FIT_SPLIT_TYPE)13) +#define FIT_SPLIT_TYPE_WORKOUT_ROUND ((FIT_SPLIT_TYPE)14) +#define FIT_SPLIT_TYPE_RWD_RUN ((FIT_SPLIT_TYPE)17) // run/walk detection running +#define FIT_SPLIT_TYPE_RWD_WALK ((FIT_SPLIT_TYPE)18) // run/walk detection walking +#define FIT_SPLIT_TYPE_WINDSURF_ACTIVE ((FIT_SPLIT_TYPE)21) +#define FIT_SPLIT_TYPE_RWD_STAND ((FIT_SPLIT_TYPE)22) // run/walk detection standing +#define FIT_SPLIT_TYPE_TRANSITION ((FIT_SPLIT_TYPE)23) // Marks the time going from ascent_split to descent_split/used in backcountry ski +#define FIT_SPLIT_TYPE_SKI_LIFT_SPLIT ((FIT_SPLIT_TYPE)28) +#define FIT_SPLIT_TYPE_SKI_RUN_SPLIT ((FIT_SPLIT_TYPE)29) +#define FIT_SPLIT_TYPE_COUNT 21 + +typedef FIT_ENUM FIT_CLIMB_PRO_EVENT; +#define FIT_CLIMB_PRO_EVENT_INVALID FIT_ENUM_INVALID +#define FIT_CLIMB_PRO_EVENT_APPROACH ((FIT_CLIMB_PRO_EVENT)0) +#define FIT_CLIMB_PRO_EVENT_START ((FIT_CLIMB_PRO_EVENT)1) +#define FIT_CLIMB_PRO_EVENT_COMPLETE ((FIT_CLIMB_PRO_EVENT)2) +#define FIT_CLIMB_PRO_EVENT_COUNT 3 + +typedef FIT_ENUM FIT_GAS_CONSUMPTION_RATE_TYPE; +#define FIT_GAS_CONSUMPTION_RATE_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_GAS_CONSUMPTION_RATE_TYPE_PRESSURE_SAC ((FIT_GAS_CONSUMPTION_RATE_TYPE)0) // Pressure-based Surface Air Consumption +#define FIT_GAS_CONSUMPTION_RATE_TYPE_VOLUME_SAC ((FIT_GAS_CONSUMPTION_RATE_TYPE)1) // Volumetric Surface Air Consumption +#define FIT_GAS_CONSUMPTION_RATE_TYPE_RMV ((FIT_GAS_CONSUMPTION_RATE_TYPE)2) // Respiratory Minute Volume +#define FIT_GAS_CONSUMPTION_RATE_TYPE_COUNT 3 + +typedef FIT_ENUM FIT_TAP_SENSITIVITY; +#define FIT_TAP_SENSITIVITY_INVALID FIT_ENUM_INVALID +#define FIT_TAP_SENSITIVITY_HIGH ((FIT_TAP_SENSITIVITY)0) +#define FIT_TAP_SENSITIVITY_MEDIUM ((FIT_TAP_SENSITIVITY)1) +#define FIT_TAP_SENSITIVITY_LOW ((FIT_TAP_SENSITIVITY)2) +#define FIT_TAP_SENSITIVITY_COUNT 3 + +typedef FIT_ENUM FIT_RADAR_THREAT_LEVEL_TYPE; +#define FIT_RADAR_THREAT_LEVEL_TYPE_INVALID FIT_ENUM_INVALID +#define FIT_RADAR_THREAT_LEVEL_TYPE_THREAT_UNKNOWN ((FIT_RADAR_THREAT_LEVEL_TYPE)0) +#define FIT_RADAR_THREAT_LEVEL_TYPE_THREAT_NONE ((FIT_RADAR_THREAT_LEVEL_TYPE)1) +#define FIT_RADAR_THREAT_LEVEL_TYPE_THREAT_APPROACHING ((FIT_RADAR_THREAT_LEVEL_TYPE)2) +#define FIT_RADAR_THREAT_LEVEL_TYPE_THREAT_APPROACHING_FAST ((FIT_RADAR_THREAT_LEVEL_TYPE)3) +#define FIT_RADAR_THREAT_LEVEL_TYPE_COUNT 4 + +typedef FIT_ENUM FIT_MAX_MET_SPEED_SOURCE; +#define FIT_MAX_MET_SPEED_SOURCE_INVALID FIT_ENUM_INVALID +#define FIT_MAX_MET_SPEED_SOURCE_ONBOARD_GPS ((FIT_MAX_MET_SPEED_SOURCE)0) +#define FIT_MAX_MET_SPEED_SOURCE_CONNECTED_GPS ((FIT_MAX_MET_SPEED_SOURCE)1) +#define FIT_MAX_MET_SPEED_SOURCE_CADENCE ((FIT_MAX_MET_SPEED_SOURCE)2) +#define FIT_MAX_MET_SPEED_SOURCE_COUNT 3 + +typedef FIT_ENUM FIT_MAX_MET_HEART_RATE_SOURCE; +#define FIT_MAX_MET_HEART_RATE_SOURCE_INVALID FIT_ENUM_INVALID +#define FIT_MAX_MET_HEART_RATE_SOURCE_WHR ((FIT_MAX_MET_HEART_RATE_SOURCE)0) // Wrist Heart Rate Monitor +#define FIT_MAX_MET_HEART_RATE_SOURCE_HRM ((FIT_MAX_MET_HEART_RATE_SOURCE)1) // Chest Strap Heart Rate Monitor +#define FIT_MAX_MET_HEART_RATE_SOURCE_COUNT 2 + +typedef FIT_ENUM FIT_HRV_STATUS; +#define FIT_HRV_STATUS_INVALID FIT_ENUM_INVALID +#define FIT_HRV_STATUS_NONE ((FIT_HRV_STATUS)0) +#define FIT_HRV_STATUS_POOR ((FIT_HRV_STATUS)1) +#define FIT_HRV_STATUS_LOW ((FIT_HRV_STATUS)2) +#define FIT_HRV_STATUS_UNBALANCED ((FIT_HRV_STATUS)3) +#define FIT_HRV_STATUS_BALANCED ((FIT_HRV_STATUS)4) +#define FIT_HRV_STATUS_COUNT 5 + +typedef FIT_ENUM FIT_NO_FLY_TIME_MODE; +#define FIT_NO_FLY_TIME_MODE_INVALID FIT_ENUM_INVALID +#define FIT_NO_FLY_TIME_MODE_STANDARD ((FIT_NO_FLY_TIME_MODE)0) // Standard Diver Alert Network no-fly guidance +#define FIT_NO_FLY_TIME_MODE_FLAT_24_HOURS ((FIT_NO_FLY_TIME_MODE)1) // Flat 24 hour no-fly guidance +#define FIT_NO_FLY_TIME_MODE_COUNT 2 + + +/////////////////////////////////////////////////////////////////////// +// Message Conversion Structures +/////////////////////////////////////////////////////////////////////// + +typedef struct +{ + FIT_UINT8 base_type; + FIT_UINT16 offset_in; + FIT_UINT16 offset_local; + FIT_UINT8 size; + FIT_UINT8 num; +} FIT_FIELD_CONVERT; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_FIELD_CONVERT fields[95]; +} FIT_MESG_CONVERT; + + +/////////////////////////////////////////////////////////////////////// +// Messages +/////////////////////////////////////////////////////////////////////// + +#define FIT_MESG_SIZE 254 +#define FIT_MESG_DEF_SIZE 290 + +// pad message + +#define FIT_PAD_MESG_DEF_SIZE 5 + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; +} FIT_PAD_MESG_DEF; + + +// file_id message + +#define FIT_FILE_ID_MESG_SIZE 35 +#define FIT_FILE_ID_MESG_DEF_SIZE 26 +#define FIT_FILE_ID_MESG_PRODUCT_NAME_COUNT 20 + +typedef struct +{ + FIT_UINT32Z serial_number; // + FIT_DATE_TIME time_created; // Only set for files that are can be created/erased. + FIT_STRING product_name[FIT_FILE_ID_MESG_PRODUCT_NAME_COUNT]; // Optional free form string to indicate the devices name or model + FIT_MANUFACTURER manufacturer; // + FIT_UINT16 product; // + FIT_UINT16 number; // Only set for files that are not created/erased. + FIT_FILE type; // +} FIT_FILE_ID_MESG; + +typedef FIT_UINT8 FIT_FILE_ID_FIELD_NUM; + +#define FIT_FILE_ID_FIELD_NUM_SERIAL_NUMBER ((FIT_FILE_ID_FIELD_NUM)3) +#define FIT_FILE_ID_FIELD_NUM_TIME_CREATED ((FIT_FILE_ID_FIELD_NUM)4) +#define FIT_FILE_ID_FIELD_NUM_PRODUCT_NAME ((FIT_FILE_ID_FIELD_NUM)8) +#define FIT_FILE_ID_FIELD_NUM_MANUFACTURER ((FIT_FILE_ID_FIELD_NUM)1) +#define FIT_FILE_ID_FIELD_NUM_PRODUCT ((FIT_FILE_ID_FIELD_NUM)2) +#define FIT_FILE_ID_FIELD_NUM_NUMBER ((FIT_FILE_ID_FIELD_NUM)5) +#define FIT_FILE_ID_FIELD_NUM_TYPE ((FIT_FILE_ID_FIELD_NUM)0) + +typedef enum +{ + FIT_FILE_ID_MESG_SERIAL_NUMBER, + FIT_FILE_ID_MESG_TIME_CREATED, + FIT_FILE_ID_MESG_PRODUCT_NAME, + FIT_FILE_ID_MESG_MANUFACTURER, + FIT_FILE_ID_MESG_PRODUCT, + FIT_FILE_ID_MESG_NUMBER, + FIT_FILE_ID_MESG_TYPE, + FIT_FILE_ID_MESG_FIELDS +} FIT_FILE_ID_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_FILE_ID_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_FILE_ID_MESG_DEF; + +// file_creator message + +#define FIT_FILE_CREATOR_MESG_SIZE 3 +#define FIT_FILE_CREATOR_MESG_DEF_SIZE 11 + +typedef struct +{ + FIT_UINT16 software_version; // + FIT_UINT8 hardware_version; // +} FIT_FILE_CREATOR_MESG; + +typedef FIT_UINT8 FIT_FILE_CREATOR_FIELD_NUM; + +#define FIT_FILE_CREATOR_FIELD_NUM_SOFTWARE_VERSION ((FIT_FILE_CREATOR_FIELD_NUM)0) +#define FIT_FILE_CREATOR_FIELD_NUM_HARDWARE_VERSION ((FIT_FILE_CREATOR_FIELD_NUM)1) + +typedef enum +{ + FIT_FILE_CREATOR_MESG_SOFTWARE_VERSION, + FIT_FILE_CREATOR_MESG_HARDWARE_VERSION, + FIT_FILE_CREATOR_MESG_FIELDS +} FIT_FILE_CREATOR_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_FILE_CREATOR_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_FILE_CREATOR_MESG_DEF; + +// software message + +#define FIT_SOFTWARE_MESG_SIZE 20 +#define FIT_SOFTWARE_MESG_DEF_SIZE 14 +#define FIT_SOFTWARE_MESG_PART_NUMBER_COUNT 16 + +typedef struct +{ + FIT_STRING part_number[FIT_SOFTWARE_MESG_PART_NUMBER_COUNT]; // + FIT_MESSAGE_INDEX message_index; // + FIT_UINT16 version; // +} FIT_SOFTWARE_MESG; + +typedef FIT_UINT8 FIT_SOFTWARE_FIELD_NUM; + +#define FIT_SOFTWARE_FIELD_NUM_PART_NUMBER ((FIT_SOFTWARE_FIELD_NUM)5) +#define FIT_SOFTWARE_FIELD_NUM_MESSAGE_INDEX ((FIT_SOFTWARE_FIELD_NUM)254) +#define FIT_SOFTWARE_FIELD_NUM_VERSION ((FIT_SOFTWARE_FIELD_NUM)3) + +typedef enum +{ + FIT_SOFTWARE_MESG_PART_NUMBER, + FIT_SOFTWARE_MESG_MESSAGE_INDEX, + FIT_SOFTWARE_MESG_VERSION, + FIT_SOFTWARE_MESG_FIELDS +} FIT_SOFTWARE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_SOFTWARE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_SOFTWARE_MESG_DEF; + +// slave_device message + +#define FIT_SLAVE_DEVICE_MESG_SIZE 4 +#define FIT_SLAVE_DEVICE_MESG_DEF_SIZE 11 + +typedef struct +{ + FIT_MANUFACTURER manufacturer; // + FIT_UINT16 product; // +} FIT_SLAVE_DEVICE_MESG; + +typedef FIT_UINT8 FIT_SLAVE_DEVICE_FIELD_NUM; + +#define FIT_SLAVE_DEVICE_FIELD_NUM_MANUFACTURER ((FIT_SLAVE_DEVICE_FIELD_NUM)0) +#define FIT_SLAVE_DEVICE_FIELD_NUM_PRODUCT ((FIT_SLAVE_DEVICE_FIELD_NUM)1) + +typedef enum +{ + FIT_SLAVE_DEVICE_MESG_MANUFACTURER, + FIT_SLAVE_DEVICE_MESG_PRODUCT, + FIT_SLAVE_DEVICE_MESG_FIELDS +} FIT_SLAVE_DEVICE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_SLAVE_DEVICE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_SLAVE_DEVICE_MESG_DEF; + +// capabilities message + +#define FIT_CAPABILITIES_MESG_SIZE 13 +#define FIT_CAPABILITIES_MESG_DEF_SIZE 17 +#define FIT_CAPABILITIES_MESG_LANGUAGES_COUNT 4 +#define FIT_CAPABILITIES_MESG_SPORTS_COUNT 1 + +typedef struct +{ + FIT_UINT8Z languages[FIT_CAPABILITIES_MESG_LANGUAGES_COUNT]; // Use language_bits_x types where x is index of array. + FIT_WORKOUT_CAPABILITIES workouts_supported; // + FIT_CONNECTIVITY_CAPABILITIES connectivity_supported; // + FIT_SPORT_BITS_0 sports[FIT_CAPABILITIES_MESG_SPORTS_COUNT]; // Use sport_bits_x types where x is index of array. +} FIT_CAPABILITIES_MESG; + +typedef FIT_UINT8 FIT_CAPABILITIES_FIELD_NUM; + +#define FIT_CAPABILITIES_FIELD_NUM_LANGUAGES ((FIT_CAPABILITIES_FIELD_NUM)0) +#define FIT_CAPABILITIES_FIELD_NUM_WORKOUTS_SUPPORTED ((FIT_CAPABILITIES_FIELD_NUM)21) +#define FIT_CAPABILITIES_FIELD_NUM_CONNECTIVITY_SUPPORTED ((FIT_CAPABILITIES_FIELD_NUM)23) +#define FIT_CAPABILITIES_FIELD_NUM_SPORTS ((FIT_CAPABILITIES_FIELD_NUM)1) + +typedef enum +{ + FIT_CAPABILITIES_MESG_LANGUAGES, + FIT_CAPABILITIES_MESG_WORKOUTS_SUPPORTED, + FIT_CAPABILITIES_MESG_CONNECTIVITY_SUPPORTED, + FIT_CAPABILITIES_MESG_SPORTS, + FIT_CAPABILITIES_MESG_FIELDS +} FIT_CAPABILITIES_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_CAPABILITIES_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_CAPABILITIES_MESG_DEF; + +// file_capabilities message + +#define FIT_FILE_CAPABILITIES_MESG_SIZE 26 +#define FIT_FILE_CAPABILITIES_MESG_DEF_SIZE 23 +#define FIT_FILE_CAPABILITIES_MESG_DIRECTORY_COUNT 16 + +typedef struct +{ + FIT_STRING directory[FIT_FILE_CAPABILITIES_MESG_DIRECTORY_COUNT]; // + FIT_UINT32 max_size; // 1 * bytes + 0, + FIT_MESSAGE_INDEX message_index; // + FIT_UINT16 max_count; // + FIT_FILE type; // + FIT_FILE_FLAGS flags; // +} FIT_FILE_CAPABILITIES_MESG; + +typedef FIT_UINT8 FIT_FILE_CAPABILITIES_FIELD_NUM; + +#define FIT_FILE_CAPABILITIES_FIELD_NUM_DIRECTORY ((FIT_FILE_CAPABILITIES_FIELD_NUM)2) +#define FIT_FILE_CAPABILITIES_FIELD_NUM_MAX_SIZE ((FIT_FILE_CAPABILITIES_FIELD_NUM)4) +#define FIT_FILE_CAPABILITIES_FIELD_NUM_MESSAGE_INDEX ((FIT_FILE_CAPABILITIES_FIELD_NUM)254) +#define FIT_FILE_CAPABILITIES_FIELD_NUM_MAX_COUNT ((FIT_FILE_CAPABILITIES_FIELD_NUM)3) +#define FIT_FILE_CAPABILITIES_FIELD_NUM_TYPE ((FIT_FILE_CAPABILITIES_FIELD_NUM)0) +#define FIT_FILE_CAPABILITIES_FIELD_NUM_FLAGS ((FIT_FILE_CAPABILITIES_FIELD_NUM)1) + +typedef enum +{ + FIT_FILE_CAPABILITIES_MESG_DIRECTORY, + FIT_FILE_CAPABILITIES_MESG_MAX_SIZE, + FIT_FILE_CAPABILITIES_MESG_MESSAGE_INDEX, + FIT_FILE_CAPABILITIES_MESG_MAX_COUNT, + FIT_FILE_CAPABILITIES_MESG_TYPE, + FIT_FILE_CAPABILITIES_MESG_FLAGS, + FIT_FILE_CAPABILITIES_MESG_FIELDS +} FIT_FILE_CAPABILITIES_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_FILE_CAPABILITIES_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_FILE_CAPABILITIES_MESG_DEF; + +// mesg_capabilities message + +#define FIT_MESG_CAPABILITIES_MESG_SIZE 8 +#define FIT_MESG_CAPABILITIES_MESG_DEF_SIZE 20 + +typedef struct +{ + FIT_MESSAGE_INDEX message_index; // + FIT_MESG_NUM mesg_num; // + FIT_UINT16 count; // + FIT_FILE file; // + FIT_MESG_COUNT count_type; // +} FIT_MESG_CAPABILITIES_MESG; + +typedef FIT_UINT8 FIT_MESG_CAPABILITIES_FIELD_NUM; + +#define FIT_MESG_CAPABILITIES_FIELD_NUM_MESSAGE_INDEX ((FIT_MESG_CAPABILITIES_FIELD_NUM)254) +#define FIT_MESG_CAPABILITIES_FIELD_NUM_MESG_NUM ((FIT_MESG_CAPABILITIES_FIELD_NUM)1) +#define FIT_MESG_CAPABILITIES_FIELD_NUM_COUNT ((FIT_MESG_CAPABILITIES_FIELD_NUM)3) +#define FIT_MESG_CAPABILITIES_FIELD_NUM_FILE ((FIT_MESG_CAPABILITIES_FIELD_NUM)0) +#define FIT_MESG_CAPABILITIES_FIELD_NUM_COUNT_TYPE ((FIT_MESG_CAPABILITIES_FIELD_NUM)2) + +typedef enum +{ + FIT_MESG_CAPABILITIES_MESG_MESSAGE_INDEX, + FIT_MESG_CAPABILITIES_MESG_MESG_NUM, + FIT_MESG_CAPABILITIES_MESG_COUNT, + FIT_MESG_CAPABILITIES_MESG_FILE, + FIT_MESG_CAPABILITIES_MESG_COUNT_TYPE, + FIT_MESG_CAPABILITIES_MESG_FIELDS +} FIT_MESG_CAPABILITIES_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_MESG_CAPABILITIES_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_MESG_CAPABILITIES_MESG_DEF; + +// field_capabilities message + +#define FIT_FIELD_CAPABILITIES_MESG_SIZE 8 +#define FIT_FIELD_CAPABILITIES_MESG_DEF_SIZE 20 + +typedef struct +{ + FIT_MESSAGE_INDEX message_index; // + FIT_MESG_NUM mesg_num; // + FIT_UINT16 count; // + FIT_FILE file; // + FIT_UINT8 field_num; // +} FIT_FIELD_CAPABILITIES_MESG; + +typedef FIT_UINT8 FIT_FIELD_CAPABILITIES_FIELD_NUM; + +#define FIT_FIELD_CAPABILITIES_FIELD_NUM_MESSAGE_INDEX ((FIT_FIELD_CAPABILITIES_FIELD_NUM)254) +#define FIT_FIELD_CAPABILITIES_FIELD_NUM_MESG_NUM ((FIT_FIELD_CAPABILITIES_FIELD_NUM)1) +#define FIT_FIELD_CAPABILITIES_FIELD_NUM_COUNT ((FIT_FIELD_CAPABILITIES_FIELD_NUM)3) +#define FIT_FIELD_CAPABILITIES_FIELD_NUM_FILE ((FIT_FIELD_CAPABILITIES_FIELD_NUM)0) +#define FIT_FIELD_CAPABILITIES_FIELD_NUM_FIELD_NUM ((FIT_FIELD_CAPABILITIES_FIELD_NUM)2) + +typedef enum +{ + FIT_FIELD_CAPABILITIES_MESG_MESSAGE_INDEX, + FIT_FIELD_CAPABILITIES_MESG_MESG_NUM, + FIT_FIELD_CAPABILITIES_MESG_COUNT, + FIT_FIELD_CAPABILITIES_MESG_FILE, + FIT_FIELD_CAPABILITIES_MESG_FIELD_NUM, + FIT_FIELD_CAPABILITIES_MESG_FIELDS +} FIT_FIELD_CAPABILITIES_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_FIELD_CAPABILITIES_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_FIELD_CAPABILITIES_MESG_DEF; + +// device_settings message + +#define FIT_DEVICE_SETTINGS_MESG_SIZE 36 +#define FIT_DEVICE_SETTINGS_MESG_DEF_SIZE 56 +#define FIT_DEVICE_SETTINGS_MESG_TIME_OFFSET_COUNT 2 +#define FIT_DEVICE_SETTINGS_MESG_PAGES_ENABLED_COUNT 1 +#define FIT_DEVICE_SETTINGS_MESG_DEFAULT_PAGE_COUNT 1 +#define FIT_DEVICE_SETTINGS_MESG_TIME_MODE_COUNT 2 +#define FIT_DEVICE_SETTINGS_MESG_TIME_ZONE_OFFSET_COUNT 2 + +typedef struct +{ + FIT_UINT32 utc_offset; // Offset from system time. Required to convert timestamp from system time to UTC. + FIT_UINT32 time_offset[FIT_DEVICE_SETTINGS_MESG_TIME_OFFSET_COUNT]; // 1 * s + 0, Offset from system time. + FIT_DATE_TIME clock_time; // UTC timestamp used to set the devices clock and date + FIT_UINT16 pages_enabled[FIT_DEVICE_SETTINGS_MESG_PAGES_ENABLED_COUNT]; // Bitfield to configure enabled screens for each supported loop + FIT_UINT16 default_page[FIT_DEVICE_SETTINGS_MESG_DEFAULT_PAGE_COUNT]; // Bitfield to indicate one page as default for each supported loop + FIT_UINT16 autosync_min_steps; // 1 * steps + 0, Minimum steps before an autosync can occur + FIT_UINT16 autosync_min_time; // 1 * minutes + 0, Minimum minutes before an autosync can occur + FIT_UINT8 active_time_zone; // Index into time zone arrays. + FIT_TIME_MODE time_mode[FIT_DEVICE_SETTINGS_MESG_TIME_MODE_COUNT]; // Display mode for the time + FIT_SINT8 time_zone_offset[FIT_DEVICE_SETTINGS_MESG_TIME_ZONE_OFFSET_COUNT]; // 4 * hr + 0, timezone offset in 1/4 hour increments + FIT_BACKLIGHT_MODE backlight_mode; // Mode for backlight + FIT_BOOL activity_tracker_enabled; // Enabled state of the activity tracker functionality + FIT_BOOL move_alert_enabled; // Enabled state of the move alert + FIT_DATE_MODE date_mode; // Display mode for the date + FIT_DISPLAY_ORIENTATION display_orientation; // + FIT_SIDE mounting_side; // + FIT_TAP_SENSITIVITY tap_sensitivity; // Used to hold the tap threshold setting +} FIT_DEVICE_SETTINGS_MESG; + +typedef FIT_UINT8 FIT_DEVICE_SETTINGS_FIELD_NUM; + +#define FIT_DEVICE_SETTINGS_FIELD_NUM_UTC_OFFSET ((FIT_DEVICE_SETTINGS_FIELD_NUM)1) +#define FIT_DEVICE_SETTINGS_FIELD_NUM_TIME_OFFSET ((FIT_DEVICE_SETTINGS_FIELD_NUM)2) +#define FIT_DEVICE_SETTINGS_FIELD_NUM_CLOCK_TIME ((FIT_DEVICE_SETTINGS_FIELD_NUM)39) +#define FIT_DEVICE_SETTINGS_FIELD_NUM_PAGES_ENABLED ((FIT_DEVICE_SETTINGS_FIELD_NUM)40) +#define FIT_DEVICE_SETTINGS_FIELD_NUM_DEFAULT_PAGE ((FIT_DEVICE_SETTINGS_FIELD_NUM)57) +#define FIT_DEVICE_SETTINGS_FIELD_NUM_AUTOSYNC_MIN_STEPS ((FIT_DEVICE_SETTINGS_FIELD_NUM)58) +#define FIT_DEVICE_SETTINGS_FIELD_NUM_AUTOSYNC_MIN_TIME ((FIT_DEVICE_SETTINGS_FIELD_NUM)59) +#define FIT_DEVICE_SETTINGS_FIELD_NUM_ACTIVE_TIME_ZONE ((FIT_DEVICE_SETTINGS_FIELD_NUM)0) +#define FIT_DEVICE_SETTINGS_FIELD_NUM_TIME_MODE ((FIT_DEVICE_SETTINGS_FIELD_NUM)4) +#define FIT_DEVICE_SETTINGS_FIELD_NUM_TIME_ZONE_OFFSET ((FIT_DEVICE_SETTINGS_FIELD_NUM)5) +#define FIT_DEVICE_SETTINGS_FIELD_NUM_BACKLIGHT_MODE ((FIT_DEVICE_SETTINGS_FIELD_NUM)12) +#define FIT_DEVICE_SETTINGS_FIELD_NUM_ACTIVITY_TRACKER_ENABLED ((FIT_DEVICE_SETTINGS_FIELD_NUM)36) +#define FIT_DEVICE_SETTINGS_FIELD_NUM_MOVE_ALERT_ENABLED ((FIT_DEVICE_SETTINGS_FIELD_NUM)46) +#define FIT_DEVICE_SETTINGS_FIELD_NUM_DATE_MODE ((FIT_DEVICE_SETTINGS_FIELD_NUM)47) +#define FIT_DEVICE_SETTINGS_FIELD_NUM_DISPLAY_ORIENTATION ((FIT_DEVICE_SETTINGS_FIELD_NUM)55) +#define FIT_DEVICE_SETTINGS_FIELD_NUM_MOUNTING_SIDE ((FIT_DEVICE_SETTINGS_FIELD_NUM)56) +#define FIT_DEVICE_SETTINGS_FIELD_NUM_TAP_SENSITIVITY ((FIT_DEVICE_SETTINGS_FIELD_NUM)174) + +typedef enum +{ + FIT_DEVICE_SETTINGS_MESG_UTC_OFFSET, + FIT_DEVICE_SETTINGS_MESG_TIME_OFFSET, + FIT_DEVICE_SETTINGS_MESG_CLOCK_TIME, + FIT_DEVICE_SETTINGS_MESG_PAGES_ENABLED, + FIT_DEVICE_SETTINGS_MESG_DEFAULT_PAGE, + FIT_DEVICE_SETTINGS_MESG_AUTOSYNC_MIN_STEPS, + FIT_DEVICE_SETTINGS_MESG_AUTOSYNC_MIN_TIME, + FIT_DEVICE_SETTINGS_MESG_ACTIVE_TIME_ZONE, + FIT_DEVICE_SETTINGS_MESG_TIME_MODE, + FIT_DEVICE_SETTINGS_MESG_TIME_ZONE_OFFSET, + FIT_DEVICE_SETTINGS_MESG_BACKLIGHT_MODE, + FIT_DEVICE_SETTINGS_MESG_ACTIVITY_TRACKER_ENABLED, + FIT_DEVICE_SETTINGS_MESG_MOVE_ALERT_ENABLED, + FIT_DEVICE_SETTINGS_MESG_DATE_MODE, + FIT_DEVICE_SETTINGS_MESG_DISPLAY_ORIENTATION, + FIT_DEVICE_SETTINGS_MESG_MOUNTING_SIDE, + FIT_DEVICE_SETTINGS_MESG_TAP_SENSITIVITY, + FIT_DEVICE_SETTINGS_MESG_FIELDS +} FIT_DEVICE_SETTINGS_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_DEVICE_SETTINGS_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_DEVICE_SETTINGS_MESG_DEF; + +// user_profile message + +#define FIT_USER_PROFILE_MESG_SIZE 50 +#define FIT_USER_PROFILE_MESG_DEF_SIZE 80 +#define FIT_USER_PROFILE_MESG_FRIENDLY_NAME_COUNT 16 +#define FIT_USER_PROFILE_MESG_GLOBAL_ID_COUNT 6 + +typedef struct +{ + FIT_STRING friendly_name[FIT_USER_PROFILE_MESG_FRIENDLY_NAME_COUNT]; // + FIT_MESSAGE_INDEX message_index; // + FIT_UINT16 weight; // 10 * kg + 0, + FIT_USER_LOCAL_ID local_id; // + FIT_UINT16 user_running_step_length; // 1000 * m + 0, User defined running step length set to 0 for auto length + FIT_UINT16 user_walking_step_length; // 1000 * m + 0, User defined walking step length set to 0 for auto length + FIT_GENDER gender; // + FIT_UINT8 age; // 1 * years + 0, + FIT_UINT8 height; // 100 * m + 0, + FIT_LANGUAGE language; // + FIT_DISPLAY_MEASURE elev_setting; // + FIT_DISPLAY_MEASURE weight_setting; // + FIT_UINT8 resting_heart_rate; // 1 * bpm + 0, + FIT_UINT8 default_max_running_heart_rate; // 1 * bpm + 0, + FIT_UINT8 default_max_biking_heart_rate; // 1 * bpm + 0, + FIT_UINT8 default_max_heart_rate; // 1 * bpm + 0, + FIT_DISPLAY_HEART hr_setting; // + FIT_DISPLAY_MEASURE speed_setting; // + FIT_DISPLAY_MEASURE dist_setting; // + FIT_DISPLAY_POWER power_setting; // + FIT_ACTIVITY_CLASS activity_class; // + FIT_DISPLAY_POSITION position_setting; // + FIT_DISPLAY_MEASURE temperature_setting; // + FIT_BYTE global_id[FIT_USER_PROFILE_MESG_GLOBAL_ID_COUNT]; // + FIT_DISPLAY_MEASURE height_setting; // +} FIT_USER_PROFILE_MESG; + +typedef FIT_UINT8 FIT_USER_PROFILE_FIELD_NUM; + +#define FIT_USER_PROFILE_FIELD_NUM_FRIENDLY_NAME ((FIT_USER_PROFILE_FIELD_NUM)0) +#define FIT_USER_PROFILE_FIELD_NUM_MESSAGE_INDEX ((FIT_USER_PROFILE_FIELD_NUM)254) +#define FIT_USER_PROFILE_FIELD_NUM_WEIGHT ((FIT_USER_PROFILE_FIELD_NUM)4) +#define FIT_USER_PROFILE_FIELD_NUM_LOCAL_ID ((FIT_USER_PROFILE_FIELD_NUM)22) +#define FIT_USER_PROFILE_FIELD_NUM_USER_RUNNING_STEP_LENGTH ((FIT_USER_PROFILE_FIELD_NUM)31) +#define FIT_USER_PROFILE_FIELD_NUM_USER_WALKING_STEP_LENGTH ((FIT_USER_PROFILE_FIELD_NUM)32) +#define FIT_USER_PROFILE_FIELD_NUM_GENDER ((FIT_USER_PROFILE_FIELD_NUM)1) +#define FIT_USER_PROFILE_FIELD_NUM_AGE ((FIT_USER_PROFILE_FIELD_NUM)2) +#define FIT_USER_PROFILE_FIELD_NUM_HEIGHT ((FIT_USER_PROFILE_FIELD_NUM)3) +#define FIT_USER_PROFILE_FIELD_NUM_LANGUAGE ((FIT_USER_PROFILE_FIELD_NUM)5) +#define FIT_USER_PROFILE_FIELD_NUM_ELEV_SETTING ((FIT_USER_PROFILE_FIELD_NUM)6) +#define FIT_USER_PROFILE_FIELD_NUM_WEIGHT_SETTING ((FIT_USER_PROFILE_FIELD_NUM)7) +#define FIT_USER_PROFILE_FIELD_NUM_RESTING_HEART_RATE ((FIT_USER_PROFILE_FIELD_NUM)8) +#define FIT_USER_PROFILE_FIELD_NUM_DEFAULT_MAX_RUNNING_HEART_RATE ((FIT_USER_PROFILE_FIELD_NUM)9) +#define FIT_USER_PROFILE_FIELD_NUM_DEFAULT_MAX_BIKING_HEART_RATE ((FIT_USER_PROFILE_FIELD_NUM)10) +#define FIT_USER_PROFILE_FIELD_NUM_DEFAULT_MAX_HEART_RATE ((FIT_USER_PROFILE_FIELD_NUM)11) +#define FIT_USER_PROFILE_FIELD_NUM_HR_SETTING ((FIT_USER_PROFILE_FIELD_NUM)12) +#define FIT_USER_PROFILE_FIELD_NUM_SPEED_SETTING ((FIT_USER_PROFILE_FIELD_NUM)13) +#define FIT_USER_PROFILE_FIELD_NUM_DIST_SETTING ((FIT_USER_PROFILE_FIELD_NUM)14) +#define FIT_USER_PROFILE_FIELD_NUM_POWER_SETTING ((FIT_USER_PROFILE_FIELD_NUM)16) +#define FIT_USER_PROFILE_FIELD_NUM_ACTIVITY_CLASS ((FIT_USER_PROFILE_FIELD_NUM)17) +#define FIT_USER_PROFILE_FIELD_NUM_POSITION_SETTING ((FIT_USER_PROFILE_FIELD_NUM)18) +#define FIT_USER_PROFILE_FIELD_NUM_TEMPERATURE_SETTING ((FIT_USER_PROFILE_FIELD_NUM)21) +#define FIT_USER_PROFILE_FIELD_NUM_GLOBAL_ID ((FIT_USER_PROFILE_FIELD_NUM)23) +#define FIT_USER_PROFILE_FIELD_NUM_HEIGHT_SETTING ((FIT_USER_PROFILE_FIELD_NUM)30) + +typedef enum +{ + FIT_USER_PROFILE_MESG_FRIENDLY_NAME, + FIT_USER_PROFILE_MESG_MESSAGE_INDEX, + FIT_USER_PROFILE_MESG_WEIGHT, + FIT_USER_PROFILE_MESG_LOCAL_ID, + FIT_USER_PROFILE_MESG_USER_RUNNING_STEP_LENGTH, + FIT_USER_PROFILE_MESG_USER_WALKING_STEP_LENGTH, + FIT_USER_PROFILE_MESG_GENDER, + FIT_USER_PROFILE_MESG_AGE, + FIT_USER_PROFILE_MESG_HEIGHT, + FIT_USER_PROFILE_MESG_LANGUAGE, + FIT_USER_PROFILE_MESG_ELEV_SETTING, + FIT_USER_PROFILE_MESG_WEIGHT_SETTING, + FIT_USER_PROFILE_MESG_RESTING_HEART_RATE, + FIT_USER_PROFILE_MESG_DEFAULT_MAX_RUNNING_HEART_RATE, + FIT_USER_PROFILE_MESG_DEFAULT_MAX_BIKING_HEART_RATE, + FIT_USER_PROFILE_MESG_DEFAULT_MAX_HEART_RATE, + FIT_USER_PROFILE_MESG_HR_SETTING, + FIT_USER_PROFILE_MESG_SPEED_SETTING, + FIT_USER_PROFILE_MESG_DIST_SETTING, + FIT_USER_PROFILE_MESG_POWER_SETTING, + FIT_USER_PROFILE_MESG_ACTIVITY_CLASS, + FIT_USER_PROFILE_MESG_POSITION_SETTING, + FIT_USER_PROFILE_MESG_TEMPERATURE_SETTING, + FIT_USER_PROFILE_MESG_GLOBAL_ID, + FIT_USER_PROFILE_MESG_HEIGHT_SETTING, + FIT_USER_PROFILE_MESG_FIELDS +} FIT_USER_PROFILE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_USER_PROFILE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_USER_PROFILE_MESG_DEF; + +// hrm_profile message + +#define FIT_HRM_PROFILE_MESG_SIZE 7 +#define FIT_HRM_PROFILE_MESG_DEF_SIZE 20 + +typedef struct +{ + FIT_MESSAGE_INDEX message_index; // + FIT_UINT16Z hrm_ant_id; // + FIT_BOOL enabled; // + FIT_BOOL log_hrv; // + FIT_UINT8Z hrm_ant_id_trans_type; // +} FIT_HRM_PROFILE_MESG; + +typedef FIT_UINT8 FIT_HRM_PROFILE_FIELD_NUM; + +#define FIT_HRM_PROFILE_FIELD_NUM_MESSAGE_INDEX ((FIT_HRM_PROFILE_FIELD_NUM)254) +#define FIT_HRM_PROFILE_FIELD_NUM_HRM_ANT_ID ((FIT_HRM_PROFILE_FIELD_NUM)1) +#define FIT_HRM_PROFILE_FIELD_NUM_ENABLED ((FIT_HRM_PROFILE_FIELD_NUM)0) +#define FIT_HRM_PROFILE_FIELD_NUM_LOG_HRV ((FIT_HRM_PROFILE_FIELD_NUM)2) +#define FIT_HRM_PROFILE_FIELD_NUM_HRM_ANT_ID_TRANS_TYPE ((FIT_HRM_PROFILE_FIELD_NUM)3) + +typedef enum +{ + FIT_HRM_PROFILE_MESG_MESSAGE_INDEX, + FIT_HRM_PROFILE_MESG_HRM_ANT_ID, + FIT_HRM_PROFILE_MESG_ENABLED, + FIT_HRM_PROFILE_MESG_LOG_HRV, + FIT_HRM_PROFILE_MESG_HRM_ANT_ID_TRANS_TYPE, + FIT_HRM_PROFILE_MESG_FIELDS +} FIT_HRM_PROFILE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_HRM_PROFILE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_HRM_PROFILE_MESG_DEF; + +// sdm_profile message + +#define FIT_SDM_PROFILE_MESG_SIZE 14 +#define FIT_SDM_PROFILE_MESG_DEF_SIZE 29 + +typedef struct +{ + FIT_UINT32 odometer; // 100 * m + 0, + FIT_MESSAGE_INDEX message_index; // + FIT_UINT16Z sdm_ant_id; // + FIT_UINT16 sdm_cal_factor; // 10 * % + 0, + FIT_BOOL enabled; // + FIT_BOOL speed_source; // Use footpod for speed source instead of GPS + FIT_UINT8Z sdm_ant_id_trans_type; // + FIT_UINT8 odometer_rollover; // Rollover counter that can be used to extend the odometer +} FIT_SDM_PROFILE_MESG; + +typedef FIT_UINT8 FIT_SDM_PROFILE_FIELD_NUM; + +#define FIT_SDM_PROFILE_FIELD_NUM_ODOMETER ((FIT_SDM_PROFILE_FIELD_NUM)3) +#define FIT_SDM_PROFILE_FIELD_NUM_MESSAGE_INDEX ((FIT_SDM_PROFILE_FIELD_NUM)254) +#define FIT_SDM_PROFILE_FIELD_NUM_SDM_ANT_ID ((FIT_SDM_PROFILE_FIELD_NUM)1) +#define FIT_SDM_PROFILE_FIELD_NUM_SDM_CAL_FACTOR ((FIT_SDM_PROFILE_FIELD_NUM)2) +#define FIT_SDM_PROFILE_FIELD_NUM_ENABLED ((FIT_SDM_PROFILE_FIELD_NUM)0) +#define FIT_SDM_PROFILE_FIELD_NUM_SPEED_SOURCE ((FIT_SDM_PROFILE_FIELD_NUM)4) +#define FIT_SDM_PROFILE_FIELD_NUM_SDM_ANT_ID_TRANS_TYPE ((FIT_SDM_PROFILE_FIELD_NUM)5) +#define FIT_SDM_PROFILE_FIELD_NUM_ODOMETER_ROLLOVER ((FIT_SDM_PROFILE_FIELD_NUM)7) + +typedef enum +{ + FIT_SDM_PROFILE_MESG_ODOMETER, + FIT_SDM_PROFILE_MESG_MESSAGE_INDEX, + FIT_SDM_PROFILE_MESG_SDM_ANT_ID, + FIT_SDM_PROFILE_MESG_SDM_CAL_FACTOR, + FIT_SDM_PROFILE_MESG_ENABLED, + FIT_SDM_PROFILE_MESG_SPEED_SOURCE, + FIT_SDM_PROFILE_MESG_SDM_ANT_ID_TRANS_TYPE, + FIT_SDM_PROFILE_MESG_ODOMETER_ROLLOVER, + FIT_SDM_PROFILE_MESG_FIELDS +} FIT_SDM_PROFILE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_SDM_PROFILE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_SDM_PROFILE_MESG_DEF; + +// bike_profile message + +#define FIT_BIKE_PROFILE_MESG_SIZE 59 +#define FIT_BIKE_PROFILE_MESG_DEF_SIZE 101 +#define FIT_BIKE_PROFILE_MESG_NAME_COUNT 16 +#define FIT_BIKE_PROFILE_MESG_FRONT_GEAR_COUNT 1 +#define FIT_BIKE_PROFILE_MESG_REAR_GEAR_COUNT 1 + +typedef struct +{ + FIT_STRING name[FIT_BIKE_PROFILE_MESG_NAME_COUNT]; // + FIT_UINT32 odometer; // 100 * m + 0, + FIT_MESSAGE_INDEX message_index; // + FIT_UINT16Z bike_spd_ant_id; // + FIT_UINT16Z bike_cad_ant_id; // + FIT_UINT16Z bike_spdcad_ant_id; // + FIT_UINT16Z bike_power_ant_id; // + FIT_UINT16 custom_wheelsize; // 1000 * m + 0, + FIT_UINT16 auto_wheelsize; // 1000 * m + 0, + FIT_UINT16 bike_weight; // 10 * kg + 0, + FIT_UINT16 power_cal_factor; // 10 * % + 0, + FIT_SPORT sport; // + FIT_SUB_SPORT sub_sport; // + FIT_BOOL auto_wheel_cal; // + FIT_BOOL auto_power_zero; // + FIT_UINT8 id; // + FIT_BOOL spd_enabled; // + FIT_BOOL cad_enabled; // + FIT_BOOL spdcad_enabled; // + FIT_BOOL power_enabled; // + FIT_UINT8 crank_length; // 2 * mm + -110, + FIT_BOOL enabled; // + FIT_UINT8Z bike_spd_ant_id_trans_type; // + FIT_UINT8Z bike_cad_ant_id_trans_type; // + FIT_UINT8Z bike_spdcad_ant_id_trans_type; // + FIT_UINT8Z bike_power_ant_id_trans_type; // + FIT_UINT8 odometer_rollover; // Rollover counter that can be used to extend the odometer + FIT_UINT8Z front_gear_num; // Number of front gears + FIT_UINT8Z front_gear[FIT_BIKE_PROFILE_MESG_FRONT_GEAR_COUNT]; // Number of teeth on each gear 0 is innermost + FIT_UINT8Z rear_gear_num; // Number of rear gears + FIT_UINT8Z rear_gear[FIT_BIKE_PROFILE_MESG_REAR_GEAR_COUNT]; // Number of teeth on each gear 0 is innermost + FIT_BOOL shimano_di2_enabled; // +} FIT_BIKE_PROFILE_MESG; + +typedef FIT_UINT8 FIT_BIKE_PROFILE_FIELD_NUM; + +#define FIT_BIKE_PROFILE_FIELD_NUM_NAME ((FIT_BIKE_PROFILE_FIELD_NUM)0) +#define FIT_BIKE_PROFILE_FIELD_NUM_ODOMETER ((FIT_BIKE_PROFILE_FIELD_NUM)3) +#define FIT_BIKE_PROFILE_FIELD_NUM_MESSAGE_INDEX ((FIT_BIKE_PROFILE_FIELD_NUM)254) +#define FIT_BIKE_PROFILE_FIELD_NUM_BIKE_SPD_ANT_ID ((FIT_BIKE_PROFILE_FIELD_NUM)4) +#define FIT_BIKE_PROFILE_FIELD_NUM_BIKE_CAD_ANT_ID ((FIT_BIKE_PROFILE_FIELD_NUM)5) +#define FIT_BIKE_PROFILE_FIELD_NUM_BIKE_SPDCAD_ANT_ID ((FIT_BIKE_PROFILE_FIELD_NUM)6) +#define FIT_BIKE_PROFILE_FIELD_NUM_BIKE_POWER_ANT_ID ((FIT_BIKE_PROFILE_FIELD_NUM)7) +#define FIT_BIKE_PROFILE_FIELD_NUM_CUSTOM_WHEELSIZE ((FIT_BIKE_PROFILE_FIELD_NUM)8) +#define FIT_BIKE_PROFILE_FIELD_NUM_AUTO_WHEELSIZE ((FIT_BIKE_PROFILE_FIELD_NUM)9) +#define FIT_BIKE_PROFILE_FIELD_NUM_BIKE_WEIGHT ((FIT_BIKE_PROFILE_FIELD_NUM)10) +#define FIT_BIKE_PROFILE_FIELD_NUM_POWER_CAL_FACTOR ((FIT_BIKE_PROFILE_FIELD_NUM)11) +#define FIT_BIKE_PROFILE_FIELD_NUM_SPORT ((FIT_BIKE_PROFILE_FIELD_NUM)1) +#define FIT_BIKE_PROFILE_FIELD_NUM_SUB_SPORT ((FIT_BIKE_PROFILE_FIELD_NUM)2) +#define FIT_BIKE_PROFILE_FIELD_NUM_AUTO_WHEEL_CAL ((FIT_BIKE_PROFILE_FIELD_NUM)12) +#define FIT_BIKE_PROFILE_FIELD_NUM_AUTO_POWER_ZERO ((FIT_BIKE_PROFILE_FIELD_NUM)13) +#define FIT_BIKE_PROFILE_FIELD_NUM_ID ((FIT_BIKE_PROFILE_FIELD_NUM)14) +#define FIT_BIKE_PROFILE_FIELD_NUM_SPD_ENABLED ((FIT_BIKE_PROFILE_FIELD_NUM)15) +#define FIT_BIKE_PROFILE_FIELD_NUM_CAD_ENABLED ((FIT_BIKE_PROFILE_FIELD_NUM)16) +#define FIT_BIKE_PROFILE_FIELD_NUM_SPDCAD_ENABLED ((FIT_BIKE_PROFILE_FIELD_NUM)17) +#define FIT_BIKE_PROFILE_FIELD_NUM_POWER_ENABLED ((FIT_BIKE_PROFILE_FIELD_NUM)18) +#define FIT_BIKE_PROFILE_FIELD_NUM_CRANK_LENGTH ((FIT_BIKE_PROFILE_FIELD_NUM)19) +#define FIT_BIKE_PROFILE_FIELD_NUM_ENABLED ((FIT_BIKE_PROFILE_FIELD_NUM)20) +#define FIT_BIKE_PROFILE_FIELD_NUM_BIKE_SPD_ANT_ID_TRANS_TYPE ((FIT_BIKE_PROFILE_FIELD_NUM)21) +#define FIT_BIKE_PROFILE_FIELD_NUM_BIKE_CAD_ANT_ID_TRANS_TYPE ((FIT_BIKE_PROFILE_FIELD_NUM)22) +#define FIT_BIKE_PROFILE_FIELD_NUM_BIKE_SPDCAD_ANT_ID_TRANS_TYPE ((FIT_BIKE_PROFILE_FIELD_NUM)23) +#define FIT_BIKE_PROFILE_FIELD_NUM_BIKE_POWER_ANT_ID_TRANS_TYPE ((FIT_BIKE_PROFILE_FIELD_NUM)24) +#define FIT_BIKE_PROFILE_FIELD_NUM_ODOMETER_ROLLOVER ((FIT_BIKE_PROFILE_FIELD_NUM)37) +#define FIT_BIKE_PROFILE_FIELD_NUM_FRONT_GEAR_NUM ((FIT_BIKE_PROFILE_FIELD_NUM)38) +#define FIT_BIKE_PROFILE_FIELD_NUM_FRONT_GEAR ((FIT_BIKE_PROFILE_FIELD_NUM)39) +#define FIT_BIKE_PROFILE_FIELD_NUM_REAR_GEAR_NUM ((FIT_BIKE_PROFILE_FIELD_NUM)40) +#define FIT_BIKE_PROFILE_FIELD_NUM_REAR_GEAR ((FIT_BIKE_PROFILE_FIELD_NUM)41) +#define FIT_BIKE_PROFILE_FIELD_NUM_SHIMANO_DI2_ENABLED ((FIT_BIKE_PROFILE_FIELD_NUM)44) + +typedef enum +{ + FIT_BIKE_PROFILE_MESG_NAME, + FIT_BIKE_PROFILE_MESG_ODOMETER, + FIT_BIKE_PROFILE_MESG_MESSAGE_INDEX, + FIT_BIKE_PROFILE_MESG_BIKE_SPD_ANT_ID, + FIT_BIKE_PROFILE_MESG_BIKE_CAD_ANT_ID, + FIT_BIKE_PROFILE_MESG_BIKE_SPDCAD_ANT_ID, + FIT_BIKE_PROFILE_MESG_BIKE_POWER_ANT_ID, + FIT_BIKE_PROFILE_MESG_CUSTOM_WHEELSIZE, + FIT_BIKE_PROFILE_MESG_AUTO_WHEELSIZE, + FIT_BIKE_PROFILE_MESG_BIKE_WEIGHT, + FIT_BIKE_PROFILE_MESG_POWER_CAL_FACTOR, + FIT_BIKE_PROFILE_MESG_SPORT, + FIT_BIKE_PROFILE_MESG_SUB_SPORT, + FIT_BIKE_PROFILE_MESG_AUTO_WHEEL_CAL, + FIT_BIKE_PROFILE_MESG_AUTO_POWER_ZERO, + FIT_BIKE_PROFILE_MESG_ID, + FIT_BIKE_PROFILE_MESG_SPD_ENABLED, + FIT_BIKE_PROFILE_MESG_CAD_ENABLED, + FIT_BIKE_PROFILE_MESG_SPDCAD_ENABLED, + FIT_BIKE_PROFILE_MESG_POWER_ENABLED, + FIT_BIKE_PROFILE_MESG_CRANK_LENGTH, + FIT_BIKE_PROFILE_MESG_ENABLED, + FIT_BIKE_PROFILE_MESG_BIKE_SPD_ANT_ID_TRANS_TYPE, + FIT_BIKE_PROFILE_MESG_BIKE_CAD_ANT_ID_TRANS_TYPE, + FIT_BIKE_PROFILE_MESG_BIKE_SPDCAD_ANT_ID_TRANS_TYPE, + FIT_BIKE_PROFILE_MESG_BIKE_POWER_ANT_ID_TRANS_TYPE, + FIT_BIKE_PROFILE_MESG_ODOMETER_ROLLOVER, + FIT_BIKE_PROFILE_MESG_FRONT_GEAR_NUM, + FIT_BIKE_PROFILE_MESG_FRONT_GEAR, + FIT_BIKE_PROFILE_MESG_REAR_GEAR_NUM, + FIT_BIKE_PROFILE_MESG_REAR_GEAR, + FIT_BIKE_PROFILE_MESG_SHIMANO_DI2_ENABLED, + FIT_BIKE_PROFILE_MESG_FIELDS +} FIT_BIKE_PROFILE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_BIKE_PROFILE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_BIKE_PROFILE_MESG_DEF; + +// connectivity message + +#define FIT_CONNECTIVITY_MESG_SIZE 36 +#define FIT_CONNECTIVITY_MESG_DEF_SIZE 44 +#define FIT_CONNECTIVITY_MESG_NAME_COUNT 24 + +typedef struct +{ + FIT_STRING name[FIT_CONNECTIVITY_MESG_NAME_COUNT]; // + FIT_BOOL bluetooth_enabled; // Use Bluetooth for connectivity features + FIT_BOOL bluetooth_le_enabled; // Use Bluetooth Low Energy for connectivity features + FIT_BOOL ant_enabled; // Use ANT for connectivity features + FIT_BOOL live_tracking_enabled; // + FIT_BOOL weather_conditions_enabled; // + FIT_BOOL weather_alerts_enabled; // + FIT_BOOL auto_activity_upload_enabled; // + FIT_BOOL course_download_enabled; // + FIT_BOOL workout_download_enabled; // + FIT_BOOL gps_ephemeris_download_enabled; // + FIT_BOOL incident_detection_enabled; // + FIT_BOOL grouptrack_enabled; // +} FIT_CONNECTIVITY_MESG; + +typedef FIT_UINT8 FIT_CONNECTIVITY_FIELD_NUM; + +#define FIT_CONNECTIVITY_FIELD_NUM_NAME ((FIT_CONNECTIVITY_FIELD_NUM)3) +#define FIT_CONNECTIVITY_FIELD_NUM_BLUETOOTH_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)0) +#define FIT_CONNECTIVITY_FIELD_NUM_BLUETOOTH_LE_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)1) +#define FIT_CONNECTIVITY_FIELD_NUM_ANT_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)2) +#define FIT_CONNECTIVITY_FIELD_NUM_LIVE_TRACKING_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)4) +#define FIT_CONNECTIVITY_FIELD_NUM_WEATHER_CONDITIONS_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)5) +#define FIT_CONNECTIVITY_FIELD_NUM_WEATHER_ALERTS_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)6) +#define FIT_CONNECTIVITY_FIELD_NUM_AUTO_ACTIVITY_UPLOAD_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)7) +#define FIT_CONNECTIVITY_FIELD_NUM_COURSE_DOWNLOAD_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)8) +#define FIT_CONNECTIVITY_FIELD_NUM_WORKOUT_DOWNLOAD_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)9) +#define FIT_CONNECTIVITY_FIELD_NUM_GPS_EPHEMERIS_DOWNLOAD_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)10) +#define FIT_CONNECTIVITY_FIELD_NUM_INCIDENT_DETECTION_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)11) +#define FIT_CONNECTIVITY_FIELD_NUM_GROUPTRACK_ENABLED ((FIT_CONNECTIVITY_FIELD_NUM)12) + +typedef enum +{ + FIT_CONNECTIVITY_MESG_NAME, + FIT_CONNECTIVITY_MESG_BLUETOOTH_ENABLED, + FIT_CONNECTIVITY_MESG_BLUETOOTH_LE_ENABLED, + FIT_CONNECTIVITY_MESG_ANT_ENABLED, + FIT_CONNECTIVITY_MESG_LIVE_TRACKING_ENABLED, + FIT_CONNECTIVITY_MESG_WEATHER_CONDITIONS_ENABLED, + FIT_CONNECTIVITY_MESG_WEATHER_ALERTS_ENABLED, + FIT_CONNECTIVITY_MESG_AUTO_ACTIVITY_UPLOAD_ENABLED, + FIT_CONNECTIVITY_MESG_COURSE_DOWNLOAD_ENABLED, + FIT_CONNECTIVITY_MESG_WORKOUT_DOWNLOAD_ENABLED, + FIT_CONNECTIVITY_MESG_GPS_EPHEMERIS_DOWNLOAD_ENABLED, + FIT_CONNECTIVITY_MESG_INCIDENT_DETECTION_ENABLED, + FIT_CONNECTIVITY_MESG_GROUPTRACK_ENABLED, + FIT_CONNECTIVITY_MESG_FIELDS +} FIT_CONNECTIVITY_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_CONNECTIVITY_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_CONNECTIVITY_MESG_DEF; + +// zones_target message + +#define FIT_ZONES_TARGET_MESG_SIZE 6 +#define FIT_ZONES_TARGET_MESG_DEF_SIZE 20 + +typedef struct +{ + FIT_UINT16 functional_threshold_power; // + FIT_UINT8 max_heart_rate; // + FIT_UINT8 threshold_heart_rate; // + FIT_HR_ZONE_CALC hr_calc_type; // + FIT_PWR_ZONE_CALC pwr_calc_type; // +} FIT_ZONES_TARGET_MESG; + +typedef FIT_UINT8 FIT_ZONES_TARGET_FIELD_NUM; + +#define FIT_ZONES_TARGET_FIELD_NUM_FUNCTIONAL_THRESHOLD_POWER ((FIT_ZONES_TARGET_FIELD_NUM)3) +#define FIT_ZONES_TARGET_FIELD_NUM_MAX_HEART_RATE ((FIT_ZONES_TARGET_FIELD_NUM)1) +#define FIT_ZONES_TARGET_FIELD_NUM_THRESHOLD_HEART_RATE ((FIT_ZONES_TARGET_FIELD_NUM)2) +#define FIT_ZONES_TARGET_FIELD_NUM_HR_CALC_TYPE ((FIT_ZONES_TARGET_FIELD_NUM)5) +#define FIT_ZONES_TARGET_FIELD_NUM_PWR_CALC_TYPE ((FIT_ZONES_TARGET_FIELD_NUM)7) + +typedef enum +{ + FIT_ZONES_TARGET_MESG_FUNCTIONAL_THRESHOLD_POWER, + FIT_ZONES_TARGET_MESG_MAX_HEART_RATE, + FIT_ZONES_TARGET_MESG_THRESHOLD_HEART_RATE, + FIT_ZONES_TARGET_MESG_HR_CALC_TYPE, + FIT_ZONES_TARGET_MESG_PWR_CALC_TYPE, + FIT_ZONES_TARGET_MESG_FIELDS +} FIT_ZONES_TARGET_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_ZONES_TARGET_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_ZONES_TARGET_MESG_DEF; + +// sport message + +#define FIT_SPORT_MESG_SIZE 18 +#define FIT_SPORT_MESG_DEF_SIZE 14 +#define FIT_SPORT_MESG_NAME_COUNT 16 + +typedef struct +{ + FIT_STRING name[FIT_SPORT_MESG_NAME_COUNT]; // + FIT_SPORT sport; // + FIT_SUB_SPORT sub_sport; // +} FIT_SPORT_MESG; + +typedef FIT_UINT8 FIT_SPORT_FIELD_NUM; + +#define FIT_SPORT_FIELD_NUM_NAME ((FIT_SPORT_FIELD_NUM)3) +#define FIT_SPORT_FIELD_NUM_SPORT ((FIT_SPORT_FIELD_NUM)0) +#define FIT_SPORT_FIELD_NUM_SUB_SPORT ((FIT_SPORT_FIELD_NUM)1) + +typedef enum +{ + FIT_SPORT_MESG_NAME, + FIT_SPORT_MESG_SPORT, + FIT_SPORT_MESG_SUB_SPORT, + FIT_SPORT_MESG_FIELDS +} FIT_SPORT_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_SPORT_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_SPORT_MESG_DEF; + +// hr_zone message + +#define FIT_HR_ZONE_MESG_SIZE 19 +#define FIT_HR_ZONE_MESG_DEF_SIZE 14 +#define FIT_HR_ZONE_MESG_NAME_COUNT 16 + +typedef struct +{ + FIT_STRING name[FIT_HR_ZONE_MESG_NAME_COUNT]; // + FIT_MESSAGE_INDEX message_index; // + FIT_UINT8 high_bpm; // 1 * bpm + 0, +} FIT_HR_ZONE_MESG; + +typedef FIT_UINT8 FIT_HR_ZONE_FIELD_NUM; + +#define FIT_HR_ZONE_FIELD_NUM_NAME ((FIT_HR_ZONE_FIELD_NUM)2) +#define FIT_HR_ZONE_FIELD_NUM_MESSAGE_INDEX ((FIT_HR_ZONE_FIELD_NUM)254) +#define FIT_HR_ZONE_FIELD_NUM_HIGH_BPM ((FIT_HR_ZONE_FIELD_NUM)1) + +typedef enum +{ + FIT_HR_ZONE_MESG_NAME, + FIT_HR_ZONE_MESG_MESSAGE_INDEX, + FIT_HR_ZONE_MESG_HIGH_BPM, + FIT_HR_ZONE_MESG_FIELDS +} FIT_HR_ZONE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_HR_ZONE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_HR_ZONE_MESG_DEF; + +// speed_zone message + +#define FIT_SPEED_ZONE_MESG_SIZE 20 +#define FIT_SPEED_ZONE_MESG_DEF_SIZE 14 +#define FIT_SPEED_ZONE_MESG_NAME_COUNT 16 + +typedef struct +{ + FIT_STRING name[FIT_SPEED_ZONE_MESG_NAME_COUNT]; // + FIT_MESSAGE_INDEX message_index; // + FIT_UINT16 high_value; // 1000 * m/s + 0, +} FIT_SPEED_ZONE_MESG; + +typedef FIT_UINT8 FIT_SPEED_ZONE_FIELD_NUM; + +#define FIT_SPEED_ZONE_FIELD_NUM_NAME ((FIT_SPEED_ZONE_FIELD_NUM)1) +#define FIT_SPEED_ZONE_FIELD_NUM_MESSAGE_INDEX ((FIT_SPEED_ZONE_FIELD_NUM)254) +#define FIT_SPEED_ZONE_FIELD_NUM_HIGH_VALUE ((FIT_SPEED_ZONE_FIELD_NUM)0) + +typedef enum +{ + FIT_SPEED_ZONE_MESG_NAME, + FIT_SPEED_ZONE_MESG_MESSAGE_INDEX, + FIT_SPEED_ZONE_MESG_HIGH_VALUE, + FIT_SPEED_ZONE_MESG_FIELDS +} FIT_SPEED_ZONE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_SPEED_ZONE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_SPEED_ZONE_MESG_DEF; + +// cadence_zone message + +#define FIT_CADENCE_ZONE_MESG_SIZE 19 +#define FIT_CADENCE_ZONE_MESG_DEF_SIZE 14 +#define FIT_CADENCE_ZONE_MESG_NAME_COUNT 16 + +typedef struct +{ + FIT_STRING name[FIT_CADENCE_ZONE_MESG_NAME_COUNT]; // + FIT_MESSAGE_INDEX message_index; // + FIT_UINT8 high_value; // 1 * rpm + 0, +} FIT_CADENCE_ZONE_MESG; + +typedef FIT_UINT8 FIT_CADENCE_ZONE_FIELD_NUM; + +#define FIT_CADENCE_ZONE_FIELD_NUM_NAME ((FIT_CADENCE_ZONE_FIELD_NUM)1) +#define FIT_CADENCE_ZONE_FIELD_NUM_MESSAGE_INDEX ((FIT_CADENCE_ZONE_FIELD_NUM)254) +#define FIT_CADENCE_ZONE_FIELD_NUM_HIGH_VALUE ((FIT_CADENCE_ZONE_FIELD_NUM)0) + +typedef enum +{ + FIT_CADENCE_ZONE_MESG_NAME, + FIT_CADENCE_ZONE_MESG_MESSAGE_INDEX, + FIT_CADENCE_ZONE_MESG_HIGH_VALUE, + FIT_CADENCE_ZONE_MESG_FIELDS +} FIT_CADENCE_ZONE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_CADENCE_ZONE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_CADENCE_ZONE_MESG_DEF; + +// power_zone message + +#define FIT_POWER_ZONE_MESG_SIZE 20 +#define FIT_POWER_ZONE_MESG_DEF_SIZE 14 +#define FIT_POWER_ZONE_MESG_NAME_COUNT 16 + +typedef struct +{ + FIT_STRING name[FIT_POWER_ZONE_MESG_NAME_COUNT]; // + FIT_MESSAGE_INDEX message_index; // + FIT_UINT16 high_value; // 1 * watts + 0, +} FIT_POWER_ZONE_MESG; + +typedef FIT_UINT8 FIT_POWER_ZONE_FIELD_NUM; + +#define FIT_POWER_ZONE_FIELD_NUM_NAME ((FIT_POWER_ZONE_FIELD_NUM)2) +#define FIT_POWER_ZONE_FIELD_NUM_MESSAGE_INDEX ((FIT_POWER_ZONE_FIELD_NUM)254) +#define FIT_POWER_ZONE_FIELD_NUM_HIGH_VALUE ((FIT_POWER_ZONE_FIELD_NUM)1) + +typedef enum +{ + FIT_POWER_ZONE_MESG_NAME, + FIT_POWER_ZONE_MESG_MESSAGE_INDEX, + FIT_POWER_ZONE_MESG_HIGH_VALUE, + FIT_POWER_ZONE_MESG_FIELDS +} FIT_POWER_ZONE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_POWER_ZONE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_POWER_ZONE_MESG_DEF; + +// met_zone message + +#define FIT_MET_ZONE_MESG_SIZE 6 +#define FIT_MET_ZONE_MESG_DEF_SIZE 17 + +typedef struct +{ + FIT_MESSAGE_INDEX message_index; // + FIT_UINT16 calories; // 10 * kcal / min + 0, + FIT_UINT8 high_bpm; // + FIT_UINT8 fat_calories; // 10 * kcal / min + 0, +} FIT_MET_ZONE_MESG; + +typedef FIT_UINT8 FIT_MET_ZONE_FIELD_NUM; + +#define FIT_MET_ZONE_FIELD_NUM_MESSAGE_INDEX ((FIT_MET_ZONE_FIELD_NUM)254) +#define FIT_MET_ZONE_FIELD_NUM_CALORIES ((FIT_MET_ZONE_FIELD_NUM)2) +#define FIT_MET_ZONE_FIELD_NUM_HIGH_BPM ((FIT_MET_ZONE_FIELD_NUM)1) +#define FIT_MET_ZONE_FIELD_NUM_FAT_CALORIES ((FIT_MET_ZONE_FIELD_NUM)3) + +typedef enum +{ + FIT_MET_ZONE_MESG_MESSAGE_INDEX, + FIT_MET_ZONE_MESG_CALORIES, + FIT_MET_ZONE_MESG_HIGH_BPM, + FIT_MET_ZONE_MESG_FAT_CALORIES, + FIT_MET_ZONE_MESG_FIELDS +} FIT_MET_ZONE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_MET_ZONE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_MET_ZONE_MESG_DEF; + +// dive_settings message + +#define FIT_DIVE_SETTINGS_MESG_SIZE 17 +#define FIT_DIVE_SETTINGS_MESG_DEF_SIZE 11 +#define FIT_DIVE_SETTINGS_MESG_NAME_COUNT 16 + +typedef struct +{ + FIT_STRING name[FIT_DIVE_SETTINGS_MESG_NAME_COUNT]; // + FIT_UINT8 heart_rate_source; // +} FIT_DIVE_SETTINGS_MESG; + +typedef FIT_UINT8 FIT_DIVE_SETTINGS_FIELD_NUM; + +#define FIT_DIVE_SETTINGS_FIELD_NUM_NAME ((FIT_DIVE_SETTINGS_FIELD_NUM)0) +#define FIT_DIVE_SETTINGS_FIELD_NUM_HEART_RATE_SOURCE ((FIT_DIVE_SETTINGS_FIELD_NUM)20) + +typedef enum +{ + FIT_DIVE_SETTINGS_MESG_NAME, + FIT_DIVE_SETTINGS_MESG_HEART_RATE_SOURCE, + FIT_DIVE_SETTINGS_MESG_FIELDS +} FIT_DIVE_SETTINGS_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_DIVE_SETTINGS_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_DIVE_SETTINGS_MESG_DEF; + +// goal message + +#define FIT_GOAL_MESG_SIZE 27 +#define FIT_GOAL_MESG_DEF_SIZE 44 + +typedef struct +{ + FIT_DATE_TIME start_date; // + FIT_DATE_TIME end_date; // + FIT_UINT32 value; // + FIT_UINT32 target_value; // + FIT_MESSAGE_INDEX message_index; // + FIT_UINT16 recurrence_value; // + FIT_SPORT sport; // + FIT_SUB_SPORT sub_sport; // + FIT_GOAL type; // + FIT_BOOL repeat; // + FIT_GOAL_RECURRENCE recurrence; // + FIT_BOOL enabled; // + FIT_GOAL_SOURCE source; // +} FIT_GOAL_MESG; + +typedef FIT_UINT8 FIT_GOAL_FIELD_NUM; + +#define FIT_GOAL_FIELD_NUM_START_DATE ((FIT_GOAL_FIELD_NUM)2) +#define FIT_GOAL_FIELD_NUM_END_DATE ((FIT_GOAL_FIELD_NUM)3) +#define FIT_GOAL_FIELD_NUM_VALUE ((FIT_GOAL_FIELD_NUM)5) +#define FIT_GOAL_FIELD_NUM_TARGET_VALUE ((FIT_GOAL_FIELD_NUM)7) +#define FIT_GOAL_FIELD_NUM_MESSAGE_INDEX ((FIT_GOAL_FIELD_NUM)254) +#define FIT_GOAL_FIELD_NUM_RECURRENCE_VALUE ((FIT_GOAL_FIELD_NUM)9) +#define FIT_GOAL_FIELD_NUM_SPORT ((FIT_GOAL_FIELD_NUM)0) +#define FIT_GOAL_FIELD_NUM_SUB_SPORT ((FIT_GOAL_FIELD_NUM)1) +#define FIT_GOAL_FIELD_NUM_TYPE ((FIT_GOAL_FIELD_NUM)4) +#define FIT_GOAL_FIELD_NUM_REPEAT ((FIT_GOAL_FIELD_NUM)6) +#define FIT_GOAL_FIELD_NUM_RECURRENCE ((FIT_GOAL_FIELD_NUM)8) +#define FIT_GOAL_FIELD_NUM_ENABLED ((FIT_GOAL_FIELD_NUM)10) +#define FIT_GOAL_FIELD_NUM_SOURCE ((FIT_GOAL_FIELD_NUM)11) + +typedef enum +{ + FIT_GOAL_MESG_START_DATE, + FIT_GOAL_MESG_END_DATE, + FIT_GOAL_MESG_VALUE, + FIT_GOAL_MESG_TARGET_VALUE, + FIT_GOAL_MESG_MESSAGE_INDEX, + FIT_GOAL_MESG_RECURRENCE_VALUE, + FIT_GOAL_MESG_SPORT, + FIT_GOAL_MESG_SUB_SPORT, + FIT_GOAL_MESG_TYPE, + FIT_GOAL_MESG_REPEAT, + FIT_GOAL_MESG_RECURRENCE, + FIT_GOAL_MESG_ENABLED, + FIT_GOAL_MESG_SOURCE, + FIT_GOAL_MESG_FIELDS +} FIT_GOAL_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_GOAL_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_GOAL_MESG_DEF; + +// activity message + +#define FIT_ACTIVITY_MESG_SIZE 18 +#define FIT_ACTIVITY_MESG_DEF_SIZE 29 + +typedef struct +{ + FIT_DATE_TIME timestamp; // + FIT_UINT32 total_timer_time; // 1000 * s + 0, Exclude pauses + FIT_LOCAL_DATE_TIME local_timestamp; // timestamp epoch expressed in local time, used to convert activity timestamps to local time + FIT_UINT16 num_sessions; // + FIT_ACTIVITY type; // + FIT_EVENT event; // + FIT_EVENT_TYPE event_type; // + FIT_UINT8 event_group; // +} FIT_ACTIVITY_MESG; + +typedef FIT_UINT8 FIT_ACTIVITY_FIELD_NUM; + +#define FIT_ACTIVITY_FIELD_NUM_TIMESTAMP ((FIT_ACTIVITY_FIELD_NUM)253) +#define FIT_ACTIVITY_FIELD_NUM_TOTAL_TIMER_TIME ((FIT_ACTIVITY_FIELD_NUM)0) +#define FIT_ACTIVITY_FIELD_NUM_LOCAL_TIMESTAMP ((FIT_ACTIVITY_FIELD_NUM)5) +#define FIT_ACTIVITY_FIELD_NUM_NUM_SESSIONS ((FIT_ACTIVITY_FIELD_NUM)1) +#define FIT_ACTIVITY_FIELD_NUM_TYPE ((FIT_ACTIVITY_FIELD_NUM)2) +#define FIT_ACTIVITY_FIELD_NUM_EVENT ((FIT_ACTIVITY_FIELD_NUM)3) +#define FIT_ACTIVITY_FIELD_NUM_EVENT_TYPE ((FIT_ACTIVITY_FIELD_NUM)4) +#define FIT_ACTIVITY_FIELD_NUM_EVENT_GROUP ((FIT_ACTIVITY_FIELD_NUM)6) + +typedef enum +{ + FIT_ACTIVITY_MESG_TIMESTAMP, + FIT_ACTIVITY_MESG_TOTAL_TIMER_TIME, + FIT_ACTIVITY_MESG_LOCAL_TIMESTAMP, + FIT_ACTIVITY_MESG_NUM_SESSIONS, + FIT_ACTIVITY_MESG_TYPE, + FIT_ACTIVITY_MESG_EVENT, + FIT_ACTIVITY_MESG_EVENT_TYPE, + FIT_ACTIVITY_MESG_EVENT_GROUP, + FIT_ACTIVITY_MESG_FIELDS +} FIT_ACTIVITY_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_ACTIVITY_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_ACTIVITY_MESG_DEF; + +// session message + +#define FIT_SESSION_MESG_SIZE 234 +#define FIT_SESSION_MESG_DEF_SIZE 290 +#define FIT_SESSION_MESG_TIME_IN_HR_ZONE_COUNT 1 +#define FIT_SESSION_MESG_TIME_IN_SPEED_ZONE_COUNT 1 +#define FIT_SESSION_MESG_TIME_IN_CADENCE_ZONE_COUNT 1 +#define FIT_SESSION_MESG_TIME_IN_POWER_ZONE_COUNT 1 +#define FIT_SESSION_MESG_SPORT_PROFILE_NAME_COUNT 16 +#define FIT_SESSION_MESG_STROKE_COUNT_COUNT 1 +#define FIT_SESSION_MESG_ZONE_COUNT_COUNT 1 +#define FIT_SESSION_MESG_OPPONENT_NAME_COUNT 1 + +typedef struct +{ + FIT_DATE_TIME timestamp; // 1 * s + 0, Sesson end time. + FIT_DATE_TIME start_time; // + FIT_SINT32 start_position_lat; // 1 * semicircles + 0, + FIT_SINT32 start_position_long; // 1 * semicircles + 0, + FIT_UINT32 total_elapsed_time; // 1000 * s + 0, Time (includes pauses) + FIT_UINT32 total_timer_time; // 1000 * s + 0, Timer Time (excludes pauses) + FIT_UINT32 total_distance; // 100 * m + 0, + FIT_UINT32 total_cycles; // 1 * cycles + 0, + FIT_SINT32 nec_lat; // 1 * semicircles + 0, North east corner latitude + FIT_SINT32 nec_long; // 1 * semicircles + 0, North east corner longitude + FIT_SINT32 swc_lat; // 1 * semicircles + 0, South west corner latitude + FIT_SINT32 swc_long; // 1 * semicircles + 0, South west corner longitude + FIT_SINT32 end_position_lat; // 1 * semicircles + 0, + FIT_SINT32 end_position_long; // 1 * semicircles + 0, + FIT_UINT32 avg_stroke_count; // 10 * strokes/lap + 0, + FIT_UINT32 total_work; // 1 * J + 0, + FIT_UINT32 total_moving_time; // 1000 * s + 0, + FIT_UINT32 time_in_hr_zone[FIT_SESSION_MESG_TIME_IN_HR_ZONE_COUNT]; // 1000 * s + 0, + FIT_UINT32 time_in_speed_zone[FIT_SESSION_MESG_TIME_IN_SPEED_ZONE_COUNT]; // 1000 * s + 0, + FIT_UINT32 time_in_cadence_zone[FIT_SESSION_MESG_TIME_IN_CADENCE_ZONE_COUNT]; // 1000 * s + 0, + FIT_UINT32 time_in_power_zone[FIT_SESSION_MESG_TIME_IN_POWER_ZONE_COUNT]; // 1000 * s + 0, + FIT_UINT32 avg_lap_time; // 1000 * s + 0, + FIT_STRING sport_profile_name[FIT_SESSION_MESG_SPORT_PROFILE_NAME_COUNT]; // Sport name from associated sport mesg + FIT_UINT32 enhanced_avg_speed; // 1000 * m/s + 0, total_distance / total_timer_time + FIT_UINT32 enhanced_max_speed; // 1000 * m/s + 0, + FIT_UINT32 enhanced_avg_altitude; // 5 * m + 500, + FIT_UINT32 enhanced_min_altitude; // 5 * m + 500, + FIT_UINT32 enhanced_max_altitude; // 5 * m + 500, + FIT_MESSAGE_INDEX message_index; // Selected bit is set for the current session. + FIT_UINT16 total_calories; // 1 * kcal + 0, + FIT_UINT16 total_fat_calories; // 1 * kcal + 0, + FIT_UINT16 avg_speed; // 1000 * m/s + 0, total_distance / total_timer_time + FIT_UINT16 max_speed; // 1000 * m/s + 0, + FIT_UINT16 avg_power; // 1 * watts + 0, total_power / total_timer_time if non_zero_avg_power otherwise total_power / total_elapsed_time + FIT_UINT16 max_power; // 1 * watts + 0, + FIT_UINT16 total_ascent; // 1 * m + 0, + FIT_UINT16 total_descent; // 1 * m + 0, + FIT_UINT16 first_lap_index; // + FIT_UINT16 num_laps; // + FIT_UINT16 num_lengths; // 1 * lengths + 0, # of lengths of swim pool + FIT_UINT16 normalized_power; // 1 * watts + 0, + FIT_UINT16 training_stress_score; // 10 * tss + 0, + FIT_UINT16 intensity_factor; // 1000 * if + 0, + FIT_LEFT_RIGHT_BALANCE_100 left_right_balance; // + FIT_UINT16 avg_stroke_distance; // 100 * m + 0, + FIT_UINT16 pool_length; // 100 * m + 0, + FIT_UINT16 threshold_power; // 1 * watts + 0, + FIT_UINT16 num_active_lengths; // 1 * lengths + 0, # of active lengths of swim pool + FIT_UINT16 avg_altitude; // 5 * m + 500, + FIT_UINT16 max_altitude; // 5 * m + 500, + FIT_SINT16 avg_grade; // 100 * % + 0, + FIT_SINT16 avg_pos_grade; // 100 * % + 0, + FIT_SINT16 avg_neg_grade; // 100 * % + 0, + FIT_SINT16 max_pos_grade; // 100 * % + 0, + FIT_SINT16 max_neg_grade; // 100 * % + 0, + FIT_SINT16 avg_pos_vertical_speed; // 1000 * m/s + 0, + FIT_SINT16 avg_neg_vertical_speed; // 1000 * m/s + 0, + FIT_SINT16 max_pos_vertical_speed; // 1000 * m/s + 0, + FIT_SINT16 max_neg_vertical_speed; // 1000 * m/s + 0, + FIT_UINT16 best_lap_index; // + FIT_UINT16 min_altitude; // 5 * m + 500, + FIT_UINT16 player_score; // + FIT_UINT16 opponent_score; // + FIT_UINT16 stroke_count[FIT_SESSION_MESG_STROKE_COUNT_COUNT]; // 1 * counts + 0, stroke_type enum used as the index + FIT_UINT16 zone_count[FIT_SESSION_MESG_ZONE_COUNT_COUNT]; // 1 * counts + 0, zone number used as the index + FIT_UINT16 max_ball_speed; // 100 * m/s + 0, + FIT_UINT16 avg_ball_speed; // 100 * m/s + 0, + FIT_UINT16 avg_vertical_oscillation; // 10 * mm + 0, + FIT_UINT16 avg_stance_time_percent; // 100 * percent + 0, + FIT_UINT16 avg_stance_time; // 10 * ms + 0, + FIT_UINT16 avg_vam; // 1000 * m/s + 0, + FIT_EVENT event; // session + FIT_EVENT_TYPE event_type; // stop + FIT_SPORT sport; // + FIT_SUB_SPORT sub_sport; // + FIT_UINT8 avg_heart_rate; // 1 * bpm + 0, average heart rate (excludes pause time) + FIT_UINT8 max_heart_rate; // 1 * bpm + 0, + FIT_UINT8 avg_cadence; // 1 * rpm + 0, total_cycles / total_timer_time if non_zero_avg_cadence otherwise total_cycles / total_elapsed_time + FIT_UINT8 max_cadence; // 1 * rpm + 0, + FIT_UINT8 total_training_effect; // + FIT_UINT8 event_group; // + FIT_SESSION_TRIGGER trigger; // + FIT_SWIM_STROKE swim_stroke; // 1 * swim_stroke + 0, + FIT_DISPLAY_MEASURE pool_length_unit; // + FIT_UINT8 gps_accuracy; // 1 * m + 0, + FIT_SINT8 avg_temperature; // 1 * C + 0, + FIT_SINT8 max_temperature; // 1 * C + 0, + FIT_UINT8 min_heart_rate; // 1 * bpm + 0, + FIT_STRING opponent_name[FIT_SESSION_MESG_OPPONENT_NAME_COUNT]; // + FIT_UINT8 avg_fractional_cadence; // 128 * rpm + 0, fractional part of the avg_cadence + FIT_UINT8 max_fractional_cadence; // 128 * rpm + 0, fractional part of the max_cadence + FIT_UINT8 total_fractional_cycles; // 128 * cycles + 0, fractional part of the total_cycles + FIT_UINT8 sport_index; // + FIT_UINT8 total_anaerobic_training_effect; // + FIT_SINT8 min_temperature; // 1 * C + 0, +} FIT_SESSION_MESG; + +typedef FIT_UINT8 FIT_SESSION_FIELD_NUM; + +#define FIT_SESSION_FIELD_NUM_TIMESTAMP ((FIT_SESSION_FIELD_NUM)253) +#define FIT_SESSION_FIELD_NUM_START_TIME ((FIT_SESSION_FIELD_NUM)2) +#define FIT_SESSION_FIELD_NUM_START_POSITION_LAT ((FIT_SESSION_FIELD_NUM)3) +#define FIT_SESSION_FIELD_NUM_START_POSITION_LONG ((FIT_SESSION_FIELD_NUM)4) +#define FIT_SESSION_FIELD_NUM_TOTAL_ELAPSED_TIME ((FIT_SESSION_FIELD_NUM)7) +#define FIT_SESSION_FIELD_NUM_TOTAL_TIMER_TIME ((FIT_SESSION_FIELD_NUM)8) +#define FIT_SESSION_FIELD_NUM_TOTAL_DISTANCE ((FIT_SESSION_FIELD_NUM)9) +#define FIT_SESSION_FIELD_NUM_TOTAL_CYCLES ((FIT_SESSION_FIELD_NUM)10) +#define FIT_SESSION_FIELD_NUM_NEC_LAT ((FIT_SESSION_FIELD_NUM)29) +#define FIT_SESSION_FIELD_NUM_NEC_LONG ((FIT_SESSION_FIELD_NUM)30) +#define FIT_SESSION_FIELD_NUM_SWC_LAT ((FIT_SESSION_FIELD_NUM)31) +#define FIT_SESSION_FIELD_NUM_SWC_LONG ((FIT_SESSION_FIELD_NUM)32) +#define FIT_SESSION_FIELD_NUM_END_POSITION_LAT ((FIT_SESSION_FIELD_NUM)38) +#define FIT_SESSION_FIELD_NUM_END_POSITION_LONG ((FIT_SESSION_FIELD_NUM)39) +#define FIT_SESSION_FIELD_NUM_AVG_STROKE_COUNT ((FIT_SESSION_FIELD_NUM)41) +#define FIT_SESSION_FIELD_NUM_TOTAL_WORK ((FIT_SESSION_FIELD_NUM)48) +#define FIT_SESSION_FIELD_NUM_TOTAL_MOVING_TIME ((FIT_SESSION_FIELD_NUM)59) +#define FIT_SESSION_FIELD_NUM_TIME_IN_HR_ZONE ((FIT_SESSION_FIELD_NUM)65) +#define FIT_SESSION_FIELD_NUM_TIME_IN_SPEED_ZONE ((FIT_SESSION_FIELD_NUM)66) +#define FIT_SESSION_FIELD_NUM_TIME_IN_CADENCE_ZONE ((FIT_SESSION_FIELD_NUM)67) +#define FIT_SESSION_FIELD_NUM_TIME_IN_POWER_ZONE ((FIT_SESSION_FIELD_NUM)68) +#define FIT_SESSION_FIELD_NUM_AVG_LAP_TIME ((FIT_SESSION_FIELD_NUM)69) +#define FIT_SESSION_FIELD_NUM_SPORT_PROFILE_NAME ((FIT_SESSION_FIELD_NUM)110) +#define FIT_SESSION_FIELD_NUM_ENHANCED_AVG_SPEED ((FIT_SESSION_FIELD_NUM)124) +#define FIT_SESSION_FIELD_NUM_ENHANCED_MAX_SPEED ((FIT_SESSION_FIELD_NUM)125) +#define FIT_SESSION_FIELD_NUM_ENHANCED_AVG_ALTITUDE ((FIT_SESSION_FIELD_NUM)126) +#define FIT_SESSION_FIELD_NUM_ENHANCED_MIN_ALTITUDE ((FIT_SESSION_FIELD_NUM)127) +#define FIT_SESSION_FIELD_NUM_ENHANCED_MAX_ALTITUDE ((FIT_SESSION_FIELD_NUM)128) +#define FIT_SESSION_FIELD_NUM_MESSAGE_INDEX ((FIT_SESSION_FIELD_NUM)254) +#define FIT_SESSION_FIELD_NUM_TOTAL_CALORIES ((FIT_SESSION_FIELD_NUM)11) +#define FIT_SESSION_FIELD_NUM_TOTAL_FAT_CALORIES ((FIT_SESSION_FIELD_NUM)13) +#define FIT_SESSION_FIELD_NUM_AVG_SPEED ((FIT_SESSION_FIELD_NUM)14) +#define FIT_SESSION_FIELD_NUM_MAX_SPEED ((FIT_SESSION_FIELD_NUM)15) +#define FIT_SESSION_FIELD_NUM_AVG_POWER ((FIT_SESSION_FIELD_NUM)20) +#define FIT_SESSION_FIELD_NUM_MAX_POWER ((FIT_SESSION_FIELD_NUM)21) +#define FIT_SESSION_FIELD_NUM_TOTAL_ASCENT ((FIT_SESSION_FIELD_NUM)22) +#define FIT_SESSION_FIELD_NUM_TOTAL_DESCENT ((FIT_SESSION_FIELD_NUM)23) +#define FIT_SESSION_FIELD_NUM_FIRST_LAP_INDEX ((FIT_SESSION_FIELD_NUM)25) +#define FIT_SESSION_FIELD_NUM_NUM_LAPS ((FIT_SESSION_FIELD_NUM)26) +#define FIT_SESSION_FIELD_NUM_NUM_LENGTHS ((FIT_SESSION_FIELD_NUM)33) +#define FIT_SESSION_FIELD_NUM_NORMALIZED_POWER ((FIT_SESSION_FIELD_NUM)34) +#define FIT_SESSION_FIELD_NUM_TRAINING_STRESS_SCORE ((FIT_SESSION_FIELD_NUM)35) +#define FIT_SESSION_FIELD_NUM_INTENSITY_FACTOR ((FIT_SESSION_FIELD_NUM)36) +#define FIT_SESSION_FIELD_NUM_LEFT_RIGHT_BALANCE ((FIT_SESSION_FIELD_NUM)37) +#define FIT_SESSION_FIELD_NUM_AVG_STROKE_DISTANCE ((FIT_SESSION_FIELD_NUM)42) +#define FIT_SESSION_FIELD_NUM_POOL_LENGTH ((FIT_SESSION_FIELD_NUM)44) +#define FIT_SESSION_FIELD_NUM_THRESHOLD_POWER ((FIT_SESSION_FIELD_NUM)45) +#define FIT_SESSION_FIELD_NUM_NUM_ACTIVE_LENGTHS ((FIT_SESSION_FIELD_NUM)47) +#define FIT_SESSION_FIELD_NUM_AVG_ALTITUDE ((FIT_SESSION_FIELD_NUM)49) +#define FIT_SESSION_FIELD_NUM_MAX_ALTITUDE ((FIT_SESSION_FIELD_NUM)50) +#define FIT_SESSION_FIELD_NUM_AVG_GRADE ((FIT_SESSION_FIELD_NUM)52) +#define FIT_SESSION_FIELD_NUM_AVG_POS_GRADE ((FIT_SESSION_FIELD_NUM)53) +#define FIT_SESSION_FIELD_NUM_AVG_NEG_GRADE ((FIT_SESSION_FIELD_NUM)54) +#define FIT_SESSION_FIELD_NUM_MAX_POS_GRADE ((FIT_SESSION_FIELD_NUM)55) +#define FIT_SESSION_FIELD_NUM_MAX_NEG_GRADE ((FIT_SESSION_FIELD_NUM)56) +#define FIT_SESSION_FIELD_NUM_AVG_POS_VERTICAL_SPEED ((FIT_SESSION_FIELD_NUM)60) +#define FIT_SESSION_FIELD_NUM_AVG_NEG_VERTICAL_SPEED ((FIT_SESSION_FIELD_NUM)61) +#define FIT_SESSION_FIELD_NUM_MAX_POS_VERTICAL_SPEED ((FIT_SESSION_FIELD_NUM)62) +#define FIT_SESSION_FIELD_NUM_MAX_NEG_VERTICAL_SPEED ((FIT_SESSION_FIELD_NUM)63) +#define FIT_SESSION_FIELD_NUM_BEST_LAP_INDEX ((FIT_SESSION_FIELD_NUM)70) +#define FIT_SESSION_FIELD_NUM_MIN_ALTITUDE ((FIT_SESSION_FIELD_NUM)71) +#define FIT_SESSION_FIELD_NUM_PLAYER_SCORE ((FIT_SESSION_FIELD_NUM)82) +#define FIT_SESSION_FIELD_NUM_OPPONENT_SCORE ((FIT_SESSION_FIELD_NUM)83) +#define FIT_SESSION_FIELD_NUM_STROKE_COUNT ((FIT_SESSION_FIELD_NUM)85) +#define FIT_SESSION_FIELD_NUM_ZONE_COUNT ((FIT_SESSION_FIELD_NUM)86) +#define FIT_SESSION_FIELD_NUM_MAX_BALL_SPEED ((FIT_SESSION_FIELD_NUM)87) +#define FIT_SESSION_FIELD_NUM_AVG_BALL_SPEED ((FIT_SESSION_FIELD_NUM)88) +#define FIT_SESSION_FIELD_NUM_AVG_VERTICAL_OSCILLATION ((FIT_SESSION_FIELD_NUM)89) +#define FIT_SESSION_FIELD_NUM_AVG_STANCE_TIME_PERCENT ((FIT_SESSION_FIELD_NUM)90) +#define FIT_SESSION_FIELD_NUM_AVG_STANCE_TIME ((FIT_SESSION_FIELD_NUM)91) +#define FIT_SESSION_FIELD_NUM_AVG_VAM ((FIT_SESSION_FIELD_NUM)139) +#define FIT_SESSION_FIELD_NUM_EVENT ((FIT_SESSION_FIELD_NUM)0) +#define FIT_SESSION_FIELD_NUM_EVENT_TYPE ((FIT_SESSION_FIELD_NUM)1) +#define FIT_SESSION_FIELD_NUM_SPORT ((FIT_SESSION_FIELD_NUM)5) +#define FIT_SESSION_FIELD_NUM_SUB_SPORT ((FIT_SESSION_FIELD_NUM)6) +#define FIT_SESSION_FIELD_NUM_AVG_HEART_RATE ((FIT_SESSION_FIELD_NUM)16) +#define FIT_SESSION_FIELD_NUM_MAX_HEART_RATE ((FIT_SESSION_FIELD_NUM)17) +#define FIT_SESSION_FIELD_NUM_AVG_CADENCE ((FIT_SESSION_FIELD_NUM)18) +#define FIT_SESSION_FIELD_NUM_MAX_CADENCE ((FIT_SESSION_FIELD_NUM)19) +#define FIT_SESSION_FIELD_NUM_TOTAL_TRAINING_EFFECT ((FIT_SESSION_FIELD_NUM)24) +#define FIT_SESSION_FIELD_NUM_EVENT_GROUP ((FIT_SESSION_FIELD_NUM)27) +#define FIT_SESSION_FIELD_NUM_TRIGGER ((FIT_SESSION_FIELD_NUM)28) +#define FIT_SESSION_FIELD_NUM_SWIM_STROKE ((FIT_SESSION_FIELD_NUM)43) +#define FIT_SESSION_FIELD_NUM_POOL_LENGTH_UNIT ((FIT_SESSION_FIELD_NUM)46) +#define FIT_SESSION_FIELD_NUM_GPS_ACCURACY ((FIT_SESSION_FIELD_NUM)51) +#define FIT_SESSION_FIELD_NUM_AVG_TEMPERATURE ((FIT_SESSION_FIELD_NUM)57) +#define FIT_SESSION_FIELD_NUM_MAX_TEMPERATURE ((FIT_SESSION_FIELD_NUM)58) +#define FIT_SESSION_FIELD_NUM_MIN_HEART_RATE ((FIT_SESSION_FIELD_NUM)64) +#define FIT_SESSION_FIELD_NUM_OPPONENT_NAME ((FIT_SESSION_FIELD_NUM)84) +#define FIT_SESSION_FIELD_NUM_AVG_FRACTIONAL_CADENCE ((FIT_SESSION_FIELD_NUM)92) +#define FIT_SESSION_FIELD_NUM_MAX_FRACTIONAL_CADENCE ((FIT_SESSION_FIELD_NUM)93) +#define FIT_SESSION_FIELD_NUM_TOTAL_FRACTIONAL_CYCLES ((FIT_SESSION_FIELD_NUM)94) +#define FIT_SESSION_FIELD_NUM_SPORT_INDEX ((FIT_SESSION_FIELD_NUM)111) +#define FIT_SESSION_FIELD_NUM_TOTAL_ANAEROBIC_TRAINING_EFFECT ((FIT_SESSION_FIELD_NUM)137) +#define FIT_SESSION_FIELD_NUM_MIN_TEMPERATURE ((FIT_SESSION_FIELD_NUM)150) + +typedef enum +{ + FIT_SESSION_MESG_TIMESTAMP, + FIT_SESSION_MESG_START_TIME, + FIT_SESSION_MESG_START_POSITION_LAT, + FIT_SESSION_MESG_START_POSITION_LONG, + FIT_SESSION_MESG_TOTAL_ELAPSED_TIME, + FIT_SESSION_MESG_TOTAL_TIMER_TIME, + FIT_SESSION_MESG_TOTAL_DISTANCE, + FIT_SESSION_MESG_TOTAL_CYCLES, + FIT_SESSION_MESG_NEC_LAT, + FIT_SESSION_MESG_NEC_LONG, + FIT_SESSION_MESG_SWC_LAT, + FIT_SESSION_MESG_SWC_LONG, + FIT_SESSION_MESG_END_POSITION_LAT, + FIT_SESSION_MESG_END_POSITION_LONG, + FIT_SESSION_MESG_AVG_STROKE_COUNT, + FIT_SESSION_MESG_TOTAL_WORK, + FIT_SESSION_MESG_TOTAL_MOVING_TIME, + FIT_SESSION_MESG_TIME_IN_HR_ZONE, + FIT_SESSION_MESG_TIME_IN_SPEED_ZONE, + FIT_SESSION_MESG_TIME_IN_CADENCE_ZONE, + FIT_SESSION_MESG_TIME_IN_POWER_ZONE, + FIT_SESSION_MESG_AVG_LAP_TIME, + FIT_SESSION_MESG_SPORT_PROFILE_NAME, + FIT_SESSION_MESG_ENHANCED_AVG_SPEED, + FIT_SESSION_MESG_ENHANCED_MAX_SPEED, + FIT_SESSION_MESG_ENHANCED_AVG_ALTITUDE, + FIT_SESSION_MESG_ENHANCED_MIN_ALTITUDE, + FIT_SESSION_MESG_ENHANCED_MAX_ALTITUDE, + FIT_SESSION_MESG_MESSAGE_INDEX, + FIT_SESSION_MESG_TOTAL_CALORIES, + FIT_SESSION_MESG_TOTAL_FAT_CALORIES, + FIT_SESSION_MESG_AVG_SPEED, + FIT_SESSION_MESG_MAX_SPEED, + FIT_SESSION_MESG_AVG_POWER, + FIT_SESSION_MESG_MAX_POWER, + FIT_SESSION_MESG_TOTAL_ASCENT, + FIT_SESSION_MESG_TOTAL_DESCENT, + FIT_SESSION_MESG_FIRST_LAP_INDEX, + FIT_SESSION_MESG_NUM_LAPS, + FIT_SESSION_MESG_NUM_LENGTHS, + FIT_SESSION_MESG_NORMALIZED_POWER, + FIT_SESSION_MESG_TRAINING_STRESS_SCORE, + FIT_SESSION_MESG_INTENSITY_FACTOR, + FIT_SESSION_MESG_LEFT_RIGHT_BALANCE, + FIT_SESSION_MESG_AVG_STROKE_DISTANCE, + FIT_SESSION_MESG_POOL_LENGTH, + FIT_SESSION_MESG_THRESHOLD_POWER, + FIT_SESSION_MESG_NUM_ACTIVE_LENGTHS, + FIT_SESSION_MESG_AVG_ALTITUDE, + FIT_SESSION_MESG_MAX_ALTITUDE, + FIT_SESSION_MESG_AVG_GRADE, + FIT_SESSION_MESG_AVG_POS_GRADE, + FIT_SESSION_MESG_AVG_NEG_GRADE, + FIT_SESSION_MESG_MAX_POS_GRADE, + FIT_SESSION_MESG_MAX_NEG_GRADE, + FIT_SESSION_MESG_AVG_POS_VERTICAL_SPEED, + FIT_SESSION_MESG_AVG_NEG_VERTICAL_SPEED, + FIT_SESSION_MESG_MAX_POS_VERTICAL_SPEED, + FIT_SESSION_MESG_MAX_NEG_VERTICAL_SPEED, + FIT_SESSION_MESG_BEST_LAP_INDEX, + FIT_SESSION_MESG_MIN_ALTITUDE, + FIT_SESSION_MESG_PLAYER_SCORE, + FIT_SESSION_MESG_OPPONENT_SCORE, + FIT_SESSION_MESG_STROKE_COUNT, + FIT_SESSION_MESG_ZONE_COUNT, + FIT_SESSION_MESG_MAX_BALL_SPEED, + FIT_SESSION_MESG_AVG_BALL_SPEED, + FIT_SESSION_MESG_AVG_VERTICAL_OSCILLATION, + FIT_SESSION_MESG_AVG_STANCE_TIME_PERCENT, + FIT_SESSION_MESG_AVG_STANCE_TIME, + FIT_SESSION_MESG_AVG_VAM, + FIT_SESSION_MESG_EVENT, + FIT_SESSION_MESG_EVENT_TYPE, + FIT_SESSION_MESG_SPORT, + FIT_SESSION_MESG_SUB_SPORT, + FIT_SESSION_MESG_AVG_HEART_RATE, + FIT_SESSION_MESG_MAX_HEART_RATE, + FIT_SESSION_MESG_AVG_CADENCE, + FIT_SESSION_MESG_MAX_CADENCE, + FIT_SESSION_MESG_TOTAL_TRAINING_EFFECT, + FIT_SESSION_MESG_EVENT_GROUP, + FIT_SESSION_MESG_TRIGGER, + FIT_SESSION_MESG_SWIM_STROKE, + FIT_SESSION_MESG_POOL_LENGTH_UNIT, + FIT_SESSION_MESG_GPS_ACCURACY, + FIT_SESSION_MESG_AVG_TEMPERATURE, + FIT_SESSION_MESG_MAX_TEMPERATURE, + FIT_SESSION_MESG_MIN_HEART_RATE, + FIT_SESSION_MESG_OPPONENT_NAME, + FIT_SESSION_MESG_AVG_FRACTIONAL_CADENCE, + FIT_SESSION_MESG_MAX_FRACTIONAL_CADENCE, + FIT_SESSION_MESG_TOTAL_FRACTIONAL_CYCLES, + FIT_SESSION_MESG_SPORT_INDEX, + FIT_SESSION_MESG_TOTAL_ANAEROBIC_TRAINING_EFFECT, + FIT_SESSION_MESG_MIN_TEMPERATURE, + FIT_SESSION_MESG_FIELDS +} FIT_SESSION_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_SESSION_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_SESSION_MESG_DEF; + +// lap message + +#define FIT_LAP_MESG_SIZE 190 +#define FIT_LAP_MESG_DEF_SIZE 257 +#define FIT_LAP_MESG_TIME_IN_HR_ZONE_COUNT 1 +#define FIT_LAP_MESG_TIME_IN_SPEED_ZONE_COUNT 1 +#define FIT_LAP_MESG_TIME_IN_CADENCE_ZONE_COUNT 1 +#define FIT_LAP_MESG_TIME_IN_POWER_ZONE_COUNT 1 +#define FIT_LAP_MESG_STROKE_COUNT_COUNT 1 +#define FIT_LAP_MESG_ZONE_COUNT_COUNT 1 +#define FIT_LAP_MESG_AVG_TOTAL_HEMOGLOBIN_CONC_COUNT 1 +#define FIT_LAP_MESG_MIN_TOTAL_HEMOGLOBIN_CONC_COUNT 1 +#define FIT_LAP_MESG_MAX_TOTAL_HEMOGLOBIN_CONC_COUNT 1 +#define FIT_LAP_MESG_AVG_SATURATED_HEMOGLOBIN_PERCENT_COUNT 1 +#define FIT_LAP_MESG_MIN_SATURATED_HEMOGLOBIN_PERCENT_COUNT 1 +#define FIT_LAP_MESG_MAX_SATURATED_HEMOGLOBIN_PERCENT_COUNT 1 + +typedef struct +{ + FIT_DATE_TIME timestamp; // 1 * s + 0, Lap end time. + FIT_DATE_TIME start_time; // + FIT_SINT32 start_position_lat; // 1 * semicircles + 0, + FIT_SINT32 start_position_long; // 1 * semicircles + 0, + FIT_SINT32 end_position_lat; // 1 * semicircles + 0, + FIT_SINT32 end_position_long; // 1 * semicircles + 0, + FIT_UINT32 total_elapsed_time; // 1000 * s + 0, Time (includes pauses) + FIT_UINT32 total_timer_time; // 1000 * s + 0, Timer Time (excludes pauses) + FIT_UINT32 total_distance; // 100 * m + 0, + FIT_UINT32 total_cycles; // 1 * cycles + 0, + FIT_UINT32 total_work; // 1 * J + 0, + FIT_UINT32 total_moving_time; // 1000 * s + 0, + FIT_UINT32 time_in_hr_zone[FIT_LAP_MESG_TIME_IN_HR_ZONE_COUNT]; // 1000 * s + 0, + FIT_UINT32 time_in_speed_zone[FIT_LAP_MESG_TIME_IN_SPEED_ZONE_COUNT]; // 1000 * s + 0, + FIT_UINT32 time_in_cadence_zone[FIT_LAP_MESG_TIME_IN_CADENCE_ZONE_COUNT]; // 1000 * s + 0, + FIT_UINT32 time_in_power_zone[FIT_LAP_MESG_TIME_IN_POWER_ZONE_COUNT]; // 1000 * s + 0, + FIT_UINT32 enhanced_avg_speed; // 1000 * m/s + 0, + FIT_UINT32 enhanced_max_speed; // 1000 * m/s + 0, + FIT_UINT32 enhanced_avg_altitude; // 5 * m + 500, + FIT_UINT32 enhanced_min_altitude; // 5 * m + 500, + FIT_UINT32 enhanced_max_altitude; // 5 * m + 500, + FIT_MESSAGE_INDEX message_index; // + FIT_UINT16 total_calories; // 1 * kcal + 0, + FIT_UINT16 total_fat_calories; // 1 * kcal + 0, If New Leaf + FIT_UINT16 avg_speed; // 1000 * m/s + 0, + FIT_UINT16 max_speed; // 1000 * m/s + 0, + FIT_UINT16 avg_power; // 1 * watts + 0, total_power / total_timer_time if non_zero_avg_power otherwise total_power / total_elapsed_time + FIT_UINT16 max_power; // 1 * watts + 0, + FIT_UINT16 total_ascent; // 1 * m + 0, + FIT_UINT16 total_descent; // 1 * m + 0, + FIT_UINT16 num_lengths; // 1 * lengths + 0, # of lengths of swim pool + FIT_UINT16 normalized_power; // 1 * watts + 0, + FIT_LEFT_RIGHT_BALANCE_100 left_right_balance; // + FIT_UINT16 first_length_index; // + FIT_UINT16 avg_stroke_distance; // 100 * m + 0, + FIT_UINT16 num_active_lengths; // 1 * lengths + 0, # of active lengths of swim pool + FIT_UINT16 avg_altitude; // 5 * m + 500, + FIT_UINT16 max_altitude; // 5 * m + 500, + FIT_SINT16 avg_grade; // 100 * % + 0, + FIT_SINT16 avg_pos_grade; // 100 * % + 0, + FIT_SINT16 avg_neg_grade; // 100 * % + 0, + FIT_SINT16 max_pos_grade; // 100 * % + 0, + FIT_SINT16 max_neg_grade; // 100 * % + 0, + FIT_SINT16 avg_pos_vertical_speed; // 1000 * m/s + 0, + FIT_SINT16 avg_neg_vertical_speed; // 1000 * m/s + 0, + FIT_SINT16 max_pos_vertical_speed; // 1000 * m/s + 0, + FIT_SINT16 max_neg_vertical_speed; // 1000 * m/s + 0, + FIT_UINT16 repetition_num; // + FIT_UINT16 min_altitude; // 5 * m + 500, + FIT_MESSAGE_INDEX wkt_step_index; // + FIT_UINT16 opponent_score; // + FIT_UINT16 stroke_count[FIT_LAP_MESG_STROKE_COUNT_COUNT]; // 1 * counts + 0, stroke_type enum used as the index + FIT_UINT16 zone_count[FIT_LAP_MESG_ZONE_COUNT_COUNT]; // 1 * counts + 0, zone number used as the index + FIT_UINT16 avg_vertical_oscillation; // 10 * mm + 0, + FIT_UINT16 avg_stance_time_percent; // 100 * percent + 0, + FIT_UINT16 avg_stance_time; // 10 * ms + 0, + FIT_UINT16 player_score; // + FIT_UINT16 avg_total_hemoglobin_conc[FIT_LAP_MESG_AVG_TOTAL_HEMOGLOBIN_CONC_COUNT]; // 100 * g/dL + 0, Avg saturated and unsaturated hemoglobin + FIT_UINT16 min_total_hemoglobin_conc[FIT_LAP_MESG_MIN_TOTAL_HEMOGLOBIN_CONC_COUNT]; // 100 * g/dL + 0, Min saturated and unsaturated hemoglobin + FIT_UINT16 max_total_hemoglobin_conc[FIT_LAP_MESG_MAX_TOTAL_HEMOGLOBIN_CONC_COUNT]; // 100 * g/dL + 0, Max saturated and unsaturated hemoglobin + FIT_UINT16 avg_saturated_hemoglobin_percent[FIT_LAP_MESG_AVG_SATURATED_HEMOGLOBIN_PERCENT_COUNT]; // 10 * % + 0, Avg percentage of hemoglobin saturated with oxygen + FIT_UINT16 min_saturated_hemoglobin_percent[FIT_LAP_MESG_MIN_SATURATED_HEMOGLOBIN_PERCENT_COUNT]; // 10 * % + 0, Min percentage of hemoglobin saturated with oxygen + FIT_UINT16 max_saturated_hemoglobin_percent[FIT_LAP_MESG_MAX_SATURATED_HEMOGLOBIN_PERCENT_COUNT]; // 10 * % + 0, Max percentage of hemoglobin saturated with oxygen + FIT_UINT16 avg_vam; // 1000 * m/s + 0, + FIT_EVENT event; // + FIT_EVENT_TYPE event_type; // + FIT_UINT8 avg_heart_rate; // 1 * bpm + 0, + FIT_UINT8 max_heart_rate; // 1 * bpm + 0, + FIT_UINT8 avg_cadence; // 1 * rpm + 0, total_cycles / total_timer_time if non_zero_avg_cadence otherwise total_cycles / total_elapsed_time + FIT_UINT8 max_cadence; // 1 * rpm + 0, + FIT_INTENSITY intensity; // + FIT_LAP_TRIGGER lap_trigger; // + FIT_SPORT sport; // + FIT_UINT8 event_group; // + FIT_SWIM_STROKE swim_stroke; // + FIT_SUB_SPORT sub_sport; // + FIT_UINT8 gps_accuracy; // 1 * m + 0, + FIT_SINT8 avg_temperature; // 1 * C + 0, + FIT_SINT8 max_temperature; // 1 * C + 0, + FIT_UINT8 min_heart_rate; // 1 * bpm + 0, + FIT_UINT8 avg_fractional_cadence; // 128 * rpm + 0, fractional part of the avg_cadence + FIT_UINT8 max_fractional_cadence; // 128 * rpm + 0, fractional part of the max_cadence + FIT_UINT8 total_fractional_cycles; // 128 * cycles + 0, fractional part of the total_cycles + FIT_SINT8 min_temperature; // 1 * C + 0, +} FIT_LAP_MESG; + +typedef FIT_UINT8 FIT_LAP_FIELD_NUM; + +#define FIT_LAP_FIELD_NUM_TIMESTAMP ((FIT_LAP_FIELD_NUM)253) +#define FIT_LAP_FIELD_NUM_START_TIME ((FIT_LAP_FIELD_NUM)2) +#define FIT_LAP_FIELD_NUM_START_POSITION_LAT ((FIT_LAP_FIELD_NUM)3) +#define FIT_LAP_FIELD_NUM_START_POSITION_LONG ((FIT_LAP_FIELD_NUM)4) +#define FIT_LAP_FIELD_NUM_END_POSITION_LAT ((FIT_LAP_FIELD_NUM)5) +#define FIT_LAP_FIELD_NUM_END_POSITION_LONG ((FIT_LAP_FIELD_NUM)6) +#define FIT_LAP_FIELD_NUM_TOTAL_ELAPSED_TIME ((FIT_LAP_FIELD_NUM)7) +#define FIT_LAP_FIELD_NUM_TOTAL_TIMER_TIME ((FIT_LAP_FIELD_NUM)8) +#define FIT_LAP_FIELD_NUM_TOTAL_DISTANCE ((FIT_LAP_FIELD_NUM)9) +#define FIT_LAP_FIELD_NUM_TOTAL_CYCLES ((FIT_LAP_FIELD_NUM)10) +#define FIT_LAP_FIELD_NUM_TOTAL_WORK ((FIT_LAP_FIELD_NUM)41) +#define FIT_LAP_FIELD_NUM_TOTAL_MOVING_TIME ((FIT_LAP_FIELD_NUM)52) +#define FIT_LAP_FIELD_NUM_TIME_IN_HR_ZONE ((FIT_LAP_FIELD_NUM)57) +#define FIT_LAP_FIELD_NUM_TIME_IN_SPEED_ZONE ((FIT_LAP_FIELD_NUM)58) +#define FIT_LAP_FIELD_NUM_TIME_IN_CADENCE_ZONE ((FIT_LAP_FIELD_NUM)59) +#define FIT_LAP_FIELD_NUM_TIME_IN_POWER_ZONE ((FIT_LAP_FIELD_NUM)60) +#define FIT_LAP_FIELD_NUM_ENHANCED_AVG_SPEED ((FIT_LAP_FIELD_NUM)110) +#define FIT_LAP_FIELD_NUM_ENHANCED_MAX_SPEED ((FIT_LAP_FIELD_NUM)111) +#define FIT_LAP_FIELD_NUM_ENHANCED_AVG_ALTITUDE ((FIT_LAP_FIELD_NUM)112) +#define FIT_LAP_FIELD_NUM_ENHANCED_MIN_ALTITUDE ((FIT_LAP_FIELD_NUM)113) +#define FIT_LAP_FIELD_NUM_ENHANCED_MAX_ALTITUDE ((FIT_LAP_FIELD_NUM)114) +#define FIT_LAP_FIELD_NUM_MESSAGE_INDEX ((FIT_LAP_FIELD_NUM)254) +#define FIT_LAP_FIELD_NUM_TOTAL_CALORIES ((FIT_LAP_FIELD_NUM)11) +#define FIT_LAP_FIELD_NUM_TOTAL_FAT_CALORIES ((FIT_LAP_FIELD_NUM)12) +#define FIT_LAP_FIELD_NUM_AVG_SPEED ((FIT_LAP_FIELD_NUM)13) +#define FIT_LAP_FIELD_NUM_MAX_SPEED ((FIT_LAP_FIELD_NUM)14) +#define FIT_LAP_FIELD_NUM_AVG_POWER ((FIT_LAP_FIELD_NUM)19) +#define FIT_LAP_FIELD_NUM_MAX_POWER ((FIT_LAP_FIELD_NUM)20) +#define FIT_LAP_FIELD_NUM_TOTAL_ASCENT ((FIT_LAP_FIELD_NUM)21) +#define FIT_LAP_FIELD_NUM_TOTAL_DESCENT ((FIT_LAP_FIELD_NUM)22) +#define FIT_LAP_FIELD_NUM_NUM_LENGTHS ((FIT_LAP_FIELD_NUM)32) +#define FIT_LAP_FIELD_NUM_NORMALIZED_POWER ((FIT_LAP_FIELD_NUM)33) +#define FIT_LAP_FIELD_NUM_LEFT_RIGHT_BALANCE ((FIT_LAP_FIELD_NUM)34) +#define FIT_LAP_FIELD_NUM_FIRST_LENGTH_INDEX ((FIT_LAP_FIELD_NUM)35) +#define FIT_LAP_FIELD_NUM_AVG_STROKE_DISTANCE ((FIT_LAP_FIELD_NUM)37) +#define FIT_LAP_FIELD_NUM_NUM_ACTIVE_LENGTHS ((FIT_LAP_FIELD_NUM)40) +#define FIT_LAP_FIELD_NUM_AVG_ALTITUDE ((FIT_LAP_FIELD_NUM)42) +#define FIT_LAP_FIELD_NUM_MAX_ALTITUDE ((FIT_LAP_FIELD_NUM)43) +#define FIT_LAP_FIELD_NUM_AVG_GRADE ((FIT_LAP_FIELD_NUM)45) +#define FIT_LAP_FIELD_NUM_AVG_POS_GRADE ((FIT_LAP_FIELD_NUM)46) +#define FIT_LAP_FIELD_NUM_AVG_NEG_GRADE ((FIT_LAP_FIELD_NUM)47) +#define FIT_LAP_FIELD_NUM_MAX_POS_GRADE ((FIT_LAP_FIELD_NUM)48) +#define FIT_LAP_FIELD_NUM_MAX_NEG_GRADE ((FIT_LAP_FIELD_NUM)49) +#define FIT_LAP_FIELD_NUM_AVG_POS_VERTICAL_SPEED ((FIT_LAP_FIELD_NUM)53) +#define FIT_LAP_FIELD_NUM_AVG_NEG_VERTICAL_SPEED ((FIT_LAP_FIELD_NUM)54) +#define FIT_LAP_FIELD_NUM_MAX_POS_VERTICAL_SPEED ((FIT_LAP_FIELD_NUM)55) +#define FIT_LAP_FIELD_NUM_MAX_NEG_VERTICAL_SPEED ((FIT_LAP_FIELD_NUM)56) +#define FIT_LAP_FIELD_NUM_REPETITION_NUM ((FIT_LAP_FIELD_NUM)61) +#define FIT_LAP_FIELD_NUM_MIN_ALTITUDE ((FIT_LAP_FIELD_NUM)62) +#define FIT_LAP_FIELD_NUM_WKT_STEP_INDEX ((FIT_LAP_FIELD_NUM)71) +#define FIT_LAP_FIELD_NUM_OPPONENT_SCORE ((FIT_LAP_FIELD_NUM)74) +#define FIT_LAP_FIELD_NUM_STROKE_COUNT ((FIT_LAP_FIELD_NUM)75) +#define FIT_LAP_FIELD_NUM_ZONE_COUNT ((FIT_LAP_FIELD_NUM)76) +#define FIT_LAP_FIELD_NUM_AVG_VERTICAL_OSCILLATION ((FIT_LAP_FIELD_NUM)77) +#define FIT_LAP_FIELD_NUM_AVG_STANCE_TIME_PERCENT ((FIT_LAP_FIELD_NUM)78) +#define FIT_LAP_FIELD_NUM_AVG_STANCE_TIME ((FIT_LAP_FIELD_NUM)79) +#define FIT_LAP_FIELD_NUM_PLAYER_SCORE ((FIT_LAP_FIELD_NUM)83) +#define FIT_LAP_FIELD_NUM_AVG_TOTAL_HEMOGLOBIN_CONC ((FIT_LAP_FIELD_NUM)84) +#define FIT_LAP_FIELD_NUM_MIN_TOTAL_HEMOGLOBIN_CONC ((FIT_LAP_FIELD_NUM)85) +#define FIT_LAP_FIELD_NUM_MAX_TOTAL_HEMOGLOBIN_CONC ((FIT_LAP_FIELD_NUM)86) +#define FIT_LAP_FIELD_NUM_AVG_SATURATED_HEMOGLOBIN_PERCENT ((FIT_LAP_FIELD_NUM)87) +#define FIT_LAP_FIELD_NUM_MIN_SATURATED_HEMOGLOBIN_PERCENT ((FIT_LAP_FIELD_NUM)88) +#define FIT_LAP_FIELD_NUM_MAX_SATURATED_HEMOGLOBIN_PERCENT ((FIT_LAP_FIELD_NUM)89) +#define FIT_LAP_FIELD_NUM_AVG_VAM ((FIT_LAP_FIELD_NUM)121) +#define FIT_LAP_FIELD_NUM_EVENT ((FIT_LAP_FIELD_NUM)0) +#define FIT_LAP_FIELD_NUM_EVENT_TYPE ((FIT_LAP_FIELD_NUM)1) +#define FIT_LAP_FIELD_NUM_AVG_HEART_RATE ((FIT_LAP_FIELD_NUM)15) +#define FIT_LAP_FIELD_NUM_MAX_HEART_RATE ((FIT_LAP_FIELD_NUM)16) +#define FIT_LAP_FIELD_NUM_AVG_CADENCE ((FIT_LAP_FIELD_NUM)17) +#define FIT_LAP_FIELD_NUM_MAX_CADENCE ((FIT_LAP_FIELD_NUM)18) +#define FIT_LAP_FIELD_NUM_INTENSITY ((FIT_LAP_FIELD_NUM)23) +#define FIT_LAP_FIELD_NUM_LAP_TRIGGER ((FIT_LAP_FIELD_NUM)24) +#define FIT_LAP_FIELD_NUM_SPORT ((FIT_LAP_FIELD_NUM)25) +#define FIT_LAP_FIELD_NUM_EVENT_GROUP ((FIT_LAP_FIELD_NUM)26) +#define FIT_LAP_FIELD_NUM_SWIM_STROKE ((FIT_LAP_FIELD_NUM)38) +#define FIT_LAP_FIELD_NUM_SUB_SPORT ((FIT_LAP_FIELD_NUM)39) +#define FIT_LAP_FIELD_NUM_GPS_ACCURACY ((FIT_LAP_FIELD_NUM)44) +#define FIT_LAP_FIELD_NUM_AVG_TEMPERATURE ((FIT_LAP_FIELD_NUM)50) +#define FIT_LAP_FIELD_NUM_MAX_TEMPERATURE ((FIT_LAP_FIELD_NUM)51) +#define FIT_LAP_FIELD_NUM_MIN_HEART_RATE ((FIT_LAP_FIELD_NUM)63) +#define FIT_LAP_FIELD_NUM_AVG_FRACTIONAL_CADENCE ((FIT_LAP_FIELD_NUM)80) +#define FIT_LAP_FIELD_NUM_MAX_FRACTIONAL_CADENCE ((FIT_LAP_FIELD_NUM)81) +#define FIT_LAP_FIELD_NUM_TOTAL_FRACTIONAL_CYCLES ((FIT_LAP_FIELD_NUM)82) +#define FIT_LAP_FIELD_NUM_MIN_TEMPERATURE ((FIT_LAP_FIELD_NUM)124) + +typedef enum +{ + FIT_LAP_MESG_TIMESTAMP, + FIT_LAP_MESG_START_TIME, + FIT_LAP_MESG_START_POSITION_LAT, + FIT_LAP_MESG_START_POSITION_LONG, + FIT_LAP_MESG_END_POSITION_LAT, + FIT_LAP_MESG_END_POSITION_LONG, + FIT_LAP_MESG_TOTAL_ELAPSED_TIME, + FIT_LAP_MESG_TOTAL_TIMER_TIME, + FIT_LAP_MESG_TOTAL_DISTANCE, + FIT_LAP_MESG_TOTAL_CYCLES, + FIT_LAP_MESG_TOTAL_WORK, + FIT_LAP_MESG_TOTAL_MOVING_TIME, + FIT_LAP_MESG_TIME_IN_HR_ZONE, + FIT_LAP_MESG_TIME_IN_SPEED_ZONE, + FIT_LAP_MESG_TIME_IN_CADENCE_ZONE, + FIT_LAP_MESG_TIME_IN_POWER_ZONE, + FIT_LAP_MESG_ENHANCED_AVG_SPEED, + FIT_LAP_MESG_ENHANCED_MAX_SPEED, + FIT_LAP_MESG_ENHANCED_AVG_ALTITUDE, + FIT_LAP_MESG_ENHANCED_MIN_ALTITUDE, + FIT_LAP_MESG_ENHANCED_MAX_ALTITUDE, + FIT_LAP_MESG_MESSAGE_INDEX, + FIT_LAP_MESG_TOTAL_CALORIES, + FIT_LAP_MESG_TOTAL_FAT_CALORIES, + FIT_LAP_MESG_AVG_SPEED, + FIT_LAP_MESG_MAX_SPEED, + FIT_LAP_MESG_AVG_POWER, + FIT_LAP_MESG_MAX_POWER, + FIT_LAP_MESG_TOTAL_ASCENT, + FIT_LAP_MESG_TOTAL_DESCENT, + FIT_LAP_MESG_NUM_LENGTHS, + FIT_LAP_MESG_NORMALIZED_POWER, + FIT_LAP_MESG_LEFT_RIGHT_BALANCE, + FIT_LAP_MESG_FIRST_LENGTH_INDEX, + FIT_LAP_MESG_AVG_STROKE_DISTANCE, + FIT_LAP_MESG_NUM_ACTIVE_LENGTHS, + FIT_LAP_MESG_AVG_ALTITUDE, + FIT_LAP_MESG_MAX_ALTITUDE, + FIT_LAP_MESG_AVG_GRADE, + FIT_LAP_MESG_AVG_POS_GRADE, + FIT_LAP_MESG_AVG_NEG_GRADE, + FIT_LAP_MESG_MAX_POS_GRADE, + FIT_LAP_MESG_MAX_NEG_GRADE, + FIT_LAP_MESG_AVG_POS_VERTICAL_SPEED, + FIT_LAP_MESG_AVG_NEG_VERTICAL_SPEED, + FIT_LAP_MESG_MAX_POS_VERTICAL_SPEED, + FIT_LAP_MESG_MAX_NEG_VERTICAL_SPEED, + FIT_LAP_MESG_REPETITION_NUM, + FIT_LAP_MESG_MIN_ALTITUDE, + FIT_LAP_MESG_WKT_STEP_INDEX, + FIT_LAP_MESG_OPPONENT_SCORE, + FIT_LAP_MESG_STROKE_COUNT, + FIT_LAP_MESG_ZONE_COUNT, + FIT_LAP_MESG_AVG_VERTICAL_OSCILLATION, + FIT_LAP_MESG_AVG_STANCE_TIME_PERCENT, + FIT_LAP_MESG_AVG_STANCE_TIME, + FIT_LAP_MESG_PLAYER_SCORE, + FIT_LAP_MESG_AVG_TOTAL_HEMOGLOBIN_CONC, + FIT_LAP_MESG_MIN_TOTAL_HEMOGLOBIN_CONC, + FIT_LAP_MESG_MAX_TOTAL_HEMOGLOBIN_CONC, + FIT_LAP_MESG_AVG_SATURATED_HEMOGLOBIN_PERCENT, + FIT_LAP_MESG_MIN_SATURATED_HEMOGLOBIN_PERCENT, + FIT_LAP_MESG_MAX_SATURATED_HEMOGLOBIN_PERCENT, + FIT_LAP_MESG_AVG_VAM, + FIT_LAP_MESG_EVENT, + FIT_LAP_MESG_EVENT_TYPE, + FIT_LAP_MESG_AVG_HEART_RATE, + FIT_LAP_MESG_MAX_HEART_RATE, + FIT_LAP_MESG_AVG_CADENCE, + FIT_LAP_MESG_MAX_CADENCE, + FIT_LAP_MESG_INTENSITY, + FIT_LAP_MESG_LAP_TRIGGER, + FIT_LAP_MESG_SPORT, + FIT_LAP_MESG_EVENT_GROUP, + FIT_LAP_MESG_SWIM_STROKE, + FIT_LAP_MESG_SUB_SPORT, + FIT_LAP_MESG_GPS_ACCURACY, + FIT_LAP_MESG_AVG_TEMPERATURE, + FIT_LAP_MESG_MAX_TEMPERATURE, + FIT_LAP_MESG_MIN_HEART_RATE, + FIT_LAP_MESG_AVG_FRACTIONAL_CADENCE, + FIT_LAP_MESG_MAX_FRACTIONAL_CADENCE, + FIT_LAP_MESG_TOTAL_FRACTIONAL_CYCLES, + FIT_LAP_MESG_MIN_TEMPERATURE, + FIT_LAP_MESG_FIELDS +} FIT_LAP_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_LAP_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_LAP_MESG_DEF; + +// length message + +#define FIT_LENGTH_MESG_SIZE 38 +#define FIT_LENGTH_MESG_DEF_SIZE 59 +#define FIT_LENGTH_MESG_STROKE_COUNT_COUNT 1 +#define FIT_LENGTH_MESG_ZONE_COUNT_COUNT 1 + +typedef struct +{ + FIT_DATE_TIME timestamp; // + FIT_DATE_TIME start_time; // + FIT_UINT32 total_elapsed_time; // 1000 * s + 0, + FIT_UINT32 total_timer_time; // 1000 * s + 0, + FIT_MESSAGE_INDEX message_index; // + FIT_UINT16 total_strokes; // 1 * strokes + 0, + FIT_UINT16 avg_speed; // 1000 * m/s + 0, + FIT_UINT16 total_calories; // 1 * kcal + 0, + FIT_UINT16 player_score; // + FIT_UINT16 opponent_score; // + FIT_UINT16 stroke_count[FIT_LENGTH_MESG_STROKE_COUNT_COUNT]; // 1 * counts + 0, stroke_type enum used as the index + FIT_UINT16 zone_count[FIT_LENGTH_MESG_ZONE_COUNT_COUNT]; // 1 * counts + 0, zone number used as the index + FIT_EVENT event; // + FIT_EVENT_TYPE event_type; // + FIT_SWIM_STROKE swim_stroke; // 1 * swim_stroke + 0, + FIT_UINT8 avg_swimming_cadence; // 1 * strokes/min + 0, + FIT_UINT8 event_group; // + FIT_LENGTH_TYPE length_type; // +} FIT_LENGTH_MESG; + +typedef FIT_UINT8 FIT_LENGTH_FIELD_NUM; + +#define FIT_LENGTH_FIELD_NUM_TIMESTAMP ((FIT_LENGTH_FIELD_NUM)253) +#define FIT_LENGTH_FIELD_NUM_START_TIME ((FIT_LENGTH_FIELD_NUM)2) +#define FIT_LENGTH_FIELD_NUM_TOTAL_ELAPSED_TIME ((FIT_LENGTH_FIELD_NUM)3) +#define FIT_LENGTH_FIELD_NUM_TOTAL_TIMER_TIME ((FIT_LENGTH_FIELD_NUM)4) +#define FIT_LENGTH_FIELD_NUM_MESSAGE_INDEX ((FIT_LENGTH_FIELD_NUM)254) +#define FIT_LENGTH_FIELD_NUM_TOTAL_STROKES ((FIT_LENGTH_FIELD_NUM)5) +#define FIT_LENGTH_FIELD_NUM_AVG_SPEED ((FIT_LENGTH_FIELD_NUM)6) +#define FIT_LENGTH_FIELD_NUM_TOTAL_CALORIES ((FIT_LENGTH_FIELD_NUM)11) +#define FIT_LENGTH_FIELD_NUM_PLAYER_SCORE ((FIT_LENGTH_FIELD_NUM)18) +#define FIT_LENGTH_FIELD_NUM_OPPONENT_SCORE ((FIT_LENGTH_FIELD_NUM)19) +#define FIT_LENGTH_FIELD_NUM_STROKE_COUNT ((FIT_LENGTH_FIELD_NUM)20) +#define FIT_LENGTH_FIELD_NUM_ZONE_COUNT ((FIT_LENGTH_FIELD_NUM)21) +#define FIT_LENGTH_FIELD_NUM_EVENT ((FIT_LENGTH_FIELD_NUM)0) +#define FIT_LENGTH_FIELD_NUM_EVENT_TYPE ((FIT_LENGTH_FIELD_NUM)1) +#define FIT_LENGTH_FIELD_NUM_SWIM_STROKE ((FIT_LENGTH_FIELD_NUM)7) +#define FIT_LENGTH_FIELD_NUM_AVG_SWIMMING_CADENCE ((FIT_LENGTH_FIELD_NUM)9) +#define FIT_LENGTH_FIELD_NUM_EVENT_GROUP ((FIT_LENGTH_FIELD_NUM)10) +#define FIT_LENGTH_FIELD_NUM_LENGTH_TYPE ((FIT_LENGTH_FIELD_NUM)12) + +typedef enum +{ + FIT_LENGTH_MESG_TIMESTAMP, + FIT_LENGTH_MESG_START_TIME, + FIT_LENGTH_MESG_TOTAL_ELAPSED_TIME, + FIT_LENGTH_MESG_TOTAL_TIMER_TIME, + FIT_LENGTH_MESG_MESSAGE_INDEX, + FIT_LENGTH_MESG_TOTAL_STROKES, + FIT_LENGTH_MESG_AVG_SPEED, + FIT_LENGTH_MESG_TOTAL_CALORIES, + FIT_LENGTH_MESG_PLAYER_SCORE, + FIT_LENGTH_MESG_OPPONENT_SCORE, + FIT_LENGTH_MESG_STROKE_COUNT, + FIT_LENGTH_MESG_ZONE_COUNT, + FIT_LENGTH_MESG_EVENT, + FIT_LENGTH_MESG_EVENT_TYPE, + FIT_LENGTH_MESG_SWIM_STROKE, + FIT_LENGTH_MESG_AVG_SWIMMING_CADENCE, + FIT_LENGTH_MESG_EVENT_GROUP, + FIT_LENGTH_MESG_LENGTH_TYPE, + FIT_LENGTH_MESG_FIELDS +} FIT_LENGTH_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_LENGTH_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_LENGTH_MESG_DEF; + +// record message + +#define FIT_RECORD_MESG_SIZE 99 +#define FIT_RECORD_MESG_DEF_SIZE 149 +#define FIT_RECORD_MESG_COMPRESSED_SPEED_DISTANCE_COUNT 3 +#define FIT_RECORD_MESG_SPEED_1S_COUNT 5 + +typedef struct +{ + FIT_DATE_TIME timestamp; // 1 * s + 0, + FIT_SINT32 position_lat; // 1 * semicircles + 0, + FIT_SINT32 position_long; // 1 * semicircles + 0, + FIT_UINT32 distance; // 100 * m + 0, + FIT_SINT32 time_from_course; // 1000 * s + 0, + FIT_UINT32 total_cycles; // 1 * cycles + 0, + FIT_UINT32 accumulated_power; // 1 * watts + 0, + FIT_UINT32 enhanced_speed; // 1000 * m/s + 0, + FIT_UINT32 enhanced_altitude; // 5 * m + 500, + FIT_UINT16 altitude; // 5 * m + 500, + FIT_UINT16 speed; // 1000 * m/s + 0, + FIT_UINT16 power; // 1 * watts + 0, + FIT_SINT16 grade; // 100 * % + 0, + FIT_UINT16 compressed_accumulated_power; // 1 * watts + 0, + FIT_SINT16 vertical_speed; // 1000 * m/s + 0, + FIT_UINT16 calories; // 1 * kcal + 0, + FIT_UINT16 vertical_oscillation; // 10 * mm + 0, + FIT_UINT16 stance_time_percent; // 100 * percent + 0, + FIT_UINT16 stance_time; // 10 * ms + 0, + FIT_UINT16 ball_speed; // 100 * m/s + 0, + FIT_UINT16 cadence256; // 256 * rpm + 0, Log cadence and fractional cadence for backwards compatability + FIT_UINT16 total_hemoglobin_conc; // 100 * g/dL + 0, Total saturated and unsaturated hemoglobin + FIT_UINT16 total_hemoglobin_conc_min; // 100 * g/dL + 0, Min saturated and unsaturated hemoglobin + FIT_UINT16 total_hemoglobin_conc_max; // 100 * g/dL + 0, Max saturated and unsaturated hemoglobin + FIT_UINT16 saturated_hemoglobin_percent; // 10 * % + 0, Percentage of hemoglobin saturated with oxygen + FIT_UINT16 saturated_hemoglobin_percent_min; // 10 * % + 0, Min percentage of hemoglobin saturated with oxygen + FIT_UINT16 saturated_hemoglobin_percent_max; // 10 * % + 0, Max percentage of hemoglobin saturated with oxygen + FIT_UINT8 heart_rate; // 1 * bpm + 0, + FIT_UINT8 cadence; // 1 * rpm + 0, + FIT_BYTE compressed_speed_distance[FIT_RECORD_MESG_COMPRESSED_SPEED_DISTANCE_COUNT]; // + FIT_UINT8 resistance; // Relative. 0 is none 254 is Max. + FIT_UINT8 cycle_length; // 100 * m + 0, + FIT_SINT8 temperature; // 1 * C + 0, + FIT_UINT8 speed_1s[FIT_RECORD_MESG_SPEED_1S_COUNT]; // 16 * m/s + 0, Speed at 1s intervals. Timestamp field indicates time of last array element. + FIT_UINT8 cycles; // 1 * cycles + 0, + FIT_LEFT_RIGHT_BALANCE left_right_balance; // + FIT_UINT8 gps_accuracy; // 1 * m + 0, + FIT_ACTIVITY_TYPE activity_type; // + FIT_UINT8 left_torque_effectiveness; // 2 * percent + 0, + FIT_UINT8 right_torque_effectiveness; // 2 * percent + 0, + FIT_UINT8 left_pedal_smoothness; // 2 * percent + 0, + FIT_UINT8 right_pedal_smoothness; // 2 * percent + 0, + FIT_UINT8 combined_pedal_smoothness; // 2 * percent + 0, + FIT_UINT8 time128; // 128 * s + 0, + FIT_STROKE_TYPE stroke_type; // + FIT_UINT8 zone; // + FIT_UINT8 fractional_cadence; // 128 * rpm + 0, + FIT_DEVICE_INDEX device_index; // +} FIT_RECORD_MESG; + +typedef FIT_UINT8 FIT_RECORD_FIELD_NUM; + +#define FIT_RECORD_FIELD_NUM_TIMESTAMP ((FIT_RECORD_FIELD_NUM)253) +#define FIT_RECORD_FIELD_NUM_POSITION_LAT ((FIT_RECORD_FIELD_NUM)0) +#define FIT_RECORD_FIELD_NUM_POSITION_LONG ((FIT_RECORD_FIELD_NUM)1) +#define FIT_RECORD_FIELD_NUM_DISTANCE ((FIT_RECORD_FIELD_NUM)5) +#define FIT_RECORD_FIELD_NUM_TIME_FROM_COURSE ((FIT_RECORD_FIELD_NUM)11) +#define FIT_RECORD_FIELD_NUM_TOTAL_CYCLES ((FIT_RECORD_FIELD_NUM)19) +#define FIT_RECORD_FIELD_NUM_ACCUMULATED_POWER ((FIT_RECORD_FIELD_NUM)29) +#define FIT_RECORD_FIELD_NUM_ENHANCED_SPEED ((FIT_RECORD_FIELD_NUM)73) +#define FIT_RECORD_FIELD_NUM_ENHANCED_ALTITUDE ((FIT_RECORD_FIELD_NUM)78) +#define FIT_RECORD_FIELD_NUM_ALTITUDE ((FIT_RECORD_FIELD_NUM)2) +#define FIT_RECORD_FIELD_NUM_SPEED ((FIT_RECORD_FIELD_NUM)6) +#define FIT_RECORD_FIELD_NUM_POWER ((FIT_RECORD_FIELD_NUM)7) +#define FIT_RECORD_FIELD_NUM_GRADE ((FIT_RECORD_FIELD_NUM)9) +#define FIT_RECORD_FIELD_NUM_COMPRESSED_ACCUMULATED_POWER ((FIT_RECORD_FIELD_NUM)28) +#define FIT_RECORD_FIELD_NUM_VERTICAL_SPEED ((FIT_RECORD_FIELD_NUM)32) +#define FIT_RECORD_FIELD_NUM_CALORIES ((FIT_RECORD_FIELD_NUM)33) +#define FIT_RECORD_FIELD_NUM_VERTICAL_OSCILLATION ((FIT_RECORD_FIELD_NUM)39) +#define FIT_RECORD_FIELD_NUM_STANCE_TIME_PERCENT ((FIT_RECORD_FIELD_NUM)40) +#define FIT_RECORD_FIELD_NUM_STANCE_TIME ((FIT_RECORD_FIELD_NUM)41) +#define FIT_RECORD_FIELD_NUM_BALL_SPEED ((FIT_RECORD_FIELD_NUM)51) +#define FIT_RECORD_FIELD_NUM_CADENCE256 ((FIT_RECORD_FIELD_NUM)52) +#define FIT_RECORD_FIELD_NUM_TOTAL_HEMOGLOBIN_CONC ((FIT_RECORD_FIELD_NUM)54) +#define FIT_RECORD_FIELD_NUM_TOTAL_HEMOGLOBIN_CONC_MIN ((FIT_RECORD_FIELD_NUM)55) +#define FIT_RECORD_FIELD_NUM_TOTAL_HEMOGLOBIN_CONC_MAX ((FIT_RECORD_FIELD_NUM)56) +#define FIT_RECORD_FIELD_NUM_SATURATED_HEMOGLOBIN_PERCENT ((FIT_RECORD_FIELD_NUM)57) +#define FIT_RECORD_FIELD_NUM_SATURATED_HEMOGLOBIN_PERCENT_MIN ((FIT_RECORD_FIELD_NUM)58) +#define FIT_RECORD_FIELD_NUM_SATURATED_HEMOGLOBIN_PERCENT_MAX ((FIT_RECORD_FIELD_NUM)59) +#define FIT_RECORD_FIELD_NUM_HEART_RATE ((FIT_RECORD_FIELD_NUM)3) +#define FIT_RECORD_FIELD_NUM_CADENCE ((FIT_RECORD_FIELD_NUM)4) +#define FIT_RECORD_FIELD_NUM_COMPRESSED_SPEED_DISTANCE ((FIT_RECORD_FIELD_NUM)8) +#define FIT_RECORD_FIELD_NUM_RESISTANCE ((FIT_RECORD_FIELD_NUM)10) +#define FIT_RECORD_FIELD_NUM_CYCLE_LENGTH ((FIT_RECORD_FIELD_NUM)12) +#define FIT_RECORD_FIELD_NUM_TEMPERATURE ((FIT_RECORD_FIELD_NUM)13) +#define FIT_RECORD_FIELD_NUM_SPEED_1S ((FIT_RECORD_FIELD_NUM)17) +#define FIT_RECORD_FIELD_NUM_CYCLES ((FIT_RECORD_FIELD_NUM)18) +#define FIT_RECORD_FIELD_NUM_LEFT_RIGHT_BALANCE ((FIT_RECORD_FIELD_NUM)30) +#define FIT_RECORD_FIELD_NUM_GPS_ACCURACY ((FIT_RECORD_FIELD_NUM)31) +#define FIT_RECORD_FIELD_NUM_ACTIVITY_TYPE ((FIT_RECORD_FIELD_NUM)42) +#define FIT_RECORD_FIELD_NUM_LEFT_TORQUE_EFFECTIVENESS ((FIT_RECORD_FIELD_NUM)43) +#define FIT_RECORD_FIELD_NUM_RIGHT_TORQUE_EFFECTIVENESS ((FIT_RECORD_FIELD_NUM)44) +#define FIT_RECORD_FIELD_NUM_LEFT_PEDAL_SMOOTHNESS ((FIT_RECORD_FIELD_NUM)45) +#define FIT_RECORD_FIELD_NUM_RIGHT_PEDAL_SMOOTHNESS ((FIT_RECORD_FIELD_NUM)46) +#define FIT_RECORD_FIELD_NUM_COMBINED_PEDAL_SMOOTHNESS ((FIT_RECORD_FIELD_NUM)47) +#define FIT_RECORD_FIELD_NUM_TIME128 ((FIT_RECORD_FIELD_NUM)48) +#define FIT_RECORD_FIELD_NUM_STROKE_TYPE ((FIT_RECORD_FIELD_NUM)49) +#define FIT_RECORD_FIELD_NUM_ZONE ((FIT_RECORD_FIELD_NUM)50) +#define FIT_RECORD_FIELD_NUM_FRACTIONAL_CADENCE ((FIT_RECORD_FIELD_NUM)53) +#define FIT_RECORD_FIELD_NUM_DEVICE_INDEX ((FIT_RECORD_FIELD_NUM)62) + +typedef enum +{ + FIT_RECORD_MESG_TIMESTAMP, + FIT_RECORD_MESG_POSITION_LAT, + FIT_RECORD_MESG_POSITION_LONG, + FIT_RECORD_MESG_DISTANCE, + FIT_RECORD_MESG_TIME_FROM_COURSE, + FIT_RECORD_MESG_TOTAL_CYCLES, + FIT_RECORD_MESG_ACCUMULATED_POWER, + FIT_RECORD_MESG_ENHANCED_SPEED, + FIT_RECORD_MESG_ENHANCED_ALTITUDE, + FIT_RECORD_MESG_ALTITUDE, + FIT_RECORD_MESG_SPEED, + FIT_RECORD_MESG_POWER, + FIT_RECORD_MESG_GRADE, + FIT_RECORD_MESG_COMPRESSED_ACCUMULATED_POWER, + FIT_RECORD_MESG_VERTICAL_SPEED, + FIT_RECORD_MESG_CALORIES, + FIT_RECORD_MESG_VERTICAL_OSCILLATION, + FIT_RECORD_MESG_STANCE_TIME_PERCENT, + FIT_RECORD_MESG_STANCE_TIME, + FIT_RECORD_MESG_BALL_SPEED, + FIT_RECORD_MESG_CADENCE256, + FIT_RECORD_MESG_TOTAL_HEMOGLOBIN_CONC, + FIT_RECORD_MESG_TOTAL_HEMOGLOBIN_CONC_MIN, + FIT_RECORD_MESG_TOTAL_HEMOGLOBIN_CONC_MAX, + FIT_RECORD_MESG_SATURATED_HEMOGLOBIN_PERCENT, + FIT_RECORD_MESG_SATURATED_HEMOGLOBIN_PERCENT_MIN, + FIT_RECORD_MESG_SATURATED_HEMOGLOBIN_PERCENT_MAX, + FIT_RECORD_MESG_HEART_RATE, + FIT_RECORD_MESG_CADENCE, + FIT_RECORD_MESG_COMPRESSED_SPEED_DISTANCE, + FIT_RECORD_MESG_RESISTANCE, + FIT_RECORD_MESG_CYCLE_LENGTH, + FIT_RECORD_MESG_TEMPERATURE, + FIT_RECORD_MESG_SPEED_1S, + FIT_RECORD_MESG_CYCLES, + FIT_RECORD_MESG_LEFT_RIGHT_BALANCE, + FIT_RECORD_MESG_GPS_ACCURACY, + FIT_RECORD_MESG_ACTIVITY_TYPE, + FIT_RECORD_MESG_LEFT_TORQUE_EFFECTIVENESS, + FIT_RECORD_MESG_RIGHT_TORQUE_EFFECTIVENESS, + FIT_RECORD_MESG_LEFT_PEDAL_SMOOTHNESS, + FIT_RECORD_MESG_RIGHT_PEDAL_SMOOTHNESS, + FIT_RECORD_MESG_COMBINED_PEDAL_SMOOTHNESS, + FIT_RECORD_MESG_TIME128, + FIT_RECORD_MESG_STROKE_TYPE, + FIT_RECORD_MESG_ZONE, + FIT_RECORD_MESG_FRACTIONAL_CADENCE, + FIT_RECORD_MESG_DEVICE_INDEX, + FIT_RECORD_MESG_FIELDS +} FIT_RECORD_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_RECORD_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_RECORD_MESG_DEF; + +// event message + +#define FIT_EVENT_MESG_SIZE 23 +#define FIT_EVENT_MESG_DEF_SIZE 47 + +typedef struct +{ + FIT_DATE_TIME timestamp; // 1 * s + 0, + FIT_UINT32 data; // + FIT_UINT16 data16; // + FIT_UINT16 score; // Do not populate directly. Autogenerated by decoder for sport_point subfield components + FIT_UINT16 opponent_score; // Do not populate directly. Autogenerated by decoder for sport_point subfield components + FIT_EVENT event; // + FIT_EVENT_TYPE event_type; // + FIT_UINT8 event_group; // + FIT_UINT8Z front_gear_num; // Do not populate directly. Autogenerated by decoder for gear_change subfield components. Front gear number. 1 is innermost. + FIT_UINT8Z front_gear; // Do not populate directly. Autogenerated by decoder for gear_change subfield components. Number of front teeth. + FIT_UINT8Z rear_gear_num; // Do not populate directly. Autogenerated by decoder for gear_change subfield components. Rear gear number. 1 is innermost. + FIT_UINT8Z rear_gear; // Do not populate directly. Autogenerated by decoder for gear_change subfield components. Number of rear teeth. + FIT_RADAR_THREAT_LEVEL_TYPE radar_threat_level_max; // Do not populate directly. Autogenerated by decoder for threat_alert subfield components. + FIT_UINT8 radar_threat_count; // Do not populate directly. Autogenerated by decoder for threat_alert subfield components. +} FIT_EVENT_MESG; + +typedef FIT_UINT8 FIT_EVENT_FIELD_NUM; + +#define FIT_EVENT_FIELD_NUM_TIMESTAMP ((FIT_EVENT_FIELD_NUM)253) +#define FIT_EVENT_FIELD_NUM_DATA ((FIT_EVENT_FIELD_NUM)3) +#define FIT_EVENT_FIELD_NUM_DATA16 ((FIT_EVENT_FIELD_NUM)2) +#define FIT_EVENT_FIELD_NUM_SCORE ((FIT_EVENT_FIELD_NUM)7) +#define FIT_EVENT_FIELD_NUM_OPPONENT_SCORE ((FIT_EVENT_FIELD_NUM)8) +#define FIT_EVENT_FIELD_NUM_EVENT ((FIT_EVENT_FIELD_NUM)0) +#define FIT_EVENT_FIELD_NUM_EVENT_TYPE ((FIT_EVENT_FIELD_NUM)1) +#define FIT_EVENT_FIELD_NUM_EVENT_GROUP ((FIT_EVENT_FIELD_NUM)4) +#define FIT_EVENT_FIELD_NUM_FRONT_GEAR_NUM ((FIT_EVENT_FIELD_NUM)9) +#define FIT_EVENT_FIELD_NUM_FRONT_GEAR ((FIT_EVENT_FIELD_NUM)10) +#define FIT_EVENT_FIELD_NUM_REAR_GEAR_NUM ((FIT_EVENT_FIELD_NUM)11) +#define FIT_EVENT_FIELD_NUM_REAR_GEAR ((FIT_EVENT_FIELD_NUM)12) +#define FIT_EVENT_FIELD_NUM_RADAR_THREAT_LEVEL_MAX ((FIT_EVENT_FIELD_NUM)21) +#define FIT_EVENT_FIELD_NUM_RADAR_THREAT_COUNT ((FIT_EVENT_FIELD_NUM)22) + +typedef enum +{ + FIT_EVENT_MESG_TIMESTAMP, + FIT_EVENT_MESG_DATA, + FIT_EVENT_MESG_DATA16, + FIT_EVENT_MESG_SCORE, + FIT_EVENT_MESG_OPPONENT_SCORE, + FIT_EVENT_MESG_EVENT, + FIT_EVENT_MESG_EVENT_TYPE, + FIT_EVENT_MESG_EVENT_GROUP, + FIT_EVENT_MESG_FRONT_GEAR_NUM, + FIT_EVENT_MESG_FRONT_GEAR, + FIT_EVENT_MESG_REAR_GEAR_NUM, + FIT_EVENT_MESG_REAR_GEAR, + FIT_EVENT_MESG_RADAR_THREAT_LEVEL_MAX, + FIT_EVENT_MESG_RADAR_THREAT_COUNT, + FIT_EVENT_MESG_FIELDS +} FIT_EVENT_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_EVENT_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_EVENT_MESG_DEF; + +// device_info message + +#define FIT_DEVICE_INFO_MESG_SIZE 51 +#define FIT_DEVICE_INFO_MESG_DEF_SIZE 59 +#define FIT_DEVICE_INFO_MESG_PRODUCT_NAME_COUNT 20 +#define FIT_DEVICE_INFO_MESG_DESCRIPTOR_COUNT 1 + +typedef struct +{ + FIT_DATE_TIME timestamp; // 1 * s + 0, + FIT_UINT32Z serial_number; // + FIT_UINT32 cum_operating_time; // 1 * s + 0, Reset by new battery or charge. + FIT_STRING product_name[FIT_DEVICE_INFO_MESG_PRODUCT_NAME_COUNT]; // Optional free form string to indicate the devices name or model + FIT_MANUFACTURER manufacturer; // + FIT_UINT16 product; // + FIT_UINT16 software_version; // + FIT_UINT16 battery_voltage; // 256 * V + 0, + FIT_UINT16Z ant_device_number; // + FIT_DEVICE_INDEX device_index; // + FIT_UINT8 device_type; // + FIT_UINT8 hardware_version; // + FIT_BATTERY_STATUS battery_status; // + FIT_BODY_LOCATION sensor_position; // Indicates the location of the sensor + FIT_STRING descriptor[FIT_DEVICE_INFO_MESG_DESCRIPTOR_COUNT]; // Used to describe the sensor or location + FIT_UINT8Z ant_transmission_type; // + FIT_ANT_NETWORK ant_network; // + FIT_SOURCE_TYPE source_type; // +} FIT_DEVICE_INFO_MESG; + +typedef FIT_UINT8 FIT_DEVICE_INFO_FIELD_NUM; + +#define FIT_DEVICE_INFO_FIELD_NUM_TIMESTAMP ((FIT_DEVICE_INFO_FIELD_NUM)253) +#define FIT_DEVICE_INFO_FIELD_NUM_SERIAL_NUMBER ((FIT_DEVICE_INFO_FIELD_NUM)3) +#define FIT_DEVICE_INFO_FIELD_NUM_CUM_OPERATING_TIME ((FIT_DEVICE_INFO_FIELD_NUM)7) +#define FIT_DEVICE_INFO_FIELD_NUM_PRODUCT_NAME ((FIT_DEVICE_INFO_FIELD_NUM)27) +#define FIT_DEVICE_INFO_FIELD_NUM_MANUFACTURER ((FIT_DEVICE_INFO_FIELD_NUM)2) +#define FIT_DEVICE_INFO_FIELD_NUM_PRODUCT ((FIT_DEVICE_INFO_FIELD_NUM)4) +#define FIT_DEVICE_INFO_FIELD_NUM_SOFTWARE_VERSION ((FIT_DEVICE_INFO_FIELD_NUM)5) +#define FIT_DEVICE_INFO_FIELD_NUM_BATTERY_VOLTAGE ((FIT_DEVICE_INFO_FIELD_NUM)10) +#define FIT_DEVICE_INFO_FIELD_NUM_ANT_DEVICE_NUMBER ((FIT_DEVICE_INFO_FIELD_NUM)21) +#define FIT_DEVICE_INFO_FIELD_NUM_DEVICE_INDEX ((FIT_DEVICE_INFO_FIELD_NUM)0) +#define FIT_DEVICE_INFO_FIELD_NUM_DEVICE_TYPE ((FIT_DEVICE_INFO_FIELD_NUM)1) +#define FIT_DEVICE_INFO_FIELD_NUM_HARDWARE_VERSION ((FIT_DEVICE_INFO_FIELD_NUM)6) +#define FIT_DEVICE_INFO_FIELD_NUM_BATTERY_STATUS ((FIT_DEVICE_INFO_FIELD_NUM)11) +#define FIT_DEVICE_INFO_FIELD_NUM_SENSOR_POSITION ((FIT_DEVICE_INFO_FIELD_NUM)18) +#define FIT_DEVICE_INFO_FIELD_NUM_DESCRIPTOR ((FIT_DEVICE_INFO_FIELD_NUM)19) +#define FIT_DEVICE_INFO_FIELD_NUM_ANT_TRANSMISSION_TYPE ((FIT_DEVICE_INFO_FIELD_NUM)20) +#define FIT_DEVICE_INFO_FIELD_NUM_ANT_NETWORK ((FIT_DEVICE_INFO_FIELD_NUM)22) +#define FIT_DEVICE_INFO_FIELD_NUM_SOURCE_TYPE ((FIT_DEVICE_INFO_FIELD_NUM)25) + +typedef enum +{ + FIT_DEVICE_INFO_MESG_TIMESTAMP, + FIT_DEVICE_INFO_MESG_SERIAL_NUMBER, + FIT_DEVICE_INFO_MESG_CUM_OPERATING_TIME, + FIT_DEVICE_INFO_MESG_PRODUCT_NAME, + FIT_DEVICE_INFO_MESG_MANUFACTURER, + FIT_DEVICE_INFO_MESG_PRODUCT, + FIT_DEVICE_INFO_MESG_SOFTWARE_VERSION, + FIT_DEVICE_INFO_MESG_BATTERY_VOLTAGE, + FIT_DEVICE_INFO_MESG_ANT_DEVICE_NUMBER, + FIT_DEVICE_INFO_MESG_DEVICE_INDEX, + FIT_DEVICE_INFO_MESG_DEVICE_TYPE, + FIT_DEVICE_INFO_MESG_HARDWARE_VERSION, + FIT_DEVICE_INFO_MESG_BATTERY_STATUS, + FIT_DEVICE_INFO_MESG_SENSOR_POSITION, + FIT_DEVICE_INFO_MESG_DESCRIPTOR, + FIT_DEVICE_INFO_MESG_ANT_TRANSMISSION_TYPE, + FIT_DEVICE_INFO_MESG_ANT_NETWORK, + FIT_DEVICE_INFO_MESG_SOURCE_TYPE, + FIT_DEVICE_INFO_MESG_FIELDS +} FIT_DEVICE_INFO_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_DEVICE_INFO_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_DEVICE_INFO_MESG_DEF; + +// device_aux_battery_info message + +#define FIT_DEVICE_AUX_BATTERY_INFO_MESG_SIZE 9 +#define FIT_DEVICE_AUX_BATTERY_INFO_MESG_DEF_SIZE 20 + +typedef struct +{ + FIT_DATE_TIME timestamp; // + FIT_UINT16 battery_voltage; // 256 * V + 0, + FIT_DEVICE_INDEX device_index; // + FIT_BATTERY_STATUS battery_status; // + FIT_UINT8 battery_identifier; // +} FIT_DEVICE_AUX_BATTERY_INFO_MESG; + +typedef FIT_UINT8 FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM; + +#define FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM_TIMESTAMP ((FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM)253) +#define FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM_BATTERY_VOLTAGE ((FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM)1) +#define FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM_DEVICE_INDEX ((FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM)0) +#define FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM_BATTERY_STATUS ((FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM)2) +#define FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM_BATTERY_IDENTIFIER ((FIT_DEVICE_AUX_BATTERY_INFO_FIELD_NUM)3) + +typedef enum +{ + FIT_DEVICE_AUX_BATTERY_INFO_MESG_TIMESTAMP, + FIT_DEVICE_AUX_BATTERY_INFO_MESG_BATTERY_VOLTAGE, + FIT_DEVICE_AUX_BATTERY_INFO_MESG_DEVICE_INDEX, + FIT_DEVICE_AUX_BATTERY_INFO_MESG_BATTERY_STATUS, + FIT_DEVICE_AUX_BATTERY_INFO_MESG_BATTERY_IDENTIFIER, + FIT_DEVICE_AUX_BATTERY_INFO_MESG_FIELDS +} FIT_DEVICE_AUX_BATTERY_INFO_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_DEVICE_AUX_BATTERY_INFO_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_DEVICE_AUX_BATTERY_INFO_MESG_DEF; + +// training_file message + +#define FIT_TRAINING_FILE_MESG_SIZE 17 +#define FIT_TRAINING_FILE_MESG_DEF_SIZE 23 + +typedef struct +{ + FIT_DATE_TIME timestamp; // + FIT_UINT32Z serial_number; // + FIT_DATE_TIME time_created; // + FIT_MANUFACTURER manufacturer; // + FIT_UINT16 product; // + FIT_FILE type; // +} FIT_TRAINING_FILE_MESG; + +typedef FIT_UINT8 FIT_TRAINING_FILE_FIELD_NUM; + +#define FIT_TRAINING_FILE_FIELD_NUM_TIMESTAMP ((FIT_TRAINING_FILE_FIELD_NUM)253) +#define FIT_TRAINING_FILE_FIELD_NUM_SERIAL_NUMBER ((FIT_TRAINING_FILE_FIELD_NUM)3) +#define FIT_TRAINING_FILE_FIELD_NUM_TIME_CREATED ((FIT_TRAINING_FILE_FIELD_NUM)4) +#define FIT_TRAINING_FILE_FIELD_NUM_MANUFACTURER ((FIT_TRAINING_FILE_FIELD_NUM)1) +#define FIT_TRAINING_FILE_FIELD_NUM_PRODUCT ((FIT_TRAINING_FILE_FIELD_NUM)2) +#define FIT_TRAINING_FILE_FIELD_NUM_TYPE ((FIT_TRAINING_FILE_FIELD_NUM)0) + +typedef enum +{ + FIT_TRAINING_FILE_MESG_TIMESTAMP, + FIT_TRAINING_FILE_MESG_SERIAL_NUMBER, + FIT_TRAINING_FILE_MESG_TIME_CREATED, + FIT_TRAINING_FILE_MESG_MANUFACTURER, + FIT_TRAINING_FILE_MESG_PRODUCT, + FIT_TRAINING_FILE_MESG_TYPE, + FIT_TRAINING_FILE_MESG_FIELDS +} FIT_TRAINING_FILE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_TRAINING_FILE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_TRAINING_FILE_MESG_DEF; + +// weather_conditions message + +#define FIT_WEATHER_CONDITIONS_MESG_SIZE 93 +#define FIT_WEATHER_CONDITIONS_MESG_DEF_SIZE 53 +#define FIT_WEATHER_CONDITIONS_MESG_LOCATION_COUNT 64 + +typedef struct +{ + FIT_DATE_TIME timestamp; // time of update for current conditions, else forecast time + FIT_STRING location[FIT_WEATHER_CONDITIONS_MESG_LOCATION_COUNT]; // string corresponding to GCS response location string + FIT_DATE_TIME observed_at_time; // + FIT_SINT32 observed_location_lat; // 1 * semicircles + 0, + FIT_SINT32 observed_location_long; // 1 * semicircles + 0, + FIT_UINT16 wind_direction; // 1 * degrees + 0, + FIT_UINT16 wind_speed; // 1000 * m/s + 0, + FIT_WEATHER_REPORT weather_report; // Current or forecast + FIT_SINT8 temperature; // 1 * C + 0, + FIT_WEATHER_STATUS condition; // Corresponds to GSC Response weatherIcon field + FIT_UINT8 precipitation_probability; // range 0-100 + FIT_SINT8 temperature_feels_like; // 1 * C + 0, Heat Index if GCS heatIdx above or equal to 90F or wind chill if GCS windChill below or equal to 32F + FIT_UINT8 relative_humidity; // + FIT_DAY_OF_WEEK day_of_week; // + FIT_SINT8 high_temperature; // 1 * C + 0, + FIT_SINT8 low_temperature; // 1 * C + 0, +} FIT_WEATHER_CONDITIONS_MESG; + +typedef FIT_UINT8 FIT_WEATHER_CONDITIONS_FIELD_NUM; + +#define FIT_WEATHER_CONDITIONS_FIELD_NUM_TIMESTAMP ((FIT_WEATHER_CONDITIONS_FIELD_NUM)253) +#define FIT_WEATHER_CONDITIONS_FIELD_NUM_LOCATION ((FIT_WEATHER_CONDITIONS_FIELD_NUM)8) +#define FIT_WEATHER_CONDITIONS_FIELD_NUM_OBSERVED_AT_TIME ((FIT_WEATHER_CONDITIONS_FIELD_NUM)9) +#define FIT_WEATHER_CONDITIONS_FIELD_NUM_OBSERVED_LOCATION_LAT ((FIT_WEATHER_CONDITIONS_FIELD_NUM)10) +#define FIT_WEATHER_CONDITIONS_FIELD_NUM_OBSERVED_LOCATION_LONG ((FIT_WEATHER_CONDITIONS_FIELD_NUM)11) +#define FIT_WEATHER_CONDITIONS_FIELD_NUM_WIND_DIRECTION ((FIT_WEATHER_CONDITIONS_FIELD_NUM)3) +#define FIT_WEATHER_CONDITIONS_FIELD_NUM_WIND_SPEED ((FIT_WEATHER_CONDITIONS_FIELD_NUM)4) +#define FIT_WEATHER_CONDITIONS_FIELD_NUM_WEATHER_REPORT ((FIT_WEATHER_CONDITIONS_FIELD_NUM)0) +#define FIT_WEATHER_CONDITIONS_FIELD_NUM_TEMPERATURE ((FIT_WEATHER_CONDITIONS_FIELD_NUM)1) +#define FIT_WEATHER_CONDITIONS_FIELD_NUM_CONDITION ((FIT_WEATHER_CONDITIONS_FIELD_NUM)2) +#define FIT_WEATHER_CONDITIONS_FIELD_NUM_PRECIPITATION_PROBABILITY ((FIT_WEATHER_CONDITIONS_FIELD_NUM)5) +#define FIT_WEATHER_CONDITIONS_FIELD_NUM_TEMPERATURE_FEELS_LIKE ((FIT_WEATHER_CONDITIONS_FIELD_NUM)6) +#define FIT_WEATHER_CONDITIONS_FIELD_NUM_RELATIVE_HUMIDITY ((FIT_WEATHER_CONDITIONS_FIELD_NUM)7) +#define FIT_WEATHER_CONDITIONS_FIELD_NUM_DAY_OF_WEEK ((FIT_WEATHER_CONDITIONS_FIELD_NUM)12) +#define FIT_WEATHER_CONDITIONS_FIELD_NUM_HIGH_TEMPERATURE ((FIT_WEATHER_CONDITIONS_FIELD_NUM)13) +#define FIT_WEATHER_CONDITIONS_FIELD_NUM_LOW_TEMPERATURE ((FIT_WEATHER_CONDITIONS_FIELD_NUM)14) + +typedef enum +{ + FIT_WEATHER_CONDITIONS_MESG_TIMESTAMP, + FIT_WEATHER_CONDITIONS_MESG_LOCATION, + FIT_WEATHER_CONDITIONS_MESG_OBSERVED_AT_TIME, + FIT_WEATHER_CONDITIONS_MESG_OBSERVED_LOCATION_LAT, + FIT_WEATHER_CONDITIONS_MESG_OBSERVED_LOCATION_LONG, + FIT_WEATHER_CONDITIONS_MESG_WIND_DIRECTION, + FIT_WEATHER_CONDITIONS_MESG_WIND_SPEED, + FIT_WEATHER_CONDITIONS_MESG_WEATHER_REPORT, + FIT_WEATHER_CONDITIONS_MESG_TEMPERATURE, + FIT_WEATHER_CONDITIONS_MESG_CONDITION, + FIT_WEATHER_CONDITIONS_MESG_PRECIPITATION_PROBABILITY, + FIT_WEATHER_CONDITIONS_MESG_TEMPERATURE_FEELS_LIKE, + FIT_WEATHER_CONDITIONS_MESG_RELATIVE_HUMIDITY, + FIT_WEATHER_CONDITIONS_MESG_DAY_OF_WEEK, + FIT_WEATHER_CONDITIONS_MESG_HIGH_TEMPERATURE, + FIT_WEATHER_CONDITIONS_MESG_LOW_TEMPERATURE, + FIT_WEATHER_CONDITIONS_MESG_FIELDS +} FIT_WEATHER_CONDITIONS_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_WEATHER_CONDITIONS_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_WEATHER_CONDITIONS_MESG_DEF; + +// weather_alert message + +#define FIT_WEATHER_ALERT_MESG_SIZE 26 +#define FIT_WEATHER_ALERT_MESG_DEF_SIZE 23 +#define FIT_WEATHER_ALERT_MESG_REPORT_ID_COUNT 12 + +typedef struct +{ + FIT_DATE_TIME timestamp; // + FIT_STRING report_id[FIT_WEATHER_ALERT_MESG_REPORT_ID_COUNT]; // Unique identifier from GCS report ID string, length is 12 + FIT_DATE_TIME issue_time; // Time alert was issued + FIT_DATE_TIME expire_time; // Time alert expires + FIT_WEATHER_SEVERITY severity; // Warning, Watch, Advisory, Statement + FIT_WEATHER_SEVERE_TYPE type; // Tornado, Severe Thunderstorm, etc. +} FIT_WEATHER_ALERT_MESG; + +typedef FIT_UINT8 FIT_WEATHER_ALERT_FIELD_NUM; + +#define FIT_WEATHER_ALERT_FIELD_NUM_TIMESTAMP ((FIT_WEATHER_ALERT_FIELD_NUM)253) +#define FIT_WEATHER_ALERT_FIELD_NUM_REPORT_ID ((FIT_WEATHER_ALERT_FIELD_NUM)0) +#define FIT_WEATHER_ALERT_FIELD_NUM_ISSUE_TIME ((FIT_WEATHER_ALERT_FIELD_NUM)1) +#define FIT_WEATHER_ALERT_FIELD_NUM_EXPIRE_TIME ((FIT_WEATHER_ALERT_FIELD_NUM)2) +#define FIT_WEATHER_ALERT_FIELD_NUM_SEVERITY ((FIT_WEATHER_ALERT_FIELD_NUM)3) +#define FIT_WEATHER_ALERT_FIELD_NUM_TYPE ((FIT_WEATHER_ALERT_FIELD_NUM)4) + +typedef enum +{ + FIT_WEATHER_ALERT_MESG_TIMESTAMP, + FIT_WEATHER_ALERT_MESG_REPORT_ID, + FIT_WEATHER_ALERT_MESG_ISSUE_TIME, + FIT_WEATHER_ALERT_MESG_EXPIRE_TIME, + FIT_WEATHER_ALERT_MESG_SEVERITY, + FIT_WEATHER_ALERT_MESG_TYPE, + FIT_WEATHER_ALERT_MESG_FIELDS +} FIT_WEATHER_ALERT_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_WEATHER_ALERT_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_WEATHER_ALERT_MESG_DEF; + +// nmea_sentence message + +#define FIT_NMEA_SENTENCE_MESG_SIZE 89 +#define FIT_NMEA_SENTENCE_MESG_DEF_SIZE 14 +#define FIT_NMEA_SENTENCE_MESG_SENTENCE_COUNT 83 + +typedef struct +{ + FIT_DATE_TIME timestamp; // 1 * s + 0, Timestamp message was output + FIT_UINT16 timestamp_ms; // 1 * ms + 0, Fractional part of timestamp, added to timestamp + FIT_STRING sentence[FIT_NMEA_SENTENCE_MESG_SENTENCE_COUNT]; // NMEA sentence +} FIT_NMEA_SENTENCE_MESG; + +typedef FIT_UINT8 FIT_NMEA_SENTENCE_FIELD_NUM; + +#define FIT_NMEA_SENTENCE_FIELD_NUM_TIMESTAMP ((FIT_NMEA_SENTENCE_FIELD_NUM)253) +#define FIT_NMEA_SENTENCE_FIELD_NUM_TIMESTAMP_MS ((FIT_NMEA_SENTENCE_FIELD_NUM)0) +#define FIT_NMEA_SENTENCE_FIELD_NUM_SENTENCE ((FIT_NMEA_SENTENCE_FIELD_NUM)1) + +typedef enum +{ + FIT_NMEA_SENTENCE_MESG_TIMESTAMP, + FIT_NMEA_SENTENCE_MESG_TIMESTAMP_MS, + FIT_NMEA_SENTENCE_MESG_SENTENCE, + FIT_NMEA_SENTENCE_MESG_FIELDS +} FIT_NMEA_SENTENCE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_NMEA_SENTENCE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_NMEA_SENTENCE_MESG_DEF; + +// aviation_attitude message + +#define FIT_AVIATION_ATTITUDE_MESG_SIZE 26 +#define FIT_AVIATION_ATTITUDE_MESG_DEF_SIZE 41 +#define FIT_AVIATION_ATTITUDE_MESG_SYSTEM_TIME_COUNT 1 +#define FIT_AVIATION_ATTITUDE_MESG_PITCH_COUNT 1 +#define FIT_AVIATION_ATTITUDE_MESG_ROLL_COUNT 1 +#define FIT_AVIATION_ATTITUDE_MESG_ACCEL_LATERAL_COUNT 1 +#define FIT_AVIATION_ATTITUDE_MESG_ACCEL_NORMAL_COUNT 1 +#define FIT_AVIATION_ATTITUDE_MESG_TURN_RATE_COUNT 1 +#define FIT_AVIATION_ATTITUDE_MESG_TRACK_COUNT 1 +#define FIT_AVIATION_ATTITUDE_MESG_VALIDITY_COUNT 1 +#define FIT_AVIATION_ATTITUDE_MESG_STAGE_COUNT 1 +#define FIT_AVIATION_ATTITUDE_MESG_ATTITUDE_STAGE_COMPLETE_COUNT 1 + +typedef struct +{ + FIT_DATE_TIME timestamp; // 1 * s + 0, Timestamp message was output + FIT_UINT32 system_time[FIT_AVIATION_ATTITUDE_MESG_SYSTEM_TIME_COUNT]; // 1 * ms + 0, System time associated with sample expressed in ms. + FIT_UINT16 timestamp_ms; // 1 * ms + 0, Fractional part of timestamp, added to timestamp + FIT_SINT16 pitch[FIT_AVIATION_ATTITUDE_MESG_PITCH_COUNT]; // 10430.38 * radians + 0, Range -PI/2 to +PI/2 + FIT_SINT16 roll[FIT_AVIATION_ATTITUDE_MESG_ROLL_COUNT]; // 10430.38 * radians + 0, Range -PI to +PI + FIT_SINT16 accel_lateral[FIT_AVIATION_ATTITUDE_MESG_ACCEL_LATERAL_COUNT]; // 100 * m/s^2 + 0, Range -78.4 to +78.4 (-8 Gs to 8 Gs) + FIT_SINT16 accel_normal[FIT_AVIATION_ATTITUDE_MESG_ACCEL_NORMAL_COUNT]; // 100 * m/s^2 + 0, Range -78.4 to +78.4 (-8 Gs to 8 Gs) + FIT_SINT16 turn_rate[FIT_AVIATION_ATTITUDE_MESG_TURN_RATE_COUNT]; // 1024 * radians/second + 0, Range -8.727 to +8.727 (-500 degs/sec to +500 degs/sec) + FIT_UINT16 track[FIT_AVIATION_ATTITUDE_MESG_TRACK_COUNT]; // 10430.38 * radians + 0, Track Angle/Heading Range 0 - 2pi + FIT_ATTITUDE_VALIDITY validity[FIT_AVIATION_ATTITUDE_MESG_VALIDITY_COUNT]; // + FIT_ATTITUDE_STAGE stage[FIT_AVIATION_ATTITUDE_MESG_STAGE_COUNT]; // + FIT_UINT8 attitude_stage_complete[FIT_AVIATION_ATTITUDE_MESG_ATTITUDE_STAGE_COMPLETE_COUNT]; // 1 * % + 0, The percent complete of the current attitude stage. Set to 0 for attitude stages 0, 1 and 2 and to 100 for attitude stage 3 by AHRS modules that do not support it. Range - 100 +} FIT_AVIATION_ATTITUDE_MESG; + +typedef FIT_UINT8 FIT_AVIATION_ATTITUDE_FIELD_NUM; + +#define FIT_AVIATION_ATTITUDE_FIELD_NUM_TIMESTAMP ((FIT_AVIATION_ATTITUDE_FIELD_NUM)253) +#define FIT_AVIATION_ATTITUDE_FIELD_NUM_SYSTEM_TIME ((FIT_AVIATION_ATTITUDE_FIELD_NUM)1) +#define FIT_AVIATION_ATTITUDE_FIELD_NUM_TIMESTAMP_MS ((FIT_AVIATION_ATTITUDE_FIELD_NUM)0) +#define FIT_AVIATION_ATTITUDE_FIELD_NUM_PITCH ((FIT_AVIATION_ATTITUDE_FIELD_NUM)2) +#define FIT_AVIATION_ATTITUDE_FIELD_NUM_ROLL ((FIT_AVIATION_ATTITUDE_FIELD_NUM)3) +#define FIT_AVIATION_ATTITUDE_FIELD_NUM_ACCEL_LATERAL ((FIT_AVIATION_ATTITUDE_FIELD_NUM)4) +#define FIT_AVIATION_ATTITUDE_FIELD_NUM_ACCEL_NORMAL ((FIT_AVIATION_ATTITUDE_FIELD_NUM)5) +#define FIT_AVIATION_ATTITUDE_FIELD_NUM_TURN_RATE ((FIT_AVIATION_ATTITUDE_FIELD_NUM)6) +#define FIT_AVIATION_ATTITUDE_FIELD_NUM_TRACK ((FIT_AVIATION_ATTITUDE_FIELD_NUM)9) +#define FIT_AVIATION_ATTITUDE_FIELD_NUM_VALIDITY ((FIT_AVIATION_ATTITUDE_FIELD_NUM)10) +#define FIT_AVIATION_ATTITUDE_FIELD_NUM_STAGE ((FIT_AVIATION_ATTITUDE_FIELD_NUM)7) +#define FIT_AVIATION_ATTITUDE_FIELD_NUM_ATTITUDE_STAGE_COMPLETE ((FIT_AVIATION_ATTITUDE_FIELD_NUM)8) + +typedef enum +{ + FIT_AVIATION_ATTITUDE_MESG_TIMESTAMP, + FIT_AVIATION_ATTITUDE_MESG_SYSTEM_TIME, + FIT_AVIATION_ATTITUDE_MESG_TIMESTAMP_MS, + FIT_AVIATION_ATTITUDE_MESG_PITCH, + FIT_AVIATION_ATTITUDE_MESG_ROLL, + FIT_AVIATION_ATTITUDE_MESG_ACCEL_LATERAL, + FIT_AVIATION_ATTITUDE_MESG_ACCEL_NORMAL, + FIT_AVIATION_ATTITUDE_MESG_TURN_RATE, + FIT_AVIATION_ATTITUDE_MESG_TRACK, + FIT_AVIATION_ATTITUDE_MESG_VALIDITY, + FIT_AVIATION_ATTITUDE_MESG_STAGE, + FIT_AVIATION_ATTITUDE_MESG_ATTITUDE_STAGE_COMPLETE, + FIT_AVIATION_ATTITUDE_MESG_FIELDS +} FIT_AVIATION_ATTITUDE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_AVIATION_ATTITUDE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_AVIATION_ATTITUDE_MESG_DEF; + +// video_title message + +#define FIT_VIDEO_TITLE_MESG_SIZE 84 +#define FIT_VIDEO_TITLE_MESG_DEF_SIZE 14 +#define FIT_VIDEO_TITLE_MESG_TEXT_COUNT 80 + +typedef struct +{ + FIT_STRING text[FIT_VIDEO_TITLE_MESG_TEXT_COUNT]; // + FIT_MESSAGE_INDEX message_index; // Long titles will be split into multiple parts + FIT_UINT16 message_count; // Total number of title parts +} FIT_VIDEO_TITLE_MESG; + +typedef FIT_UINT8 FIT_VIDEO_TITLE_FIELD_NUM; + +#define FIT_VIDEO_TITLE_FIELD_NUM_TEXT ((FIT_VIDEO_TITLE_FIELD_NUM)1) +#define FIT_VIDEO_TITLE_FIELD_NUM_MESSAGE_INDEX ((FIT_VIDEO_TITLE_FIELD_NUM)254) +#define FIT_VIDEO_TITLE_FIELD_NUM_MESSAGE_COUNT ((FIT_VIDEO_TITLE_FIELD_NUM)0) + +typedef enum +{ + FIT_VIDEO_TITLE_MESG_TEXT, + FIT_VIDEO_TITLE_MESG_MESSAGE_INDEX, + FIT_VIDEO_TITLE_MESG_MESSAGE_COUNT, + FIT_VIDEO_TITLE_MESG_FIELDS +} FIT_VIDEO_TITLE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_VIDEO_TITLE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_VIDEO_TITLE_MESG_DEF; + +// video_description message + +#define FIT_VIDEO_DESCRIPTION_MESG_SIZE 254 +#define FIT_VIDEO_DESCRIPTION_MESG_DEF_SIZE 14 +#define FIT_VIDEO_DESCRIPTION_MESG_TEXT_COUNT 250 + +typedef struct +{ + FIT_MESSAGE_INDEX message_index; // Long descriptions will be split into multiple parts + FIT_UINT16 message_count; // Total number of description parts + FIT_STRING text[FIT_VIDEO_DESCRIPTION_MESG_TEXT_COUNT]; // +} FIT_VIDEO_DESCRIPTION_MESG; + +typedef FIT_UINT8 FIT_VIDEO_DESCRIPTION_FIELD_NUM; + +#define FIT_VIDEO_DESCRIPTION_FIELD_NUM_MESSAGE_INDEX ((FIT_VIDEO_DESCRIPTION_FIELD_NUM)254) +#define FIT_VIDEO_DESCRIPTION_FIELD_NUM_MESSAGE_COUNT ((FIT_VIDEO_DESCRIPTION_FIELD_NUM)0) +#define FIT_VIDEO_DESCRIPTION_FIELD_NUM_TEXT ((FIT_VIDEO_DESCRIPTION_FIELD_NUM)1) + +typedef enum +{ + FIT_VIDEO_DESCRIPTION_MESG_MESSAGE_INDEX, + FIT_VIDEO_DESCRIPTION_MESG_MESSAGE_COUNT, + FIT_VIDEO_DESCRIPTION_MESG_TEXT, + FIT_VIDEO_DESCRIPTION_MESG_FIELDS +} FIT_VIDEO_DESCRIPTION_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_VIDEO_DESCRIPTION_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_VIDEO_DESCRIPTION_MESG_DEF; + +// set message + +#define FIT_SET_MESG_SIZE 2 +#define FIT_SET_MESG_DEF_SIZE 8 + +typedef struct +{ + FIT_FIT_BASE_UNIT weight_display_unit; // +} FIT_SET_MESG; + +typedef FIT_UINT8 FIT_SET_FIELD_NUM; + +#define FIT_SET_FIELD_NUM_WEIGHT_DISPLAY_UNIT ((FIT_SET_FIELD_NUM)9) + +typedef enum +{ + FIT_SET_MESG_WEIGHT_DISPLAY_UNIT, + FIT_SET_MESG_FIELDS +} FIT_SET_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_SET_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_SET_MESG_DEF; + +// field_description message + +#define FIT_FIELD_DESCRIPTION_MESG_SIZE 90 +#define FIT_FIELD_DESCRIPTION_MESG_DEF_SIZE 35 +#define FIT_FIELD_DESCRIPTION_MESG_FIELD_NAME_COUNT 64 +#define FIT_FIELD_DESCRIPTION_MESG_UNITS_COUNT 16 + +typedef struct +{ + FIT_STRING field_name[FIT_FIELD_DESCRIPTION_MESG_FIELD_NAME_COUNT]; // + FIT_STRING units[FIT_FIELD_DESCRIPTION_MESG_UNITS_COUNT]; // + FIT_FIT_BASE_UNIT fit_base_unit_id; // + FIT_MESG_NUM native_mesg_num; // + FIT_UINT8 developer_data_index; // + FIT_UINT8 field_definition_number; // + FIT_FIT_BASE_TYPE fit_base_type_id; // + FIT_UINT8 scale; // + FIT_SINT8 offset; // + FIT_UINT8 native_field_num; // +} FIT_FIELD_DESCRIPTION_MESG; + +typedef FIT_UINT8 FIT_FIELD_DESCRIPTION_FIELD_NUM; + +#define FIT_FIELD_DESCRIPTION_FIELD_NUM_FIELD_NAME ((FIT_FIELD_DESCRIPTION_FIELD_NUM)3) +#define FIT_FIELD_DESCRIPTION_FIELD_NUM_UNITS ((FIT_FIELD_DESCRIPTION_FIELD_NUM)8) +#define FIT_FIELD_DESCRIPTION_FIELD_NUM_FIT_BASE_UNIT_ID ((FIT_FIELD_DESCRIPTION_FIELD_NUM)13) +#define FIT_FIELD_DESCRIPTION_FIELD_NUM_NATIVE_MESG_NUM ((FIT_FIELD_DESCRIPTION_FIELD_NUM)14) +#define FIT_FIELD_DESCRIPTION_FIELD_NUM_DEVELOPER_DATA_INDEX ((FIT_FIELD_DESCRIPTION_FIELD_NUM)0) +#define FIT_FIELD_DESCRIPTION_FIELD_NUM_FIELD_DEFINITION_NUMBER ((FIT_FIELD_DESCRIPTION_FIELD_NUM)1) +#define FIT_FIELD_DESCRIPTION_FIELD_NUM_FIT_BASE_TYPE_ID ((FIT_FIELD_DESCRIPTION_FIELD_NUM)2) +#define FIT_FIELD_DESCRIPTION_FIELD_NUM_SCALE ((FIT_FIELD_DESCRIPTION_FIELD_NUM)6) +#define FIT_FIELD_DESCRIPTION_FIELD_NUM_OFFSET ((FIT_FIELD_DESCRIPTION_FIELD_NUM)7) +#define FIT_FIELD_DESCRIPTION_FIELD_NUM_NATIVE_FIELD_NUM ((FIT_FIELD_DESCRIPTION_FIELD_NUM)15) + +typedef enum +{ + FIT_FIELD_DESCRIPTION_MESG_FIELD_NAME, + FIT_FIELD_DESCRIPTION_MESG_UNITS, + FIT_FIELD_DESCRIPTION_MESG_FIT_BASE_UNIT_ID, + FIT_FIELD_DESCRIPTION_MESG_NATIVE_MESG_NUM, + FIT_FIELD_DESCRIPTION_MESG_DEVELOPER_DATA_INDEX, + FIT_FIELD_DESCRIPTION_MESG_FIELD_DEFINITION_NUMBER, + FIT_FIELD_DESCRIPTION_MESG_FIT_BASE_TYPE_ID, + FIT_FIELD_DESCRIPTION_MESG_SCALE, + FIT_FIELD_DESCRIPTION_MESG_OFFSET, + FIT_FIELD_DESCRIPTION_MESG_NATIVE_FIELD_NUM, + FIT_FIELD_DESCRIPTION_MESG_FIELDS +} FIT_FIELD_DESCRIPTION_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_FIELD_DESCRIPTION_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_FIELD_DESCRIPTION_MESG_DEF; + +// developer_data_id message + +#define FIT_DEVELOPER_DATA_ID_MESG_SIZE 39 +#define FIT_DEVELOPER_DATA_ID_MESG_DEF_SIZE 20 +#define FIT_DEVELOPER_DATA_ID_MESG_DEVELOPER_ID_COUNT 16 +#define FIT_DEVELOPER_DATA_ID_MESG_APPLICATION_ID_COUNT 16 + +typedef struct +{ + FIT_BYTE developer_id[FIT_DEVELOPER_DATA_ID_MESG_DEVELOPER_ID_COUNT]; // + FIT_BYTE application_id[FIT_DEVELOPER_DATA_ID_MESG_APPLICATION_ID_COUNT]; // + FIT_UINT32 application_version; // + FIT_MANUFACTURER manufacturer_id; // + FIT_UINT8 developer_data_index; // +} FIT_DEVELOPER_DATA_ID_MESG; + +typedef FIT_UINT8 FIT_DEVELOPER_DATA_ID_FIELD_NUM; + +#define FIT_DEVELOPER_DATA_ID_FIELD_NUM_DEVELOPER_ID ((FIT_DEVELOPER_DATA_ID_FIELD_NUM)0) +#define FIT_DEVELOPER_DATA_ID_FIELD_NUM_APPLICATION_ID ((FIT_DEVELOPER_DATA_ID_FIELD_NUM)1) +#define FIT_DEVELOPER_DATA_ID_FIELD_NUM_APPLICATION_VERSION ((FIT_DEVELOPER_DATA_ID_FIELD_NUM)4) +#define FIT_DEVELOPER_DATA_ID_FIELD_NUM_MANUFACTURER_ID ((FIT_DEVELOPER_DATA_ID_FIELD_NUM)2) +#define FIT_DEVELOPER_DATA_ID_FIELD_NUM_DEVELOPER_DATA_INDEX ((FIT_DEVELOPER_DATA_ID_FIELD_NUM)3) + +typedef enum +{ + FIT_DEVELOPER_DATA_ID_MESG_DEVELOPER_ID, + FIT_DEVELOPER_DATA_ID_MESG_APPLICATION_ID, + FIT_DEVELOPER_DATA_ID_MESG_APPLICATION_VERSION, + FIT_DEVELOPER_DATA_ID_MESG_MANUFACTURER_ID, + FIT_DEVELOPER_DATA_ID_MESG_DEVELOPER_DATA_INDEX, + FIT_DEVELOPER_DATA_ID_MESG_FIELDS +} FIT_DEVELOPER_DATA_ID_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_DEVELOPER_DATA_ID_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_DEVELOPER_DATA_ID_MESG_DEF; + +// course message + +#define FIT_COURSE_MESG_SIZE 22 +#define FIT_COURSE_MESG_DEF_SIZE 17 +#define FIT_COURSE_MESG_NAME_COUNT 16 + +typedef struct +{ + FIT_STRING name[FIT_COURSE_MESG_NAME_COUNT]; // + FIT_COURSE_CAPABILITIES capabilities; // + FIT_SPORT sport; // + FIT_SUB_SPORT sub_sport; // +} FIT_COURSE_MESG; + +typedef FIT_UINT8 FIT_COURSE_FIELD_NUM; + +#define FIT_COURSE_FIELD_NUM_NAME ((FIT_COURSE_FIELD_NUM)5) +#define FIT_COURSE_FIELD_NUM_CAPABILITIES ((FIT_COURSE_FIELD_NUM)6) +#define FIT_COURSE_FIELD_NUM_SPORT ((FIT_COURSE_FIELD_NUM)4) +#define FIT_COURSE_FIELD_NUM_SUB_SPORT ((FIT_COURSE_FIELD_NUM)7) + +typedef enum +{ + FIT_COURSE_MESG_NAME, + FIT_COURSE_MESG_CAPABILITIES, + FIT_COURSE_MESG_SPORT, + FIT_COURSE_MESG_SUB_SPORT, + FIT_COURSE_MESG_FIELDS +} FIT_COURSE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_COURSE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_COURSE_MESG_DEF; + +// course_point message + +#define FIT_COURSE_POINT_MESG_SIZE 36 +#define FIT_COURSE_POINT_MESG_DEF_SIZE 29 +#define FIT_COURSE_POINT_MESG_NAME_COUNT 16 + +typedef struct +{ + FIT_DATE_TIME timestamp; // + FIT_SINT32 position_lat; // 1 * semicircles + 0, + FIT_SINT32 position_long; // 1 * semicircles + 0, + FIT_UINT32 distance; // 100 * m + 0, + FIT_STRING name[FIT_COURSE_POINT_MESG_NAME_COUNT]; // + FIT_MESSAGE_INDEX message_index; // + FIT_COURSE_POINT type; // + FIT_BOOL favorite; // +} FIT_COURSE_POINT_MESG; + +typedef FIT_UINT8 FIT_COURSE_POINT_FIELD_NUM; + +#define FIT_COURSE_POINT_FIELD_NUM_TIMESTAMP ((FIT_COURSE_POINT_FIELD_NUM)1) +#define FIT_COURSE_POINT_FIELD_NUM_POSITION_LAT ((FIT_COURSE_POINT_FIELD_NUM)2) +#define FIT_COURSE_POINT_FIELD_NUM_POSITION_LONG ((FIT_COURSE_POINT_FIELD_NUM)3) +#define FIT_COURSE_POINT_FIELD_NUM_DISTANCE ((FIT_COURSE_POINT_FIELD_NUM)4) +#define FIT_COURSE_POINT_FIELD_NUM_NAME ((FIT_COURSE_POINT_FIELD_NUM)6) +#define FIT_COURSE_POINT_FIELD_NUM_MESSAGE_INDEX ((FIT_COURSE_POINT_FIELD_NUM)254) +#define FIT_COURSE_POINT_FIELD_NUM_TYPE ((FIT_COURSE_POINT_FIELD_NUM)5) +#define FIT_COURSE_POINT_FIELD_NUM_FAVORITE ((FIT_COURSE_POINT_FIELD_NUM)8) + +typedef enum +{ + FIT_COURSE_POINT_MESG_TIMESTAMP, + FIT_COURSE_POINT_MESG_POSITION_LAT, + FIT_COURSE_POINT_MESG_POSITION_LONG, + FIT_COURSE_POINT_MESG_DISTANCE, + FIT_COURSE_POINT_MESG_NAME, + FIT_COURSE_POINT_MESG_MESSAGE_INDEX, + FIT_COURSE_POINT_MESG_TYPE, + FIT_COURSE_POINT_MESG_FAVORITE, + FIT_COURSE_POINT_MESG_FIELDS +} FIT_COURSE_POINT_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_COURSE_POINT_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_COURSE_POINT_MESG_DEF; + +// segment_id message + +#define FIT_SEGMENT_ID_MESG_SIZE 15 +#define FIT_SEGMENT_ID_MESG_DEF_SIZE 32 +#define FIT_SEGMENT_ID_MESG_NAME_COUNT 1 +#define FIT_SEGMENT_ID_MESG_UUID_COUNT 1 + +typedef struct +{ + FIT_UINT32 user_profile_primary_key; // Primary key of the user that created the segment + FIT_UINT32 device_id; // ID of the device that created the segment + FIT_STRING name[FIT_SEGMENT_ID_MESG_NAME_COUNT]; // Friendly name assigned to segment + FIT_STRING uuid[FIT_SEGMENT_ID_MESG_UUID_COUNT]; // UUID of the segment + FIT_SPORT sport; // Sport associated with the segment + FIT_BOOL enabled; // Segment enabled for evaluation + FIT_UINT8 default_race_leader; // Index for the Leader Board entry selected as the default race participant + FIT_SEGMENT_DELETE_STATUS delete_status; // Indicates if any segments should be deleted + FIT_SEGMENT_SELECTION_TYPE selection_type; // Indicates how the segment was selected to be sent to the device +} FIT_SEGMENT_ID_MESG; + +typedef FIT_UINT8 FIT_SEGMENT_ID_FIELD_NUM; + +#define FIT_SEGMENT_ID_FIELD_NUM_USER_PROFILE_PRIMARY_KEY ((FIT_SEGMENT_ID_FIELD_NUM)4) +#define FIT_SEGMENT_ID_FIELD_NUM_DEVICE_ID ((FIT_SEGMENT_ID_FIELD_NUM)5) +#define FIT_SEGMENT_ID_FIELD_NUM_NAME ((FIT_SEGMENT_ID_FIELD_NUM)0) +#define FIT_SEGMENT_ID_FIELD_NUM_UUID ((FIT_SEGMENT_ID_FIELD_NUM)1) +#define FIT_SEGMENT_ID_FIELD_NUM_SPORT ((FIT_SEGMENT_ID_FIELD_NUM)2) +#define FIT_SEGMENT_ID_FIELD_NUM_ENABLED ((FIT_SEGMENT_ID_FIELD_NUM)3) +#define FIT_SEGMENT_ID_FIELD_NUM_DEFAULT_RACE_LEADER ((FIT_SEGMENT_ID_FIELD_NUM)6) +#define FIT_SEGMENT_ID_FIELD_NUM_DELETE_STATUS ((FIT_SEGMENT_ID_FIELD_NUM)7) +#define FIT_SEGMENT_ID_FIELD_NUM_SELECTION_TYPE ((FIT_SEGMENT_ID_FIELD_NUM)8) + +typedef enum +{ + FIT_SEGMENT_ID_MESG_USER_PROFILE_PRIMARY_KEY, + FIT_SEGMENT_ID_MESG_DEVICE_ID, + FIT_SEGMENT_ID_MESG_NAME, + FIT_SEGMENT_ID_MESG_UUID, + FIT_SEGMENT_ID_MESG_SPORT, + FIT_SEGMENT_ID_MESG_ENABLED, + FIT_SEGMENT_ID_MESG_DEFAULT_RACE_LEADER, + FIT_SEGMENT_ID_MESG_DELETE_STATUS, + FIT_SEGMENT_ID_MESG_SELECTION_TYPE, + FIT_SEGMENT_ID_MESG_FIELDS +} FIT_SEGMENT_ID_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_SEGMENT_ID_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_SEGMENT_ID_MESG_DEF; + +// segment_leaderboard_entry message + +#define FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_SIZE 16 +#define FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_DEF_SIZE 23 +#define FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_NAME_COUNT 1 + +typedef struct +{ + FIT_UINT32 group_primary_key; // Primary user ID of this leader + FIT_UINT32 activity_id; // ID of the activity associated with this leader time + FIT_UINT32 segment_time; // 1000 * s + 0, Segment Time (includes pauses) + FIT_MESSAGE_INDEX message_index; // + FIT_STRING name[FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_NAME_COUNT]; // Friendly name assigned to leader + FIT_SEGMENT_LEADERBOARD_TYPE type; // Leader classification +} FIT_SEGMENT_LEADERBOARD_ENTRY_MESG; + +typedef FIT_UINT8 FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM; + +#define FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM_GROUP_PRIMARY_KEY ((FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM)2) +#define FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM_ACTIVITY_ID ((FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM)3) +#define FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM_SEGMENT_TIME ((FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM)4) +#define FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM_MESSAGE_INDEX ((FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM)254) +#define FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM_NAME ((FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM)0) +#define FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM_TYPE ((FIT_SEGMENT_LEADERBOARD_ENTRY_FIELD_NUM)1) + +typedef enum +{ + FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_GROUP_PRIMARY_KEY, + FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_ACTIVITY_ID, + FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_SEGMENT_TIME, + FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_MESSAGE_INDEX, + FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_NAME, + FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_TYPE, + FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_FIELDS +} FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_SEGMENT_LEADERBOARD_ENTRY_MESG_DEF; + +// segment_point message + +#define FIT_SEGMENT_POINT_MESG_SIZE 20 +#define FIT_SEGMENT_POINT_MESG_DEF_SIZE 23 +#define FIT_SEGMENT_POINT_MESG_LEADER_TIME_COUNT 1 + +typedef struct +{ + FIT_SINT32 position_lat; // 1 * semicircles + 0, + FIT_SINT32 position_long; // 1 * semicircles + 0, + FIT_UINT32 distance; // 100 * m + 0, Accumulated distance along the segment at the described point + FIT_UINT32 leader_time[FIT_SEGMENT_POINT_MESG_LEADER_TIME_COUNT]; // 1000 * s + 0, Accumualted time each leader board member required to reach the described point. This value is zero for all leader board members at the starting point of the segment. + FIT_MESSAGE_INDEX message_index; // + FIT_UINT16 altitude; // 5 * m + 500, Accumulated altitude along the segment at the described point +} FIT_SEGMENT_POINT_MESG; + +typedef FIT_UINT8 FIT_SEGMENT_POINT_FIELD_NUM; + +#define FIT_SEGMENT_POINT_FIELD_NUM_POSITION_LAT ((FIT_SEGMENT_POINT_FIELD_NUM)1) +#define FIT_SEGMENT_POINT_FIELD_NUM_POSITION_LONG ((FIT_SEGMENT_POINT_FIELD_NUM)2) +#define FIT_SEGMENT_POINT_FIELD_NUM_DISTANCE ((FIT_SEGMENT_POINT_FIELD_NUM)3) +#define FIT_SEGMENT_POINT_FIELD_NUM_LEADER_TIME ((FIT_SEGMENT_POINT_FIELD_NUM)5) +#define FIT_SEGMENT_POINT_FIELD_NUM_MESSAGE_INDEX ((FIT_SEGMENT_POINT_FIELD_NUM)254) +#define FIT_SEGMENT_POINT_FIELD_NUM_ALTITUDE ((FIT_SEGMENT_POINT_FIELD_NUM)4) + +typedef enum +{ + FIT_SEGMENT_POINT_MESG_POSITION_LAT, + FIT_SEGMENT_POINT_MESG_POSITION_LONG, + FIT_SEGMENT_POINT_MESG_DISTANCE, + FIT_SEGMENT_POINT_MESG_LEADER_TIME, + FIT_SEGMENT_POINT_MESG_MESSAGE_INDEX, + FIT_SEGMENT_POINT_MESG_ALTITUDE, + FIT_SEGMENT_POINT_MESG_FIELDS +} FIT_SEGMENT_POINT_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_SEGMENT_POINT_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_SEGMENT_POINT_MESG_DEF; + +// segment_lap message + +#define FIT_SEGMENT_LAP_MESG_SIZE 210 +#define FIT_SEGMENT_LAP_MESG_DEF_SIZE 224 +#define FIT_SEGMENT_LAP_MESG_NAME_COUNT 16 +#define FIT_SEGMENT_LAP_MESG_TIME_IN_HR_ZONE_COUNT 1 +#define FIT_SEGMENT_LAP_MESG_TIME_IN_SPEED_ZONE_COUNT 1 +#define FIT_SEGMENT_LAP_MESG_TIME_IN_CADENCE_ZONE_COUNT 1 +#define FIT_SEGMENT_LAP_MESG_TIME_IN_POWER_ZONE_COUNT 1 +#define FIT_SEGMENT_LAP_MESG_UUID_COUNT 33 + +typedef struct +{ + FIT_DATE_TIME timestamp; // 1 * s + 0, Lap end time. + FIT_DATE_TIME start_time; // + FIT_SINT32 start_position_lat; // 1 * semicircles + 0, + FIT_SINT32 start_position_long; // 1 * semicircles + 0, + FIT_SINT32 end_position_lat; // 1 * semicircles + 0, + FIT_SINT32 end_position_long; // 1 * semicircles + 0, + FIT_UINT32 total_elapsed_time; // 1000 * s + 0, Time (includes pauses) + FIT_UINT32 total_timer_time; // 1000 * s + 0, Timer Time (excludes pauses) + FIT_UINT32 total_distance; // 100 * m + 0, + FIT_UINT32 total_cycles; // 1 * cycles + 0, + FIT_SINT32 nec_lat; // 1 * semicircles + 0, North east corner latitude. + FIT_SINT32 nec_long; // 1 * semicircles + 0, North east corner longitude. + FIT_SINT32 swc_lat; // 1 * semicircles + 0, South west corner latitude. + FIT_SINT32 swc_long; // 1 * semicircles + 0, South west corner latitude. + FIT_STRING name[FIT_SEGMENT_LAP_MESG_NAME_COUNT]; // + FIT_UINT32 total_work; // 1 * J + 0, + FIT_UINT32 total_moving_time; // 1000 * s + 0, + FIT_UINT32 time_in_hr_zone[FIT_SEGMENT_LAP_MESG_TIME_IN_HR_ZONE_COUNT]; // 1000 * s + 0, + FIT_UINT32 time_in_speed_zone[FIT_SEGMENT_LAP_MESG_TIME_IN_SPEED_ZONE_COUNT]; // 1000 * s + 0, + FIT_UINT32 time_in_cadence_zone[FIT_SEGMENT_LAP_MESG_TIME_IN_CADENCE_ZONE_COUNT]; // 1000 * s + 0, + FIT_UINT32 time_in_power_zone[FIT_SEGMENT_LAP_MESG_TIME_IN_POWER_ZONE_COUNT]; // 1000 * s + 0, + FIT_UINT32 active_time; // 1000 * s + 0, + FIT_MESSAGE_INDEX message_index; // + FIT_UINT16 total_calories; // 1 * kcal + 0, + FIT_UINT16 total_fat_calories; // 1 * kcal + 0, If New Leaf + FIT_UINT16 avg_speed; // 1000 * m/s + 0, + FIT_UINT16 max_speed; // 1000 * m/s + 0, + FIT_UINT16 avg_power; // 1 * watts + 0, total_power / total_timer_time if non_zero_avg_power otherwise total_power / total_elapsed_time + FIT_UINT16 max_power; // 1 * watts + 0, + FIT_UINT16 total_ascent; // 1 * m + 0, + FIT_UINT16 total_descent; // 1 * m + 0, + FIT_UINT16 normalized_power; // 1 * watts + 0, + FIT_LEFT_RIGHT_BALANCE_100 left_right_balance; // + FIT_UINT16 avg_altitude; // 5 * m + 500, + FIT_UINT16 max_altitude; // 5 * m + 500, + FIT_SINT16 avg_grade; // 100 * % + 0, + FIT_SINT16 avg_pos_grade; // 100 * % + 0, + FIT_SINT16 avg_neg_grade; // 100 * % + 0, + FIT_SINT16 max_pos_grade; // 100 * % + 0, + FIT_SINT16 max_neg_grade; // 100 * % + 0, + FIT_SINT16 avg_pos_vertical_speed; // 1000 * m/s + 0, + FIT_SINT16 avg_neg_vertical_speed; // 1000 * m/s + 0, + FIT_SINT16 max_pos_vertical_speed; // 1000 * m/s + 0, + FIT_SINT16 max_neg_vertical_speed; // 1000 * m/s + 0, + FIT_UINT16 repetition_num; // + FIT_UINT16 min_altitude; // 5 * m + 500, + FIT_MESSAGE_INDEX wkt_step_index; // + FIT_UINT16 front_gear_shift_count; // + FIT_UINT16 rear_gear_shift_count; // + FIT_EVENT event; // + FIT_EVENT_TYPE event_type; // + FIT_UINT8 avg_heart_rate; // 1 * bpm + 0, + FIT_UINT8 max_heart_rate; // 1 * bpm + 0, + FIT_UINT8 avg_cadence; // 1 * rpm + 0, total_cycles / total_timer_time if non_zero_avg_cadence otherwise total_cycles / total_elapsed_time + FIT_UINT8 max_cadence; // 1 * rpm + 0, + FIT_SPORT sport; // + FIT_UINT8 event_group; // + FIT_SUB_SPORT sub_sport; // + FIT_UINT8 gps_accuracy; // 1 * m + 0, + FIT_SINT8 avg_temperature; // 1 * C + 0, + FIT_SINT8 max_temperature; // 1 * C + 0, + FIT_UINT8 min_heart_rate; // 1 * bpm + 0, + FIT_SPORT_EVENT sport_event; // + FIT_UINT8 avg_left_torque_effectiveness; // 2 * percent + 0, + FIT_UINT8 avg_right_torque_effectiveness; // 2 * percent + 0, + FIT_UINT8 avg_left_pedal_smoothness; // 2 * percent + 0, + FIT_UINT8 avg_right_pedal_smoothness; // 2 * percent + 0, + FIT_UINT8 avg_combined_pedal_smoothness; // 2 * percent + 0, + FIT_SEGMENT_LAP_STATUS status; // + FIT_STRING uuid[FIT_SEGMENT_LAP_MESG_UUID_COUNT]; // + FIT_UINT8 avg_fractional_cadence; // 128 * rpm + 0, fractional part of the avg_cadence + FIT_UINT8 max_fractional_cadence; // 128 * rpm + 0, fractional part of the max_cadence + FIT_UINT8 total_fractional_cycles; // 128 * cycles + 0, fractional part of the total_cycles +} FIT_SEGMENT_LAP_MESG; + +typedef FIT_UINT8 FIT_SEGMENT_LAP_FIELD_NUM; + +#define FIT_SEGMENT_LAP_FIELD_NUM_TIMESTAMP ((FIT_SEGMENT_LAP_FIELD_NUM)253) +#define FIT_SEGMENT_LAP_FIELD_NUM_START_TIME ((FIT_SEGMENT_LAP_FIELD_NUM)2) +#define FIT_SEGMENT_LAP_FIELD_NUM_START_POSITION_LAT ((FIT_SEGMENT_LAP_FIELD_NUM)3) +#define FIT_SEGMENT_LAP_FIELD_NUM_START_POSITION_LONG ((FIT_SEGMENT_LAP_FIELD_NUM)4) +#define FIT_SEGMENT_LAP_FIELD_NUM_END_POSITION_LAT ((FIT_SEGMENT_LAP_FIELD_NUM)5) +#define FIT_SEGMENT_LAP_FIELD_NUM_END_POSITION_LONG ((FIT_SEGMENT_LAP_FIELD_NUM)6) +#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_ELAPSED_TIME ((FIT_SEGMENT_LAP_FIELD_NUM)7) +#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_TIMER_TIME ((FIT_SEGMENT_LAP_FIELD_NUM)8) +#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_DISTANCE ((FIT_SEGMENT_LAP_FIELD_NUM)9) +#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_CYCLES ((FIT_SEGMENT_LAP_FIELD_NUM)10) +#define FIT_SEGMENT_LAP_FIELD_NUM_NEC_LAT ((FIT_SEGMENT_LAP_FIELD_NUM)25) +#define FIT_SEGMENT_LAP_FIELD_NUM_NEC_LONG ((FIT_SEGMENT_LAP_FIELD_NUM)26) +#define FIT_SEGMENT_LAP_FIELD_NUM_SWC_LAT ((FIT_SEGMENT_LAP_FIELD_NUM)27) +#define FIT_SEGMENT_LAP_FIELD_NUM_SWC_LONG ((FIT_SEGMENT_LAP_FIELD_NUM)28) +#define FIT_SEGMENT_LAP_FIELD_NUM_NAME ((FIT_SEGMENT_LAP_FIELD_NUM)29) +#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_WORK ((FIT_SEGMENT_LAP_FIELD_NUM)33) +#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_MOVING_TIME ((FIT_SEGMENT_LAP_FIELD_NUM)44) +#define FIT_SEGMENT_LAP_FIELD_NUM_TIME_IN_HR_ZONE ((FIT_SEGMENT_LAP_FIELD_NUM)49) +#define FIT_SEGMENT_LAP_FIELD_NUM_TIME_IN_SPEED_ZONE ((FIT_SEGMENT_LAP_FIELD_NUM)50) +#define FIT_SEGMENT_LAP_FIELD_NUM_TIME_IN_CADENCE_ZONE ((FIT_SEGMENT_LAP_FIELD_NUM)51) +#define FIT_SEGMENT_LAP_FIELD_NUM_TIME_IN_POWER_ZONE ((FIT_SEGMENT_LAP_FIELD_NUM)52) +#define FIT_SEGMENT_LAP_FIELD_NUM_ACTIVE_TIME ((FIT_SEGMENT_LAP_FIELD_NUM)56) +#define FIT_SEGMENT_LAP_FIELD_NUM_MESSAGE_INDEX ((FIT_SEGMENT_LAP_FIELD_NUM)254) +#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_CALORIES ((FIT_SEGMENT_LAP_FIELD_NUM)11) +#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_FAT_CALORIES ((FIT_SEGMENT_LAP_FIELD_NUM)12) +#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_SPEED ((FIT_SEGMENT_LAP_FIELD_NUM)13) +#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_SPEED ((FIT_SEGMENT_LAP_FIELD_NUM)14) +#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_POWER ((FIT_SEGMENT_LAP_FIELD_NUM)19) +#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_POWER ((FIT_SEGMENT_LAP_FIELD_NUM)20) +#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_ASCENT ((FIT_SEGMENT_LAP_FIELD_NUM)21) +#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_DESCENT ((FIT_SEGMENT_LAP_FIELD_NUM)22) +#define FIT_SEGMENT_LAP_FIELD_NUM_NORMALIZED_POWER ((FIT_SEGMENT_LAP_FIELD_NUM)30) +#define FIT_SEGMENT_LAP_FIELD_NUM_LEFT_RIGHT_BALANCE ((FIT_SEGMENT_LAP_FIELD_NUM)31) +#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_ALTITUDE ((FIT_SEGMENT_LAP_FIELD_NUM)34) +#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_ALTITUDE ((FIT_SEGMENT_LAP_FIELD_NUM)35) +#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_GRADE ((FIT_SEGMENT_LAP_FIELD_NUM)37) +#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_POS_GRADE ((FIT_SEGMENT_LAP_FIELD_NUM)38) +#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_NEG_GRADE ((FIT_SEGMENT_LAP_FIELD_NUM)39) +#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_POS_GRADE ((FIT_SEGMENT_LAP_FIELD_NUM)40) +#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_NEG_GRADE ((FIT_SEGMENT_LAP_FIELD_NUM)41) +#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_POS_VERTICAL_SPEED ((FIT_SEGMENT_LAP_FIELD_NUM)45) +#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_NEG_VERTICAL_SPEED ((FIT_SEGMENT_LAP_FIELD_NUM)46) +#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_POS_VERTICAL_SPEED ((FIT_SEGMENT_LAP_FIELD_NUM)47) +#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_NEG_VERTICAL_SPEED ((FIT_SEGMENT_LAP_FIELD_NUM)48) +#define FIT_SEGMENT_LAP_FIELD_NUM_REPETITION_NUM ((FIT_SEGMENT_LAP_FIELD_NUM)53) +#define FIT_SEGMENT_LAP_FIELD_NUM_MIN_ALTITUDE ((FIT_SEGMENT_LAP_FIELD_NUM)54) +#define FIT_SEGMENT_LAP_FIELD_NUM_WKT_STEP_INDEX ((FIT_SEGMENT_LAP_FIELD_NUM)57) +#define FIT_SEGMENT_LAP_FIELD_NUM_FRONT_GEAR_SHIFT_COUNT ((FIT_SEGMENT_LAP_FIELD_NUM)69) +#define FIT_SEGMENT_LAP_FIELD_NUM_REAR_GEAR_SHIFT_COUNT ((FIT_SEGMENT_LAP_FIELD_NUM)70) +#define FIT_SEGMENT_LAP_FIELD_NUM_EVENT ((FIT_SEGMENT_LAP_FIELD_NUM)0) +#define FIT_SEGMENT_LAP_FIELD_NUM_EVENT_TYPE ((FIT_SEGMENT_LAP_FIELD_NUM)1) +#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_HEART_RATE ((FIT_SEGMENT_LAP_FIELD_NUM)15) +#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_HEART_RATE ((FIT_SEGMENT_LAP_FIELD_NUM)16) +#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_CADENCE ((FIT_SEGMENT_LAP_FIELD_NUM)17) +#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_CADENCE ((FIT_SEGMENT_LAP_FIELD_NUM)18) +#define FIT_SEGMENT_LAP_FIELD_NUM_SPORT ((FIT_SEGMENT_LAP_FIELD_NUM)23) +#define FIT_SEGMENT_LAP_FIELD_NUM_EVENT_GROUP ((FIT_SEGMENT_LAP_FIELD_NUM)24) +#define FIT_SEGMENT_LAP_FIELD_NUM_SUB_SPORT ((FIT_SEGMENT_LAP_FIELD_NUM)32) +#define FIT_SEGMENT_LAP_FIELD_NUM_GPS_ACCURACY ((FIT_SEGMENT_LAP_FIELD_NUM)36) +#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_TEMPERATURE ((FIT_SEGMENT_LAP_FIELD_NUM)42) +#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_TEMPERATURE ((FIT_SEGMENT_LAP_FIELD_NUM)43) +#define FIT_SEGMENT_LAP_FIELD_NUM_MIN_HEART_RATE ((FIT_SEGMENT_LAP_FIELD_NUM)55) +#define FIT_SEGMENT_LAP_FIELD_NUM_SPORT_EVENT ((FIT_SEGMENT_LAP_FIELD_NUM)58) +#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_LEFT_TORQUE_EFFECTIVENESS ((FIT_SEGMENT_LAP_FIELD_NUM)59) +#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_RIGHT_TORQUE_EFFECTIVENESS ((FIT_SEGMENT_LAP_FIELD_NUM)60) +#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_LEFT_PEDAL_SMOOTHNESS ((FIT_SEGMENT_LAP_FIELD_NUM)61) +#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_RIGHT_PEDAL_SMOOTHNESS ((FIT_SEGMENT_LAP_FIELD_NUM)62) +#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_COMBINED_PEDAL_SMOOTHNESS ((FIT_SEGMENT_LAP_FIELD_NUM)63) +#define FIT_SEGMENT_LAP_FIELD_NUM_STATUS ((FIT_SEGMENT_LAP_FIELD_NUM)64) +#define FIT_SEGMENT_LAP_FIELD_NUM_UUID ((FIT_SEGMENT_LAP_FIELD_NUM)65) +#define FIT_SEGMENT_LAP_FIELD_NUM_AVG_FRACTIONAL_CADENCE ((FIT_SEGMENT_LAP_FIELD_NUM)66) +#define FIT_SEGMENT_LAP_FIELD_NUM_MAX_FRACTIONAL_CADENCE ((FIT_SEGMENT_LAP_FIELD_NUM)67) +#define FIT_SEGMENT_LAP_FIELD_NUM_TOTAL_FRACTIONAL_CYCLES ((FIT_SEGMENT_LAP_FIELD_NUM)68) + +typedef enum +{ + FIT_SEGMENT_LAP_MESG_TIMESTAMP, + FIT_SEGMENT_LAP_MESG_START_TIME, + FIT_SEGMENT_LAP_MESG_START_POSITION_LAT, + FIT_SEGMENT_LAP_MESG_START_POSITION_LONG, + FIT_SEGMENT_LAP_MESG_END_POSITION_LAT, + FIT_SEGMENT_LAP_MESG_END_POSITION_LONG, + FIT_SEGMENT_LAP_MESG_TOTAL_ELAPSED_TIME, + FIT_SEGMENT_LAP_MESG_TOTAL_TIMER_TIME, + FIT_SEGMENT_LAP_MESG_TOTAL_DISTANCE, + FIT_SEGMENT_LAP_MESG_TOTAL_CYCLES, + FIT_SEGMENT_LAP_MESG_NEC_LAT, + FIT_SEGMENT_LAP_MESG_NEC_LONG, + FIT_SEGMENT_LAP_MESG_SWC_LAT, + FIT_SEGMENT_LAP_MESG_SWC_LONG, + FIT_SEGMENT_LAP_MESG_NAME, + FIT_SEGMENT_LAP_MESG_TOTAL_WORK, + FIT_SEGMENT_LAP_MESG_TOTAL_MOVING_TIME, + FIT_SEGMENT_LAP_MESG_TIME_IN_HR_ZONE, + FIT_SEGMENT_LAP_MESG_TIME_IN_SPEED_ZONE, + FIT_SEGMENT_LAP_MESG_TIME_IN_CADENCE_ZONE, + FIT_SEGMENT_LAP_MESG_TIME_IN_POWER_ZONE, + FIT_SEGMENT_LAP_MESG_ACTIVE_TIME, + FIT_SEGMENT_LAP_MESG_MESSAGE_INDEX, + FIT_SEGMENT_LAP_MESG_TOTAL_CALORIES, + FIT_SEGMENT_LAP_MESG_TOTAL_FAT_CALORIES, + FIT_SEGMENT_LAP_MESG_AVG_SPEED, + FIT_SEGMENT_LAP_MESG_MAX_SPEED, + FIT_SEGMENT_LAP_MESG_AVG_POWER, + FIT_SEGMENT_LAP_MESG_MAX_POWER, + FIT_SEGMENT_LAP_MESG_TOTAL_ASCENT, + FIT_SEGMENT_LAP_MESG_TOTAL_DESCENT, + FIT_SEGMENT_LAP_MESG_NORMALIZED_POWER, + FIT_SEGMENT_LAP_MESG_LEFT_RIGHT_BALANCE, + FIT_SEGMENT_LAP_MESG_AVG_ALTITUDE, + FIT_SEGMENT_LAP_MESG_MAX_ALTITUDE, + FIT_SEGMENT_LAP_MESG_AVG_GRADE, + FIT_SEGMENT_LAP_MESG_AVG_POS_GRADE, + FIT_SEGMENT_LAP_MESG_AVG_NEG_GRADE, + FIT_SEGMENT_LAP_MESG_MAX_POS_GRADE, + FIT_SEGMENT_LAP_MESG_MAX_NEG_GRADE, + FIT_SEGMENT_LAP_MESG_AVG_POS_VERTICAL_SPEED, + FIT_SEGMENT_LAP_MESG_AVG_NEG_VERTICAL_SPEED, + FIT_SEGMENT_LAP_MESG_MAX_POS_VERTICAL_SPEED, + FIT_SEGMENT_LAP_MESG_MAX_NEG_VERTICAL_SPEED, + FIT_SEGMENT_LAP_MESG_REPETITION_NUM, + FIT_SEGMENT_LAP_MESG_MIN_ALTITUDE, + FIT_SEGMENT_LAP_MESG_WKT_STEP_INDEX, + FIT_SEGMENT_LAP_MESG_FRONT_GEAR_SHIFT_COUNT, + FIT_SEGMENT_LAP_MESG_REAR_GEAR_SHIFT_COUNT, + FIT_SEGMENT_LAP_MESG_EVENT, + FIT_SEGMENT_LAP_MESG_EVENT_TYPE, + FIT_SEGMENT_LAP_MESG_AVG_HEART_RATE, + FIT_SEGMENT_LAP_MESG_MAX_HEART_RATE, + FIT_SEGMENT_LAP_MESG_AVG_CADENCE, + FIT_SEGMENT_LAP_MESG_MAX_CADENCE, + FIT_SEGMENT_LAP_MESG_SPORT, + FIT_SEGMENT_LAP_MESG_EVENT_GROUP, + FIT_SEGMENT_LAP_MESG_SUB_SPORT, + FIT_SEGMENT_LAP_MESG_GPS_ACCURACY, + FIT_SEGMENT_LAP_MESG_AVG_TEMPERATURE, + FIT_SEGMENT_LAP_MESG_MAX_TEMPERATURE, + FIT_SEGMENT_LAP_MESG_MIN_HEART_RATE, + FIT_SEGMENT_LAP_MESG_SPORT_EVENT, + FIT_SEGMENT_LAP_MESG_AVG_LEFT_TORQUE_EFFECTIVENESS, + FIT_SEGMENT_LAP_MESG_AVG_RIGHT_TORQUE_EFFECTIVENESS, + FIT_SEGMENT_LAP_MESG_AVG_LEFT_PEDAL_SMOOTHNESS, + FIT_SEGMENT_LAP_MESG_AVG_RIGHT_PEDAL_SMOOTHNESS, + FIT_SEGMENT_LAP_MESG_AVG_COMBINED_PEDAL_SMOOTHNESS, + FIT_SEGMENT_LAP_MESG_STATUS, + FIT_SEGMENT_LAP_MESG_UUID, + FIT_SEGMENT_LAP_MESG_AVG_FRACTIONAL_CADENCE, + FIT_SEGMENT_LAP_MESG_MAX_FRACTIONAL_CADENCE, + FIT_SEGMENT_LAP_MESG_TOTAL_FRACTIONAL_CYCLES, + FIT_SEGMENT_LAP_MESG_FIELDS +} FIT_SEGMENT_LAP_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_SEGMENT_LAP_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_SEGMENT_LAP_MESG_DEF; + +// segment_file message + +#define FIT_SEGMENT_FILE_MESG_SIZE 17 +#define FIT_SEGMENT_FILE_MESG_DEF_SIZE 26 +#define FIT_SEGMENT_FILE_MESG_LEADER_GROUP_PRIMARY_KEY_COUNT 1 +#define FIT_SEGMENT_FILE_MESG_LEADER_ACTIVITY_ID_COUNT 1 +#define FIT_SEGMENT_FILE_MESG_FILE_UUID_COUNT 1 +#define FIT_SEGMENT_FILE_MESG_LEADER_TYPE_COUNT 1 + +typedef struct +{ + FIT_UINT32 user_profile_primary_key; // Primary key of the user that created the segment file + FIT_UINT32 leader_group_primary_key[FIT_SEGMENT_FILE_MESG_LEADER_GROUP_PRIMARY_KEY_COUNT]; // Group primary key of each leader in the segment file + FIT_UINT32 leader_activity_id[FIT_SEGMENT_FILE_MESG_LEADER_ACTIVITY_ID_COUNT]; // Activity ID of each leader in the segment file + FIT_MESSAGE_INDEX message_index; // + FIT_STRING file_uuid[FIT_SEGMENT_FILE_MESG_FILE_UUID_COUNT]; // UUID of the segment file + FIT_BOOL enabled; // Enabled state of the segment file + FIT_SEGMENT_LEADERBOARD_TYPE leader_type[FIT_SEGMENT_FILE_MESG_LEADER_TYPE_COUNT]; // Leader type of each leader in the segment file +} FIT_SEGMENT_FILE_MESG; + +typedef FIT_UINT8 FIT_SEGMENT_FILE_FIELD_NUM; + +#define FIT_SEGMENT_FILE_FIELD_NUM_USER_PROFILE_PRIMARY_KEY ((FIT_SEGMENT_FILE_FIELD_NUM)4) +#define FIT_SEGMENT_FILE_FIELD_NUM_LEADER_GROUP_PRIMARY_KEY ((FIT_SEGMENT_FILE_FIELD_NUM)8) +#define FIT_SEGMENT_FILE_FIELD_NUM_LEADER_ACTIVITY_ID ((FIT_SEGMENT_FILE_FIELD_NUM)9) +#define FIT_SEGMENT_FILE_FIELD_NUM_MESSAGE_INDEX ((FIT_SEGMENT_FILE_FIELD_NUM)254) +#define FIT_SEGMENT_FILE_FIELD_NUM_FILE_UUID ((FIT_SEGMENT_FILE_FIELD_NUM)1) +#define FIT_SEGMENT_FILE_FIELD_NUM_ENABLED ((FIT_SEGMENT_FILE_FIELD_NUM)3) +#define FIT_SEGMENT_FILE_FIELD_NUM_LEADER_TYPE ((FIT_SEGMENT_FILE_FIELD_NUM)7) + +typedef enum +{ + FIT_SEGMENT_FILE_MESG_USER_PROFILE_PRIMARY_KEY, + FIT_SEGMENT_FILE_MESG_LEADER_GROUP_PRIMARY_KEY, + FIT_SEGMENT_FILE_MESG_LEADER_ACTIVITY_ID, + FIT_SEGMENT_FILE_MESG_MESSAGE_INDEX, + FIT_SEGMENT_FILE_MESG_FILE_UUID, + FIT_SEGMENT_FILE_MESG_ENABLED, + FIT_SEGMENT_FILE_MESG_LEADER_TYPE, + FIT_SEGMENT_FILE_MESG_FIELDS +} FIT_SEGMENT_FILE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_SEGMENT_FILE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_SEGMENT_FILE_MESG_DEF; + +// workout message + +#define FIT_WORKOUT_MESG_SIZE 29 +#define FIT_WORKOUT_MESG_DEF_SIZE 29 +#define FIT_WORKOUT_MESG_WKT_NAME_COUNT 16 + +typedef struct +{ + FIT_WORKOUT_CAPABILITIES capabilities; // + FIT_STRING wkt_name[FIT_WORKOUT_MESG_WKT_NAME_COUNT]; // + FIT_MESSAGE_INDEX message_index; // + FIT_UINT16 num_valid_steps; // number of valid steps + FIT_UINT16 pool_length; // 100 * m + 0, + FIT_SPORT sport; // + FIT_SUB_SPORT sub_sport; // + FIT_DISPLAY_MEASURE pool_length_unit; // +} FIT_WORKOUT_MESG; + +typedef FIT_UINT8 FIT_WORKOUT_FIELD_NUM; + +#define FIT_WORKOUT_FIELD_NUM_CAPABILITIES ((FIT_WORKOUT_FIELD_NUM)5) +#define FIT_WORKOUT_FIELD_NUM_WKT_NAME ((FIT_WORKOUT_FIELD_NUM)8) +#define FIT_WORKOUT_FIELD_NUM_MESSAGE_INDEX ((FIT_WORKOUT_FIELD_NUM)254) +#define FIT_WORKOUT_FIELD_NUM_NUM_VALID_STEPS ((FIT_WORKOUT_FIELD_NUM)6) +#define FIT_WORKOUT_FIELD_NUM_POOL_LENGTH ((FIT_WORKOUT_FIELD_NUM)14) +#define FIT_WORKOUT_FIELD_NUM_SPORT ((FIT_WORKOUT_FIELD_NUM)4) +#define FIT_WORKOUT_FIELD_NUM_SUB_SPORT ((FIT_WORKOUT_FIELD_NUM)11) +#define FIT_WORKOUT_FIELD_NUM_POOL_LENGTH_UNIT ((FIT_WORKOUT_FIELD_NUM)15) + +typedef enum +{ + FIT_WORKOUT_MESG_CAPABILITIES, + FIT_WORKOUT_MESG_WKT_NAME, + FIT_WORKOUT_MESG_MESSAGE_INDEX, + FIT_WORKOUT_MESG_NUM_VALID_STEPS, + FIT_WORKOUT_MESG_POOL_LENGTH, + FIT_WORKOUT_MESG_SPORT, + FIT_WORKOUT_MESG_SUB_SPORT, + FIT_WORKOUT_MESG_POOL_LENGTH_UNIT, + FIT_WORKOUT_MESG_FIELDS +} FIT_WORKOUT_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_WORKOUT_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_WORKOUT_MESG_DEF; + +// workout_session message + +#define FIT_WORKOUT_SESSION_MESG_SIZE 11 +#define FIT_WORKOUT_SESSION_MESG_DEF_SIZE 26 + +typedef struct +{ + FIT_MESSAGE_INDEX message_index; // + FIT_UINT16 num_valid_steps; // + FIT_UINT16 first_step_index; // + FIT_UINT16 pool_length; // 100 * m + 0, + FIT_SPORT sport; // + FIT_SUB_SPORT sub_sport; // + FIT_DISPLAY_MEASURE pool_length_unit; // +} FIT_WORKOUT_SESSION_MESG; + +typedef FIT_UINT8 FIT_WORKOUT_SESSION_FIELD_NUM; + +#define FIT_WORKOUT_SESSION_FIELD_NUM_MESSAGE_INDEX ((FIT_WORKOUT_SESSION_FIELD_NUM)254) +#define FIT_WORKOUT_SESSION_FIELD_NUM_NUM_VALID_STEPS ((FIT_WORKOUT_SESSION_FIELD_NUM)2) +#define FIT_WORKOUT_SESSION_FIELD_NUM_FIRST_STEP_INDEX ((FIT_WORKOUT_SESSION_FIELD_NUM)3) +#define FIT_WORKOUT_SESSION_FIELD_NUM_POOL_LENGTH ((FIT_WORKOUT_SESSION_FIELD_NUM)4) +#define FIT_WORKOUT_SESSION_FIELD_NUM_SPORT ((FIT_WORKOUT_SESSION_FIELD_NUM)0) +#define FIT_WORKOUT_SESSION_FIELD_NUM_SUB_SPORT ((FIT_WORKOUT_SESSION_FIELD_NUM)1) +#define FIT_WORKOUT_SESSION_FIELD_NUM_POOL_LENGTH_UNIT ((FIT_WORKOUT_SESSION_FIELD_NUM)5) + +typedef enum +{ + FIT_WORKOUT_SESSION_MESG_MESSAGE_INDEX, + FIT_WORKOUT_SESSION_MESG_NUM_VALID_STEPS, + FIT_WORKOUT_SESSION_MESG_FIRST_STEP_INDEX, + FIT_WORKOUT_SESSION_MESG_POOL_LENGTH, + FIT_WORKOUT_SESSION_MESG_SPORT, + FIT_WORKOUT_SESSION_MESG_SUB_SPORT, + FIT_WORKOUT_SESSION_MESG_POOL_LENGTH_UNIT, + FIT_WORKOUT_SESSION_MESG_FIELDS +} FIT_WORKOUT_SESSION_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_WORKOUT_SESSION_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_WORKOUT_SESSION_MESG_DEF; + +// workout_step message + +#define FIT_WORKOUT_STEP_MESG_SIZE 103 +#define FIT_WORKOUT_STEP_MESG_DEF_SIZE 53 +#define FIT_WORKOUT_STEP_MESG_WKT_STEP_NAME_COUNT 16 +#define FIT_WORKOUT_STEP_MESG_NOTES_COUNT 50 + +typedef struct +{ + FIT_STRING wkt_step_name[FIT_WORKOUT_STEP_MESG_WKT_STEP_NAME_COUNT]; // + FIT_UINT32 duration_value; // + FIT_UINT32 target_value; // + FIT_UINT32 custom_target_value_low; // + FIT_UINT32 custom_target_value_high; // + FIT_UINT32 secondary_target_value; // + FIT_UINT32 secondary_custom_target_value_low; // + FIT_UINT32 secondary_custom_target_value_high; // + FIT_MESSAGE_INDEX message_index; // + FIT_EXERCISE_CATEGORY exercise_category; // + FIT_WKT_STEP_DURATION duration_type; // + FIT_WKT_STEP_TARGET target_type; // + FIT_INTENSITY intensity; // + FIT_STRING notes[FIT_WORKOUT_STEP_MESG_NOTES_COUNT]; // + FIT_WORKOUT_EQUIPMENT equipment; // + FIT_WKT_STEP_TARGET secondary_target_type; // +} FIT_WORKOUT_STEP_MESG; + +typedef FIT_UINT8 FIT_WORKOUT_STEP_FIELD_NUM; + +#define FIT_WORKOUT_STEP_FIELD_NUM_WKT_STEP_NAME ((FIT_WORKOUT_STEP_FIELD_NUM)0) +#define FIT_WORKOUT_STEP_FIELD_NUM_DURATION_VALUE ((FIT_WORKOUT_STEP_FIELD_NUM)2) +#define FIT_WORKOUT_STEP_FIELD_NUM_TARGET_VALUE ((FIT_WORKOUT_STEP_FIELD_NUM)4) +#define FIT_WORKOUT_STEP_FIELD_NUM_CUSTOM_TARGET_VALUE_LOW ((FIT_WORKOUT_STEP_FIELD_NUM)5) +#define FIT_WORKOUT_STEP_FIELD_NUM_CUSTOM_TARGET_VALUE_HIGH ((FIT_WORKOUT_STEP_FIELD_NUM)6) +#define FIT_WORKOUT_STEP_FIELD_NUM_SECONDARY_TARGET_VALUE ((FIT_WORKOUT_STEP_FIELD_NUM)20) +#define FIT_WORKOUT_STEP_FIELD_NUM_SECONDARY_CUSTOM_TARGET_VALUE_LOW ((FIT_WORKOUT_STEP_FIELD_NUM)21) +#define FIT_WORKOUT_STEP_FIELD_NUM_SECONDARY_CUSTOM_TARGET_VALUE_HIGH ((FIT_WORKOUT_STEP_FIELD_NUM)22) +#define FIT_WORKOUT_STEP_FIELD_NUM_MESSAGE_INDEX ((FIT_WORKOUT_STEP_FIELD_NUM)254) +#define FIT_WORKOUT_STEP_FIELD_NUM_EXERCISE_CATEGORY ((FIT_WORKOUT_STEP_FIELD_NUM)10) +#define FIT_WORKOUT_STEP_FIELD_NUM_DURATION_TYPE ((FIT_WORKOUT_STEP_FIELD_NUM)1) +#define FIT_WORKOUT_STEP_FIELD_NUM_TARGET_TYPE ((FIT_WORKOUT_STEP_FIELD_NUM)3) +#define FIT_WORKOUT_STEP_FIELD_NUM_INTENSITY ((FIT_WORKOUT_STEP_FIELD_NUM)7) +#define FIT_WORKOUT_STEP_FIELD_NUM_NOTES ((FIT_WORKOUT_STEP_FIELD_NUM)8) +#define FIT_WORKOUT_STEP_FIELD_NUM_EQUIPMENT ((FIT_WORKOUT_STEP_FIELD_NUM)9) +#define FIT_WORKOUT_STEP_FIELD_NUM_SECONDARY_TARGET_TYPE ((FIT_WORKOUT_STEP_FIELD_NUM)19) + +typedef enum +{ + FIT_WORKOUT_STEP_MESG_WKT_STEP_NAME, + FIT_WORKOUT_STEP_MESG_DURATION_VALUE, + FIT_WORKOUT_STEP_MESG_TARGET_VALUE, + FIT_WORKOUT_STEP_MESG_CUSTOM_TARGET_VALUE_LOW, + FIT_WORKOUT_STEP_MESG_CUSTOM_TARGET_VALUE_HIGH, + FIT_WORKOUT_STEP_MESG_SECONDARY_TARGET_VALUE, + FIT_WORKOUT_STEP_MESG_SECONDARY_CUSTOM_TARGET_VALUE_LOW, + FIT_WORKOUT_STEP_MESG_SECONDARY_CUSTOM_TARGET_VALUE_HIGH, + FIT_WORKOUT_STEP_MESG_MESSAGE_INDEX, + FIT_WORKOUT_STEP_MESG_EXERCISE_CATEGORY, + FIT_WORKOUT_STEP_MESG_DURATION_TYPE, + FIT_WORKOUT_STEP_MESG_TARGET_TYPE, + FIT_WORKOUT_STEP_MESG_INTENSITY, + FIT_WORKOUT_STEP_MESG_NOTES, + FIT_WORKOUT_STEP_MESG_EQUIPMENT, + FIT_WORKOUT_STEP_MESG_SECONDARY_TARGET_TYPE, + FIT_WORKOUT_STEP_MESG_FIELDS +} FIT_WORKOUT_STEP_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_WORKOUT_STEP_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_WORKOUT_STEP_MESG_DEF; + +// exercise_title message + +#define FIT_EXERCISE_TITLE_MESG_SIZE 206 +#define FIT_EXERCISE_TITLE_MESG_DEF_SIZE 17 +#define FIT_EXERCISE_TITLE_MESG_WKT_STEP_NAME_COUNT 200 + +typedef struct +{ + FIT_STRING wkt_step_name[FIT_EXERCISE_TITLE_MESG_WKT_STEP_NAME_COUNT]; // + FIT_MESSAGE_INDEX message_index; // + FIT_EXERCISE_CATEGORY exercise_category; // + FIT_UINT16 exercise_name; // +} FIT_EXERCISE_TITLE_MESG; + +typedef FIT_UINT8 FIT_EXERCISE_TITLE_FIELD_NUM; + +#define FIT_EXERCISE_TITLE_FIELD_NUM_WKT_STEP_NAME ((FIT_EXERCISE_TITLE_FIELD_NUM)2) +#define FIT_EXERCISE_TITLE_FIELD_NUM_MESSAGE_INDEX ((FIT_EXERCISE_TITLE_FIELD_NUM)254) +#define FIT_EXERCISE_TITLE_FIELD_NUM_EXERCISE_CATEGORY ((FIT_EXERCISE_TITLE_FIELD_NUM)0) +#define FIT_EXERCISE_TITLE_FIELD_NUM_EXERCISE_NAME ((FIT_EXERCISE_TITLE_FIELD_NUM)1) + +typedef enum +{ + FIT_EXERCISE_TITLE_MESG_WKT_STEP_NAME, + FIT_EXERCISE_TITLE_MESG_MESSAGE_INDEX, + FIT_EXERCISE_TITLE_MESG_EXERCISE_CATEGORY, + FIT_EXERCISE_TITLE_MESG_EXERCISE_NAME, + FIT_EXERCISE_TITLE_MESG_FIELDS +} FIT_EXERCISE_TITLE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_EXERCISE_TITLE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_EXERCISE_TITLE_MESG_DEF; + +// schedule message + +#define FIT_SCHEDULE_MESG_SIZE 18 +#define FIT_SCHEDULE_MESG_DEF_SIZE 26 + +typedef struct +{ + FIT_UINT32Z serial_number; // Corresponds to file_id of scheduled workout / course. + FIT_DATE_TIME time_created; // Corresponds to file_id of scheduled workout / course. + FIT_LOCAL_DATE_TIME scheduled_time; // + FIT_MANUFACTURER manufacturer; // Corresponds to file_id of scheduled workout / course. + FIT_UINT16 product; // Corresponds to file_id of scheduled workout / course. + FIT_BOOL completed; // TRUE if this activity has been started + FIT_SCHEDULE type; // +} FIT_SCHEDULE_MESG; + +typedef FIT_UINT8 FIT_SCHEDULE_FIELD_NUM; + +#define FIT_SCHEDULE_FIELD_NUM_SERIAL_NUMBER ((FIT_SCHEDULE_FIELD_NUM)2) +#define FIT_SCHEDULE_FIELD_NUM_TIME_CREATED ((FIT_SCHEDULE_FIELD_NUM)3) +#define FIT_SCHEDULE_FIELD_NUM_SCHEDULED_TIME ((FIT_SCHEDULE_FIELD_NUM)6) +#define FIT_SCHEDULE_FIELD_NUM_MANUFACTURER ((FIT_SCHEDULE_FIELD_NUM)0) +#define FIT_SCHEDULE_FIELD_NUM_PRODUCT ((FIT_SCHEDULE_FIELD_NUM)1) +#define FIT_SCHEDULE_FIELD_NUM_COMPLETED ((FIT_SCHEDULE_FIELD_NUM)4) +#define FIT_SCHEDULE_FIELD_NUM_TYPE ((FIT_SCHEDULE_FIELD_NUM)5) + +typedef enum +{ + FIT_SCHEDULE_MESG_SERIAL_NUMBER, + FIT_SCHEDULE_MESG_TIME_CREATED, + FIT_SCHEDULE_MESG_SCHEDULED_TIME, + FIT_SCHEDULE_MESG_MANUFACTURER, + FIT_SCHEDULE_MESG_PRODUCT, + FIT_SCHEDULE_MESG_COMPLETED, + FIT_SCHEDULE_MESG_TYPE, + FIT_SCHEDULE_MESG_FIELDS +} FIT_SCHEDULE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_SCHEDULE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_SCHEDULE_MESG_DEF; + +// totals message + +#define FIT_TOTALS_MESG_SIZE 29 +#define FIT_TOTALS_MESG_DEF_SIZE 32 + +typedef struct +{ + FIT_DATE_TIME timestamp; // 1 * s + 0, + FIT_UINT32 timer_time; // 1 * s + 0, Excludes pauses + FIT_UINT32 distance; // 1 * m + 0, + FIT_UINT32 calories; // 1 * kcal + 0, + FIT_UINT32 elapsed_time; // 1 * s + 0, Includes pauses + FIT_UINT32 active_time; // 1 * s + 0, + FIT_MESSAGE_INDEX message_index; // + FIT_UINT16 sessions; // + FIT_SPORT sport; // +} FIT_TOTALS_MESG; + +typedef FIT_UINT8 FIT_TOTALS_FIELD_NUM; + +#define FIT_TOTALS_FIELD_NUM_TIMESTAMP ((FIT_TOTALS_FIELD_NUM)253) +#define FIT_TOTALS_FIELD_NUM_TIMER_TIME ((FIT_TOTALS_FIELD_NUM)0) +#define FIT_TOTALS_FIELD_NUM_DISTANCE ((FIT_TOTALS_FIELD_NUM)1) +#define FIT_TOTALS_FIELD_NUM_CALORIES ((FIT_TOTALS_FIELD_NUM)2) +#define FIT_TOTALS_FIELD_NUM_ELAPSED_TIME ((FIT_TOTALS_FIELD_NUM)4) +#define FIT_TOTALS_FIELD_NUM_ACTIVE_TIME ((FIT_TOTALS_FIELD_NUM)6) +#define FIT_TOTALS_FIELD_NUM_MESSAGE_INDEX ((FIT_TOTALS_FIELD_NUM)254) +#define FIT_TOTALS_FIELD_NUM_SESSIONS ((FIT_TOTALS_FIELD_NUM)5) +#define FIT_TOTALS_FIELD_NUM_SPORT ((FIT_TOTALS_FIELD_NUM)3) + +typedef enum +{ + FIT_TOTALS_MESG_TIMESTAMP, + FIT_TOTALS_MESG_TIMER_TIME, + FIT_TOTALS_MESG_DISTANCE, + FIT_TOTALS_MESG_CALORIES, + FIT_TOTALS_MESG_ELAPSED_TIME, + FIT_TOTALS_MESG_ACTIVE_TIME, + FIT_TOTALS_MESG_MESSAGE_INDEX, + FIT_TOTALS_MESG_SESSIONS, + FIT_TOTALS_MESG_SPORT, + FIT_TOTALS_MESG_FIELDS +} FIT_TOTALS_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_TOTALS_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_TOTALS_MESG_DEF; + +// weight_scale message + +#define FIT_WEIGHT_SCALE_MESG_SIZE 27 +#define FIT_WEIGHT_SCALE_MESG_DEF_SIZE 47 + +typedef struct +{ + FIT_DATE_TIME timestamp; // 1 * s + 0, + FIT_WEIGHT weight; // 100 * kg + 0, + FIT_UINT16 percent_fat; // 100 * % + 0, + FIT_UINT16 percent_hydration; // 100 * % + 0, + FIT_UINT16 visceral_fat_mass; // 100 * kg + 0, + FIT_UINT16 bone_mass; // 100 * kg + 0, + FIT_UINT16 muscle_mass; // 100 * kg + 0, + FIT_UINT16 basal_met; // 4 * kcal/day + 0, + FIT_UINT16 active_met; // 4 * kcal/day + 0, ~4kJ per kcal, 0.25 allows max 16384 kcal + FIT_MESSAGE_INDEX user_profile_index; // Associates this weight scale message to a user. This corresponds to the index of the user profile message in the weight scale file. + FIT_UINT16 bmi; // 10 * kg/m^2 + 0, + FIT_UINT8 physique_rating; // + FIT_UINT8 metabolic_age; // 1 * years + 0, + FIT_UINT8 visceral_fat_rating; // +} FIT_WEIGHT_SCALE_MESG; + +typedef FIT_UINT8 FIT_WEIGHT_SCALE_FIELD_NUM; + +#define FIT_WEIGHT_SCALE_FIELD_NUM_TIMESTAMP ((FIT_WEIGHT_SCALE_FIELD_NUM)253) +#define FIT_WEIGHT_SCALE_FIELD_NUM_WEIGHT ((FIT_WEIGHT_SCALE_FIELD_NUM)0) +#define FIT_WEIGHT_SCALE_FIELD_NUM_PERCENT_FAT ((FIT_WEIGHT_SCALE_FIELD_NUM)1) +#define FIT_WEIGHT_SCALE_FIELD_NUM_PERCENT_HYDRATION ((FIT_WEIGHT_SCALE_FIELD_NUM)2) +#define FIT_WEIGHT_SCALE_FIELD_NUM_VISCERAL_FAT_MASS ((FIT_WEIGHT_SCALE_FIELD_NUM)3) +#define FIT_WEIGHT_SCALE_FIELD_NUM_BONE_MASS ((FIT_WEIGHT_SCALE_FIELD_NUM)4) +#define FIT_WEIGHT_SCALE_FIELD_NUM_MUSCLE_MASS ((FIT_WEIGHT_SCALE_FIELD_NUM)5) +#define FIT_WEIGHT_SCALE_FIELD_NUM_BASAL_MET ((FIT_WEIGHT_SCALE_FIELD_NUM)7) +#define FIT_WEIGHT_SCALE_FIELD_NUM_ACTIVE_MET ((FIT_WEIGHT_SCALE_FIELD_NUM)9) +#define FIT_WEIGHT_SCALE_FIELD_NUM_USER_PROFILE_INDEX ((FIT_WEIGHT_SCALE_FIELD_NUM)12) +#define FIT_WEIGHT_SCALE_FIELD_NUM_BMI ((FIT_WEIGHT_SCALE_FIELD_NUM)13) +#define FIT_WEIGHT_SCALE_FIELD_NUM_PHYSIQUE_RATING ((FIT_WEIGHT_SCALE_FIELD_NUM)8) +#define FIT_WEIGHT_SCALE_FIELD_NUM_METABOLIC_AGE ((FIT_WEIGHT_SCALE_FIELD_NUM)10) +#define FIT_WEIGHT_SCALE_FIELD_NUM_VISCERAL_FAT_RATING ((FIT_WEIGHT_SCALE_FIELD_NUM)11) + +typedef enum +{ + FIT_WEIGHT_SCALE_MESG_TIMESTAMP, + FIT_WEIGHT_SCALE_MESG_WEIGHT, + FIT_WEIGHT_SCALE_MESG_PERCENT_FAT, + FIT_WEIGHT_SCALE_MESG_PERCENT_HYDRATION, + FIT_WEIGHT_SCALE_MESG_VISCERAL_FAT_MASS, + FIT_WEIGHT_SCALE_MESG_BONE_MASS, + FIT_WEIGHT_SCALE_MESG_MUSCLE_MASS, + FIT_WEIGHT_SCALE_MESG_BASAL_MET, + FIT_WEIGHT_SCALE_MESG_ACTIVE_MET, + FIT_WEIGHT_SCALE_MESG_USER_PROFILE_INDEX, + FIT_WEIGHT_SCALE_MESG_BMI, + FIT_WEIGHT_SCALE_MESG_PHYSIQUE_RATING, + FIT_WEIGHT_SCALE_MESG_METABOLIC_AGE, + FIT_WEIGHT_SCALE_MESG_VISCERAL_FAT_RATING, + FIT_WEIGHT_SCALE_MESG_FIELDS +} FIT_WEIGHT_SCALE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_WEIGHT_SCALE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_WEIGHT_SCALE_MESG_DEF; + +// blood_pressure message + +#define FIT_BLOOD_PRESSURE_MESG_SIZE 21 +#define FIT_BLOOD_PRESSURE_MESG_DEF_SIZE 38 + +typedef struct +{ + FIT_DATE_TIME timestamp; // 1 * s + 0, + FIT_UINT16 systolic_pressure; // 1 * mmHg + 0, + FIT_UINT16 diastolic_pressure; // 1 * mmHg + 0, + FIT_UINT16 mean_arterial_pressure; // 1 * mmHg + 0, + FIT_UINT16 map_3_sample_mean; // 1 * mmHg + 0, + FIT_UINT16 map_morning_values; // 1 * mmHg + 0, + FIT_UINT16 map_evening_values; // 1 * mmHg + 0, + FIT_MESSAGE_INDEX user_profile_index; // Associates this blood pressure message to a user. This corresponds to the index of the user profile message in the blood pressure file. + FIT_UINT8 heart_rate; // 1 * bpm + 0, + FIT_HR_TYPE heart_rate_type; // + FIT_BP_STATUS status; // +} FIT_BLOOD_PRESSURE_MESG; + +typedef FIT_UINT8 FIT_BLOOD_PRESSURE_FIELD_NUM; + +#define FIT_BLOOD_PRESSURE_FIELD_NUM_TIMESTAMP ((FIT_BLOOD_PRESSURE_FIELD_NUM)253) +#define FIT_BLOOD_PRESSURE_FIELD_NUM_SYSTOLIC_PRESSURE ((FIT_BLOOD_PRESSURE_FIELD_NUM)0) +#define FIT_BLOOD_PRESSURE_FIELD_NUM_DIASTOLIC_PRESSURE ((FIT_BLOOD_PRESSURE_FIELD_NUM)1) +#define FIT_BLOOD_PRESSURE_FIELD_NUM_MEAN_ARTERIAL_PRESSURE ((FIT_BLOOD_PRESSURE_FIELD_NUM)2) +#define FIT_BLOOD_PRESSURE_FIELD_NUM_MAP_3_SAMPLE_MEAN ((FIT_BLOOD_PRESSURE_FIELD_NUM)3) +#define FIT_BLOOD_PRESSURE_FIELD_NUM_MAP_MORNING_VALUES ((FIT_BLOOD_PRESSURE_FIELD_NUM)4) +#define FIT_BLOOD_PRESSURE_FIELD_NUM_MAP_EVENING_VALUES ((FIT_BLOOD_PRESSURE_FIELD_NUM)5) +#define FIT_BLOOD_PRESSURE_FIELD_NUM_USER_PROFILE_INDEX ((FIT_BLOOD_PRESSURE_FIELD_NUM)9) +#define FIT_BLOOD_PRESSURE_FIELD_NUM_HEART_RATE ((FIT_BLOOD_PRESSURE_FIELD_NUM)6) +#define FIT_BLOOD_PRESSURE_FIELD_NUM_HEART_RATE_TYPE ((FIT_BLOOD_PRESSURE_FIELD_NUM)7) +#define FIT_BLOOD_PRESSURE_FIELD_NUM_STATUS ((FIT_BLOOD_PRESSURE_FIELD_NUM)8) + +typedef enum +{ + FIT_BLOOD_PRESSURE_MESG_TIMESTAMP, + FIT_BLOOD_PRESSURE_MESG_SYSTOLIC_PRESSURE, + FIT_BLOOD_PRESSURE_MESG_DIASTOLIC_PRESSURE, + FIT_BLOOD_PRESSURE_MESG_MEAN_ARTERIAL_PRESSURE, + FIT_BLOOD_PRESSURE_MESG_MAP_3_SAMPLE_MEAN, + FIT_BLOOD_PRESSURE_MESG_MAP_MORNING_VALUES, + FIT_BLOOD_PRESSURE_MESG_MAP_EVENING_VALUES, + FIT_BLOOD_PRESSURE_MESG_USER_PROFILE_INDEX, + FIT_BLOOD_PRESSURE_MESG_HEART_RATE, + FIT_BLOOD_PRESSURE_MESG_HEART_RATE_TYPE, + FIT_BLOOD_PRESSURE_MESG_STATUS, + FIT_BLOOD_PRESSURE_MESG_FIELDS +} FIT_BLOOD_PRESSURE_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_BLOOD_PRESSURE_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_BLOOD_PRESSURE_MESG_DEF; + +// monitoring_info message + +#define FIT_MONITORING_INFO_MESG_SIZE 8 +#define FIT_MONITORING_INFO_MESG_DEF_SIZE 11 + +typedef struct +{ + FIT_DATE_TIME timestamp; // 1 * s + 0, + FIT_LOCAL_DATE_TIME local_timestamp; // 1 * s + 0, Use to convert activity timestamps to local time if device does not support time zone and daylight savings time correction. +} FIT_MONITORING_INFO_MESG; + +typedef FIT_UINT8 FIT_MONITORING_INFO_FIELD_NUM; + +#define FIT_MONITORING_INFO_FIELD_NUM_TIMESTAMP ((FIT_MONITORING_INFO_FIELD_NUM)253) +#define FIT_MONITORING_INFO_FIELD_NUM_LOCAL_TIMESTAMP ((FIT_MONITORING_INFO_FIELD_NUM)0) + +typedef enum +{ + FIT_MONITORING_INFO_MESG_TIMESTAMP, + FIT_MONITORING_INFO_MESG_LOCAL_TIMESTAMP, + FIT_MONITORING_INFO_MESG_FIELDS +} FIT_MONITORING_INFO_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_MONITORING_INFO_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_MONITORING_INFO_MESG_DEF; + +// monitoring message + +#define FIT_MONITORING_MESG_SIZE 31 +#define FIT_MONITORING_MESG_DEF_SIZE 41 + +typedef struct +{ + FIT_DATE_TIME timestamp; // 1 * s + 0, Must align to logging interval, for example, time must be 00:00:00 for daily log. + FIT_UINT32 distance; // 100 * m + 0, Accumulated distance. Maintained by MonitoringReader for each activity_type. See SDK documentation. + FIT_UINT32 cycles; // 2 * cycles + 0, Accumulated cycles. Maintained by MonitoringReader for each activity_type. See SDK documentation. + FIT_UINT32 active_time; // 1000 * s + 0, + FIT_LOCAL_DATE_TIME local_timestamp; // Must align to logging interval, for example, time must be 00:00:00 for daily log. + FIT_UINT16 calories; // 1 * kcal + 0, Accumulated total calories. Maintained by MonitoringReader for each activity_type. See SDK documentation + FIT_UINT16 distance_16; // 1 * 100 * m + 0, + FIT_UINT16 cycles_16; // 1 * 2 * cycles (steps) + 0, + FIT_UINT16 active_time_16; // 1 * s + 0, + FIT_DEVICE_INDEX device_index; // Associates this data to device_info message. Not required for file with single device (sensor). + FIT_ACTIVITY_TYPE activity_type; // + FIT_ACTIVITY_SUBTYPE activity_subtype; // +} FIT_MONITORING_MESG; + +typedef FIT_UINT8 FIT_MONITORING_FIELD_NUM; + +#define FIT_MONITORING_FIELD_NUM_TIMESTAMP ((FIT_MONITORING_FIELD_NUM)253) +#define FIT_MONITORING_FIELD_NUM_DISTANCE ((FIT_MONITORING_FIELD_NUM)2) +#define FIT_MONITORING_FIELD_NUM_CYCLES ((FIT_MONITORING_FIELD_NUM)3) +#define FIT_MONITORING_FIELD_NUM_ACTIVE_TIME ((FIT_MONITORING_FIELD_NUM)4) +#define FIT_MONITORING_FIELD_NUM_LOCAL_TIMESTAMP ((FIT_MONITORING_FIELD_NUM)11) +#define FIT_MONITORING_FIELD_NUM_CALORIES ((FIT_MONITORING_FIELD_NUM)1) +#define FIT_MONITORING_FIELD_NUM_DISTANCE_16 ((FIT_MONITORING_FIELD_NUM)8) +#define FIT_MONITORING_FIELD_NUM_CYCLES_16 ((FIT_MONITORING_FIELD_NUM)9) +#define FIT_MONITORING_FIELD_NUM_ACTIVE_TIME_16 ((FIT_MONITORING_FIELD_NUM)10) +#define FIT_MONITORING_FIELD_NUM_DEVICE_INDEX ((FIT_MONITORING_FIELD_NUM)0) +#define FIT_MONITORING_FIELD_NUM_ACTIVITY_TYPE ((FIT_MONITORING_FIELD_NUM)5) +#define FIT_MONITORING_FIELD_NUM_ACTIVITY_SUBTYPE ((FIT_MONITORING_FIELD_NUM)6) + +typedef enum +{ + FIT_MONITORING_MESG_TIMESTAMP, + FIT_MONITORING_MESG_DISTANCE, + FIT_MONITORING_MESG_CYCLES, + FIT_MONITORING_MESG_ACTIVE_TIME, + FIT_MONITORING_MESG_LOCAL_TIMESTAMP, + FIT_MONITORING_MESG_CALORIES, + FIT_MONITORING_MESG_DISTANCE_16, + FIT_MONITORING_MESG_CYCLES_16, + FIT_MONITORING_MESG_ACTIVE_TIME_16, + FIT_MONITORING_MESG_DEVICE_INDEX, + FIT_MONITORING_MESG_ACTIVITY_TYPE, + FIT_MONITORING_MESG_ACTIVITY_SUBTYPE, + FIT_MONITORING_MESG_FIELDS +} FIT_MONITORING_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_MONITORING_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_MONITORING_MESG_DEF; + +// monitoring_hr_data message + +#define FIT_MONITORING_HR_DATA_MESG_SIZE 6 +#define FIT_MONITORING_HR_DATA_MESG_DEF_SIZE 14 + +typedef struct +{ + FIT_DATE_TIME timestamp; // 1 * s + 0, Must align to logging interval, for example, time must be 00:00:00 for daily log. + FIT_UINT8 resting_heart_rate; // 1 * bpm + 0, 7-day rolling average + FIT_UINT8 current_day_resting_heart_rate; // 1 * bpm + 0, RHR for today only. (Feeds into 7-day average) +} FIT_MONITORING_HR_DATA_MESG; + +typedef FIT_UINT8 FIT_MONITORING_HR_DATA_FIELD_NUM; + +#define FIT_MONITORING_HR_DATA_FIELD_NUM_TIMESTAMP ((FIT_MONITORING_HR_DATA_FIELD_NUM)253) +#define FIT_MONITORING_HR_DATA_FIELD_NUM_RESTING_HEART_RATE ((FIT_MONITORING_HR_DATA_FIELD_NUM)0) +#define FIT_MONITORING_HR_DATA_FIELD_NUM_CURRENT_DAY_RESTING_HEART_RATE ((FIT_MONITORING_HR_DATA_FIELD_NUM)1) + +typedef enum +{ + FIT_MONITORING_HR_DATA_MESG_TIMESTAMP, + FIT_MONITORING_HR_DATA_MESG_RESTING_HEART_RATE, + FIT_MONITORING_HR_DATA_MESG_CURRENT_DAY_RESTING_HEART_RATE, + FIT_MONITORING_HR_DATA_MESG_FIELDS +} FIT_MONITORING_HR_DATA_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_MONITORING_HR_DATA_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_MONITORING_HR_DATA_MESG_DEF; + +// hr message + +#define FIT_HR_MESG_SIZE 13 +#define FIT_HR_MESG_DEF_SIZE 23 +#define FIT_HR_MESG_EVENT_TIMESTAMP_COUNT 1 +#define FIT_HR_MESG_FILTERED_BPM_COUNT 1 +#define FIT_HR_MESG_EVENT_TIMESTAMP_12_COUNT 1 + +typedef struct +{ + FIT_DATE_TIME timestamp; // + FIT_UINT32 event_timestamp[FIT_HR_MESG_EVENT_TIMESTAMP_COUNT]; // 1024 * s + 0, + FIT_UINT16 fractional_timestamp; // 32768 * s + 0, + FIT_UINT8 time256; // 256 * s + 0, + FIT_UINT8 filtered_bpm[FIT_HR_MESG_FILTERED_BPM_COUNT]; // 1 * bpm + 0, + FIT_BYTE event_timestamp_12[FIT_HR_MESG_EVENT_TIMESTAMP_12_COUNT]; // +} FIT_HR_MESG; + +typedef FIT_UINT8 FIT_HR_FIELD_NUM; + +#define FIT_HR_FIELD_NUM_TIMESTAMP ((FIT_HR_FIELD_NUM)253) +#define FIT_HR_FIELD_NUM_EVENT_TIMESTAMP ((FIT_HR_FIELD_NUM)9) +#define FIT_HR_FIELD_NUM_FRACTIONAL_TIMESTAMP ((FIT_HR_FIELD_NUM)0) +#define FIT_HR_FIELD_NUM_TIME256 ((FIT_HR_FIELD_NUM)1) +#define FIT_HR_FIELD_NUM_FILTERED_BPM ((FIT_HR_FIELD_NUM)6) +#define FIT_HR_FIELD_NUM_EVENT_TIMESTAMP_12 ((FIT_HR_FIELD_NUM)10) + +typedef enum +{ + FIT_HR_MESG_TIMESTAMP, + FIT_HR_MESG_EVENT_TIMESTAMP, + FIT_HR_MESG_FRACTIONAL_TIMESTAMP, + FIT_HR_MESG_TIME256, + FIT_HR_MESG_FILTERED_BPM, + FIT_HR_MESG_EVENT_TIMESTAMP_12, + FIT_HR_MESG_FIELDS +} FIT_HR_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_HR_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_HR_MESG_DEF; + +// ant_rx message + +#define FIT_ANT_RX_MESG_SIZE 25 +#define FIT_ANT_RX_MESG_DEF_SIZE 23 +#define FIT_ANT_RX_MESG_DATA_COUNT 8 +#define FIT_ANT_RX_MESG_MESG_DATA_COUNT 9 + +typedef struct +{ + FIT_DATE_TIME timestamp; // 1 * s + 0, + FIT_BYTE data[FIT_ANT_RX_MESG_DATA_COUNT]; // + FIT_UINT16 fractional_timestamp; // 32768 * s + 0, + FIT_BYTE mesg_id; // + FIT_BYTE mesg_data[FIT_ANT_RX_MESG_MESG_DATA_COUNT]; // + FIT_UINT8 channel_number; // +} FIT_ANT_RX_MESG; + +typedef FIT_UINT8 FIT_ANT_RX_FIELD_NUM; + +#define FIT_ANT_RX_FIELD_NUM_TIMESTAMP ((FIT_ANT_RX_FIELD_NUM)253) +#define FIT_ANT_RX_FIELD_NUM_DATA ((FIT_ANT_RX_FIELD_NUM)4) +#define FIT_ANT_RX_FIELD_NUM_FRACTIONAL_TIMESTAMP ((FIT_ANT_RX_FIELD_NUM)0) +#define FIT_ANT_RX_FIELD_NUM_MESG_ID ((FIT_ANT_RX_FIELD_NUM)1) +#define FIT_ANT_RX_FIELD_NUM_MESG_DATA ((FIT_ANT_RX_FIELD_NUM)2) +#define FIT_ANT_RX_FIELD_NUM_CHANNEL_NUMBER ((FIT_ANT_RX_FIELD_NUM)3) + +typedef enum +{ + FIT_ANT_RX_MESG_TIMESTAMP, + FIT_ANT_RX_MESG_DATA, + FIT_ANT_RX_MESG_FRACTIONAL_TIMESTAMP, + FIT_ANT_RX_MESG_MESG_ID, + FIT_ANT_RX_MESG_MESG_DATA, + FIT_ANT_RX_MESG_CHANNEL_NUMBER, + FIT_ANT_RX_MESG_FIELDS +} FIT_ANT_RX_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_ANT_RX_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_ANT_RX_MESG_DEF; + +// ant_tx message + +#define FIT_ANT_TX_MESG_SIZE 25 +#define FIT_ANT_TX_MESG_DEF_SIZE 23 +#define FIT_ANT_TX_MESG_DATA_COUNT 8 +#define FIT_ANT_TX_MESG_MESG_DATA_COUNT 9 + +typedef struct +{ + FIT_DATE_TIME timestamp; // 1 * s + 0, + FIT_BYTE data[FIT_ANT_TX_MESG_DATA_COUNT]; // + FIT_UINT16 fractional_timestamp; // 32768 * s + 0, + FIT_BYTE mesg_id; // + FIT_BYTE mesg_data[FIT_ANT_TX_MESG_MESG_DATA_COUNT]; // + FIT_UINT8 channel_number; // +} FIT_ANT_TX_MESG; + +typedef FIT_UINT8 FIT_ANT_TX_FIELD_NUM; + +#define FIT_ANT_TX_FIELD_NUM_TIMESTAMP ((FIT_ANT_TX_FIELD_NUM)253) +#define FIT_ANT_TX_FIELD_NUM_DATA ((FIT_ANT_TX_FIELD_NUM)4) +#define FIT_ANT_TX_FIELD_NUM_FRACTIONAL_TIMESTAMP ((FIT_ANT_TX_FIELD_NUM)0) +#define FIT_ANT_TX_FIELD_NUM_MESG_ID ((FIT_ANT_TX_FIELD_NUM)1) +#define FIT_ANT_TX_FIELD_NUM_MESG_DATA ((FIT_ANT_TX_FIELD_NUM)2) +#define FIT_ANT_TX_FIELD_NUM_CHANNEL_NUMBER ((FIT_ANT_TX_FIELD_NUM)3) + +typedef enum +{ + FIT_ANT_TX_MESG_TIMESTAMP, + FIT_ANT_TX_MESG_DATA, + FIT_ANT_TX_MESG_FRACTIONAL_TIMESTAMP, + FIT_ANT_TX_MESG_MESG_ID, + FIT_ANT_TX_MESG_MESG_DATA, + FIT_ANT_TX_MESG_CHANNEL_NUMBER, + FIT_ANT_TX_MESG_FIELDS +} FIT_ANT_TX_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_ANT_TX_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_ANT_TX_MESG_DEF; + +// exd_screen_configuration message + +#define FIT_EXD_SCREEN_CONFIGURATION_MESG_SIZE 4 +#define FIT_EXD_SCREEN_CONFIGURATION_MESG_DEF_SIZE 17 + +typedef struct +{ + FIT_UINT8 screen_index; // + FIT_UINT8 field_count; // number of fields in screen + FIT_EXD_LAYOUT layout; // + FIT_BOOL screen_enabled; // +} FIT_EXD_SCREEN_CONFIGURATION_MESG; + +typedef FIT_UINT8 FIT_EXD_SCREEN_CONFIGURATION_FIELD_NUM; + +#define FIT_EXD_SCREEN_CONFIGURATION_FIELD_NUM_SCREEN_INDEX ((FIT_EXD_SCREEN_CONFIGURATION_FIELD_NUM)0) +#define FIT_EXD_SCREEN_CONFIGURATION_FIELD_NUM_FIELD_COUNT ((FIT_EXD_SCREEN_CONFIGURATION_FIELD_NUM)1) +#define FIT_EXD_SCREEN_CONFIGURATION_FIELD_NUM_LAYOUT ((FIT_EXD_SCREEN_CONFIGURATION_FIELD_NUM)2) +#define FIT_EXD_SCREEN_CONFIGURATION_FIELD_NUM_SCREEN_ENABLED ((FIT_EXD_SCREEN_CONFIGURATION_FIELD_NUM)3) + +typedef enum +{ + FIT_EXD_SCREEN_CONFIGURATION_MESG_SCREEN_INDEX, + FIT_EXD_SCREEN_CONFIGURATION_MESG_FIELD_COUNT, + FIT_EXD_SCREEN_CONFIGURATION_MESG_LAYOUT, + FIT_EXD_SCREEN_CONFIGURATION_MESG_SCREEN_ENABLED, + FIT_EXD_SCREEN_CONFIGURATION_MESG_FIELDS +} FIT_EXD_SCREEN_CONFIGURATION_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_EXD_SCREEN_CONFIGURATION_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_EXD_SCREEN_CONFIGURATION_MESG_DEF; + +// exd_data_field_configuration message + +#define FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_SIZE 6 +#define FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_DEF_SIZE 23 +#define FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_TITLE_COUNT 1 + +typedef struct +{ + FIT_UINT8 screen_index; // + FIT_BYTE concept_field; // + FIT_UINT8 field_id; // + FIT_UINT8 concept_count; // + FIT_EXD_DISPLAY_TYPE display_type; // + FIT_STRING title[FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_TITLE_COUNT]; // +} FIT_EXD_DATA_FIELD_CONFIGURATION_MESG; + +typedef FIT_UINT8 FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM; + +#define FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM_SCREEN_INDEX ((FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM)0) +#define FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM_CONCEPT_FIELD ((FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM)1) +#define FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM_FIELD_ID ((FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM)2) +#define FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM_CONCEPT_COUNT ((FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM)3) +#define FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM_DISPLAY_TYPE ((FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM)4) +#define FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM_TITLE ((FIT_EXD_DATA_FIELD_CONFIGURATION_FIELD_NUM)5) + +typedef enum +{ + FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_SCREEN_INDEX, + FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_CONCEPT_FIELD, + FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_FIELD_ID, + FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_CONCEPT_COUNT, + FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_DISPLAY_TYPE, + FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_TITLE, + FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_FIELDS +} FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_EXD_DATA_FIELD_CONFIGURATION_MESG_DEF; + +// exd_data_concept_configuration message + +#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_SIZE 11 +#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_DEF_SIZE 38 + +typedef struct +{ + FIT_UINT8 screen_index; // + FIT_BYTE concept_field; // + FIT_UINT8 field_id; // + FIT_UINT8 concept_index; // + FIT_UINT8 data_page; // + FIT_UINT8 concept_key; // + FIT_UINT8 scaling; // + FIT_EXD_DATA_UNITS data_units; // + FIT_EXD_QUALIFIERS qualifier; // + FIT_EXD_DESCRIPTORS descriptor; // + FIT_BOOL is_signed; // +} FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG; + +typedef FIT_UINT8 FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM; + +#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_SCREEN_INDEX ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)0) +#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_CONCEPT_FIELD ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)1) +#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_FIELD_ID ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)2) +#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_CONCEPT_INDEX ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)3) +#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_DATA_PAGE ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)4) +#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_CONCEPT_KEY ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)5) +#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_SCALING ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)6) +#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_DATA_UNITS ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)8) +#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_QUALIFIER ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)9) +#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_DESCRIPTOR ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)10) +#define FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM_IS_SIGNED ((FIT_EXD_DATA_CONCEPT_CONFIGURATION_FIELD_NUM)11) + +typedef enum +{ + FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_SCREEN_INDEX, + FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_CONCEPT_FIELD, + FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_FIELD_ID, + FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_CONCEPT_INDEX, + FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_DATA_PAGE, + FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_CONCEPT_KEY, + FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_SCALING, + FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_DATA_UNITS, + FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_QUALIFIER, + FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_DESCRIPTOR, + FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_IS_SIGNED, + FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_FIELDS +} FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_EXD_DATA_CONCEPT_CONFIGURATION_MESG_DEF; + +// hrv message + +#define FIT_HRV_MESG_SIZE 2 +#define FIT_HRV_MESG_DEF_SIZE 8 +#define FIT_HRV_MESG_TIME_COUNT 1 + +typedef struct +{ + FIT_UINT16 time[FIT_HRV_MESG_TIME_COUNT]; // 1000 * s + 0, Time between beats +} FIT_HRV_MESG; + +typedef FIT_UINT8 FIT_HRV_FIELD_NUM; + +#define FIT_HRV_FIELD_NUM_TIME ((FIT_HRV_FIELD_NUM)0) + +typedef enum +{ + FIT_HRV_MESG_TIME, + FIT_HRV_MESG_FIELDS +} FIT_HRV_MESG_FIELD; + +typedef struct +{ + FIT_UINT8 reserved_1; + FIT_UINT8 arch; + FIT_MESG_NUM global_mesg_num; + FIT_UINT8 num_fields; + FIT_UINT8 fields[FIT_HRV_MESG_FIELDS * FIT_FIELD_DEF_SIZE]; +} FIT_HRV_MESG_DEF; + +typedef enum { + FIT_MESG_PAD, + FIT_MESG_FILE_ID, + FIT_MESG_FILE_CREATOR, + FIT_MESG_SOFTWARE, + FIT_MESG_SLAVE_DEVICE, + FIT_MESG_CAPABILITIES, + FIT_MESG_FILE_CAPABILITIES, + FIT_MESG_MESG_CAPABILITIES, + FIT_MESG_FIELD_CAPABILITIES, + FIT_MESG_DEVICE_SETTINGS, + FIT_MESG_USER_PROFILE, + FIT_MESG_HRM_PROFILE, + FIT_MESG_SDM_PROFILE, + FIT_MESG_BIKE_PROFILE, + FIT_MESG_CONNECTIVITY, + FIT_MESG_ZONES_TARGET, + FIT_MESG_SPORT, + FIT_MESG_HR_ZONE, + FIT_MESG_SPEED_ZONE, + FIT_MESG_CADENCE_ZONE, + FIT_MESG_POWER_ZONE, + FIT_MESG_MET_ZONE, + FIT_MESG_DIVE_SETTINGS, + FIT_MESG_GOAL, + FIT_MESG_ACTIVITY, + FIT_MESG_SESSION, + FIT_MESG_LAP, + FIT_MESG_LENGTH, + FIT_MESG_RECORD, + FIT_MESG_EVENT, + FIT_MESG_DEVICE_INFO, + FIT_MESG_DEVICE_AUX_BATTERY_INFO, + FIT_MESG_TRAINING_FILE, + FIT_MESG_WEATHER_CONDITIONS, + FIT_MESG_WEATHER_ALERT, + FIT_MESG_NMEA_SENTENCE, + FIT_MESG_AVIATION_ATTITUDE, + FIT_MESG_VIDEO_TITLE, + FIT_MESG_VIDEO_DESCRIPTION, + FIT_MESG_SET, + FIT_MESG_FIELD_DESCRIPTION, + FIT_MESG_DEVELOPER_DATA_ID, + FIT_MESG_COURSE, + FIT_MESG_COURSE_POINT, + FIT_MESG_SEGMENT_ID, + FIT_MESG_SEGMENT_LEADERBOARD_ENTRY, + FIT_MESG_SEGMENT_POINT, + FIT_MESG_SEGMENT_LAP, + FIT_MESG_SEGMENT_FILE, + FIT_MESG_WORKOUT, + FIT_MESG_WORKOUT_SESSION, + FIT_MESG_WORKOUT_STEP, + FIT_MESG_EXERCISE_TITLE, + FIT_MESG_SCHEDULE, + FIT_MESG_TOTALS, + FIT_MESG_WEIGHT_SCALE, + FIT_MESG_BLOOD_PRESSURE, + FIT_MESG_MONITORING_INFO, + FIT_MESG_MONITORING, + FIT_MESG_MONITORING_HR_DATA, + FIT_MESG_HR, + FIT_MESG_ANT_RX, + FIT_MESG_ANT_TX, + FIT_MESG_EXD_SCREEN_CONFIGURATION, + FIT_MESG_EXD_DATA_FIELD_CONFIGURATION, + FIT_MESG_EXD_DATA_CONCEPT_CONFIGURATION, + FIT_MESG_HRV, + FIT_MESGS +} FIT_MESG; + +typedef const FIT_MESG_DEF * FIT_CONST_MESG_DEF_PTR; +extern const FIT_CONST_MESG_DEF_PTR fit_mesg_defs[FIT_MESGS]; + + + + +/////////////////////////////////////////////////////////////////////// +// Files +// Use FIT_MESG_OFFSET macro get byte offset of messages in a file. +/////////////////////////////////////////////////////////////////////// + +#define FIT_FILE_DATA_SIZE ((FIT_UINT32)63) +#define FIT_FILE_SIZE (FIT_FILE_HDR_SIZE + FIT_FILE_DATA_SIZE + sizeof(FIT_UINT16)) +#define FIT_FILE_MESG_COUNT 1 + +typedef enum { + FIT_FILE_DEF_DEVICE, + FIT_FILE_DEFS +} FIT_FILE_DEF_ENUM; + +typedef enum { + FIT_FILE_INDEX_DEVICE_0, + FIT_FILE_INDEX_COUNT +} FIT_FILE_INDEX; + +#define FIT_FILE_INDEX_DEVICE FIT_FILE_INDEX_DEVICE_0 + +#define FIT_DEVICE_FILE_FILE_ID_MESGS 1 +#define FIT_DEVICE_FILE_DATA_SIZE ((FIT_UINT32)63) +#define FIT_DEVICE_FILE_SIZE (FIT_FILE_HDR_SIZE + FIT_DEVICE_FILE_DATA_SIZE + sizeof(FIT_UINT16)) +#define FIT_DEVICE_FILE_MESG_COUNT 1 +#define FIT_DEVICE_FILE_COUNT 1 + + + +#define FIT_DEVICE_FILE_CRC_PAD_SIZE ((FIT_ALIGNMENT - FIT_FILE_CRC_SIZE) % FIT_ALIGNMENT) + +typedef struct +{ + FIT_UINT8 hdr[FIT_FILE_HDR_SIZE]; + FIT_UINT8 file_id_mesg_def[FIT_HDR_SIZE + FIT_FILE_ID_MESG_DEF_SIZE]; + FIT_UINT8 file_id_mesg[FIT_DEVICE_FILE_FILE_ID_MESGS][FIT_HDR_SIZE + FIT_FILE_ID_MESG_SIZE]; + FIT_UINT8 crc[2]; +} FIT_DEVICE_FILE; + +extern const FIT_DEVICE_FILE fit_device_file; + + +extern const FIT_FILE_DEF fit_file_defs[FIT_FILE_DEFS]; + + + + + +#if defined(__cplusplus) + } +#endif + +#endif // !defined(FIT_EXAMPLE_H) + diff --git a/util/fit/fitprod.py b/util/fit/fitprod.py index fbbf02545..cb7b7aa2a 100755 --- a/util/fit/fitprod.py +++ b/util/fit/fitprod.py @@ -5,13 +5,17 @@ print('{\n "VERSION":' + str(int(time.time())) + ',') print(' "COMMENT":"Do not edit this file directly it is generated.",') print(' "PRODUCTS":[') +# # output the known products captured by GoldenCheetah users +# nongarmin = open("nongarmin.json", "r") lines = nongarmin.readlines() for line in lines: print(" " + line, end="") +# # output garmin products as described in the FIT SDK +# sdkheader = open("fit_example.h","r") lines = sdkheader.readlines() pre=" " @@ -26,8 +30,9 @@ for line in lines: pre=",\n " print("\n ],\n") +# # manufacturers list from FIT SDK - +# print(' "MANUFACTURERS":[') pre=" " for line in lines: @@ -36,5 +41,29 @@ for line in lines: print(pre+ '{ "manu":' + match.group(2).strip() + ', "name":"' + match.group(1).strip().replace('_',' ').title() + '" }', end="") pre=",\n " -print("\n ]\n}") +print("\n ],\n") +# +# field numbers +# +fields = open("fields.json", "r") +fieldlines = fields.readlines() +for line in fieldlines: + print(line, end="") + +# +# Message number description +# +# // #define FIT_MESG_NUM_HR_ZONE ((FIT_MESG_NUM)8) + +print(' "MESSAGES":[') +pre=" " +for line in lines: + match = re.search("FIT_MESG_NUM_([^ \t]*).*\(\(FIT_MESG_NUM\)([ 0-9]*)", line) + if match: + num = int(match.group(2).strip()) + if num > 0: + print(pre+ '{ "num":', num, ', "desc":"' + match.group(1).strip().replace('_',' ').title() + '" }', end="") + pre=",\n " + +print("\n ]\n}")