[PATCH] fix endianness/packing issues with energympro, globalsat_sport.
authortsteven4 <13596209+tsteven4@users.noreply.github.com>
Thu, 6 Aug 2020 14:23:11 +0000 (08:23 -0600)
committerJochen Sprickerhof <jspricke@debian.org>
Sat, 17 Oct 2020 10:37:40 +0000 (11:37 +0100)
this was motivated by test failures seen at
https://buildd.debian.org/status/fetch.php?pkg=gpsbabel&arch=s390x&ver=1.7.0%2Bds-3&stamp=1594393020&raw=0

Gbp-Pq: Name 618.patch

energympro.cc
energympro.h
globalsat_sport.cc

index 2695a8f52752195732837d54abc0ae56ab23a42b..978052a184c17bc02a8f909b929836ef350d0cc5 100644 (file)
@@ -33,7 +33,7 @@
 
 #include "defs.h"
 #include "energympro.h"
-#include "gbfile.h"             // for gbfgetc, gbfseek, gbfclose, gbfopen, gbfread, gbfgetuint32, gbfcopyfrom, gbfgetuint16, gbfile, gbsize_t
+#include "gbfile.h"             // for gbfgetc, gbfgetuint16, gbfgetuint32, gbfseek, gbfgetint16, gbfclose, gbfopen, gbfcopyfrom, gbfile, gbsize_t
 #include "src/core/datetime.h"  // for DateTime
 
 
@@ -46,22 +46,48 @@ void
 EnergymproFormat::read_point(route_head* gpsbabel_route, gpsbabel::DateTime& gpsDateTime) const
 {
   tw_point point{};
-  gbfread(&point, sizeof(tw_point), 1, file_in);
+  point.Latitude = gbfgetuint32(file_in);
+  point.Longitude = gbfgetuint32(file_in);
+  point.Altitude = gbfgetint16(file_in);
+  point.reserved1 = gbfgetuint16(file_in);
+  point.Speed = gbfgetuint32(file_in);
+  point.IntervalDist = gbfgetuint16(file_in);
+  point.reserved2 = gbfgetuint16(file_in);
+  point.IntervalTime = gbfgetuint32(file_in);
+  point.Status = gbfgetc(file_in);
+  point.HR_Heartrate = gbfgetc(file_in);
+  point.HR_Status = gbfgetc(file_in);
+  point.reserved3 = gbfgetc(file_in);
+  point.Speed_Speed = gbfgetuint32(file_in);
+  point.Speed_Status = gbfgetc(file_in);
+  point.reserved4 = gbfgetc(file_in);
+  point.reserved5 = gbfgetc(file_in);
+  point.reserved6 = gbfgetc(file_in);
+  point.Cadence_Cadence = gbfgetc(file_in);
+  point.Cadence_Status = gbfgetc(file_in);
+  point.Power_Cadence = gbfgetuint16(file_in);
+  point.Power_Power = gbfgetuint16(file_in);
+  point.Power_Status = gbfgetc(file_in);
+  point.reserved7 = gbfgetc(file_in);
+  point.Temp = gbfgetc(file_in);
+  point.reserved8 = gbfgetc(file_in);
+  point.reserved9 = gbfgetc(file_in);
+  point.reserved10 = gbfgetc(file_in);
   if (global_opts.debug_level > 1) {
     printf("Point: lat:%8u long:%8u alt:%8d ", point.Latitude, point.Longitude, point.Altitude);
-    printf("speed:%6u dist:%5u time:%5u Status:%1u", point.Speed, point.IntervalDist, point.lntervalTime, point.Status);
+    printf("speed:%6u dist:%5u time:%5u Status:%1u", point.Speed, point.IntervalDist, point.IntervalTime, point.Status);
     printf("HR:(%3d,%1d)", point.HR_Heartrate, point.HR_Status);
     printf("Speed:(%8u,%1d)", point.Speed_Speed, point.Speed_Status);
     printf("Cad:(%3d,%1d)", point.Cadence_Cadence, point.Cadence_Status);
     printf("Power (Cad:%6d Pow:%6d,%2d)Temp:%3d\n", point.Power_Cadence, point.Power_Power, point.Power_Status, point.Temp);
 
     qDebug() << "DateTime1:" << gpsDateTime.toString();
-    qDebug() << "point.lntervalTime:" << point.lntervalTime;
+    qDebug() << "point.IntervalTime:" << point.IntervalTime;
   }
 
-  //Time from last point in sec's * 10 (e.g. point.lntervalTime is sec multiplied with 10)
+  //Time from last point in sec's * 10 (e.g. point.IntervalTime is sec multiplied with 10)
   // convert to millisecs
-  gpsDateTime = gpsDateTime.addMSecs(point.lntervalTime*100);
+  gpsDateTime = gpsDateTime.addMSecs(point.IntervalTime*100);
 
   auto waypt = new Waypoint;
   waypt->latitude = (point.Latitude / 1000000.0);
@@ -95,7 +121,25 @@ void
 EnergymproFormat::read_lap() const
 {
   tw_lap lap{};
-  gbfread(&lap, sizeof(tw_lap), 1, file_in);
+  lap.splitTime = gbfgetuint32(file_in);
+  lap.TotalTime = gbfgetuint32(file_in);
+  lap.Number = gbfgetuint16(file_in);
+  lap.reserved1 = gbfgetuint16(file_in);
+  lap.lDistance = gbfgetuint32(file_in);
+  lap.Calorie = gbfgetuint16(file_in);
+  lap.reserved2 = gbfgetuint16(file_in);
+  lap.MaxSpeed = gbfgetuint32(file_in);
+  lap.AvgSpeed = gbfgetuint32(file_in);
+  lap.MaxHeartrate = gbfgetc(file_in);
+  lap.AvgHeartrate = gbfgetc(file_in);
+  lap.MinAlti = gbfgetint16(file_in);
+  lap.MaxAlti = gbfgetint16(file_in);
+  lap.AvgCad = gbfgetc(file_in);
+  lap.MaxCad = gbfgetc(file_in);
+  lap.AvgPower = gbfgetuint16(file_in);
+  lap.MaxPower = gbfgetuint16(file_in);
+  lap.StartRecPt = gbfgetuint16(file_in);
+  lap.FinishRecPt = gbfgetuint16(file_in);
   if (global_opts.debug_level > 1) {
     printf("LAP: splitTime:%6us TotalTime:%6us LapNumber:%5d ", lap.splitTime/10, lap.TotalTime/10, lap.Number);
     printf("dist:%08um Cal:%5u Speed:(%6u,%6u) ", lap.lDistance, lap.Calorie, lap.MaxSpeed, lap.AvgSpeed);
index 18403fb1ddaee636962fca742c1ffb6b11062a6b..d5e9a59964ff64f2d818f5cf672f4cb88aa1c926 100644 (file)
@@ -119,7 +119,7 @@ private:
     uint32_t  Speed;
     uint16_t  IntervalDist;          // Interval Distance
     uint16_t  reserved2;
-    uint32_t  lntervalTime;          // Interval time
+    uint32_t  IntervalTime;          // Interval time
     uint8_t   Status;                //Status (0 = ok, 1 = miss, 2 = no good, 3 = bad)
     uint8_t   HR_Heartrate;
     uint8_t   HR_Status;
index 269c55e27b3ad1736210ae84146f73678dc4e49d..af755f97b260ab8e5244d49dfe38a7807c6d12dc 100644 (file)
@@ -120,12 +120,12 @@ GlobalsatSportFormat::recv_byte()
   if (!opt_input_dump_file) {
     result=serial_recv_byte();
   } else {
-    int bytes = gbfread(&result, 1, 1, in_file);
-    is_fatal((bytes != 1), MYNAME ": read error");
+    result = gbfgetc(in_file);
+    is_fatal((result < 0), MYNAME ": read error");
   }
   // Check if byte should be dumped also into a file
   if (dumpfile) {
-    gbfwrite(&result, 1, 1, dumpfile);
+    gbfputc(result, dumpfile);
   }
   return result;
 }