1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-24 16:55:20 +03:00

Bsongis/telemetry clean session (#6597)

Telemetry cleaning session
This commit is contained in:
Bertrand Songis 2019-08-02 21:31:03 +02:00 committed by GitHub
parent 5b516b8287
commit 39f29860c9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 151 additions and 172 deletions

View file

@ -40,11 +40,10 @@ void menuRadioDiagAnalogs(event_t event)
}
// RAS
if((isModuleXJT(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) || (isModulePXX1(EXTERNAL_MODULE) && !IS_INTERNAL_MODULE_ON())) {
if ((isModuleXJT(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) || (isModulePXX1(EXTERNAL_MODULE) && !IS_INTERNAL_MODULE_ON())) {
lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+6*FH, "RAS");
lcdDrawNumber(10*FW-1, MENU_HEADER_HEIGHT+6*FH, telemetryData.swrInternal.value, RIGHT);
lcdDrawNumber(10*FW-1, MENU_HEADER_HEIGHT+6*FH, telemetryData.swrInternal.value(), RIGHT);
lcdDrawText(LCD_W/2, MENU_HEADER_HEIGHT+6*FH, "XJTVER");
lcdDrawNumber(LCD_W/2 + 10*FW-1, MENU_HEADER_HEIGHT+6*FH, telemetryData.xjtVersion, RIGHT);
}
}

View file

@ -221,7 +221,7 @@ bool menuStatsAnalogs(event_t event)
// RAS
if ((isModuleXJT(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) || (isModulePXX1(EXTERNAL_MODULE) && !IS_INTERNAL_MODULE_ON())) {
lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP+7*FH, "RAS");
lcdDrawNumber(MENUS_MARGIN_LEFT+100, MENU_CONTENT_TOP+7*FH, telemetryData.swrInternal.value);
lcdDrawNumber(MENUS_MARGIN_LEFT+100, MENU_CONTENT_TOP+7*FH, telemetryData.swrInternal.value());
lcdDrawText(MENUS_MARGIN_LEFT + LCD_W/2, MENU_CONTENT_TOP+7*FH, "XJTVER");
lcdDrawNumber(LCD_W/2 + MENUS_MARGIN_LEFT+100, MENU_CONTENT_TOP+7*FH, telemetryData.xjtVersion);
}

View file

@ -564,13 +564,13 @@ void menuRadioHardware(event_t event)
#else
lcdDrawTextAlignedLeft(y, "RAS");
if (telemetryData.swrInternal.isFresh())
lcdDrawNumber(HW_SETTINGS_COLUMN2, y, telemetryData.swrInternal.value);
lcdDrawNumber(HW_SETTINGS_COLUMN2, y, telemetryData.swrInternal.value());
else
lcdDrawText(HW_SETTINGS_COLUMN2, y, "---");
lcdDrawText(lcdNextPos, y, "/");
#endif
if (telemetryData.swrExternal.isFresh())
lcdDrawNumber(lcdNextPos, y, telemetryData.swrExternal.value);
lcdDrawNumber(lcdNextPos, y, telemetryData.swrExternal.value());
else
lcdDrawText(lcdNextPos, y, "---");
break;

View file

@ -785,7 +785,7 @@ This is just a hardware pass/fail measure and does not represent the quality of
static int luaGetRAS(lua_State * L)
{
if (isRasValueValid()) {
lua_pushinteger(L, telemetryData.swrInternal.value);
lua_pushinteger(L, telemetryData.swrInternal.value());
}
else {
lua_pushnil(L);

View file

@ -1842,17 +1842,7 @@ void opentxInit()
// g_model.topbarData is still zero here (because it was not yet read from SDCARD),
// but we only remember the pointer to in in constructor.
// The storageReadAll() needs topbar object, so it must be created here
#if __clang__
// clang does not like this at all, turn into a warning so that -Werror does not stop here
// taking address of packed member 'topbarData' of class or structure 'ModelData' may result in an unaligned pointer value [-Werror,-Waddress-of-packed-member]
#pragma clang diagnostic push
#pragma clang diagnostic warning "-Waddress-of-packed-member"
#endif
topbar = new Topbar(&g_model.topbarData);
#if __clang__
// Restore warnings
#pragma clang diagnostic pop
#endif
// lua widget state must also be prepared before the call to storageReadAll()
LUA_INIT_THEMES_AND_WIDGETS();

View file

@ -784,10 +784,11 @@ void logicalSwitchesTimerTick()
for (uint8_t i=0; i<MAX_LOGICAL_SWITCHES; i++) {
LogicalSwitchData * ls = lswAddress(i);
if (ls->func == LS_FUNC_TIMER) {
int16_t *lastValue = &LS_LAST_VALUE(fm, i);
int16_t * lastValue = &LS_LAST_VALUE(fm, i);
if (*lastValue == 0 || *lastValue == CS_LAST_VALUE_INIT) {
*lastValue = -lswTimerValue(ls->v1);
}
else if (*lastValue < 0) {
if (++(*lastValue) == 0)
*lastValue = lswTimerValue(ls->v2);

View file

@ -39,11 +39,6 @@ enum FrSkyDataState {
#define FRSKY_SPORT_PACKET_SIZE 9
#define WSHH_TIMEOUT10ms 60 // 600ms
#define FRSKY_SPORT_AVERAGING 4
#define FRSKY_D_AVERAGING 8
// Enumerate FrSky packet codes
#define LINKPKT 0xfe
#define USRPKT 0xfd
@ -56,7 +51,6 @@ enum FrSkyDataState {
#define RSSI2PKT 0xf6
#define RSSI_REQUEST 0xf1
// FrSky PRIM IDs (1 byte)
#define DATA_FRAME 0x10
@ -99,7 +93,6 @@ enum FrSkyDataState {
#define VFAS_D_HIPREC_OFFSET 2000
// FrSky new DATA IDs (2 bytes)
#define ALT_FIRST_ID 0x0100
#define ALT_LAST_ID 0x010f
@ -205,52 +198,44 @@ enum FrSkyDataState {
#define DATA_ID_SP2UH 0x45 // 5
#define DATA_ID_SP2UR 0xC6 // 6
#define IS_HIDDEN_TELEMETRY_VALUE(id) ((id == SP2UART_A_ID) || (id == SP2UART_B_ID) || (id == XJT_VERSION_ID) || (id == RAS_ID) || (id == FACT_TEST_ID))
inline bool IS_HIDDEN_TELEMETRY_VALUE(uint16_t id)
{
return (id == SP2UART_A_ID) || (id == SP2UART_B_ID) || (id == XJT_VERSION_ID) || (id == RAS_ID) || (id == FACT_TEST_ID);
}
#define ALARM_GREATER(channel, alarm) ((g_model.frsky.channels[channel].alarms_greater >> alarm) & 1)
#define ALARM_LEVEL(channel, alarm) ((g_model.frsky.channels[channel].alarms_level >> (2*alarm)) & 3)
class TelemetryData {
public:
TelemetryExpiringDecorator<TelemetryValue> swrInternal;
TelemetryExpiringDecorator<TelemetryValue> swrExternal;
TelemetryFilterDecorator<TelemetryValue> rssi;
uint16_t xjtVersion;
bool varioHighPrecision;
#define TELEMETRY_STREAMING() (telemetryData.rssi.value > 0)
#define TELEMETRY_RSSI() (telemetryData.rssi.value)
#define TELEMETRY_RSSI_MIN() (telemetryData.rssi.min)
void setSwr(uint8_t module, uint8_t value)
{
if (module == 0)
swrInternal.set(value);
else
swrExternal.set(value);
}
#define TELEMETRY_CELL_VOLTAGE_MUTLIPLIER 1
void clear()
{
memset(this, 0, sizeof(*this));
}
};
#define TELEMETRY_GPS_SPEED_BP telemetryData.hub.gpsSpeed_bp
#define TELEMETRY_GPS_SPEED_AP telemetryData.hub.gpsSpeed_ap
extern TelemetryData telemetryData;
#define TELEMETRY_ABSOLUTE_GPS_ALT (telemetryData.hub.gpsAltitude)
#define TELEMETRY_RELATIVE_GPS_ALT (telemetryData.hub.gpsAltitude + telemetryData.hub.gpsAltitudeOffset)
#define TELEMETRY_RELATIVE_GPS_ALT_BP (TELEMETRY_RELATIVE_GPS_ALT / 100)
inline bool TELEMETRY_STREAMING()
{
return telemetryData.rssi.value() > 0;
}
#define TELEMETRY_RELATIVE_BARO_ALT_BP (telemetryData.hub.baroAltitude / 100)
#define TELEMETRY_RELATIVE_BARO_ALT_AP (telemetryData.hub.baroAltitude % 100)
#define TELEMETRY_BARO_ALT_PREPARE() div_t baroAltitudeDivision = div(getConvertedTelemetryValue(telemetryData.hub.baroAltitude, UNIT_DIST), 100)
#define TELEMETRY_BARO_ALT_FORMAT "%c%d.%02d,"
#define TELEMETRY_BARO_ALT_ARGS telemetryData.hub.baroAltitude < 0 ? '-' : ' ', abs(baroAltitudeDivision.quot), abs(baroAltitudeDivision.rem),
#define TELEMETRY_GPS_ALT_FORMAT "%c%d.%02d,"
#define TELEMETRY_GPS_ALT_ARGS telemetryData.hub.gpsAltitude < 0 ? '-' : ' ', abs(telemetryData.hub.gpsAltitude / 100), abs(telemetryData.hub.gpsAltitude % 100),
#define TELEMETRY_SPEED_UNIT (IS_IMPERIAL_ENABLE() ? SPEED_UNIT_IMP : SPEED_UNIT_METR)
#define TELEMETRY_GPS_SPEED_FORMAT "%d,"
#define TELEMETRY_GPS_SPEED_ARGS telemetryData.hub.gpsSpeed_bp,
#define TELEMETRY_CELLS_ARGS telemetryData.hub.cellsSum / 10, telemetryData.hub.cellsSum % 10, TELEMETRY_CELL_VOLTAGE(0)/100, TELEMETRY_CELL_VOLTAGE(0)%100, TELEMETRY_CELL_VOLTAGE(1)/100, TELEMETRY_CELL_VOLTAGE(1)%100, TELEMETRY_CELL_VOLTAGE(2)/100, TELEMETRY_CELL_VOLTAGE(2)%100, TELEMETRY_CELL_VOLTAGE(3)/100, TELEMETRY_CELL_VOLTAGE(3)%100, TELEMETRY_CELL_VOLTAGE(4)/100, TELEMETRY_CELL_VOLTAGE(4)%100, TELEMETRY_CELL_VOLTAGE(5)/100, TELEMETRY_CELL_VOLTAGE(5)%100, TELEMETRY_CELL_VOLTAGE(6)/100, TELEMETRY_CELL_VOLTAGE(6)%100, TELEMETRY_CELL_VOLTAGE(7)/100, TELEMETRY_CELL_VOLTAGE(7)%100, TELEMETRY_CELL_VOLTAGE(8)/100, TELEMETRY_CELL_VOLTAGE(8)%100, TELEMETRY_CELL_VOLTAGE(9)/100, TELEMETRY_CELL_VOLTAGE(9)%100, TELEMETRY_CELL_VOLTAGE(10)/100, TELEMETRY_CELL_VOLTAGE(10)%100, TELEMETRY_CELL_VOLTAGE(11)/100, TELEMETRY_CELL_VOLTAGE(11)%100,
#define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,"
#define TELEMETRY_CELLS_LABEL "Cell volts,Cell 1,Cell 2,Cell 3,Cell 4,Cell 5,Cell 6,Cell 7,Cell 8,Cell 9,Cell 10,Cell 11,Cell 12,"
#define TELEMETRY_CURRENT_FORMAT "%d.%d,"
#define TELEMETRY_CURRENT_ARGS telemetryData.hub.current / 10, telemetryData.hub.current % 10,
#define TELEMETRY_VFAS_FORMAT "%d.%d,"
#define TELEMETRY_VFAS_ARGS telemetryData.hub.vfas / 10, telemetryData.hub.vfas % 10,
#define TELEMETRY_VSPEED_FORMAT "%c%d.%02d,"
#define TELEMETRY_VSPEED_ARGS telemetryData.hub.varioSpeed < 0 ? '-' : ' ', abs(telemetryData.hub.varioSpeed / 100), abs(telemetryData.hub.varioSpeed % 100),
#define TELEMETRY_ASPEED_FORMAT "%d.%d,"
#define TELEMETRY_ASPEED_ARGS telemetryData.hub.airSpeed / 10, telemetryData.hub.airSpeed % 10,
#define TELEMETRY_OPENXSENSOR() (0)
#define TELEMETRY_CELL_VOLTAGE(k) (telemetryData.hub.cellVolts[k] * TELEMETRY_CELL_VOLTAGE_MUTLIPLIER)
#define TELEMETRY_MIN_CELL_VOLTAGE (telemetryData.hub.minCellVolts * TELEMETRY_CELL_VOLTAGE_MUTLIPLIER)
inline uint8_t TELEMETRY_RSSI()
{
return telemetryData.rssi.value();
}
#define START_STOP 0x7E
#define BYTESTUFF 0x7D
@ -280,25 +265,6 @@ void telemetryInit(uint8_t protocol);
void telemetryInterrupt10ms();
class TelemetryData {
public:
TelemetryExpiringDecorator<TelemetryValue> swrInternal;
TelemetryExpiringDecorator<TelemetryValue> swrExternal;
TelemetryFilterDecorator<TelemetryValue> rssi;
uint16_t xjtVersion;
bool varioHighPrecision;
void setSwr(uint8_t module, uint8_t value)
{
if (module == 0)
swrInternal.set(value);
else
swrExternal.set(value);
}
};
extern TelemetryData telemetryData;
bool pushFrskyTelemetryData(uint8_t data); // returns true when end of frame detected
void processFrskyTelemetryData(uint8_t data);

View file

@ -71,10 +71,10 @@ inline bool isBadAntennaDetected()
if (!isRasValueValid())
return false;
if (telemetryData.swrInternal.isFresh() && telemetryData.swrInternal.value > FRSKY_BAD_ANTENNA_THRESHOLD)
if (telemetryData.swrInternal.isFresh() && telemetryData.swrInternal.value() > FRSKY_BAD_ANTENNA_THRESHOLD)
return true;
if (telemetryData.swrExternal.isFresh() && telemetryData.swrExternal.value > FRSKY_BAD_ANTENNA_THRESHOLD)
if (telemetryData.swrExternal.isFresh() && telemetryData.swrExternal.value() > FRSKY_BAD_ANTENNA_THRESHOLD)
return true;
return false;
@ -210,7 +210,6 @@ void telemetryInterrupt10ms()
{
if (TELEMETRY_STREAMING()) {
if (!TELEMETRY_OPENXSENSOR()) {
for (int i=0; i<MAX_TELEMETRY_SENSORS; i++) {
const TelemetrySensor & sensor = g_model.telemetrySensors[i];
if (sensor.type == TELEM_TYPE_CALCULATED) {
@ -219,8 +218,6 @@ void telemetryInterrupt10ms()
}
}
}
#if defined(WS_HOW_HIGH)
if (wshhStreaming > 0) {
wshhStreaming--;

View file

@ -29,31 +29,37 @@
class TelemetryValue {
public:
uint8_t value;
uint8_t value()
{
return _value;
}
void set(uint8_t value)
{
this->value = value;
_value = value;
}
void reset()
{
set(0);
};
}
protected:
uint8_t _value;
};
template <class T>
class TelemetryFilterDecorator: public T {
public:
uint8_t values[TELEMETRY_AVERAGE_COUNT];
void set(uint8_t value)
{
if (this->value == 0 || value == 0) {
if (value == 0 || this->_value == 0) {
memset(values, value, TELEMETRY_AVERAGE_COUNT);
this->value = value;
this->_value = value;
}
else {
//calculate the average from values[] and value
//also shift readings in values [] array
// calculate the average from values[] and value
// also shift readings in values [] array
unsigned int sum = values[0];
for (int i=0; i<TELEMETRY_AVERAGE_COUNT-1; i++) {
uint8_t tmp = values[i+1];
@ -62,49 +68,65 @@ class TelemetryFilterDecorator: public T {
}
values[TELEMETRY_AVERAGE_COUNT-1] = value;
sum += value;
this->value = sum / (TELEMETRY_AVERAGE_COUNT+1);
this->_value = sum / (TELEMETRY_AVERAGE_COUNT+1);
}
}
void reset()
{
memclear(this, sizeof(*this));
};
}
protected:
uint8_t values[TELEMETRY_AVERAGE_COUNT];
};
template <class T>
class TelemetryExpiringDecorator: public T {
public:
tmr10ms_t expirationTime;
void set(uint8_t value)
{
T::set(value);
expirationTime = get_tmr10ms() + 1000/*10s*/;
}
void reset()
{
memclear(this, sizeof(*this));
}
bool isFresh()
{
return get_tmr10ms() < expirationTime;
}
protected:
tmr10ms_t expirationTime;
};
template <class T>
class TelemetryMinDecorator: public T {
public:
uint8_t min;
void set(uint8_t value)
{
T::set(value);
if (!min || value < min) {
min = value;
if (!_min || value < _min) {
_min = value;
}
}
uint8_t min()
{
return _min;
}
void reset()
{
memclear(this, sizeof(*this));
}
protected:
uint8_t _min;
};
#endif // _TELEMETRY_HOLDERS_H_

View file

@ -34,7 +34,7 @@ if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-ms-bitfields")
endif()
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 ${WARNING_FLAGS}")
use_cxx11() # ensure gnu++11 in CXX_FLAGS with CMake < 3.1

View file

@ -35,7 +35,6 @@ PACK(struct RamBackupUncompressed {
extern Backup::RamBackupUncompressed ramBackupUncompressed;
TEST(Storage, BackupAndRestore)
{
rambackupWrite();
Backup::RamBackupUncompressed ramBackupRestored;
if (uncompress((uint8_t *)&ramBackupRestored, sizeof(ramBackupRestored), ramBackup->data, ramBackup->size) != sizeof(ramBackupUncompressed))
@ -55,10 +54,10 @@ TEST(Eeprom, 100_random_writes)
storageFormat();
for(int i=0; i<100; i++) {
int size = rand()%800;
for(int j=0; j<size; j++) {
buf[j] = rand() < (RAND_MAX/10000*i) ? 0 : (j&0xff);
for (int i = 0; i < 100; i++) {
int size = rand() % 800;
for (int j = 0; j < size; j++) {
buf[j] = rand() < (RAND_MAX / 10000 * i) ? 0 : (j & 0xff);
}
f.writeRlc(5, 5, buf, size, 100);
// printf("size=%4d red=%4d\n\n\n", size, f.size());
@ -77,7 +76,8 @@ TEST(Eeprom, test2)
storageFormat();
for(int i=0; i<1000; i++) buf[i]='6'+i%4;
for (int i = 0; i < 1000; i++)
buf[i] = '6' + i % 4;
f.writeRlc(6, 6, buf, 300, 100);
@ -86,7 +86,9 @@ TEST(Eeprom, test2)
for(int i=0; i<500; i++){
uint8_t b;
uint16_t n=f.readRlc(&b,1);
if(n) EXPECT_EQ(b, ('6'+sz%4));
if (n) {
EXPECT_EQ(b, ('6' + sz % 4));
}
sz+=n;
}
EXPECT_EQ(sz, 300);
@ -100,7 +102,8 @@ TEST(Eeprom, storageCheckImmediately)
storageFormat();
for(int i=0; i<1000; i++) buf[i]='6'+i%4;
for (int i = 0; i < 1000; i++)
buf[i]='6'+i%4;
theFile.writeRlc(6, 6, buf, 300, false);
@ -108,11 +111,13 @@ TEST(Eeprom, storageCheckImmediately)
theFile.openRd(6);
uint16_t sz=0;
for(int i=0; i<500; i++){
for (int i = 0; i < 500; i++) {
uint8_t b;
uint16_t n=theFile.readRlc(&b,1);
if(n) EXPECT_EQ(b, ('6'+sz%4));
sz+=n;
uint16_t n = theFile.readRlc(&b, 1);
if (n) {
EXPECT_EQ(b, ('6' + sz % 4));
}
sz += n;
}
EXPECT_EQ(sz, 300);
}
@ -125,19 +130,22 @@ TEST(Eeprom, copy)
storageFormat();
for(int i=0; i<1000; i++) buf[i]='6'+i%4;
for (int i = 0; i < 1000; i++)
buf[i] = '6' + i % 4;
theFile.writeRlc(5, 6, buf, 300, true);
theFile.copy(6, 5);
theFile.openRd(6);
uint16_t sz=0;
for(int i=0; i<500; i++){
uint16_t sz = 0;
for (int i = 0; i < 500; i++) {
uint8_t b;
uint16_t n=theFile.readRlc(&b,1);
if(n) EXPECT_EQ(b, ('6'+sz%4));
sz+=n;
uint16_t n = theFile.readRlc(&b, 1);
if (n) {
EXPECT_EQ(b, ('6' + sz % 4));
}
sz += n;
}
EXPECT_EQ(sz, 300);
}
@ -150,7 +158,8 @@ TEST(Eeprom, rm)
storageFormat();
for(int i=0; i<1000; i++) buf[i]='6'+i%4;
for (int i = 0; i < 1000; i++)
buf[i] = '6' + i % 4;
theFile.writeRlc(5, 6, buf, 300, true);
@ -164,9 +173,11 @@ TEST(Eeprom, rm)
uint16_t sz=0;
for(int i=0; i<500; i++){
uint8_t b;
uint16_t n=theFile.readRlc(&b,1);
if(n) EXPECT_EQ(b, ('6'+sz%4));
sz+=n;
uint16_t n = theFile.readRlc(&b, 1);
if (n) {
EXPECT_EQ(b, ('6' + sz % 4));
}
sz += n;
}
EXPECT_EQ(sz, 0);
}

View file

@ -45,19 +45,16 @@ TEST(FrSky, TelemetryValueWithMinAveraging)
int testPos = 0;
//test of averaging
TelemetryMinDecorator<TelemetryFilterDecorator<TelemetryValue>> testVal;
testVal.value = 0;
testVal.reset();
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++]);
EXPECT_EQ(testVal.value(), expected[testPos++]);
for (int n = 2; n < 10; ++n) {
testVal.set(n * 10);
EXPECT_EQ(testVal.value(), expected[testPos++]);
}
for(int n=2; n<10; ++n) {
for (int n = 2; n < 10; ++n) {
testVal.set(100);
EXPECT_EQ(RAW_FRSKY_MINMAX(testVal), 100);
EXPECT_EQ(testVal.value, expected[testPos++]);
EXPECT_EQ(testVal.value(), expected[testPos++]);
}
}
@ -190,8 +187,6 @@ void generateSportCellPacket(uint8_t * packet, uint8_t cells, uint8_t battnumber
setSportPacketCrc(packet);
}
#define _V(volts) (volts/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER)
TEST(FrSkySPORT, FrSkyDCells)
{
MODEL_RESET();
@ -227,12 +222,12 @@ TEST(FrSkySPORT, frskySetCellVoltage)
allowNewSensors = true;
// test that simulates 3 cell battery
generateSportCellPacket(packet, 3, 0, _V(410), _V(420)); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 3, 0, 410, 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, 2, 430, 0); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 3, 0, _V(405), _V(300)); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 3, 2, _V(430), _V( 0)); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 3, 0, 405, 300); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 3, 2, 430, 0); sportProcessTelemetryPacket(packet);
EXPECT_EQ(telemetryItems[0].cells.count, 3);
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 405);
@ -243,11 +238,11 @@ TEST(FrSkySPORT, frskySetCellVoltage)
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, 405, 250); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 3, 2, 430, 0); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 3, 0, _V(410), _V(420)); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 3, 2, _V(430), _V( 0)); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 3, 0, 410, 420); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 3, 2, 430, 0); sportProcessTelemetryPacket(packet);
EXPECT_EQ(telemetryItems[0].cells.count, 3);
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 410);
@ -259,9 +254,9 @@ TEST(FrSkySPORT, frskySetCellVoltage)
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);
generateSportCellPacket(packet, 5, 0, 418, 408); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 5, 2, 415, 420); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 5, 4, 410, 0); sportProcessTelemetryPacket(packet);
EXPECT_EQ(telemetryItems[0].cells.count, 5);
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418);
@ -275,9 +270,9 @@ TEST(FrSkySPORT, frskySetCellVoltage)
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);
generateSportCellPacket(packet, 5, 0, 418, 408); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 5, 2, 100, 420); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 5, 4, 410, 0); sportProcessTelemetryPacket(packet);
EXPECT_EQ(telemetryItems[0].cells.count, 5);
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418);
@ -291,10 +286,10 @@ TEST(FrSkySPORT, frskySetCellVoltage)
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);
generateSportCellPacket(packet, 5, 4, 410, 0); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 5, 0, 418, 408); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 5, 2, 412, 420); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 5, 4, 410, 0); sportProcessTelemetryPacket(packet);
EXPECT_EQ(telemetryItems[0].cells.count, 5);
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418);
@ -334,8 +329,8 @@ TEST(FrSkySPORT, frskySetCellVoltageTwoSensors)
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);
generateSportCellPacket(packet, 3, 0, 418, 416); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 3, 2, 415, 0); sportProcessTelemetryPacket(packet);
EXPECT_EQ(telemetryItems[0].cells.count, 3);
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418);
@ -347,8 +342,8 @@ TEST(FrSkySPORT, frskySetCellVoltageTwoSensors)
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);
generateSportCellPacket(packet, 4, 0, 410, 420, DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 4, 2, 400, 405, DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet);
EXPECT_EQ(telemetryItems[1].cells.count, 4);
EXPECT_EQ(telemetryItems[1].cells.values[0].value, 410);
@ -372,10 +367,10 @@ TEST(FrSkySPORT, frskySetCellVoltageTwoSensors)
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);
generateSportCellPacket(packet, 3, 2, 415, 0); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 4, 2, 390, 370, DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 3, 0, 420, 410); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 4, 0, 410, 420, DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet);
telemetryWakeup();

View file

@ -81,10 +81,8 @@ inline void MIXER_RESET()
inline void TELEMETRY_RESET()
{
#if defined(TELEMETRY_FRSKY)
memclear(&telemetryData, sizeof(telemetryData));
TELEMETRY_RSSI() = 100;
#endif
#if defined(TELEMETRY_FRSKY)
telemetryData.clear();
telemetryData.rssi.set(100);
for (int i=0; i<MAX_TELEMETRY_SENSORS; i++) {
telemetryItems[i].clear();
}