diff --git a/src/telemetry/frsky.cpp b/src/telemetry/frsky.cpp index aa4374cf9..f2e7f7905 100644 --- a/src/telemetry/frsky.cpp +++ b/src/telemetry/frsky.cpp @@ -165,6 +165,10 @@ void parseTelemHubByte(uint8_t byte) } #endif +#if 0 + uint16_t previousValue = *((uint16_t *)(((uint8_t*)&frskyData.hub) + structPos)); +#endif + ((uint8_t*)&frskyData.hub)[structPos] = lowByte; ((uint8_t*)&frskyData.hub)[structPos+1] = byte; @@ -191,6 +195,11 @@ void parseTelemHubByte(uint8_t byte) frskyData.hub.maxCurrent = frskyData.hub.current; break; + case offsetof(FrskySerialData, currentConsumption): + // we receive data from openXsensor. stops the calculation of consumption and power + frskyData.hub.openXsensor = 1; + break; + case offsetof(FrskySerialData, volts_ap): #if defined(FAS_BSS) frskyData.hub.vfas = (frskyData.hub.volts_bp * 10 + frskyData.hub.volts_ap); @@ -275,6 +284,31 @@ void parseTelemHubByte(uint8_t byte) *(int16_t*)(&((uint8_t*)&frskyData.hub)[structPos]) /= 10; break; +#if 0 + case offsetof(FrskySerialData, gpsAltitude_bp): + case offsetof(FrskySerialData, fuelLevel): + case offsetof(FrskySerialData, gpsLongitude_bp): + case offsetof(FrskySerialData, gpsLatitude_bp): + case offsetof(FrskySerialData, gpsCourse_bp): + case offsetof(FrskySerialData, day): + case offsetof(FrskySerialData, year): + case offsetof(FrskySerialData, sec): + case offsetof(FrskySerialData, gpsSpeed_ap): + case offsetof(FrskySerialData, gpsLongitude_ap): + case offsetof(FrskySerialData, gpsLatitude_ap): + case offsetof(FrskySerialData, gpsCourse_ap): + case offsetof(FrskySerialData, gpsLongitudeEW): + case offsetof(FrskySerialData, gpsLatitudeNS): + case offsetof(FrskySerialData, varioSpeed): + case offsetof(FrskySerialData, power): /* because sent by openXsensor */ + case offsetof(FrskySerialData, vfas): + case offsetof(FrskySerialData, volts_bp): + break; + + default: + *((uint16_t *)(((uint8_t*)&frskyData.hub) + structPos)) = previousValue; + break; +#endif } } #endif @@ -663,41 +697,43 @@ void telemetryInterrupt10ms() #endif if (TELEMETRY_STREAMING()) { - uint8_t channel = g_model.frsky.voltsSource; - if (channel <= 1) { - voltage = applyChannelRatio(channel, frskyData.analog[channel].value) / 10; - } + if (!TELEMETRY_OPENXSENSOR()) { + uint8_t channel = g_model.frsky.voltsSource; + if (channel <= 1) { + voltage = applyChannelRatio(channel, frskyData.analog[channel].value) / 10; + } #if defined(FRSKY_HUB) - else if (channel == 2) { - voltage = frskyData.hub.vfas; - } + else if (channel == 2) { + voltage = frskyData.hub.vfas; + } #endif #if defined(FRSKY_HUB) - uint16_t current = frskyData.hub.current; /* unit: 1/10 amps */ + uint16_t current = frskyData.hub.current; /* unit: 1/10 amps */ #else - uint16_t current = 0; + uint16_t current = 0; #endif - channel = g_model.frsky.currentSource - FRSKY_SOURCE_A1; - if (channel <= 1) { - current = applyChannelRatio(channel, frskyData.analog[channel].value) / 10; - } + channel = g_model.frsky.currentSource - FRSKY_SOURCE_A1; + if (channel <= 1) { + current = applyChannelRatio(channel, frskyData.analog[channel].value) / 10; + } #if defined(CPUARM) - frskyData.hub.power = (current * voltage) / 100; + frskyData.hub.power = (current * voltage) / 100; #else - frskyData.hub.power = ((current>>1) * (voltage>>1)) / 25; + frskyData.hub.power = ((current>>1) * (voltage>>1)) / 25; #endif + frskyData.hub.currentPrescale += current; + if (frskyData.hub.currentPrescale >= 3600) { + frskyData.hub.currentConsumption += 1; + frskyData.hub.currentPrescale -= 3600; + } + } + if (frskyData.hub.power > frskyData.hub.maxPower) frskyData.hub.maxPower = frskyData.hub.power; - - frskyData.hub.currentPrescale += current; - if (frskyData.hub.currentPrescale >= 3600) { - frskyData.hub.currentConsumption += 1; - frskyData.hub.currentPrescale -= 3600; - } } } diff --git a/src/telemetry/frsky.h b/src/telemetry/frsky.h index a75822dd8..a18b60318 100644 --- a/src/telemetry/frsky.h +++ b/src/telemetry/frsky.h @@ -108,7 +108,7 @@ PACK(struct FrskySerialData { int16_t accelZ; // 0x26 1/256th gram (-8g ~ +8g) uint8_t gpsDistNeeded:1; // 1bits out of 16bits spare reused int8_t gpsFix:2; // 2bits out of 16bits spare reused: -1=never fixed, 0=not fixed now, 1=fixed - uint8_t spare1:1; // + uint8_t openXsensor:1; // 1bits out of 16bits spare reused: we receive data from the openXsensor uint8_t cellsCount:4; // 4bits out of 16bits spare reused uint8_t minCellVolts; // 8bits out of 16bits spare reused uint16_t current; // 0x28 Current @@ -121,9 +121,9 @@ PACK(struct FrskySerialData { uint8_t varioAltitudeQueuePointer; // circular-buffer pointer uint8_t minCellIdx; int16_t cellsSum; - uint16_t currentConsumption; + uint16_t currentConsumption; // 0x35 openXsensor only! Otherwise calculated by the Tx from current uint16_t currentPrescale; - uint16_t power; + uint16_t power; // 0x37 openXsensor only! Otherwise calculated by the Tx from current and voltage int16_t spare2; uint16_t vfas; // 0x39 Added to FrSky protocol for home made sensors with a better precision @@ -234,7 +234,13 @@ void resetTelemetry(); #define TELEMETRY_VSPEED frskyData.hub.varioSpeed < 0 ? '-' : ' ', frskyData.hub.varioSpeed / 100, frskyData.hub.varioSpeed % 100 #define TELEMETRY_VSPEED_FORMAT "%c%d.%02d," -#define TELEMETRY_STREAMING() (frskyStreaming > 0) +#define TELEMETRY_STREAMING() (frskyStreaming > 0) + +#if defined(FRSKY_HUB) + #define TELEMETRY_OPENXSENSOR() (frskyData.hub.openXsensor) +#else + #define TELEMETRY_OPENXSENSOR() (0) +#endif #endif