mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-17 21:35:44 +03:00
Spektrum TM. Core Temp added to RPM report. Added some symbolic names for magic numbers.
This commit is contained in:
parent
637f5b1ca3
commit
3ba2799867
1 changed files with 42 additions and 14 deletions
|
@ -55,6 +55,7 @@
|
||||||
#include "io/spektrum_vtx_control.h"
|
#include "io/spektrum_vtx_control.h"
|
||||||
|
|
||||||
#include "sensors/battery.h"
|
#include "sensors/battery.h"
|
||||||
|
#include "sensors/adcinternal.h"
|
||||||
|
|
||||||
#include "telemetry/telemetry.h"
|
#include "telemetry/telemetry.h"
|
||||||
#include "telemetry/srxl.h"
|
#include "telemetry/srxl.h"
|
||||||
|
@ -118,7 +119,8 @@ typedef struct
|
||||||
} STRU_TELE_QOS;
|
} STRU_TELE_QOS;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define STRU_TELE_QOS_EMPTY_REPORT_COUNT 14
|
#define STRU_TELE_QOS_EMPTY_FIELDS_COUNT 14
|
||||||
|
#define STRU_TELE_QOS_EMPTY_FIELDS_VALUE 0xff
|
||||||
|
|
||||||
bool srxlFrameQos(sbuf_t *dst, timeUs_t currentTimeUs)
|
bool srxlFrameQos(sbuf_t *dst, timeUs_t currentTimeUs)
|
||||||
{
|
{
|
||||||
|
@ -127,8 +129,9 @@ bool srxlFrameQos(sbuf_t *dst, timeUs_t currentTimeUs)
|
||||||
sbufWriteU8(dst, SRXL_FRAMETYPE_TELE_QOS);
|
sbufWriteU8(dst, SRXL_FRAMETYPE_TELE_QOS);
|
||||||
sbufWriteU8(dst, SRXL_FRAMETYPE_SID);
|
sbufWriteU8(dst, SRXL_FRAMETYPE_SID);
|
||||||
|
|
||||||
sbufFill(dst, 0xFF, STRU_TELE_QOS_EMPTY_REPORT_COUNT); // Clear remainder
|
sbufFill(dst, STRU_TELE_QOS_EMPTY_FIELDS_VALUE, STRU_TELE_QOS_EMPTY_FIELDS_COUNT); // Clear remainder
|
||||||
|
|
||||||
|
// Mandatory frame, send it unconditionally.
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,21 +150,34 @@ typedef struct
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define STRU_TELE_RPM_EMPTY_FIELDS_COUNT 8
|
#define STRU_TELE_RPM_EMPTY_FIELDS_COUNT 8
|
||||||
|
#define STRU_TELE_RPM_EMPTY_FIELDS_VALUE 0xff
|
||||||
|
|
||||||
|
#define SPEKTRUM_RPM_UNUSED 0xffff
|
||||||
|
#define SPEKTRUM_TEMP_UNUSED 0x7fff
|
||||||
|
|
||||||
bool srxlFrameRpm(sbuf_t *dst, timeUs_t currentTimeUs)
|
bool srxlFrameRpm(sbuf_t *dst, timeUs_t currentTimeUs)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
int16_t coreTemp = SPEKTRUM_TEMP_UNUSED;
|
||||||
|
#if defined(USE_ADC_INTERNAL)
|
||||||
|
coreTemp = getCoreTemperatureCelsius();
|
||||||
|
coreTemp = coreTemp * 9 / 5 + 32; // C -> F
|
||||||
|
#endif
|
||||||
|
|
||||||
UNUSED(currentTimeUs);
|
UNUSED(currentTimeUs);
|
||||||
|
|
||||||
sbufWriteU8(dst, SRXL_FRAMETYPE_TELE_RPM);
|
sbufWriteU8(dst, SRXL_FRAMETYPE_TELE_RPM);
|
||||||
sbufWriteU8(dst, SRXL_FRAMETYPE_SID);
|
sbufWriteU8(dst, SRXL_FRAMETYPE_SID);
|
||||||
sbufWriteU16BigEndian(dst, 0xFFFF); // pulse leading edges
|
sbufWriteU16BigEndian(dst, SPEKTRUM_RPM_UNUSED); // pulse leading edges
|
||||||
if (telemetryConfig()->report_cell_voltage) {
|
if (telemetryConfig()->report_cell_voltage) {
|
||||||
sbufWriteU16BigEndian(dst, getBatteryAverageCellVoltage()); // Cell voltage is in units of 0.01V
|
sbufWriteU16BigEndian(dst, getBatteryAverageCellVoltage()); // Cell voltage is in units of 0.01V
|
||||||
} else {
|
} else {
|
||||||
sbufWriteU16BigEndian(dst, getBatteryVoltage()); // vbat is in units of 0.01V
|
sbufWriteU16BigEndian(dst, getBatteryVoltage()); // vbat is in units of 0.01V
|
||||||
}
|
}
|
||||||
sbufWriteU16BigEndian(dst, 0x7FFF); // temperature
|
sbufWriteU16BigEndian(dst, coreTemp); // temperature
|
||||||
sbufFill(dst, 0xFF, STRU_TELE_RPM_EMPTY_FIELDS_COUNT);
|
sbufFill(dst, STRU_TELE_RPM_EMPTY_FIELDS_VALUE, STRU_TELE_RPM_EMPTY_FIELDS_COUNT);
|
||||||
|
|
||||||
|
// Mandatory frame, send it unconditionally.
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -280,6 +296,7 @@ typedef struct
|
||||||
} STRU_TELE_GPS_STAT;
|
} STRU_TELE_GPS_STAT;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define STRU_TELE_GPS_STAT_EMPTY_FIELDS_VALUE 0xff
|
||||||
#define STRU_TELE_GPS_STAT_EMPTY_FIELDS_COUNT 6
|
#define STRU_TELE_GPS_STAT_EMPTY_FIELDS_COUNT 6
|
||||||
#define SPEKTRUM_TIME_UNKNOWN 0xFFFFFFFF
|
#define SPEKTRUM_TIME_UNKNOWN 0xFFFFFFFF
|
||||||
|
|
||||||
|
@ -327,7 +344,7 @@ bool srxlFrameGpsStat(sbuf_t *dst, timeUs_t currentTimeUs)
|
||||||
sbufWriteU32(dst, timeBcd);
|
sbufWriteU32(dst, timeBcd);
|
||||||
sbufWriteU8(dst, numSatBcd);
|
sbufWriteU8(dst, numSatBcd);
|
||||||
sbufWriteU8(dst, altitudeHighBcd);
|
sbufWriteU8(dst, altitudeHighBcd);
|
||||||
sbufFill(dst, 0xFF, STRU_TELE_GPS_STAT_EMPTY_FIELDS_COUNT);
|
sbufFill(dst, STRU_TELE_GPS_STAT_EMPTY_FIELDS_VALUE, STRU_TELE_GPS_STAT_EMPTY_FIELDS_COUNT);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -348,6 +365,11 @@ typedef struct
|
||||||
UINT16 spare; // Not used
|
UINT16 spare; // Not used
|
||||||
} STRU_TELE_FP_MAH;
|
} STRU_TELE_FP_MAH;
|
||||||
*/
|
*/
|
||||||
|
#define STRU_TELE_FP_EMPTY_FIELDS_COUNT 2
|
||||||
|
#define STRU_TELE_FP_EMPTY_FIELDS_VALUE 0xff
|
||||||
|
|
||||||
|
#define SPEKTRUM_AMPS_UNUSED 0x7fff
|
||||||
|
#define SPEKTRUM_AMPH_UNUSED 0x7fff
|
||||||
|
|
||||||
#define FP_MAH_KEEPALIVE_TIME_OUT 2000000 // 2s
|
#define FP_MAH_KEEPALIVE_TIME_OUT 2000000 // 2s
|
||||||
|
|
||||||
|
@ -361,17 +383,21 @@ bool srxlFrameFlightPackCurrent(sbuf_t *dst, timeUs_t currentTimeUs)
|
||||||
|
|
||||||
timeUs_t keepAlive = currentTimeUs - lastTimeSentFPmAh;
|
timeUs_t keepAlive = currentTimeUs - lastTimeSentFPmAh;
|
||||||
|
|
||||||
if ( (amps != sentAmps) || (mah != sentMah) ||
|
|
||||||
|
if ( amps != sentAmps ||
|
||||||
|
mah != sentMah ||
|
||||||
keepAlive > FP_MAH_KEEPALIVE_TIME_OUT ) {
|
keepAlive > FP_MAH_KEEPALIVE_TIME_OUT ) {
|
||||||
|
|
||||||
sbufWriteU8(dst, SRXL_FRAMETYPE_TELE_FP_MAH);
|
sbufWriteU8(dst, SRXL_FRAMETYPE_TELE_FP_MAH);
|
||||||
sbufWriteU8(dst, SRXL_FRAMETYPE_SID);
|
sbufWriteU8(dst, SRXL_FRAMETYPE_SID);
|
||||||
sbufWriteU16(dst, amps);
|
sbufWriteU16(dst, amps);
|
||||||
sbufWriteU16(dst, mah);
|
sbufWriteU16(dst, mah);
|
||||||
sbufWriteU16(dst, 0x7fff); // temp A
|
sbufWriteU16(dst, SPEKTRUM_TEMP_UNUSED); // temp A
|
||||||
sbufWriteU16(dst, 0x7fff); // Amps B
|
sbufWriteU16(dst, SPEKTRUM_AMPS_UNUSED); // Amps B
|
||||||
sbufWriteU16(dst, 0x7fff); // mAH B
|
sbufWriteU16(dst, SPEKTRUM_AMPH_UNUSED); // mAH B
|
||||||
sbufWriteU16(dst, 0x7fff); // temp B
|
sbufWriteU16(dst, SPEKTRUM_TEMP_UNUSED); // temp B
|
||||||
sbufWriteU16(dst, 0xffff);
|
|
||||||
|
sbufFill(dst, STRU_TELE_FP_EMPTY_FIELDS_VALUE, STRU_TELE_FP_EMPTY_FIELDS_COUNT);
|
||||||
|
|
||||||
sentAmps = amps;
|
sentAmps = amps;
|
||||||
sentMah = mah;
|
sentMah = mah;
|
||||||
|
@ -553,7 +579,9 @@ typedef struct
|
||||||
} STRU_TELE_VTX;
|
} STRU_TELE_VTX;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define STRU_TELE_VTX_RESERVE_COUNT 7
|
#define STRU_TELE_VTX_EMPTY_COUNT 7
|
||||||
|
#define STRU_TELE_VTX_EMPTY_VALUE 0xff
|
||||||
|
|
||||||
#define VTX_KEEPALIVE_TIME_OUT 2000000 // uS
|
#define VTX_KEEPALIVE_TIME_OUT 2000000 // uS
|
||||||
|
|
||||||
static bool srxlFrameVTX(sbuf_t *dst, timeUs_t currentTimeUs)
|
static bool srxlFrameVTX(sbuf_t *dst, timeUs_t currentTimeUs)
|
||||||
|
@ -579,7 +607,7 @@ static bool srxlFrameVTX(sbuf_t *dst, timeUs_t currentTimeUs)
|
||||||
sbufWriteU16(dst, vtx.powerValue);
|
sbufWriteU16(dst, vtx.powerValue);
|
||||||
sbufWriteU8(dst, vtx.region);
|
sbufWriteU8(dst, vtx.region);
|
||||||
|
|
||||||
sbufFill(dst, 0xFF, STRU_TELE_VTX_RESERVE_COUNT);
|
sbufFill(dst, STRU_TELE_VTX_EMPTY_VALUE, STRU_TELE_VTX_EMPTY_COUNT);
|
||||||
|
|
||||||
memcpy(&vtxSent, &vtx, sizeof(spektrumVtx_t));
|
memcpy(&vtxSent, &vtx, sizeof(spektrumVtx_t));
|
||||||
lastTimeSentVtx = currentTimeUs;
|
lastTimeSentVtx = currentTimeUs;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue