Subversion Repositories public

Rev

Rev 224 | Rev 232 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 224 Rev 225
Line 52... Line 52...
52
#define FLD_LANGID		20
52
#define FLD_LANGID		20
53
#define FLD_PARTNUMBER		21
53
#define FLD_PARTNUMBER		21
54
#define FLD_CADENCE		22
54
#define FLD_CADENCE		22
55
#define FLD_MAXSPEED		23
55
#define FLD_MAXSPEED		23
56
#define FLD_CALORIES		24
56
#define FLD_CALORIES		24
-
 
57
#define FLD_ID			25
-
 
58
#define FLD_TRIGGERMETHOD	26
-
 
59
#define FLD_TPX			27
-
 
60
#define FLD_UNITID		28
-
 
61
#define FLD_PRODUCTID		29
-
 
62
#define FLD_NOTES		30
57
 
63
 
58
#define CON_COURSES		100
64
#define CON_COURSES		100
59
#define CON_COURSE		101
65
#define CON_COURSE		101
60
#define CON_LAP			102
66
#define CON_LAP			102
61
#define CON_BEGINPOSITION	103
67
#define CON_BEGINPOSITION	103
Line 67... Line 73...
67
#define CON_POSITION		109
73
#define CON_POSITION		109
68
#define CON_HEARTRATEBPM	110
74
#define CON_HEARTRATEBPM	110
69
#define CON_AUTHOR		111
75
#define CON_AUTHOR		111
70
#define CON_VERSION		112
76
#define CON_VERSION		112
71
#define CON_BUILD		113
77
#define CON_BUILD		113
-
 
78
#define CON_ACTIVITY		114
-
 
79
#define CON_EXTENSIONS		115
-
 
80
#define CON_CREATOR		116
-
 
81
#define CON_MULTISPORTSESSION	117
-
 
82
#define CON_FIRSTSPORT		118
-
 
83
#define CON_NEXTSPORT		119
-
 
84
#define CON_TRAINING		120
-
 
85
#define CON_QUICKWORKOUTRESULTS	121
-
 
86
 
-
 
87
#define ATT_CADENCESENSOR	200
72
 
88
 
73
#define STOPSTOP		0
89
#define STOPSTOP		0
74
 
90
 
75
KEYS keys[] = {
91
KEYS keys[] = {
76
	/* Fields */
92
	/* Fields */
Line 96... Line 112...
96
	{ FLD_LANGID,			QString("LangID") },
112
	{ FLD_LANGID,			QString("LangID") },
97
	{ FLD_PARTNUMBER,		QString("PartNumber") },
113
	{ FLD_PARTNUMBER,		QString("PartNumber") },
98
	{ FLD_CADENCE,			QString("Cadence") },
114
	{ FLD_CADENCE,			QString("Cadence") },
99
	{ FLD_CALORIES,			QString("Calories") },
115
	{ FLD_CALORIES,			QString("Calories") },
100
	{ FLD_MAXSPEED,			QString("MaximumSpeed") },
116
	{ FLD_MAXSPEED,			QString("MaximumSpeed") },
-
 
117
	{ FLD_ID,			QString("Id") },
-
 
118
	{ FLD_TRIGGERMETHOD,		QString("TriggerMethod") },
-
 
119
	{ FLD_TPX,			QString("TPX") },
-
 
120
	{ FLD_UNITID,			QString("UnitId") },
-
 
121
	{ FLD_PRODUCTID,		QString("ProductID") },
-
 
122
	{ FLD_NOTES,			QString("Notes") },
-
 
123
	/* Attributes */
-
 
124
	{ ATT_CADENCESENSOR,		QString("CadenceSensor") },
101
	/* Container */
125
	/* Container */
102
	{ CON_COURSES,			QString("Courses") },
126
	{ CON_COURSES,			QString("Courses") },
103
	{ CON_COURSE,			QString("Course") },
127
	{ CON_COURSE,			QString("Course") },
104
	{ CON_LAP,			QString("Lap") },
128
	{ CON_LAP,			QString("Lap") },
105
	{ CON_BEGINPOSITION,		QString("BeginPosition") },
129
	{ CON_BEGINPOSITION,		QString("BeginPosition") },
Line 111... Line 135...
111
	{ CON_POSITION,			QString("Position") },
135
	{ CON_POSITION,			QString("Position") },
112
	{ CON_HEARTRATEBPM,		QString("HeartRateBpm") },
136
	{ CON_HEARTRATEBPM,		QString("HeartRateBpm") },
113
	{ CON_AUTHOR,			QString("Author") },
137
	{ CON_AUTHOR,			QString("Author") },
114
	{ CON_VERSION,			QString("Version") },
138
	{ CON_VERSION,			QString("Version") },
115
	{ CON_BUILD,			QString("Build") },
139
	{ CON_BUILD,			QString("Build") },
-
 
140
	{ CON_ACTIVITY,			QString("Activity") },
-
 
141
	{ CON_EXTENSIONS,		QString("Extensions") },
-
 
142
	{ CON_CREATOR,			QString("Creator") },
-
 
143
	{ CON_MULTISPORTSESSION,	QString("MultiSportSession") },
-
 
144
	{ CON_FIRSTSPORT,		QString("FirstSport") },
-
 
145
	{ CON_NEXTSPORT,		QString("NextSport") },
-
 
146
	{ CON_TRAINING,			QString("Training") },
-
 
147
	{ CON_QUICKWORKOUTRESULTS,	QString("QuickWorkoutResults") },
116
	/* Errors */
148
	/* Errors */
117
	{ ERR_OK,			QString("OK") },	// this is no error
149
	{ ERR_OK,			QString("OK") },	// this is no error
118
	{ ERR_NOFILE,			i18n("IMPORT: No file name to parse XML!") },	// but this
150
	{ ERR_NOFILE,			i18n("IMPORT: No file name to parse XML!") },	// but this
119
	{ ERR_TAGS,			i18n("IMPORT: More end tags than open tags! Invalid XML file.") },
151
	{ ERR_TAGS,			i18n("IMPORT: More end tags than open tags! Invalid XML file.") },
120
	{ ERR_ALLOCGMN,			i18n("IMPORT: Error allocating memory for base Garmin structure.") },
152
	{ ERR_ALLOCGMN,			i18n("IMPORT: Error allocating memory for base Garmin structure.") },
Line 131... Line 163...
131
	qfopen = false;
163
	qfopen = false;
132
	__error = 0;
164
	__error = 0;
133
	gmn = 0;
165
	gmn = 0;
134
	list_lap = list_track = 0;
166
	list_lap = list_track = 0;
135
	ds = 0;
167
	ds = 0;
-
 
168
	history = false;
136
}
169
}
137
 
170
 
138
gmn_import::gmn_import (const QFile &qfile)
171
gmn_import::gmn_import (const QFile &qfile)
139
{
172
{
140
	Initialize ();
173
	Initialize ();
Line 204... Line 237...
204
{
237
{
205
	indent = 0;
238
	indent = 0;
206
	con.setAscii("");
239
	con.setAscii("");
207
	subCon.setAscii("");
240
	subCon.setAscii("");
208
	lpos = tpos = oldLPos = 0;
241
	lpos = tpos = oldLPos = 0;
-
 
242
	history = fakeLap = false;
-
 
243
	first_tpos = 0;
-
 
244
	prun = 0;
-
 
245
	plap = 0;
209
	return TRUE;
246
	return TRUE;
210
}
247
}
211
 
248
 
212
/*
249
/*
213
 * This is called every time a new start element was parsed.
250
 * This is called every time a new start element was parsed.
Line 220... Line 257...
220
 
257
 
221
	while (i <= CON_LAST)
258
	while (i <= CON_LAST)
222
	{
259
	{
223
	   if (qName.lower() == getKey(i).lower())
260
	   if (qName.lower() == getKey(i).lower())
224
	   {
261
	   {
225
	      if (qName.lower() == QString("course"))
262
	      if (qName.lower() == QString("course") || qName.lower() == QString("activity"))
226
	      {
263
	      {
227
		 memset (&run, 0, sizeof (D1009));
264
		 memset (&run, 0, sizeof (D1009));
-
 
265
 
-
 
266
		 if (i == CON_ACTIVITY)
-
 
267
		 {
-
 
268
		    con.setAscii("activity");
-
 
269
		    history = true;
-
 
270
		 }
-
 
271
		 else
228
		 con.setAscii("course");
272
		    con.setAscii("course");
-
 
273
 
229
		 run.track_index = 0;
274
		 run.track_index = 0;
230
		 run.first_lap_index = 0;
275
		 run.first_lap_index = 0;
231
		 run.sport_type = 0;		// Running
276
		 run.sport_type = 0;		// Running
232
		 tk = i;
277
		 tk = i;
233
	      }
278
	      }
Line 252... Line 297...
252
	      else if (con == QString("lap") && qName.lower() == QString("AverageHeartRateBpm").lower())
297
	      else if (con == QString("lap") && qName.lower() == QString("AverageHeartRateBpm").lower())
253
		 subCon = qName.lower();
298
		 subCon = qName.lower();
254
	      else if (con == QString("lap") && qName.lower() == QString("MaximumHeartRateBpm").lower())
299
	      else if (con == QString("lap") && qName.lower() == QString("MaximumHeartRateBpm").lower())
255
		 subCon = qName.lower();
300
		 subCon = qName.lower();
256
 
301
 
-
 
302
	      if (history && qName.lower() == QString("track") && con.lower() == QString("lap"))
-
 
303
	      {
-
 
304
		 first_tpos = tpos + 1;
-
 
305
		 endElement (QString::null, QString::null, QString("Lap"));
-
 
306
		 indent++;
-
 
307
		 con.setAscii("lap");
-
 
308
		 fakeLap = true;
-
 
309
	      }
-
 
310
 
257
	      if (qName.lower() == QString("trackpoint"))
311
	      if (qName.lower() == QString("trackpoint"))
258
	      {
312
	      {
259
		 memset (&point, 0, sizeof (D304));
313
		 memset (&point, 0, sizeof (D304));
260
		 point.alt = 1.0e24;
314
		 point.alt = 1.0e24;
261
		 point.posn.lat = 0x7fffffff;
315
		 point.posn.lat = 0x7fffffff;
Line 291... Line 345...
291
/*
345
/*
292
 * This is called every time an element is closed.
346
 * This is called every time an element is closed.
293
 */
347
 */
294
bool gmn_import::endElement( const QString&, const QString&, const QString& qName)
348
bool gmn_import::endElement( const QString&, const QString&, const QString& qName)
295
{
349
{
-
 
350
	if (!fakeLap)
296
	indent--;
351
	   indent--;
297
 
352
 
298
	if (qName.lower() == QString("lap"))
353
	if (qName.lower() == QString("lap"))
299
	{
354
	{
300
	   garmin_data *gdt;
355
	   garmin_data *gdt;
301
	   garmin_list *l;
356
	   garmin_list *l;
302
 
357
 
-
 
358
	   if (!fakeLap)
303
	   con.setAscii("");
359
	      con.setAscii("");
-
 
360
 
-
 
361
	   if (history && fakeLap)
-
 
362
	   {
-
 
363
	      fakeLap = false;
-
 
364
	      return TRUE;
-
 
365
	   }
304
 
366
 
305
	   if (!gmn)		/* allocating space for first structure */
367
	   if (!gmn)		/* allocating space for first structure */
306
	   {
368
	   {
307
	      if ((gmn = garmin_alloc_data (data_Dlist)) == NULL)
369
	      if ((gmn = garmin_alloc_data (data_Dlist)) == NULL)
308
	      {
370
	      {
Line 363... Line 425...
363
	      __error = 4;
425
	      __error = 4;
364
	      return FALSE;
426
	      return FALSE;
365
	   }
427
	   }
366
 
428
 
367
	   memmove (gdt->data, &lap, sizeof (D1015));
429
	   memmove (gdt->data, &lap, sizeof (D1015));
-
 
430
	   plap = (D1015 *)gdt->data;
368
 
431
 
369
	   if (ds)
432
	   if (ds)
370
	      ds->garmin_print_data (gdt);
433
	      ds->garmin_print_data (gdt);
371
 
434
 
372
	   if ((l = garmin_list_append (list, gdt)) == NULL)
435
	   if ((l = garmin_list_append (list, gdt)) == NULL)
Line 376... Line 439...
376
	   }
439
	   }
377
 
440
 
378
	   list = l;
441
	   list = l;
379
	}
442
	}
380
 
443
 
-
 
444
	if (history && qName.lower() == QString("track"))
-
 
445
	   first_tpos = 0;
-
 
446
 
381
	if (qName.lower() == QString("trackpoint"))
447
	if (qName.lower() == QString("trackpoint"))
382
	{
448
	{
383
	   garmin_data *gdt;
449
	   garmin_data *gdt;
384
	   garmin_list *l;
450
	   garmin_list *l;
385
 
451
 
Line 459... Line 525...
459
	   }
525
	   }
460
 
526
 
461
	   list = l;
527
	   list = l;
462
	}
528
	}
463
 
529
 
464
	if (qName.lower() == QString("course"))
530
	if (qName.lower() == QString("course") || qName.lower() == QString("activity"))
465
	{
531
	{
466
	   con.setAscii("");
532
	   con.setAscii("");
467
	   run.track_index = tpos - 1;
533
	   run.track_index = tpos - 1;
468
	   run.last_lap_index = lpos - 1;
534
	   run.last_lap_index = lpos - 1;
469
	   memmove (prun, &run, sizeof (D1009));
535
	   memmove (prun, &run, sizeof (D1009));
-
 
536
	   history = false;
470
	}
537
	}
471
 
538
 
472
	if (qName.lower() == QString("beginposition") || qName.lower() == QString("endposition") ||
539
	if (qName.lower() == QString("beginposition") || qName.lower() == QString("endposition") ||
473
	    qName.lower() == QString("averageheartratebpm") || qName.lower() == QString("maximumheartratebpm"))
540
	    qName.lower() == QString("averageheartratebpm") || qName.lower() == QString("maximumheartratebpm"))
474
	   subCon.setAscii("");
541
	   subCon.setAscii("");
Line 501... Line 568...
501
	      run.workout.name[15] = 0;
568
	      run.workout.name[15] = 0;
502
	      tk = 0;
569
	      tk = 0;
503
	   }
570
	   }
504
	}
571
	}
505
 
572
 
-
 
573
	if (history && con == QString("activity"))
-
 
574
	{
-
 
575
	   if (tk == FLD_ID)
-
 
576
	   {
-
 
577
	      strncpy (run.workout.name, ch.ascii(), 15);
-
 
578
	      run.workout.name[15] = 0;
-
 
579
	      tk = 0;
-
 
580
	   }
-
 
581
	}
-
 
582
 
506
	if (con == QString("lap"))
583
	if (con == QString("lap"))
507
	{
584
	{
508
	   if (tk == FLD_DISTANCEMETERS)
585
	   if (tk == FLD_DISTANCEMETERS)
509
	   {
586
	   {
510
	      lap.total_dist = (float32)ch.toFloat();
587
	      lap.total_dist = (float32)ch.toFloat();
Line 545... Line 622...
545
	   {
622
	   {
546
	      lap.max_speed = (float32)ch.toFloat();
623
	      lap.max_speed = (float32)ch.toFloat();
547
	      tk = 0;
624
	      tk = 0;
548
	   }
625
	   }
549
 
626
 
-
 
627
	   if (tk == FLD_TRIGGERMETHOD)
-
 
628
	   {
-
 
629
	      if (ch.lower() == QString("manual"))
-
 
630
		 lap.trigger_method = D1011_manual;
-
 
631
	      else if (ch.lower() == QString("distance"))
-
 
632
		 lap.trigger_method = D1011_distance;
-
 
633
	      else if (ch.lower() == QString("location"))
-
 
634
		 lap.trigger_method = D1011_location;
-
 
635
	      else if (ch.lower() == QString("time"))
-
 
636
		 lap.trigger_method = D1011_time;
-
 
637
	      else if (ch.lower() == QString("HeartRate"))
-
 
638
		 lap.trigger_method = D1011_heart_rate;
-
 
639
	   }
-
 
640
 
550
	   if (subCon.lower() == QString("BeginPosition").lower())
641
	   if (subCon.lower() == QString("BeginPosition").lower())
551
	   {
642
	   {
552
	      if (tk == FLD_LATITUDEDEGREES)
643
	      if (tk == FLD_LATITUDEDEGREES)
553
	      {
644
	      {
554
		 lap.begin.lat = (ch.toDouble() == 180.0) ? 0x7fffffff : (sint32)DEG2SEMI(ch.toDouble());
645
		 lap.begin.lat = (ch.toDouble() == 180.0) ? 0x7fffffff : (sint32)DEG2SEMI(ch.toDouble());
Line 596... Line 687...
596
	if (con == QString("trackpoint"))
687
	if (con == QString("trackpoint"))
597
	{
688
	{
598
	   if (tk == FLD_TIME)
689
	   if (tk == FLD_TIME)
599
	   {
690
	   {
600
	      point.time = garmin_time (ch);
691
	      point.time = garmin_time (ch);
-
 
692
 
-
 
693
	      if (history && first_tpos == tpos && plap)
-
 
694
		 plap->start_time = point.time;
-
 
695
 
601
	      tk = 0;
696
	      tk = 0;
602
	   }
697
	   }
603
 
698
 
604
	   if (tk == FLD_ALTITUDEMETERS)
699
	   if (tk == FLD_ALTITUDEMETERS)
605
	   {
700
	   {
Line 622... Line 717...
622
	   if (subCon.lower() == QString("position"))
717
	   if (subCon.lower() == QString("position"))
623
	   {
718
	   {
624
	      if (tk == FLD_LATITUDEDEGREES)
719
	      if (tk == FLD_LATITUDEDEGREES)
625
	      {
720
	      {
626
		 point.posn.lat = (ch.toDouble() == 180.0) ? 0x7fffffff : (sint32)DEG2SEMI(ch.toDouble());
721
		 point.posn.lat = (ch.toDouble() == 180.0) ? 0x7fffffff : (sint32)DEG2SEMI(ch.toDouble());
-
 
722
 
-
 
723
		 if (history && tpos == first_tpos && plap)	// Add mising information to first lap
-
 
724
		    plap->begin.lat = point.posn.lat;
-
 
725
		 else if (history && point.posn.lat != 0x7fffffff && plap)
-
 
726
		    plap->end.lat = point.posn.lat;
-
 
727
 
627
		 tk = 0;
728
		 tk = 0;
628
	      }
729
	      }
629
 
730
 
630
	      if (tk == FLD_LONGITUDEDEGREES)
731
	      if (tk == FLD_LONGITUDEDEGREES)
631
	      {
732
	      {
632
		 point.posn.lon = (ch.toDouble() == 180.0) ? 0x7fffffff : (sint32)DEG2SEMI(ch.toDouble());
733
		 point.posn.lon = (ch.toDouble() == 180.0) ? 0x7fffffff : (sint32)DEG2SEMI(ch.toDouble());
-
 
734
 
-
 
735
		 if (history && tpos == first_tpos && plap)	// Add mising information to first lap
-
 
736
		    plap->begin.lon = point.posn.lon;
-
 
737
		 else if (history && point.posn.lon != 0x7fffffff && plap)
-
 
738
		    plap->end.lat = point.posn.lon;
-
 
739
 
633
		 tk = 0;
740
		 tk = 0;
634
	      }
741
	      }
635
	   }
742
	   }
636
	   else if (subCon.lower() == QString("heartratebpm"))
743
	   else if (subCon.lower() == QString("heartratebpm"))
637
	   {
744
	   {