mirror of
https://github.com/opentx/opentx.git
synced 2025-07-26 17:55:19 +03:00
Fixes #2359
This commit is contained in:
parent
f4d1389c4d
commit
fc492a7709
4 changed files with 49 additions and 14 deletions
|
@ -600,6 +600,8 @@ void processHubPacket(uint8_t id, int16_t value)
|
|||
}
|
||||
else if (id == VOLTS_ID) {
|
||||
unit = UNIT_CELLS;
|
||||
uint32_t cellData = (uint32_t)data;
|
||||
data = ((cellData & 0x00F0) << 12) + (((((cellData & 0xFF00) >> 8) + ((cellData & 0x000F) << 8))) / 5);
|
||||
}
|
||||
else if (id == GPS_DAY_MONTH_ID) {
|
||||
id = GPS_HOUR_MIN_ID;
|
||||
|
@ -636,8 +638,6 @@ void frskyDSetDefault(int index, uint16_t id)
|
|||
const FrSkyDSensor * sensor = getFrSkyDSensor(id);
|
||||
if (sensor) {
|
||||
TelemetryUnit unit = sensor->unit;
|
||||
if (unit == UNIT_CELLS)
|
||||
unit = UNIT_VOLTS;
|
||||
uint8_t prec = min<uint8_t>(2, sensor->prec);
|
||||
telemetrySensor.init(sensor->name, unit, prec);
|
||||
if (id >= D_A1_ID && id <= D_A2_ID) {
|
||||
|
|
|
@ -236,11 +236,23 @@ void processSportPacket(uint8_t *packet)
|
|||
unit = sensor->unit;
|
||||
precision = sensor->prec;
|
||||
}
|
||||
if (unit == UNIT_CELLS) {
|
||||
uint8_t cellsCount = (data & 0xF0) >> 4;
|
||||
uint8_t cellIndex = (data & 0x0F);
|
||||
uint32_t mask = (cellsCount << 24) + (cellIndex << 16);
|
||||
setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, appId, dataId, mask + (((data & 0x000FFF00) >> 8) / 5), unit, precision);
|
||||
if (cellIndex+1 < cellsCount) {
|
||||
mask += (1 << 16);
|
||||
setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, appId, dataId, mask + (((data & 0xFFF00000) >> 20) / 5), unit, precision);
|
||||
}
|
||||
}
|
||||
else {
|
||||
setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, appId, dataId, data, unit, precision);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void frskySportSetDefault(int index, uint16_t id, uint8_t instance)
|
||||
{
|
||||
|
|
|
@ -20,19 +20,22 @@ void TelemetryItem::setValue(const TelemetrySensor & sensor, int32_t val, uint32
|
|||
|
||||
if (unit == UNIT_CELLS) {
|
||||
uint32_t data = uint32_t(newVal);
|
||||
uint8_t cellIndex = data & 0xF;
|
||||
uint8_t count = (data & 0xF0) >> 4;
|
||||
if (count != cells.count) {
|
||||
uint8_t cellsCount = (data >> 24);
|
||||
uint8_t cellIndex = ((data >> 16) & 0x0F);
|
||||
uint16_t cellValue = (data & 0xFFFF);
|
||||
if (cellsCount == 0) {
|
||||
cellsCount = (cellIndex >= cells.count ? cellIndex + 1 : cells.count);
|
||||
}
|
||||
if (cellsCount != cells.count) {
|
||||
clear();
|
||||
cells.count = count;
|
||||
cells.count = cellsCount;
|
||||
// we skip this round
|
||||
return;
|
||||
}
|
||||
cells.values[cellIndex].set(((data & 0x000FFF00) >> 8) / 5);
|
||||
if (cellIndex+1 < cells.count) {
|
||||
cells.values[cellIndex+1].set(((data & 0xFFF00000) >> 20) / 5);
|
||||
}
|
||||
if (cellIndex+2 >= cells.count) {
|
||||
cells.values[cellIndex].set(cellValue);
|
||||
if (cellIndex+1 == cells.count) {
|
||||
newVal = 0;
|
||||
for (int i=0; i<count; i++) {
|
||||
for (int i=0; i<cellsCount; i++) {
|
||||
if (cells.values[i].state) {
|
||||
newVal += cells.values[i].value;
|
||||
}
|
||||
|
|
|
@ -166,6 +166,26 @@ void generateSportCellPacket(uint8_t * packet, uint8_t cells, uint8_t battnumber
|
|||
|
||||
#define _V(volts) (volts/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER)
|
||||
|
||||
TEST(FrSkySPORT, FrSkyDCells)
|
||||
{
|
||||
TELEMETRY_RESET();
|
||||
uint8_t pkt1[] = { 0x7E, 0x98, 0x10, 0x06, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x12 };
|
||||
EXPECT_EQ(checkSportPacket(pkt1+1), true);
|
||||
processSportPacket(pkt1+1);
|
||||
uint8_t pkt2[] = { 0x7E, 0x98, 0x10, 0x06, 0x00, 0x17, 0xD0, 0x00, 0x00, 0x02 };
|
||||
EXPECT_EQ(checkSportPacket(pkt2+1), true);
|
||||
processSportPacket(pkt2+1);
|
||||
uint8_t pkt3[] = { 0x7E, 0x98, 0x10, 0x06, 0x00, 0x27, 0xD0, 0x00, 0x00, 0xF1 };
|
||||
EXPECT_EQ(checkSportPacket(pkt3+1), true);
|
||||
processSportPacket(pkt3+1);
|
||||
processSportPacket(pkt1+1);
|
||||
processSportPacket(pkt2+1);
|
||||
processSportPacket(pkt3+1);
|
||||
EXPECT_EQ(telemetryItems[0].cells.count, 3);
|
||||
// EXPECT_EQ(frskyData.hub.cellVolts[0], _V(000)); // now we ignore such low values
|
||||
// EXPECT_EQ(frskyData.hub.cellVolts[1], _V(413));
|
||||
}
|
||||
|
||||
#if 0
|
||||
TEST(FrSkySPORT, DISABLED_frskySetCellVoltage)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue