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