1 /*
2     Handle energympro (GPS training watch) .cpo files
3 
4     Copyright (c) 2014 Zingo Andersen zingo@vectrace.com
5     Copyright (C) 2014 Robert Lipe, robertlipe+source@gpsbabel.org
6 
7     This program is free software; you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11 
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15     GNU General Public License for more details.
16 
17     You should have received a copy of the GNU General Public License
18     along with this program; if not, write to the Free Software
19     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20 
21  */
22 #ifndef ENERGYMPRO_H_INCLUDED_
23 #define ENERGYMPRO_H_INCLUDED_
24 
25 #include <cstdint>              // for uint8_t, uint16_t, uint32_t, int16_t
26 
27 #include <QtCore/QString>       // for QString
28 #include <QtCore/QTimeZone>     // for QTimeZone
29 #include <QtCore/QVector>       // for QVector
30 
31 #include "defs.h"
32 #include "format.h"             // for Format
33 #include "gbfile.h"             // for gbfgetc, gbfseek, gbfclose, gbfopen, gbfread, gbfgetuint32, gbfcopyfrom, gbfgetuint16, gbfile, gbsize_t
34 #include "src/core/datetime.h"  // for DateTime
35 
36 
37 class EnergymproFormat : public Format
38 {
39 public:
get_args()40   QVector<arglist_t>* get_args() override
41   {
42     return &energympro_args;
43   }
44 
get_type()45   ff_type get_type() const override
46   {
47     return ff_type_file;
48   }
49 
get_cap()50   QVector<ff_cap> get_cap() const override
51   {
52     return {
53       ff_cap_none,  // waypoints
54       ff_cap_read,  // tracks
55       ff_cap_none   // routes
56     };
57   }
58 
get_encode()59   QString get_encode() const override
60   {
61     return CET_CHARSET_ASCII;
62   }
63 
get_fixed_encode()64   int get_fixed_encode() const override
65   {
66     return 0;
67   }
68 
69   void rd_init(const QString& fname) override;
70   void read() override;
71   void rd_deinit() override;
72 
73 private:
74   /* Types */
75 
76   struct tw_date {
77     uint8_t Year;
78     uint8_t Month;
79     uint8_t Day;
80   };
81 
82   struct tw_time {
83     uint8_t Hour;
84     uint8_t Minute;
85     uint8_t Second;
86   };
87 
88   struct tw_workout {
89     tw_date       dateStart;            // start date
90     tw_time       timeStart;            // start time
91     uint16_t      TotalRecPt;           // Total record Point
92     uint32_t      TotalTime;            // Total Time
93     uint32_t      TotalDist;            // Total Distance
94     uint16_t      LapNumber;            // Lap Number
95     uint16_t      Calory;               // Calory
96     uint32_t      MaxSpeed;             // Max Speed
97     uint32_t      AvgSpeed;             // average Speed
98     uint8_t       MaxHeart;             // Max Heartrate
99     uint8_t       AvgHeart;             // average Heart
100     uint16_t      Ascent;               // Ascent
101     uint16_t      Descent;              // Descent
102     int16_t       MinAlti;              // Min Altitude
103     int16_t       MaxAlti;              // Max Altitude
104     uint8_t       AvgCad;               // average Cadence
105     uint8_t       MaxCad;               // Best Cadence
106     uint16_t      AvgPower;             // average Power
107     uint16_t      MaxPower;             // Max Power
108     char          VersionProduct[15];
109     uint8_t       reserved1;
110     uint8_t       VersionVerNum;
111     uint8_t       reserved2[17];
112   };
113 
114   struct tw_point {
115     uint32_t  Latitude;
116     uint32_t  Longitude;
117     int16_t   Altitude;
118     uint16_t  reserved1;
119     uint32_t  Speed;
120     uint16_t  IntervalDist;          // Interval Distance
121     uint16_t  reserved2;
122     uint32_t  lntervalTime;          // Interval time
123     uint8_t   Status;                //Status (0 = ok, 1 = miss, 2 = no good, 3 = bad)
124     uint8_t   HR_Heartrate;
125     uint8_t   HR_Status;
126     uint8_t   reserved3;
127     uint32_t  Speed_Speed;
128     uint8_t   Speed_Status;
129     uint8_t   reserved4;
130     uint8_t   reserved5;
131     uint8_t   reserved6;
132     uint8_t   Cadence_Cadence;
133     uint8_t   Cadence_Status;
134     uint16_t  Power_Cadence;
135     uint16_t  Power_Power;
136     uint8_t   Power_Status;
137     uint8_t   reserved7;
138     uint8_t   Temp;
139     uint8_t   reserved8;
140     uint8_t   reserved9;
141     uint8_t   reserved10;
142   };
143 
144   struct tw_lap {
145     uint32_t       splitTime;        // split time
146     uint32_t       TotalTime;        // Total Time
147     uint16_t       Number;           // Number
148     uint16_t       reserved1;
149     uint32_t       lDistance;        // Distance
150     uint16_t       Calorie;          // Calorie
151     uint16_t       reserved2;
152     uint32_t       MaxSpeed;         // Max Speed
153     uint32_t       AvgSpeed;         // average Speed
154     uint8_t        MaxHeartrate;     // Max Heartrate
155     uint8_t        AvgHeartrate;     // average Heartrate
156     int16_t        MinAlti;          // Min Altitude
157     int16_t        MaxAlti;          // Max Altitude
158     uint8_t        AvgCad;           // average Cadence
159     uint8_t        MaxCad;           // Max Cadence
160     uint16_t       AvgPower;         // average Power
161     uint16_t       MaxPower;         // Max Power
162     uint16_t       StartRecPt;       // start record point
163     uint16_t       FinishRecPt;      // Finish record point
164   };
165 
166   /* Member Functions */
167 
168   void read_point(route_head* gpsbabel_route, gpsbabel::DateTime& gpsDateTime) const;
169   void read_lap() const;
170   void track_read();
171 
172   /* Data Members */
173 
174   gbfile* file_in{nullptr};
175   char* opt_timezone{nullptr};
176   QTimeZone* timezn{nullptr};
177 
178   QVector<arglist_t> energympro_args = {
179     {"timezone", &opt_timezone, "Time zone ID", nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr},
180   };
181 };
182 #endif // ENERGYMPRO_H_INCLUDED_
183