1
0
Fork 0
mirror of https://github.com/EdgeTX/edgetx.git synced 2025-07-26 17:55:12 +03:00
This commit is contained in:
bsongis 2015-06-14 23:16:19 +02:00
parent f4d1389c4d
commit fc492a7709
4 changed files with 49 additions and 14 deletions

View file

@ -600,6 +600,8 @@ void processHubPacket(uint8_t id, int16_t value)
} }
else if (id == VOLTS_ID) { else if (id == VOLTS_ID) {
unit = UNIT_CELLS; 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) { else if (id == GPS_DAY_MONTH_ID) {
id = GPS_HOUR_MIN_ID; id = GPS_HOUR_MIN_ID;
@ -636,8 +638,6 @@ void frskyDSetDefault(int index, uint16_t id)
const FrSkyDSensor * sensor = getFrSkyDSensor(id); const FrSkyDSensor * sensor = getFrSkyDSensor(id);
if (sensor) { if (sensor) {
TelemetryUnit unit = sensor->unit; TelemetryUnit unit = sensor->unit;
if (unit == UNIT_CELLS)
unit = UNIT_VOLTS;
uint8_t prec = min<uint8_t>(2, sensor->prec); uint8_t prec = min<uint8_t>(2, sensor->prec);
telemetrySensor.init(sensor->name, unit, prec); telemetrySensor.init(sensor->name, unit, prec);
if (id >= D_A1_ID && id <= D_A2_ID) { if (id >= D_A1_ID && id <= D_A2_ID) {

View file

@ -236,7 +236,19 @@ void processSportPacket(uint8_t *packet)
unit = sensor->unit; unit = sensor->unit;
precision = sensor->prec; precision = sensor->prec;
} }
setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, appId, dataId, data, unit, precision); 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);
}
} }
} }
} }

View file

@ -20,19 +20,22 @@ void TelemetryItem::setValue(const TelemetrySensor & sensor, int32_t val, uint32
if (unit == UNIT_CELLS) { if (unit == UNIT_CELLS) {
uint32_t data = uint32_t(newVal); uint32_t data = uint32_t(newVal);
uint8_t cellIndex = data & 0xF; uint8_t cellsCount = (data >> 24);
uint8_t count = (data & 0xF0) >> 4; uint8_t cellIndex = ((data >> 16) & 0x0F);
if (count != cells.count) { uint16_t cellValue = (data & 0xFFFF);
if (cellsCount == 0) {
cellsCount = (cellIndex >= cells.count ? cellIndex + 1 : cells.count);
}
if (cellsCount != cells.count) {
clear(); clear();
cells.count = count; cells.count = cellsCount;
// we skip this round
return;
} }
cells.values[cellIndex].set(((data & 0x000FFF00) >> 8) / 5); cells.values[cellIndex].set(cellValue);
if (cellIndex+1 < cells.count) { if (cellIndex+1 == cells.count) {
cells.values[cellIndex+1].set(((data & 0xFFF00000) >> 20) / 5);
}
if (cellIndex+2 >= cells.count) {
newVal = 0; newVal = 0;
for (int i=0; i<count; i++) { for (int i=0; i<cellsCount; i++) {
if (cells.values[i].state) { if (cells.values[i].state) {
newVal += cells.values[i].value; newVal += cells.values[i].value;
} }
@ -476,7 +479,7 @@ int lastUsedTelemetryIndex()
bool isSensorAvailableInResetSpecialFunction(int index) bool isSensorAvailableInResetSpecialFunction(int index)
{ {
TelemetrySensor & telemetrySensor = g_model.telemetrySensors[index-FUNC_RESET_PARAM_FIRST_TELEM]; TelemetrySensor & telemetrySensor = g_model.telemetrySensors[index-FUNC_RESET_PARAM_FIRST_TELEM];
return telemetrySensor.isAvailable(); return telemetrySensor.isAvailable();
} }
void setTelemetryValue(TelemetryProtocol protocol, uint16_t id, uint8_t instance, int32_t value, uint32_t unit, uint32_t prec) void setTelemetryValue(TelemetryProtocol protocol, uint16_t id, uint8_t instance, int32_t value, uint32_t unit, uint32_t prec)

View file

@ -166,6 +166,26 @@ void generateSportCellPacket(uint8_t * packet, uint8_t cells, uint8_t battnumber
#define _V(volts) (volts/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER) #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 #if 0
TEST(FrSkySPORT, DISABLED_frskySetCellVoltage) TEST(FrSkySPORT, DISABLED_frskySetCellVoltage)
{ {