* Add FY805 protocol * Fix stray space * Fix multi sending 120% instead of 100%. * Implement a custom telemetry for the multi module The custom telemetry allows the module to tell the telemetry protocol to OpenTX and also allows signaling the status of the Module (e.g. invalid protocol) to OpenTX This should also close #3979. * Cosmetics and a few small bugfixes * remove empty if * Move status line directly below the mode to be always visible when selecting a protocol * warn if internal RF module is on * Replace sprint with small helper function to build on AVR ARM (AR9X, 9XPRO, …) * TR in wrong order, RF_PROTO_OFF inverted * Refactor definition of Multimodule protocols to have one central place to define all multi protocol properties * Also update protocols in companion * Update multi version number to display as a.b.c.d
557 lines
20 KiB
C++
557 lines
20 KiB
C++
/*
|
|
* Copyright (C) OpenTX
|
|
*
|
|
* Based on code named
|
|
* th9x - http://code.google.com/p/th9x
|
|
* er9x - http://code.google.com/p/er9x
|
|
* gruvin9x - http://code.google.com/p/gruvin9x
|
|
*
|
|
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#include "gtests.h"
|
|
|
|
void frskyDProcessPacket(const uint8_t *packet);
|
|
|
|
#if defined(TELEMETRY_FRSKY_SPORT)
|
|
bool checkSportPacket(const uint8_t *packet);
|
|
void sportProcessTelemetryPacket(const uint8_t * packet);
|
|
bool checkSportPacket(const uint8_t *packet);
|
|
void frskyCalculateCellStats(void);
|
|
void displayVoltagesScreen();
|
|
#endif
|
|
|
|
#if defined(TELEMETRY_FRSKY) && !defined(CPUARM)
|
|
TEST(FrSky, gpsNfuel)
|
|
{
|
|
MODEL_RESET();
|
|
TELEMETRY_RESET();
|
|
g_model.frsky.usrProto = 1;
|
|
telemetryData.hub.gpsFix = 1;
|
|
|
|
uint8_t pkt1[] = { 0xfd, 0x07, 0x00, 0x5e, 0x14, 0x2c, 0x00, 0x5e, 0x1c, 0x03 };
|
|
uint8_t pkt2[] = { 0xfd, 0x07, 0x00, 0x00, 0x5e, 0x13, 0x38, 0x0c, 0x5e, 0x1b };
|
|
uint8_t pkt3[] = { 0xfd, 0x07, 0x00, 0xc9, 0x06, 0x5e, 0x23, 0x4e, 0x00, 0x5e };
|
|
uint8_t pkt4[] = { 0xfd, 0x07, 0x00, 0x12, 0xef, 0x2e, 0x5e, 0x1a, 0x98, 0x26 };
|
|
uint8_t pkt5[] = { 0xfd, 0x07, 0x00, 0x5e, 0x22, 0x45, 0x00, 0x5e, 0x11, 0x02 };
|
|
uint8_t pkt6[] = { 0xfd, 0x07, 0x00, 0x00, 0x5e, 0x19, 0x93, 0x00, 0x5e, 0x04 };
|
|
uint8_t pkt7[] = { 0xfd, 0x03, 0x00, 0x64, 0x00, 0x5e };
|
|
frskyDProcessPacket(pkt1);
|
|
frskyDProcessPacket(pkt2);
|
|
frskyDProcessPacket(pkt3);
|
|
frskyDProcessPacket(pkt4);
|
|
frskyDProcessPacket(pkt5);
|
|
frskyDProcessPacket(pkt6);
|
|
frskyDProcessPacket(pkt7);
|
|
EXPECT_EQ(telemetryData.hub.gpsCourse_bp, 44);
|
|
EXPECT_EQ(telemetryData.hub.gpsCourse_ap, 03);
|
|
EXPECT_EQ(telemetryData.hub.gpsLongitude_bp / 100, 120);
|
|
EXPECT_EQ(telemetryData.hub.gpsLongitude_bp % 100, 15);
|
|
EXPECT_EQ(telemetryData.hub.gpsLongitude_ap, 0x2698);
|
|
EXPECT_EQ(telemetryData.hub.gpsLatitudeNS, 'N');
|
|
EXPECT_EQ(telemetryData.hub.gpsLongitudeEW, 'E');
|
|
EXPECT_EQ(telemetryData.hub.fuelLevel, 100);
|
|
}
|
|
|
|
TEST(FrSky, dateNtime)
|
|
{
|
|
MODEL_RESET();
|
|
TELEMETRY_RESET();
|
|
g_model.frsky.usrProto = 1;
|
|
telemetryData.hub.gpsFix = 1;
|
|
|
|
uint8_t pkt1[] = { 0xfd, 0x07, 0x00, 0x5e, 0x15, 0x0f, 0x07, 0x5e, 0x16, 0x0b };
|
|
uint8_t pkt2[] = { 0xfd, 0x07, 0x00, 0x00, 0x5e, 0x17, 0x06, 0x12, 0x5e, 0x18 };
|
|
uint8_t pkt3[] = { 0xfd, 0x03, 0x00, 0x32, 0x00, 0x5e };
|
|
frskyDProcessPacket(pkt1);
|
|
frskyDProcessPacket(pkt2);
|
|
frskyDProcessPacket(pkt3);
|
|
EXPECT_EQ(telemetryData.hub.day, 15);
|
|
EXPECT_EQ(telemetryData.hub.month, 07);
|
|
EXPECT_EQ(telemetryData.hub.year, 11);
|
|
EXPECT_EQ(telemetryData.hub.hour, 06);
|
|
EXPECT_EQ(telemetryData.hub.min, 18);
|
|
EXPECT_EQ(telemetryData.hub.sec, 50);
|
|
}
|
|
#endif
|
|
|
|
#if defined(TELEMETRY_FRSKY) && defined(CPUARM)
|
|
TEST(FrSky, TelemetryValueWithMinAveraging)
|
|
{
|
|
/*
|
|
The following expected[] array is filled
|
|
with values that correspond to 4 elements
|
|
long averaging buffer.
|
|
If length of averaging buffer is changed, this
|
|
values must be adjusted
|
|
*/
|
|
uint8_t expected[] = { 10, 12, 17, 25, 35, 45, 55, 65, 75, 85, 92, 97, 100, 100, 100, 100, 100};
|
|
int testPos = 0;
|
|
//test of averaging
|
|
TelemetryValueWithMin testVal;
|
|
testVal.value = 0;
|
|
testVal.set(10);
|
|
EXPECT_EQ(RAW_FRSKY_MINMAX(testVal), 10);
|
|
EXPECT_EQ(testVal.value, expected[testPos++]);
|
|
for(int n=2; n<10; ++n) {
|
|
testVal.set(n*10);
|
|
EXPECT_EQ(RAW_FRSKY_MINMAX(testVal), n*10);
|
|
EXPECT_EQ(testVal.value, expected[testPos++]);
|
|
}
|
|
for(int n=2; n<10; ++n) {
|
|
testVal.set(100);
|
|
EXPECT_EQ(RAW_FRSKY_MINMAX(testVal), 100);
|
|
EXPECT_EQ(testVal.value, expected[testPos++]);
|
|
}
|
|
}
|
|
|
|
TEST(FrSky, Vfas_0x39_HiPrecision)
|
|
{
|
|
MODEL_RESET();
|
|
TELEMETRY_RESET();
|
|
EXPECT_EQ(telemetryItems[0].value, 0);
|
|
|
|
allowNewSensors = true;
|
|
|
|
// normal precision, resolution 0.1V
|
|
processHubPacket(VFAS_ID, 1234); // set value of 123.4V
|
|
EXPECT_EQ(telemetryItems[0].value, 12340); // stored value has resolution of 0.01V
|
|
|
|
// now high precision, resolution 0.01V
|
|
processHubPacket(VFAS_ID, VFAS_D_HIPREC_OFFSET); // set value of 0V
|
|
EXPECT_EQ(telemetryItems[0].value, 0);
|
|
processHubPacket(VFAS_ID, VFAS_D_HIPREC_OFFSET + 12345); // set value of 123.45V
|
|
EXPECT_EQ(telemetryItems[0].value, 12345);
|
|
processHubPacket(VFAS_ID, VFAS_D_HIPREC_OFFSET + 30012); // set value of 300.12V
|
|
EXPECT_EQ(telemetryItems[0].value, 30012);
|
|
}
|
|
|
|
TEST(FrSky, HubAltNegative)
|
|
{
|
|
MODEL_RESET();
|
|
TELEMETRY_RESET();
|
|
EXPECT_EQ(telemetryItems[0].value, 0);
|
|
|
|
allowNewSensors = true;
|
|
|
|
// altimeter auto offset
|
|
processHubPacket(BARO_ALT_BP_ID, 0);
|
|
processHubPacket(BARO_ALT_AP_ID, 0);
|
|
EXPECT_EQ(telemetryItems[0].value, 0);
|
|
|
|
// low precision altimeter, bp always less than 10
|
|
processHubPacket(BARO_ALT_BP_ID, 12); // set value of 12.3m
|
|
processHubPacket(BARO_ALT_AP_ID, 3);
|
|
EXPECT_EQ(telemetryItems[0].value, 123); // altitude stored has resolution of 0.1m
|
|
|
|
processHubPacket(BARO_ALT_BP_ID, -12); // set value of -12.3m
|
|
processHubPacket(BARO_ALT_AP_ID, 3);
|
|
EXPECT_EQ(telemetryItems[0].value, -123);
|
|
|
|
// hi precision altimeter, bp can be two decimals
|
|
MODEL_RESET();
|
|
TELEMETRY_RESET();
|
|
|
|
// altimeter auto offset
|
|
processHubPacket(BARO_ALT_BP_ID, 0);
|
|
processHubPacket(BARO_ALT_AP_ID, 0);
|
|
EXPECT_EQ(telemetryItems[0].value, 0);
|
|
|
|
// first trigger hi precision, by setting AP above 9
|
|
processHubPacket(BARO_ALT_BP_ID, -1); // set value of -1.35m
|
|
processHubPacket(BARO_ALT_AP_ID, 35);
|
|
EXPECT_EQ(telemetryItems[0].value, -13);
|
|
|
|
processHubPacket(BARO_ALT_BP_ID, 12); // set value of 12.35m
|
|
processHubPacket(BARO_ALT_AP_ID, 35);
|
|
EXPECT_EQ(telemetryItems[0].value, 123);
|
|
|
|
// now test with the AP less than 10 to check if hiprecision is still active
|
|
processHubPacket(BARO_ALT_BP_ID, 12); // set value of 12.05m
|
|
processHubPacket(BARO_ALT_AP_ID, 05);
|
|
EXPECT_EQ(telemetryItems[0].value, 120);
|
|
}
|
|
|
|
TEST(FrSky, Gps)
|
|
{
|
|
MODEL_RESET();
|
|
TELEMETRY_RESET();
|
|
allowNewSensors = true;
|
|
|
|
EXPECT_EQ(telemetryItems[0].value, 0);
|
|
|
|
// latitude 15 degrees north, 30.5000 minutes = 15.508333333333333 degrees
|
|
processHubPacket(GPS_LAT_BP_ID, 1530); // DDDMM.
|
|
processHubPacket(GPS_LAT_AP_ID, 5000); // .MMMM
|
|
processHubPacket(GPS_LAT_NS_ID, 'N');
|
|
|
|
// longitude 45 degrees west, 20.5000 minutes = 45.34166666666667 degrees
|
|
processHubPacket(GPS_LONG_BP_ID, 4520);
|
|
processHubPacket(GPS_LONG_AP_ID, 5000);
|
|
processHubPacket(GPS_LONG_EW_ID, 'E');
|
|
|
|
EXPECT_EQ(telemetryItems[0].gps.latitude, 15508333);
|
|
EXPECT_EQ(telemetryItems[0].gps.longitude, 45341666);
|
|
}
|
|
|
|
#endif // defined(TELEMETRY_FRSKY) && defined(CPUARM)
|
|
|
|
#if defined(TELEMETRY_FRSKY_SPORT)
|
|
TEST(FrSkySPORT, checkCrc)
|
|
{
|
|
// Packet downstream
|
|
uint8_t pkt1[] = { 0x7E, 0x98, 0x10, 0x10, 0x00, 0x7E, 0x02, 0x00, 0x00, 0x5F };
|
|
EXPECT_EQ(checkSportPacket(pkt1+1), true);
|
|
// Packet upstream
|
|
uint8_t pkt2[] = { 0x7E, 0x1C, 0x31, 0x00, 0x10, 0x85, 0x64, 0x00, 0x00, 0xD4 };
|
|
EXPECT_EQ(checkSportPacket(pkt2+1), true);
|
|
}
|
|
|
|
void setSportPacketCrc(uint8_t * packet)
|
|
{
|
|
short crc = 0;
|
|
for (int i=1; i<FRSKY_SPORT_PACKET_SIZE-1; i++) {
|
|
crc += packet[i]; //0-1FF
|
|
crc += crc >> 8; //0-100
|
|
crc &= 0x00ff;
|
|
crc += crc >> 8; //0-0FF
|
|
crc &= 0x00ff;
|
|
}
|
|
packet[FRSKY_SPORT_PACKET_SIZE-1] = 0xFF - (crc & 0x00ff);
|
|
//TRACE("crc set: %x", packet[FRSKY_SPORT_PACKET_SIZE-1]);
|
|
}
|
|
|
|
void generateSportCellPacket(uint8_t * packet, uint8_t cells, uint8_t battnumber, uint16_t cell1, uint16_t cell2, uint8_t sensorId=DATA_ID_FLVSS)
|
|
{
|
|
packet[0] = sensorId;
|
|
packet[1] = 0x10; //DATA_FRAME
|
|
*((uint16_t *)(packet+2)) = 0x0300; //CELLS_FIRST_ID
|
|
uint32_t data = 0;
|
|
data += (cells << 4) + battnumber;
|
|
data += ((cell1 * 5) & 0xFFF) << 8;
|
|
data += ((cell2 * 5) & 0xFFF) << 20;
|
|
*((int32_t *)(packet+4)) = data;
|
|
setSportPacketCrc(packet);
|
|
}
|
|
|
|
#define _V(volts) (volts/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER)
|
|
|
|
TEST(FrSkySPORT, FrSkyDCells)
|
|
{
|
|
MODEL_RESET();
|
|
TELEMETRY_RESET();
|
|
allowNewSensors = true;
|
|
|
|
uint8_t pkt1[] = { 0x7E, 0x98, 0x10, 0x06, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x12 };
|
|
EXPECT_EQ(checkSportPacket(pkt1+1), true);
|
|
sportProcessTelemetryPacket(pkt1+1);
|
|
uint8_t pkt2[] = { 0x7E, 0x98, 0x10, 0x06, 0x00, 0x17, 0xD0, 0x00, 0x00, 0x02 };
|
|
EXPECT_EQ(checkSportPacket(pkt2+1), true);
|
|
sportProcessTelemetryPacket(pkt2+1);
|
|
uint8_t pkt3[] = { 0x7E, 0x98, 0x10, 0x06, 0x00, 0x27, 0xD0, 0x00, 0x00, 0xF1 };
|
|
EXPECT_EQ(checkSportPacket(pkt3+1), true);
|
|
sportProcessTelemetryPacket(pkt3+1);
|
|
sportProcessTelemetryPacket(pkt1+1);
|
|
sportProcessTelemetryPacket(pkt2+1);
|
|
sportProcessTelemetryPacket(pkt3+1);
|
|
EXPECT_EQ(telemetryItems[0].cells.count, 3);
|
|
EXPECT_EQ(telemetryItems[0].value, 1200);
|
|
for (int i=0; i<3; i++) {
|
|
EXPECT_EQ(telemetryItems[0].cells.values[i].state, 1);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[i].value, 400);
|
|
}
|
|
}
|
|
|
|
TEST(FrSkySPORT, frskySetCellVoltage)
|
|
{
|
|
uint8_t packet[FRSKY_SPORT_PACKET_SIZE];
|
|
|
|
MODEL_RESET();
|
|
TELEMETRY_RESET();
|
|
allowNewSensors = true;
|
|
|
|
// test that simulates 3 cell battery
|
|
generateSportCellPacket(packet, 3, 0, _V(410), _V(420)); sportProcessTelemetryPacket(packet);
|
|
EXPECT_EQ(checkSportPacket(packet), true) << "Bad CRC generation in setSportPacketCrc()";
|
|
generateSportCellPacket(packet, 3, 2, _V(430), _V( 0)); sportProcessTelemetryPacket(packet);
|
|
|
|
generateSportCellPacket(packet, 3, 0, _V(405), _V(300)); sportProcessTelemetryPacket(packet);
|
|
generateSportCellPacket(packet, 3, 2, _V(430), _V( 0)); sportProcessTelemetryPacket(packet);
|
|
|
|
EXPECT_EQ(telemetryItems[0].cells.count, 3);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 405);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[1].value, 300);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[2].value, 430);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[4].value, 0);
|
|
EXPECT_EQ(telemetryItems[0].value, 1135);
|
|
EXPECT_EQ(telemetryItems[0].valueMin, 1135);
|
|
EXPECT_EQ(telemetryItems[0].valueMax, 1260);
|
|
|
|
generateSportCellPacket(packet, 3, 0, _V(405), _V(250)); sportProcessTelemetryPacket(packet);
|
|
generateSportCellPacket(packet, 3, 2, _V(430), _V( 0)); sportProcessTelemetryPacket(packet);
|
|
|
|
generateSportCellPacket(packet, 3, 0, _V(410), _V(420)); sportProcessTelemetryPacket(packet);
|
|
generateSportCellPacket(packet, 3, 2, _V(430), _V( 0)); sportProcessTelemetryPacket(packet);
|
|
|
|
EXPECT_EQ(telemetryItems[0].cells.count, 3);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 410);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[1].value, 420);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[2].value, 430);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[4].value, 0);
|
|
EXPECT_EQ(telemetryItems[0].value, 1260);
|
|
EXPECT_EQ(telemetryItems[0].valueMin, 1085);
|
|
EXPECT_EQ(telemetryItems[0].valueMax, 1260);
|
|
|
|
//add another two cells - 5 cell battery
|
|
generateSportCellPacket(packet, 5, 0, _V(418), _V(408)); sportProcessTelemetryPacket(packet);
|
|
generateSportCellPacket(packet, 5, 2, _V(415), _V(420)); sportProcessTelemetryPacket(packet);
|
|
generateSportCellPacket(packet, 5, 4, _V(410), _V( 0)); sportProcessTelemetryPacket(packet);
|
|
|
|
EXPECT_EQ(telemetryItems[0].cells.count, 5);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[1].value, 408);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[2].value, 415);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[3].value, 420);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[4].value, 410);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[5].value, 0);
|
|
EXPECT_EQ(telemetryItems[0].value, 2071);
|
|
EXPECT_EQ(telemetryItems[0].valueMin, 2071);
|
|
EXPECT_EQ(telemetryItems[0].valueMax, 2071);
|
|
|
|
//simulate very low voltage for cell 3
|
|
generateSportCellPacket(packet, 5, 0, _V(418), _V(408)); sportProcessTelemetryPacket(packet);
|
|
generateSportCellPacket(packet, 5, 2, _V(100), _V(420)); sportProcessTelemetryPacket(packet);
|
|
generateSportCellPacket(packet, 5, 4, _V(410), _V( 0)); sportProcessTelemetryPacket(packet);
|
|
|
|
EXPECT_EQ(telemetryItems[0].cells.count, 5);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[1].value, 408);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[2].value, 100);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[3].value, 420);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[4].value, 410);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[5].value, 0);
|
|
EXPECT_EQ(telemetryItems[0].value, 1756);
|
|
EXPECT_EQ(telemetryItems[0].valueMin, 1756);
|
|
EXPECT_EQ(telemetryItems[0].valueMax, 2071);
|
|
|
|
//back to normal (but with reversed order of packets)
|
|
generateSportCellPacket(packet, 5, 4, _V(410), _V( 0)); sportProcessTelemetryPacket(packet);
|
|
generateSportCellPacket(packet, 5, 0, _V(418), _V(408)); sportProcessTelemetryPacket(packet);
|
|
generateSportCellPacket(packet, 5, 2, _V(412), _V(420)); sportProcessTelemetryPacket(packet);
|
|
generateSportCellPacket(packet, 5, 4, _V(410), _V( 0)); sportProcessTelemetryPacket(packet);
|
|
|
|
EXPECT_EQ(telemetryItems[0].cells.count, 5);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[1].value, 408);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[2].value, 412);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[3].value, 420);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[4].value, 410);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[5].value, 0);
|
|
EXPECT_EQ(telemetryItems[0].value, 2068);
|
|
EXPECT_EQ(telemetryItems[0].valueMin, 1756);
|
|
EXPECT_EQ(telemetryItems[0].valueMax, 2071);
|
|
|
|
//display test
|
|
lcdClear();
|
|
|
|
#if !defined(COLORLCD)
|
|
g_model.frsky.voltsSource = FRSKY_VOLTS_SOURCE_A1;
|
|
#endif
|
|
}
|
|
|
|
TEST(FrSkySPORT, StrangeCellsBug)
|
|
{
|
|
MODEL_RESET();
|
|
TELEMETRY_RESET();
|
|
allowNewSensors = true;
|
|
|
|
uint8_t pkt[] = { 0x7E, 0x48, 0x10, 0x00, 0x03, 0x30, 0x15, 0x50, 0x81, 0xD5 };
|
|
EXPECT_EQ(checkSportPacket(pkt+1), true);
|
|
sportProcessTelemetryPacket(pkt+1);
|
|
EXPECT_EQ(telemetryItems[0].cells.count, 3);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 0); // now we ignore such low values
|
|
EXPECT_EQ(telemetryItems[0].cells.values[1].value, 413);
|
|
}
|
|
|
|
TEST(FrSkySPORT, frskySetCellVoltageTwoSensors)
|
|
{
|
|
uint8_t packet[FRSKY_SPORT_PACKET_SIZE];
|
|
|
|
MODEL_RESET();
|
|
TELEMETRY_RESET();
|
|
allowNewSensors = true;
|
|
|
|
//sensor 1: 3 cell battery
|
|
generateSportCellPacket(packet, 3, 0, _V(418), _V(416)); sportProcessTelemetryPacket(packet);
|
|
generateSportCellPacket(packet, 3, 2, _V(415), _V( 0)); sportProcessTelemetryPacket(packet);
|
|
|
|
EXPECT_EQ(telemetryItems[0].cells.count, 3);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[1].value, 416);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[2].value, 415);
|
|
EXPECT_EQ(telemetryItems[0].cells.values[3].value, 0);
|
|
EXPECT_EQ(telemetryItems[0].value, 1249);
|
|
EXPECT_EQ(telemetryItems[0].valueMin, 1249);
|
|
EXPECT_EQ(telemetryItems[0].valueMax, 1249);
|
|
|
|
//sensor 2: 4 cell battery
|
|
generateSportCellPacket(packet, 4, 0, _V(410), _V(420), DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet);
|
|
generateSportCellPacket(packet, 4, 2, _V(400), _V(405), DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet);
|
|
|
|
EXPECT_EQ(telemetryItems[1].cells.count, 4);
|
|
EXPECT_EQ(telemetryItems[1].cells.values[0].value, 410);
|
|
EXPECT_EQ(telemetryItems[1].cells.values[1].value, 420);
|
|
EXPECT_EQ(telemetryItems[1].cells.values[2].value, 400);
|
|
EXPECT_EQ(telemetryItems[1].cells.values[3].value, 405);
|
|
EXPECT_EQ(telemetryItems[1].value, 1635);
|
|
EXPECT_EQ(telemetryItems[1].valueMin, 1635);
|
|
EXPECT_EQ(telemetryItems[1].valueMax, 1635);
|
|
|
|
g_model.telemetrySensors[2].type = TELEM_TYPE_CALCULATED;
|
|
g_model.telemetrySensors[2].formula = TELEM_FORMULA_ADD;
|
|
g_model.telemetrySensors[2].prec = 1;
|
|
g_model.telemetrySensors[2].calc.sources[0] = 1;
|
|
g_model.telemetrySensors[2].calc.sources[1] = 2;
|
|
|
|
telemetryWakeup();
|
|
|
|
EXPECT_EQ(telemetryItems[2].value, 287);
|
|
EXPECT_EQ(telemetryItems[2].valueMin, 287);
|
|
EXPECT_EQ(telemetryItems[2].valueMax, 287);
|
|
|
|
//now change some voltages
|
|
generateSportCellPacket(packet, 3, 2, _V(415), _V( 0)); sportProcessTelemetryPacket(packet);
|
|
generateSportCellPacket(packet, 4, 2, _V(390), _V(370), DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet);
|
|
generateSportCellPacket(packet, 3, 0, _V(420), _V(410)); sportProcessTelemetryPacket(packet);
|
|
generateSportCellPacket(packet, 4, 0, _V(410), _V(420), DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet);
|
|
|
|
telemetryWakeup();
|
|
|
|
EXPECT_EQ(telemetryItems[2].value, 283);
|
|
EXPECT_EQ(telemetryItems[2].valueMin, 283);
|
|
EXPECT_EQ(telemetryItems[2].valueMax, 287);
|
|
|
|
//display test
|
|
lcdClear();
|
|
|
|
#if !defined(COLORLCD)
|
|
g_model.frsky.voltsSource = FRSKY_VOLTS_SOURCE_A1;
|
|
#endif
|
|
}
|
|
|
|
void generateSportFasVoltagePacket(uint8_t * packet, uint32_t voltage)
|
|
{
|
|
packet[0] = 0x22; //DATA_ID_FAS
|
|
packet[1] = 0x10; //DATA_FRAME
|
|
*((uint16_t *)(packet+2)) = 0x0210; //VFAS_FIRST_ID
|
|
*((int32_t *)(packet+4)) = voltage; // unit 10mV
|
|
setSportPacketCrc(packet);
|
|
}
|
|
|
|
TEST(FrSkySPORT, frskyVfas)
|
|
{
|
|
uint8_t packet[FRSKY_SPORT_PACKET_SIZE];
|
|
|
|
MODEL_RESET();
|
|
TELEMETRY_RESET();
|
|
allowNewSensors = true;
|
|
|
|
// tests for Vfas
|
|
generateSportFasVoltagePacket(packet, 5000); sportProcessTelemetryPacket(packet);
|
|
EXPECT_EQ(telemetryItems[0].value, 5000);
|
|
EXPECT_EQ(telemetryItems[0].valueMin, 5000);
|
|
EXPECT_EQ(telemetryItems[0].valueMax, 5000);
|
|
|
|
generateSportFasVoltagePacket(packet, 6524); sportProcessTelemetryPacket(packet);
|
|
EXPECT_EQ(telemetryItems[0].value, 6524);
|
|
EXPECT_EQ(telemetryItems[0].valueMin, 6524); // the batt was changed (val > old max)
|
|
EXPECT_EQ(telemetryItems[0].valueMax, 6524);
|
|
|
|
generateSportFasVoltagePacket(packet, 1248); sportProcessTelemetryPacket(packet);
|
|
EXPECT_EQ(telemetryItems[0].value, 1248);
|
|
EXPECT_EQ(telemetryItems[0].valueMin, 1248);
|
|
EXPECT_EQ(telemetryItems[0].valueMax, 6524);
|
|
|
|
generateSportFasVoltagePacket(packet, 2248); sportProcessTelemetryPacket(packet);
|
|
EXPECT_EQ(telemetryItems[0].value, 2248);
|
|
EXPECT_EQ(telemetryItems[0].valueMin, 1248);
|
|
EXPECT_EQ(telemetryItems[0].valueMax, 6524);
|
|
}
|
|
|
|
void generateSportFasCurrentPacket(uint8_t * packet, uint32_t current)
|
|
{
|
|
packet[0] = 0x22; //DATA_ID_FAS
|
|
packet[1] = 0x10; //DATA_FRAME
|
|
*((uint16_t *)(packet+2)) = 0x0200; //CURR_FIRST_ID
|
|
*((int32_t *)(packet+4)) = current;
|
|
setSportPacketCrc(packet);
|
|
}
|
|
|
|
TEST(FrSkySPORT, frskyCurrent)
|
|
{
|
|
uint8_t packet[FRSKY_SPORT_PACKET_SIZE];
|
|
|
|
MODEL_RESET();
|
|
TELEMETRY_RESET();
|
|
allowNewSensors = true;
|
|
|
|
// tests for Curr
|
|
generateSportFasCurrentPacket(packet, 0); sportProcessTelemetryPacket(packet);
|
|
g_model.telemetrySensors[0].custom.offset = -5; /* unit: 1/10 amps */
|
|
generateSportFasCurrentPacket(packet, 0); sportProcessTelemetryPacket(packet);
|
|
EXPECT_EQ(telemetryItems[0].value, 0);
|
|
EXPECT_EQ(telemetryItems[0].valueMin, 0);
|
|
EXPECT_EQ(telemetryItems[0].valueMax, 0);
|
|
|
|
// measured current less then offset - value should be zero
|
|
generateSportFasCurrentPacket(packet, 4); sportProcessTelemetryPacket(packet);
|
|
EXPECT_EQ(telemetryItems[0].value, 0);
|
|
EXPECT_EQ(telemetryItems[0].valueMin, 0);
|
|
EXPECT_EQ(telemetryItems[0].valueMax, 0);
|
|
|
|
generateSportFasCurrentPacket(packet, 10); sportProcessTelemetryPacket(packet);
|
|
EXPECT_EQ(telemetryItems[0].value, 5);
|
|
EXPECT_EQ(telemetryItems[0].valueMin, 0);
|
|
EXPECT_EQ(telemetryItems[0].valueMax, 5);
|
|
|
|
generateSportFasCurrentPacket(packet, 500); sportProcessTelemetryPacket(packet);
|
|
EXPECT_EQ(telemetryItems[0].value, 495);
|
|
EXPECT_EQ(telemetryItems[0].valueMin, 0);
|
|
EXPECT_EQ(telemetryItems[0].valueMax, 495);
|
|
|
|
generateSportFasCurrentPacket(packet, 200); sportProcessTelemetryPacket(packet);
|
|
EXPECT_EQ(telemetryItems[0].value, 195);
|
|
EXPECT_EQ(telemetryItems[0].valueMin, 0);
|
|
EXPECT_EQ(telemetryItems[0].valueMax, 495);
|
|
|
|
// test with positive offset
|
|
TELEMETRY_RESET();
|
|
g_model.telemetrySensors[0].custom.offset = +5; /* unit: 1/10 amps */
|
|
|
|
generateSportFasCurrentPacket(packet, 0); sportProcessTelemetryPacket(packet);
|
|
EXPECT_EQ(telemetryItems[0].value, 5);
|
|
EXPECT_EQ(telemetryItems[0].valueMin, 5);
|
|
EXPECT_EQ(telemetryItems[0].valueMax, 5);
|
|
|
|
generateSportFasCurrentPacket(packet, 500); sportProcessTelemetryPacket(packet);
|
|
EXPECT_EQ(telemetryItems[0].value, 505);
|
|
EXPECT_EQ(telemetryItems[0].valueMin, 5);
|
|
EXPECT_EQ(telemetryItems[0].valueMax, 505);
|
|
|
|
generateSportFasCurrentPacket(packet, 200); sportProcessTelemetryPacket(packet);
|
|
EXPECT_EQ(telemetryItems[0].value, 205);
|
|
EXPECT_EQ(telemetryItems[0].valueMin, 5);
|
|
EXPECT_EQ(telemetryItems[0].valueMax, 505);
|
|
}
|
|
|
|
#endif //#if defined(TELEMETRY_FRSKY_SPORT)
|