FitRideFile: - Add Left/Right TorqueEff and Left/Rigth PedalSmooth

- Open Truncated file
This commit is contained in:
Damien
2013-07-18 22:23:37 +02:00
committed by Mark Liversedge
parent 87cef3f412
commit 74fb7f31f5

View File

@@ -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)