diff --git a/src/FitRideFile.cpp b/src/FitRideFile.cpp index 2f0c49233..a20bd3161 100644 --- a/src/FitRideFile.cpp +++ b/src/FitRideFile.cpp @@ -76,12 +76,13 @@ struct FitFileReaderState int devices; bool stopped; int last_event_type; + int last_event; int last_msg_type; FitFileReaderState(QFile &file, QStringList &errors) : file(file), errors(errors), rideFile(NULL), start_time(0), last_time(0), interval(0), devices(0), stopped(true), - last_event_type(-1), last_msg_type(-1) + last_event_type(-1), last_event(-1), last_msg_type(-1) { if (global_msg_names.isEmpty()) { global_msg_names.insert(0, "file_id"); @@ -93,6 +94,7 @@ struct FitFileReaderState global_msg_names.insert(23, "device_info"); global_msg_names.insert(34, "activity"); global_msg_names.insert(49, "file_creator"); + global_msg_names.insert(72, "undocumented_2"); // New for Garmin 800 } } @@ -143,6 +145,7 @@ struct FitFileReaderState case 988: rideFile->setDeviceType("Garmin FR60"); break; case 1018: rideFile->setDeviceType("Garmin FR310XT"); break; case 1036: rideFile->setDeviceType("Garmin Edge 500"); break; + case 1169: rideFile->setDeviceType("Garmin Edge 800"); break; default: rideFile->setDeviceType(QString("Unknown Garmin Device %1").arg(prod)); } } @@ -153,31 +156,48 @@ struct FitFileReaderState void decodeEvent(const FitDefinition &def, int, const std::vector values) { time_t time = 0; - int type = -1; + int event = -1; + int event_type = -1; int i = 0; foreach(const FitField &field, def.fields) { int value = values[i++]; switch (field.num) { case 253: time = value + qbase_time.toTime_t(); break; - case 1: type = value; break; + case 0: event = value; break; + case 1: event_type = value; break; default: ; // do nothing } } - switch (type) { - case 0: // start - stopped = false; - break; - case 3: // marker - break; - case 4: // stop all - case 9: // stop disable all - stopped = true; - break; - default: - errors << QString("unknown event type %1").arg(type); + if (event == 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 event type %1").arg(event_type); + } } - // printf("event type %d\n", type); - last_event_type = type; + // printf("event type %d\n", event_type); + last_event = event; + last_event_type = event_type; } void decodeLap(const FitDefinition &def, int time_offset, const std::vector values) { @@ -238,7 +258,7 @@ struct FitFileReaderState /* errors << QString("At %1 seconds, time is stopped, but got record " "anyway. Ignoring it. Last event type was " - "%2.").arg(time-start_time).arg(last_event_type); + "%2 for event %3.").arg(time-start_time).arg(last_event_type).arg(last_event); return; */ } @@ -399,6 +419,7 @@ struct FitFileReaderState case 23: /* device info */ case 18: /* session */ case 22: /* undocumented */ + case 72: /* undocumented - new for garmin 800*/ case 34: /* activity */ case 49: /* file creator */ break; diff --git a/src/GoogleMapControl.cpp b/src/GoogleMapControl.cpp index 9233dffad..253e5b091 100644 --- a/src/GoogleMapControl.cpp +++ b/src/GoogleMapControl.cpp @@ -509,14 +509,16 @@ string GoogleMapControl::CreateMarkers() RideItem *ride = myRideItem; // start marker + /* oss << "var marker;" << endl; - oss << "var blueIcon = new GIcon(G_DEFAULT_ICON);" << endl; - oss << "blueIcon.image = \"http://gmaps-samples.googlecode.com/svn/trunk/markers/blue/blank.png\"" << endl; - oss << "markerOptions = { icon:blueIcon };" << endl; + oss << "var greenIcon = new GIcon(G_DEFAULT_ICON);" << endl; + oss << "greenIcon.image = \"http://gmaps-samples.googlecode.com/svn/trunk/markers/green/blank.png\"" << endl; + oss << "markerOptions = { icon:greenIcon };" << endl; oss << "marker = new GMarker(new GLatLng("; - oss << rideData.front().lat << "," << rideData.front().lon << "),blueIcon);" << endl; + oss << rideData.front().lat << "," << rideData.front().lon << "),greenIcon);" << endl; oss << "marker.bindInfoWindowHtml(\"

Start

\");" << endl; oss << "map.addOverlay(marker);" << endl; + */ oss << CreateIntervalMarkers(ride); @@ -546,7 +548,10 @@ std::string GoogleMapControl::CreateMarker(int number, double lat, double lon, s ostringstream oss; oss.precision(6); oss << "intervalIcon = new GIcon(G_DEFAULT_ICON);" << endl; - oss << "intervalIcon.image = \"http://gmaps-samples.googlecode.com/svn/trunk/markers/green/marker" << number << ".png\"" << endl; + if ( number == 1 ) + oss << "intervalIcon.image = \"http://gmaps-samples.googlecode.com/svn/trunk/markers/green/marker" << number << ".png\"" << endl; + else + oss << "intervalIcon.image = \"http://gmaps-samples.googlecode.com/svn/trunk/markers/blue/marker" << number << ".png\"" << endl; oss << "markerOptions = { icon:intervalIcon };" << endl; oss << "marker = new GMarker(new GLatLng( "; oss<< lat << "," << lon << "),intervalIcon);" << endl; diff --git a/src/SrmRideFile.cpp b/src/SrmRideFile.cpp index 23a18d2e7..b1a17fdac 100644 --- a/src/SrmRideFile.cpp +++ b/src/SrmRideFile.cpp @@ -87,7 +87,7 @@ RideFile *SrmFileReader::openRideFile(QFile &file, QStringList &errorStrings) co in.readRawData(magic, sizeof(magic)); assert(strncmp(magic, "SRM", 3) == 0); int version = magic[3] - '0'; - assert(version == 6 || version == 7); + assert(version == 5 || version == 6 || version == 7); quint16 dayssince1880 = readShort(in); quint16 wheelcirc = readShort(in); @@ -111,8 +111,10 @@ RideFile *SrmFileReader::openRideFile(QFile &file, QStringList &errorStrings) co QVector markers(markercnt + 1); for (int i = 0; i <= markercnt; ++i) { char mcomment[256]; - in.readRawData(mcomment, sizeof(mcomment) - 1); - mcomment[sizeof(mcomment) - 1] = '\0'; + size_t mcommentlen = version < 6 ? 3 : 255; + assert( mcommentlen < sizeof(mcomment) ); + in.readRawData(mcomment, mcommentlen ); + mcomment[mcommentlen] = '\0'; quint8 active = readByte(in); quint16 start = readShort(in); @@ -146,7 +148,7 @@ RideFile *SrmFileReader::openRideFile(QFile &file, QStringList &errorStrings) co (void) wheelcirc; } - blockhdr *blockhdrs = new blockhdr[blockcnt]; + blockhdr *blockhdrs = new blockhdr[blockcnt+1]; for (int i = 0; i < blockcnt; ++i) { // In the .srm files generated by Rainer Clasen's srmcmd, // hsecsincemidn is a *signed* 32-bit integer. I haven't seen a @@ -167,7 +169,13 @@ RideFile *SrmFileReader::openRideFile(QFile &file, QStringList &errorStrings) co (void) zero; (void) slope; - assert(blockcnt > 0); + // SRM5 files have no blocks - synthesize one + if( blockcnt < 1 ){ + blockcnt = 0; + blockhdrs[0].chunkcnt = datacnt; + blockhdrs[0].dt = QDateTime(date); + } + int blknum = 0, blkidx = 0, mrknum = 0, interval = 0; double km = 0.0, secs = 0.0; @@ -178,7 +186,7 @@ RideFile *SrmFileReader::openRideFile(QFile &file, QStringList &errorStrings) co for (int i = 0; i < datacnt; ++i) { int cad, hr, watts; double kph, alt; - if (version == 6) { + if (version < 7) { quint8 ps[3]; in.readRawData((char*) ps, sizeof(ps)); cad = readByte(in); diff --git a/src/TcxParser.cpp b/src/TcxParser.cpp index a28695e7f..a1690e6ff 100644 --- a/src/TcxParser.cpp +++ b/src/TcxParser.cpp @@ -65,7 +65,7 @@ TcxParser::startElement( const QString&, const QString&, power = 0.0; cadence = 0.0; hr = 0.0; - alt = 0.0; + //alt = 0.0; // TCS from FIT files have not alt point for each trackpoint distance = -1; // nh - we set this to -1 so we can detect if there was a distance in the trackpoint. } return TRUE; diff --git a/src/TrainTool.cpp b/src/TrainTool.cpp index 82855aa80..f5c559306 100644 --- a/src/TrainTool.cpp +++ b/src/TrainTool.cpp @@ -127,6 +127,14 @@ TrainTool::TrainTool(MainWindow *parent, const QDir &home) : QWidget(parent), ho connect(startButton, SIGNAL(clicked()), this, SLOT(Start())); connect(pauseButton, SIGNAL(clicked()), this, SLOT(Pause())); connect(stopButton, SIGNAL(clicked()), this, SLOT(Stop())); + + // add a watch on all directories + QVariant workoutDir = appsettings->value(NULL, GC_WORKOUTDIR); + watcher = boost::shared_ptr(new QFileSystemWatcher()); + watcher->addPaths(workoutDir.toStringList()); + + connect(&*watcher,SIGNAL(directoryChanged(QString)),this,SLOT(configChanged())); + connect(&*watcher,SIGNAL(fileChanged(QString)),this,SLOT(configChanged())); } void diff --git a/src/TrainTool.h b/src/TrainTool.h index a90587474..e5952a9c0 100644 --- a/src/TrainTool.h +++ b/src/TrainTool.h @@ -103,6 +103,7 @@ class TrainTool : public QWidget public: // everyone else wants this QCheckBox *recordSelector; + boost::shared_ptr watcher; }; #endif // _GC_TrainTool_h