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 // 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"); 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"); 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); 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 // 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())) {
lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP+7*FH, "RAS"); 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"); 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); 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 #else
lcdDrawTextAlignedLeft(y, "RAS"); lcdDrawTextAlignedLeft(y, "RAS");
if (telemetryData.swrInternal.isFresh()) if (telemetryData.swrInternal.isFresh())
lcdDrawNumber(HW_SETTINGS_COLUMN2, y, telemetryData.swrInternal.value); lcdDrawNumber(HW_SETTINGS_COLUMN2, y, telemetryData.swrInternal.value());
else else
lcdDrawText(HW_SETTINGS_COLUMN2, y, "---"); lcdDrawText(HW_SETTINGS_COLUMN2, y, "---");
lcdDrawText(lcdNextPos, y, "/"); lcdDrawText(lcdNextPos, y, "/");
#endif #endif
if (telemetryData.swrExternal.isFresh()) if (telemetryData.swrExternal.isFresh())
lcdDrawNumber(lcdNextPos, y, telemetryData.swrExternal.value); lcdDrawNumber(lcdNextPos, y, telemetryData.swrExternal.value());
else else
lcdDrawText(lcdNextPos, y, "---"); lcdDrawText(lcdNextPos, y, "---");
break; 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) static int luaGetRAS(lua_State * L)
{ {
if (isRasValueValid()) { if (isRasValueValid()) {
lua_pushinteger(L, telemetryData.swrInternal.value); lua_pushinteger(L, telemetryData.swrInternal.value());
} }
else { else {
lua_pushnil(L); 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), // 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. // but we only remember the pointer to in in constructor.
// The storageReadAll() needs topbar object, so it must be created here // 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); 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 widget state must also be prepared before the call to storageReadAll()
LUA_INIT_THEMES_AND_WIDGETS(); LUA_INIT_THEMES_AND_WIDGETS();

View file

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

View file

@ -39,11 +39,6 @@ enum FrSkyDataState {
#define FRSKY_SPORT_PACKET_SIZE 9 #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 // Enumerate FrSky packet codes
#define LINKPKT 0xfe #define LINKPKT 0xfe
#define USRPKT 0xfd #define USRPKT 0xfd
@ -56,7 +51,6 @@ enum FrSkyDataState {
#define RSSI2PKT 0xf6 #define RSSI2PKT 0xf6
#define RSSI_REQUEST 0xf1 #define RSSI_REQUEST 0xf1
// FrSky PRIM IDs (1 byte) // FrSky PRIM IDs (1 byte)
#define DATA_FRAME 0x10 #define DATA_FRAME 0x10
@ -99,7 +93,6 @@ enum FrSkyDataState {
#define VFAS_D_HIPREC_OFFSET 2000 #define VFAS_D_HIPREC_OFFSET 2000
// FrSky new DATA IDs (2 bytes) // FrSky new DATA IDs (2 bytes)
#define ALT_FIRST_ID 0x0100 #define ALT_FIRST_ID 0x0100
#define ALT_LAST_ID 0x010f #define ALT_LAST_ID 0x010f
@ -205,52 +198,44 @@ enum FrSkyDataState {
#define DATA_ID_SP2UH 0x45 // 5 #define DATA_ID_SP2UH 0x45 // 5
#define DATA_ID_SP2UR 0xC6 // 6 #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) class TelemetryData {
#define ALARM_LEVEL(channel, alarm) ((g_model.frsky.channels[channel].alarms_level >> (2*alarm)) & 3) public:
TelemetryExpiringDecorator<TelemetryValue> swrInternal;
TelemetryExpiringDecorator<TelemetryValue> swrExternal;
TelemetryFilterDecorator<TelemetryValue> rssi;
uint16_t xjtVersion;
bool varioHighPrecision;
#define TELEMETRY_STREAMING() (telemetryData.rssi.value > 0) void setSwr(uint8_t module, uint8_t value)
#define TELEMETRY_RSSI() (telemetryData.rssi.value) {
#define TELEMETRY_RSSI_MIN() (telemetryData.rssi.min) 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 extern TelemetryData telemetryData;
#define TELEMETRY_GPS_SPEED_AP telemetryData.hub.gpsSpeed_ap
#define TELEMETRY_ABSOLUTE_GPS_ALT (telemetryData.hub.gpsAltitude) inline bool TELEMETRY_STREAMING()
#define TELEMETRY_RELATIVE_GPS_ALT (telemetryData.hub.gpsAltitude + telemetryData.hub.gpsAltitudeOffset) {
#define TELEMETRY_RELATIVE_GPS_ALT_BP (TELEMETRY_RELATIVE_GPS_ALT / 100) return telemetryData.rssi.value() > 0;
}
#define TELEMETRY_RELATIVE_BARO_ALT_BP (telemetryData.hub.baroAltitude / 100) inline uint8_t TELEMETRY_RSSI()
#define TELEMETRY_RELATIVE_BARO_ALT_AP (telemetryData.hub.baroAltitude % 100) {
return telemetryData.rssi.value();
#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)
#define START_STOP 0x7E #define START_STOP 0x7E
#define BYTESTUFF 0x7D #define BYTESTUFF 0x7D
@ -280,25 +265,6 @@ void telemetryInit(uint8_t protocol);
void telemetryInterrupt10ms(); 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 bool pushFrskyTelemetryData(uint8_t data); // returns true when end of frame detected
void processFrskyTelemetryData(uint8_t data); void processFrskyTelemetryData(uint8_t data);

View file

@ -71,10 +71,10 @@ inline bool isBadAntennaDetected()
if (!isRasValueValid()) if (!isRasValueValid())
return false; 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; 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 true;
return false; return false;
@ -210,15 +210,12 @@ void telemetryInterrupt10ms()
{ {
if (TELEMETRY_STREAMING()) { if (TELEMETRY_STREAMING()) {
if (!TELEMETRY_OPENXSENSOR()) { for (int i=0; i<MAX_TELEMETRY_SENSORS; i++) {
for (int i=0; i<MAX_TELEMETRY_SENSORS; i++) { const TelemetrySensor & sensor = g_model.telemetrySensors[i];
const TelemetrySensor & sensor = g_model.telemetrySensors[i]; if (sensor.type == TELEM_TYPE_CALCULATED) {
if (sensor.type == TELEM_TYPE_CALCULATED) { telemetryItems[i].per10ms(sensor);
telemetryItems[i].per10ms(sensor);
}
} }
} }
} }
#if defined(WS_HOW_HIGH) #if defined(WS_HOW_HIGH)

View file

@ -29,31 +29,37 @@
class TelemetryValue { class TelemetryValue {
public: public:
uint8_t value; uint8_t value()
{
return _value;
}
void set(uint8_t value) void set(uint8_t value)
{ {
this->value = value; _value = value;
} }
void reset() void reset()
{ {
set(0); set(0);
}; }
protected:
uint8_t _value;
}; };
template <class T> template <class T>
class TelemetryFilterDecorator: public T { class TelemetryFilterDecorator: public T {
public: public:
uint8_t values[TELEMETRY_AVERAGE_COUNT];
void set(uint8_t value) void set(uint8_t value)
{ {
if (this->value == 0 || value == 0) { if (value == 0 || this->_value == 0) {
memset(values, value, TELEMETRY_AVERAGE_COUNT); memset(values, value, TELEMETRY_AVERAGE_COUNT);
this->value = value; this->_value = value;
} }
else { else {
//calculate the average from values[] and value // calculate the average from values[] and value
//also shift readings in values [] array // also shift readings in values [] array
unsigned int sum = values[0]; unsigned int sum = values[0];
for (int i=0; i<TELEMETRY_AVERAGE_COUNT-1; i++) { for (int i=0; i<TELEMETRY_AVERAGE_COUNT-1; i++) {
uint8_t tmp = values[i+1]; uint8_t tmp = values[i+1];
@ -62,49 +68,65 @@ class TelemetryFilterDecorator: public T {
} }
values[TELEMETRY_AVERAGE_COUNT-1] = value; values[TELEMETRY_AVERAGE_COUNT-1] = value;
sum += value; sum += value;
this->value = sum / (TELEMETRY_AVERAGE_COUNT+1); this->_value = sum / (TELEMETRY_AVERAGE_COUNT+1);
} }
} }
void reset() void reset()
{ {
memclear(this, sizeof(*this)); memclear(this, sizeof(*this));
}; }
protected:
uint8_t values[TELEMETRY_AVERAGE_COUNT];
}; };
template <class T> template <class T>
class TelemetryExpiringDecorator: public T { class TelemetryExpiringDecorator: public T {
public: public:
tmr10ms_t expirationTime;
void set(uint8_t value) void set(uint8_t value)
{ {
T::set(value); T::set(value);
expirationTime = get_tmr10ms() + 1000/*10s*/; expirationTime = get_tmr10ms() + 1000/*10s*/;
} }
void reset() void reset()
{ {
memclear(this, sizeof(*this)); memclear(this, sizeof(*this));
} }
bool isFresh() bool isFresh()
{ {
return get_tmr10ms() < expirationTime; return get_tmr10ms() < expirationTime;
} }
protected:
tmr10ms_t expirationTime;
}; };
template <class T> template <class T>
class TelemetryMinDecorator: public T { class TelemetryMinDecorator: public T {
public: public:
uint8_t min;
void set(uint8_t value) void set(uint8_t value)
{ {
T::set(value); T::set(value);
if (!min || value < min) { if (!_min || value < _min) {
min = value; _min = value;
} }
} }
uint8_t min()
{
return _min;
}
void reset() void reset()
{ {
memclear(this, sizeof(*this)); memclear(this, sizeof(*this));
} }
protected:
uint8_t _min;
}; };
#endif // _TELEMETRY_HOLDERS_H_ #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") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-ms-bitfields")
endif() endif()
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0") 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 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; extern Backup::RamBackupUncompressed ramBackupUncompressed;
TEST(Storage, BackupAndRestore) TEST(Storage, BackupAndRestore)
{ {
rambackupWrite(); rambackupWrite();
Backup::RamBackupUncompressed ramBackupRestored; Backup::RamBackupUncompressed ramBackupRestored;
if (uncompress((uint8_t *)&ramBackupRestored, sizeof(ramBackupRestored), ramBackup->data, ramBackup->size) != sizeof(ramBackupUncompressed)) if (uncompress((uint8_t *)&ramBackupRestored, sizeof(ramBackupRestored), ramBackup->data, ramBackup->size) != sizeof(ramBackupUncompressed))
@ -55,10 +54,10 @@ TEST(Eeprom, 100_random_writes)
storageFormat(); storageFormat();
for(int i=0; i<100; i++) { for (int i = 0; i < 100; i++) {
int size = rand()%800; int size = rand() % 800;
for(int j=0; j<size; j++) { for (int j = 0; j < size; j++) {
buf[j] = rand() < (RAND_MAX/10000*i) ? 0 : (j&0xff); buf[j] = rand() < (RAND_MAX / 10000 * i) ? 0 : (j & 0xff);
} }
f.writeRlc(5, 5, buf, size, 100); f.writeRlc(5, 5, buf, size, 100);
// printf("size=%4d red=%4d\n\n\n", size, f.size()); // printf("size=%4d red=%4d\n\n\n", size, f.size());
@ -77,7 +76,8 @@ TEST(Eeprom, test2)
storageFormat(); 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); f.writeRlc(6, 6, buf, 300, 100);
@ -86,7 +86,9 @@ TEST(Eeprom, test2)
for(int i=0; i<500; i++){ for(int i=0; i<500; i++){
uint8_t b; uint8_t b;
uint16_t n=f.readRlc(&b,1); 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; sz+=n;
} }
EXPECT_EQ(sz, 300); EXPECT_EQ(sz, 300);
@ -100,7 +102,8 @@ TEST(Eeprom, storageCheckImmediately)
storageFormat(); 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); theFile.writeRlc(6, 6, buf, 300, false);
@ -108,11 +111,13 @@ TEST(Eeprom, storageCheckImmediately)
theFile.openRd(6); theFile.openRd(6);
uint16_t sz=0; uint16_t sz=0;
for(int i=0; i<500; i++){ for (int i = 0; i < 500; i++) {
uint8_t b; uint8_t b;
uint16_t n=theFile.readRlc(&b,1); uint16_t n = theFile.readRlc(&b, 1);
if(n) EXPECT_EQ(b, ('6'+sz%4)); if (n) {
sz+=n; EXPECT_EQ(b, ('6' + sz % 4));
}
sz += n;
} }
EXPECT_EQ(sz, 300); EXPECT_EQ(sz, 300);
} }
@ -125,19 +130,22 @@ TEST(Eeprom, copy)
storageFormat(); 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.writeRlc(5, 6, buf, 300, true);
theFile.copy(6, 5); theFile.copy(6, 5);
theFile.openRd(6); theFile.openRd(6);
uint16_t sz=0; uint16_t sz = 0;
for(int i=0; i<500; i++){ for (int i = 0; i < 500; i++) {
uint8_t b; uint8_t b;
uint16_t n=theFile.readRlc(&b,1); uint16_t n = theFile.readRlc(&b, 1);
if(n) EXPECT_EQ(b, ('6'+sz%4)); if (n) {
sz+=n; EXPECT_EQ(b, ('6' + sz % 4));
}
sz += n;
} }
EXPECT_EQ(sz, 300); EXPECT_EQ(sz, 300);
} }
@ -150,7 +158,8 @@ TEST(Eeprom, rm)
storageFormat(); 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.writeRlc(5, 6, buf, 300, true);
@ -164,9 +173,11 @@ TEST(Eeprom, rm)
uint16_t sz=0; uint16_t sz=0;
for(int i=0; i<500; i++){ for(int i=0; i<500; i++){
uint8_t b; uint8_t b;
uint16_t n=theFile.readRlc(&b,1); uint16_t n = theFile.readRlc(&b, 1);
if(n) EXPECT_EQ(b, ('6'+sz%4)); if (n) {
sz+=n; EXPECT_EQ(b, ('6' + sz % 4));
}
sz += n;
} }
EXPECT_EQ(sz, 0); EXPECT_EQ(sz, 0);
} }

View file

@ -45,19 +45,16 @@ TEST(FrSky, TelemetryValueWithMinAveraging)
int testPos = 0; int testPos = 0;
//test of averaging //test of averaging
TelemetryMinDecorator<TelemetryFilterDecorator<TelemetryValue>> testVal; TelemetryMinDecorator<TelemetryFilterDecorator<TelemetryValue>> testVal;
testVal.value = 0; testVal.reset();
testVal.set(10); testVal.set(10);
EXPECT_EQ(RAW_FRSKY_MINMAX(testVal), 10); EXPECT_EQ(testVal.value(), expected[testPos++]);
EXPECT_EQ(testVal.value, expected[testPos++]); for (int n = 2; n < 10; ++n) {
for(int n=2; n<10; ++n) { testVal.set(n * 10);
testVal.set(n*10); EXPECT_EQ(testVal.value(), expected[testPos++]);
EXPECT_EQ(RAW_FRSKY_MINMAX(testVal), 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); 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); setSportPacketCrc(packet);
} }
#define _V(volts) (volts/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER)
TEST(FrSkySPORT, FrSkyDCells) TEST(FrSkySPORT, FrSkyDCells)
{ {
MODEL_RESET(); MODEL_RESET();
@ -227,12 +222,12 @@ TEST(FrSkySPORT, frskySetCellVoltage)
allowNewSensors = true; allowNewSensors = true;
// test that simulates 3 cell battery // 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()"; 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, 0, 405, 300); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 3, 2, _V(430), _V( 0)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 3, 2, 430, 0); sportProcessTelemetryPacket(packet);
EXPECT_EQ(telemetryItems[0].cells.count, 3); EXPECT_EQ(telemetryItems[0].cells.count, 3);
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 405); 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].valueMin, 1135);
EXPECT_EQ(telemetryItems[0].valueMax, 1260); EXPECT_EQ(telemetryItems[0].valueMax, 1260);
generateSportCellPacket(packet, 3, 0, _V(405), _V(250)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 3, 0, 405, 250); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 3, 2, _V(430), _V( 0)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 3, 2, 430, 0); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 3, 0, _V(410), _V(420)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 3, 0, 410, 420); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 3, 2, _V(430), _V( 0)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 3, 2, 430, 0); sportProcessTelemetryPacket(packet);
EXPECT_EQ(telemetryItems[0].cells.count, 3); EXPECT_EQ(telemetryItems[0].cells.count, 3);
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 410); EXPECT_EQ(telemetryItems[0].cells.values[0].value, 410);
@ -259,9 +254,9 @@ TEST(FrSkySPORT, frskySetCellVoltage)
EXPECT_EQ(telemetryItems[0].valueMax, 1260); EXPECT_EQ(telemetryItems[0].valueMax, 1260);
//add another two cells - 5 cell battery //add another two cells - 5 cell battery
generateSportCellPacket(packet, 5, 0, _V(418), _V(408)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 5, 0, 418, 408); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 5, 2, _V(415), _V(420)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 5, 2, 415, 420); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 5, 4, _V(410), _V( 0)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 5, 4, 410, 0); sportProcessTelemetryPacket(packet);
EXPECT_EQ(telemetryItems[0].cells.count, 5); EXPECT_EQ(telemetryItems[0].cells.count, 5);
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418); EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418);
@ -275,9 +270,9 @@ TEST(FrSkySPORT, frskySetCellVoltage)
EXPECT_EQ(telemetryItems[0].valueMax, 2071); EXPECT_EQ(telemetryItems[0].valueMax, 2071);
//simulate very low voltage for cell 3 //simulate very low voltage for cell 3
generateSportCellPacket(packet, 5, 0, _V(418), _V(408)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 5, 0, 418, 408); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 5, 2, _V(100), _V(420)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 5, 2, 100, 420); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 5, 4, _V(410), _V( 0)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 5, 4, 410, 0); sportProcessTelemetryPacket(packet);
EXPECT_EQ(telemetryItems[0].cells.count, 5); EXPECT_EQ(telemetryItems[0].cells.count, 5);
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418); EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418);
@ -291,10 +286,10 @@ TEST(FrSkySPORT, frskySetCellVoltage)
EXPECT_EQ(telemetryItems[0].valueMax, 2071); EXPECT_EQ(telemetryItems[0].valueMax, 2071);
//back to normal (but with reversed order of packets) //back to normal (but with reversed order of packets)
generateSportCellPacket(packet, 5, 4, _V(410), _V( 0)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 5, 4, 410, 0); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 5, 0, _V(418), _V(408)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 5, 0, 418, 408); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 5, 2, _V(412), _V(420)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 5, 2, 412, 420); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 5, 4, _V(410), _V( 0)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 5, 4, 410, 0); sportProcessTelemetryPacket(packet);
EXPECT_EQ(telemetryItems[0].cells.count, 5); EXPECT_EQ(telemetryItems[0].cells.count, 5);
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418); EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418);
@ -334,8 +329,8 @@ TEST(FrSkySPORT, frskySetCellVoltageTwoSensors)
allowNewSensors = true; allowNewSensors = true;
//sensor 1: 3 cell battery //sensor 1: 3 cell battery
generateSportCellPacket(packet, 3, 0, _V(418), _V(416)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 3, 0, 418, 416); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 3, 2, _V(415), _V( 0)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 3, 2, 415, 0); sportProcessTelemetryPacket(packet);
EXPECT_EQ(telemetryItems[0].cells.count, 3); EXPECT_EQ(telemetryItems[0].cells.count, 3);
EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418); EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418);
@ -347,8 +342,8 @@ TEST(FrSkySPORT, frskySetCellVoltageTwoSensors)
EXPECT_EQ(telemetryItems[0].valueMax, 1249); EXPECT_EQ(telemetryItems[0].valueMax, 1249);
//sensor 2: 4 cell battery //sensor 2: 4 cell battery
generateSportCellPacket(packet, 4, 0, _V(410), _V(420), DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 4, 0, 410, 420, DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 4, 2, _V(400), _V(405), 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.count, 4);
EXPECT_EQ(telemetryItems[1].cells.values[0].value, 410); EXPECT_EQ(telemetryItems[1].cells.values[0].value, 410);
@ -372,10 +367,10 @@ TEST(FrSkySPORT, frskySetCellVoltageTwoSensors)
EXPECT_EQ(telemetryItems[2].valueMax, 287); EXPECT_EQ(telemetryItems[2].valueMax, 287);
//now change some voltages //now change some voltages
generateSportCellPacket(packet, 3, 2, _V(415), _V( 0)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 3, 2, 415, 0); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 4, 2, _V(390), _V(370), DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 4, 2, 390, 370, DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 3, 0, _V(420), _V(410)); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 3, 0, 420, 410); sportProcessTelemetryPacket(packet);
generateSportCellPacket(packet, 4, 0, _V(410), _V(420), DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet); generateSportCellPacket(packet, 4, 0, 410, 420, DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet);
telemetryWakeup(); telemetryWakeup();

View file

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