2 * This file is part of Cleanflight.
4 * Cleanflight is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * Cleanflight is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.
27 #include "build/debug.h"
29 #include "common/axis.h"
30 #include "common/gps_conversion.h"
33 #include "pg/pg_ids.h"
35 #include "drivers/system.h"
36 #include "drivers/serial.h"
37 #include "drivers/system.h"
39 #include "fc/runtime_config.h"
41 #include "flight/pid.h"
44 #include "io/serial.h"
46 #include "sensors/barometer.h"
47 #include "sensors/battery.h"
48 #include "sensors/sensors.h"
50 #include "telemetry/telemetry.h"
51 #include "telemetry/hott.h"
53 PG_REGISTER(telemetryConfig_t
, telemetryConfig
, PG_TELEMETRY_CONFIG
, 0);
55 uint16_t testBatteryVoltage
= 0;
56 int32_t testAmperage
= 0;
57 int32_t testMAhDrawn
= 0;
61 #include "unittest_macros.h"
62 #include "gtest/gtest.h"
65 void addGPSCoordinates(HOTT_GPS_MSG_t
*hottGPSMessage
, int32_t latitude
, int32_t longitude
);
67 // See http://en.wikipedia.org/wiki/Geographic_coordinate_conversion
69 HOTT_GPS_MSG_t hottGPSMessage
;
71 HOTT_GPS_MSG_t
*getGPSMessageForTest(void)
73 memset(&hottGPSMessage
, 0, sizeof(hottGPSMessage
));
74 return &hottGPSMessage
;
77 TEST(TelemetryHottTest
, UpdateGPSCoordinates1
)
80 HOTT_GPS_MSG_t
*hottGPSMessage
= getGPSMessageForTest();
83 uint32_t longitude
= GPS_coord_to_degrees("4710.5186");
84 uint32_t latitude
= GPS_coord_to_degrees("1151.4252");
87 addGPSCoordinates(hottGPSMessage
, latitude
, longitude
);
90 EXPECT_EQ(hottGPSMessage
->pos_NS
, 0);
91 EXPECT_EQ(hottGPSMessage
->pos_NS_dm_H
<< 8 | hottGPSMessage
->pos_NS_dm_L
, 1151);
92 EXPECT_EQ((int16_t)(hottGPSMessage
->pos_NS_sec_H
<< 8 | hottGPSMessage
->pos_NS_sec_L
), 4251);
94 EXPECT_EQ(hottGPSMessage
->pos_EW
, 0);
95 EXPECT_EQ(hottGPSMessage
->pos_EW_dm_H
<< 8 | hottGPSMessage
->pos_EW_dm_L
, 4710);
96 EXPECT_EQ((int16_t)(hottGPSMessage
->pos_EW_sec_H
<< 8 | hottGPSMessage
->pos_EW_sec_L
), 5186);
99 TEST(TelemetryHottTest
, UpdateGPSCoordinates2
)
102 HOTT_GPS_MSG_t
*hottGPSMessage
= getGPSMessageForTest();
104 // Hampstead Heath, London
105 // 51.563886, -0.159960
106 uint32_t longitude
= GPS_coord_to_degrees("5156.3886");
107 uint32_t latitude
= -GPS_coord_to_degrees("015.9960");
110 addGPSCoordinates(hottGPSMessage
, longitude
, latitude
);
113 EXPECT_EQ(hottGPSMessage
->pos_NS
, 0);
114 EXPECT_EQ(hottGPSMessage
->pos_NS_dm_H
<< 8 | hottGPSMessage
->pos_NS_dm_L
, 5156);
115 EXPECT_EQ(hottGPSMessage
->pos_NS_sec_H
<< 8 | hottGPSMessage
->pos_NS_sec_L
, 3886);
117 EXPECT_EQ(hottGPSMessage
->pos_EW
, 1);
118 EXPECT_EQ((int16_t)(hottGPSMessage
->pos_EW_dm_H
<< 8 | hottGPSMessage
->pos_EW_dm_L
), -15);
119 EXPECT_EQ((int16_t)(hottGPSMessage
->pos_EW_sec_H
<< 8 | hottGPSMessage
->pos_EW_sec_L
), -9960);
123 TEST(TelemetryHottTest
, UpdateGPSCoordinates3
)
126 HOTT_GPS_MSG_t
*hottGPSMessage
= getGPSMessageForTest();
128 int32_t longitude
= -GPS_coord_to_degrees("17999.9999");
129 int32_t latitude
= GPS_coord_to_degrees("8999.9999");
132 addGPSCoordinates(hottGPSMessage
, longitude
, latitude
);
135 EXPECT_EQ(hottGPSMessage
->pos_NS
, 1);
136 EXPECT_EQ((int16_t)(hottGPSMessage
->pos_NS_dm_H
<< 8 | hottGPSMessage
->pos_NS_dm_L
), -18039);
137 EXPECT_EQ((int16_t)(hottGPSMessage
->pos_NS_sec_H
<< 8 | hottGPSMessage
->pos_NS_sec_L
), -9999);
139 EXPECT_EQ(hottGPSMessage
->pos_EW
, 0);
140 EXPECT_EQ((int16_t)(hottGPSMessage
->pos_EW_dm_H
<< 8 | hottGPSMessage
->pos_EW_dm_L
), 9039);
141 EXPECT_EQ((int16_t)(hottGPSMessage
->pos_EW_sec_H
<< 8 | hottGPSMessage
->pos_EW_sec_L
), 9999);
145 TEST(TelemetryHottTest, PrepareGPSMessage_Altitude1m)
148 HOTT_GPS_MSG_t *hottGPSMessage = getGPSMessageForTest();
150 stateFlags = GPS_FIX;
151 uint16_t altitudeInMeters = 1;
152 GPS_altitude = altitudeInMeters * (1 / 0.1f); // 1 = 0.1m
155 hottPrepareGPSResponse(hottGPSMessage);
158 EXPECT_EQ((int16_t)(hottGPSMessage->altitude_H << 8 | hottGPSMessage->altitude_L), 1 + HOTT_GPS_ALTITUDE_OFFSET);
166 int16_t debug
[DEBUG16_VALUE_COUNT
];
170 uint16_t batteryWarningVoltage
;
171 uint8_t useHottAlarmSoundPeriod (void) { return 0; }
174 gpsSolutionData_t gpsSol
;
175 uint16_t GPS_distanceToHome
; // distance to home point in meters
176 int16_t GPS_directionToHome
; // direction to home or hol point in degrees
179 uint32_t fixedMillis
= 0;
183 int32_t getEstimatedAltitudeCm() { return 0; }
184 int16_t getEstimatedVario() { return 0; }
186 uint32_t millis(void) {
190 uint32_t micros(void) { return 0; }
192 uint32_t serialRxBytesWaiting(const serialPort_t
*instance
)
198 uint32_t serialTxBytesFree(const serialPort_t
*instance
)
204 uint8_t serialRead(serialPort_t
*instance
)
210 void serialWrite(serialPort_t
*instance
, uint8_t ch
)
216 void serialSetMode(serialPort_t
*instance
, portMode_e mode
)
222 serialPort_t
*openSerialPort(serialPortIdentifier_e identifier
, serialPortFunction_e functionMask
, serialReceiveCallbackPtr callback
, void *callbackData
, uint32_t baudRate
, portMode_e mode
, portOptions_e options
)
225 UNUSED(functionMask
);
228 UNUSED(callbackData
);
235 void closeSerialPort(serialPort_t
*serialPort
)
240 const serialPortConfig_t
*findSerialPortConfig(serialPortFunction_e function
)
247 bool sensors(uint32_t mask
)
253 bool telemetryDetermineEnabledState(portSharing_e
)
258 bool telemetryIsSensorEnabled(sensor_e sensor
) {
263 portSharing_e
determinePortSharing(const serialPortConfig_t
*, serialPortFunction_e
)
265 return PORTSHARING_NOT_SHARED
;
268 batteryState_e
getBatteryState(void)
273 batteryState_e
getVoltageState(void)
278 batteryState_e
getConsumptionState(void)
283 uint16_t getBatteryVoltage(void)
285 return testBatteryVoltage
;
288 uint16_t getLegacyBatteryVoltage(void)
290 return (testBatteryVoltage
+ 5) / 10;
293 int32_t getAmperage(void) {
297 int32_t getMAhDrawn(void) {