mirror of
https://github.com/GoldenCheetah/GoldenCheetah.git
synced 2026-02-13 16:18:42 +00:00
FitRideFile: - Add Left/Right TorqueEff and Left/Rigth PedalSmooth
- Open Truncated file
This commit is contained in:
@@ -251,6 +251,30 @@ struct FitFileReaderState
|
||||
rideFile->setFileFormat("FIT (*.fit)");
|
||||
}
|
||||
|
||||
void decodeSession(const FitDefinition &def, int, const std::vector<fit_value_t> values) {
|
||||
int i = 0;
|
||||
foreach(const FitField &field, def.fields) {
|
||||
fit_value_t value = values[i++];
|
||||
|
||||
if( value == NA_VALUE )
|
||||
continue;
|
||||
|
||||
printf("decodeSession field %d: %d bytes, num %d, type %d\n", i, field.size, field.num, field.type );
|
||||
}
|
||||
}
|
||||
|
||||
void decodeDeviceInfo(const FitDefinition &def, int, const std::vector<fit_value_t> values) {
|
||||
int i = 0;
|
||||
foreach(const FitField &field, def.fields) {
|
||||
fit_value_t value = values[i++];
|
||||
|
||||
if( value == NA_VALUE )
|
||||
continue;
|
||||
|
||||
printf("decodeDeviceInfo field %d: %d bytes, num %d, type %d\n", i, field.size, field.num, field.type );
|
||||
}
|
||||
}
|
||||
|
||||
void decodeEvent(const FitDefinition &def, int, const std::vector<fit_value_t> values) {
|
||||
int time = -1;
|
||||
int event = -1;
|
||||
@@ -361,6 +385,7 @@ struct FitFileReaderState
|
||||
time = last_time + time_offset;
|
||||
double alt = 0, cad = 0, km = 0, hr = 0, lat = 0, lng = 0, badgps = 0, lrbalance = 0;
|
||||
double kph = 0, temperature = RideFile::noTemp, watts = 0, slope = 0;
|
||||
double leftTorqueEff = 0, rightTorqueEff = 0, leftPedalSmooth = 0, rightPedalSmooth = 0;
|
||||
fit_value_t lati = NA_VALUE, lngi = NA_VALUE;
|
||||
int i = 0;
|
||||
foreach(const FitField &field, def.fields) {
|
||||
@@ -370,35 +395,76 @@ struct FitFileReaderState
|
||||
continue;
|
||||
|
||||
switch (field.num) {
|
||||
case 253: time = value + qbase_time.toTime_t();
|
||||
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;
|
||||
break;
|
||||
case 0: lati = value; break;
|
||||
case 1: lngi = value; break;
|
||||
case 2: alt = value / 5.0 - 500.0; break;
|
||||
case 3: hr = value; break;
|
||||
case 4: cad = value; break;
|
||||
case 5: km = value / 100000.0; break;
|
||||
case 6: kph = value * 3.6 / 1000.0; break;
|
||||
case 7: watts = value; break;
|
||||
case 0: // POSITION_LAT
|
||||
lati = value;
|
||||
break;
|
||||
case 1: // POSITION_LONG
|
||||
lngi = value;
|
||||
break;
|
||||
case 2: // ALTITUDE
|
||||
alt = value / 5.0 - 500.0;
|
||||
break;
|
||||
case 3: // HEART_RATE
|
||||
hr = value;
|
||||
break;
|
||||
case 4: // CADENCE
|
||||
cad = value;
|
||||
break;
|
||||
case 5: // DISTANCE
|
||||
km = value / 100000.0;
|
||||
break;
|
||||
case 6: // SPEED
|
||||
kph = value * 3.6 / 1000.0;
|
||||
break;
|
||||
case 7: // POWER
|
||||
watts = value;
|
||||
break;
|
||||
case 8: break; // packed speed/dist
|
||||
case 9: slope = value / 100.0;
|
||||
case 9: // GRADE
|
||||
slope = value / 100.0;
|
||||
break;
|
||||
case 10: //resistance = value;
|
||||
break;
|
||||
break;
|
||||
case 11: //time_from_course = value / 1000.0;
|
||||
break;
|
||||
case 12: break; // "cycle_length"
|
||||
case 13: temperature = value; break;
|
||||
case 13: // TEMPERATURE
|
||||
temperature = value;
|
||||
break;
|
||||
case 29: // ACCUMULATED_POWER
|
||||
break;
|
||||
case 30: lrbalance = (value & 0x80 ? 100 - (value & 0x7F) : value & 0x7F);
|
||||
case 30: //LEFT_RIGHT_BALANCE
|
||||
lrbalance = (value & 0x80 ? 100 - (value & 0x7F) : value & 0x7F);
|
||||
break;
|
||||
case 31: // GPS Accuracy
|
||||
break;
|
||||
case 43: // LEFT_TORQUE_EFFECTIVENESS
|
||||
leftTorqueEff = value / 2.0;
|
||||
//qDebug() << "LEFT_TORQUE_EFFECTIVENESS" << leftTorqueEff;
|
||||
break;
|
||||
case 44: // RIGHT_TORQUE_EFFECTIVENESS
|
||||
rightTorqueEff = value / 2.0;
|
||||
//qDebug() << "RIGHT_TORQUE_EFFECTIVENESS" << rightTorqueEff;
|
||||
break;
|
||||
case 45: // LEFT_PEDAL_SMOOTHNESS
|
||||
leftPedalSmooth = value / 2.0;
|
||||
//qDebug() << "LEFT_PEDAL_SMOOTHNESS" << leftPedalSmooth;
|
||||
break;
|
||||
case 46: // RIGHT_PEDAL_SMOOTHNESS
|
||||
rightPedalSmooth = value / 2.0;
|
||||
//qDebug() << "RIGHT_PEDAL_SMOOTHNESS" << rightPedalSmooth;
|
||||
break;
|
||||
case 47: // COMBINED_PEDAL_SMOOTHNES
|
||||
//qDebug() << "COMBINED_PEDAL_SMOOTHNES" << value;
|
||||
break;
|
||||
|
||||
default: unknown_record_fields.insert(field.num);
|
||||
}
|
||||
}
|
||||
@@ -593,8 +659,8 @@ struct FitFileReaderState
|
||||
case 19: decodeLap(def, time_offset, values); break;
|
||||
case RECORD_TYPE: decodeRecord(def, time_offset, values); break;
|
||||
case 21: decodeEvent(def, time_offset, values); break;
|
||||
case 23: /* device info */
|
||||
case 18: /* session */
|
||||
case 23: //decodeDeviceInfo(def, time_offset, values); break; /* device info */
|
||||
case 18: //decodeSession(def, time_offset, values); break; /* session */
|
||||
case 22: /* undocumented */
|
||||
case 72: /* undocumented - new for garmin 800*/
|
||||
case 34: /* activity */
|
||||
@@ -653,15 +719,17 @@ struct FitFileReaderState
|
||||
|
||||
int bytes_read = 0;
|
||||
bool stop = false;
|
||||
bool truncated = false;
|
||||
try {
|
||||
while (!stop && (bytes_read < data_size))
|
||||
bytes_read += read_record(stop, errors);
|
||||
}
|
||||
catch (TruncatedRead &e) {
|
||||
errors << "truncated file body";
|
||||
file.close();
|
||||
delete rideFile;
|
||||
return NULL;
|
||||
//file.close();
|
||||
//delete rideFile;
|
||||
//return NULL;
|
||||
truncated = true;
|
||||
}
|
||||
if (stop) {
|
||||
file.close();
|
||||
@@ -669,8 +737,11 @@ struct FitFileReaderState
|
||||
return NULL;
|
||||
}
|
||||
else {
|
||||
int crc = read_uint16( false ); // always littleEndian
|
||||
(void) crc;
|
||||
if (!truncated) {
|
||||
int crc = read_uint16( false ); // always littleEndian
|
||||
(void) crc;
|
||||
}
|
||||
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user