Port of TBS's changes for module scoped telemetry

This commit is contained in:
Raphael Coeffic
2021-11-21 11:18:35 +01:00
committed by Raphael Coeffic
parent 620a43a9c3
commit 2abf07ed9b
12 changed files with 159 additions and 89 deletions
+2 -2
View File
@@ -316,8 +316,8 @@ enum TelemetryUnit {
UNIT_MS,
UNIT_US,
UNIT_KM,
UNIT_MAX = UNIT_KM,
UNIT_SPARE5,
UNIT_DBM,
UNIT_MAX = UNIT_DBM,
UNIT_SPARE6,
UNIT_SPARE7,
UNIT_SPARE8,
@@ -401,8 +401,8 @@ enum TelemetryUnit {
UNIT_MS,
UNIT_US,
UNIT_KM,
UNIT_MAX = UNIT_KM,
UNIT_SPARE5,
UNIT_DBM,
UNIT_MAX = UNIT_DBM,
UNIT_SPARE6,
UNIT_SPARE7,
UNIT_SPARE8,
+1
View File
@@ -222,6 +222,7 @@ endif()
if(INTERNAL_MODULE_MULTI)
add_definitions(-DHARDWARE_INTERNAL_MODULE)
add_definitions(-DINTERNAL_MODULE_MULTI)
add_definitions(-DINTERNAL_MODULE_SERIAL_TELEMETRY)
endif()
if(ALLOW_TRAINER_MULTI)
+1
View File
@@ -517,6 +517,7 @@ endif()
if(INTERNAL_MODULE_MULTI)
add_definitions(-DHARDWARE_INTERNAL_MODULE)
add_definitions(-DINTERNAL_MODULE_MULTI)
add_definitions(-DINTERNAL_MODULE_SERIAL_TELEMETRY)
set(TARGET_SRC
${TARGET_SRC}
../common/arm/stm32/intmodule_serial_driver.cpp
+98 -55
View File
@@ -32,6 +32,11 @@ const CrossfireSensor crossfireSensors[] = {
{LINK_ID, 7, STR_SENSOR_TX_RSSI, UNIT_DB, 0},
{LINK_ID, 8, STR_SENSOR_TX_QUALITY, UNIT_PERCENT, 0},
{LINK_ID, 9, STR_SENSOR_TX_SNR, UNIT_DB, 0},
{LINK_RX_ID, 0, STR_SENSOR_RX_RSSI_PERC, UNIT_PERCENT, 0},
{LINK_RX_ID, 1, STR_SENSOR_RX_RF_POWER, UNIT_DBM, 0},
{LINK_TX_ID, 0, STR_SENSOR_TX_RSSI_PERC, UNIT_PERCENT, 0},
{LINK_TX_ID, 1, STR_SENSOR_TX_RF_POWER, UNIT_DBM, 0},
{LINK_TX_ID, 2, STR_SENSOR_TX_FPS, UNIT_HERTZ, 0},
{BATTERY_ID, 0, STR_SENSOR_BATT, UNIT_VOLTS, 1},
{BATTERY_ID, 1, STR_SENSOR_CURR, UNIT_AMPS, 1},
{BATTERY_ID, 2, STR_SENSOR_CAPACITY, UNIT_MAH, 0},
@@ -54,6 +59,10 @@ const CrossfireSensor & getCrossfireSensor(uint8_t id, uint8_t subId)
{
if (id == LINK_ID)
return crossfireSensors[RX_RSSI1_INDEX+subId];
else if (id == LINK_RX_ID)
return crossfireSensors[RX_RSSI_PERC_INDEX+subId];
else if (id == LINK_TX_ID)
return crossfireSensors[TX_RSSI_PERC_INDEX+subId];
else if (id == BATTERY_ID)
return crossfireSensors[BATT_VOLTAGE_INDEX+subId];
else if (id == GPS_ID)
@@ -74,21 +83,24 @@ void processCrossfireTelemetryValue(uint8_t index, int32_t value)
return;
const CrossfireSensor & sensor = crossfireSensors[index];
setTelemetryValue(PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id, 0, sensor.subId, value, sensor.unit, sensor.precision);
setTelemetryValue(PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id, 0, sensor.subId,
value, sensor.unit, sensor.precision);
}
bool checkCrossfireTelemetryFrameCRC()
bool checkCrossfireTelemetryFrameCRC(uint8_t module)
{
uint8_t len = telemetryRxBuffer[1];
uint8_t crc = crc8(&telemetryRxBuffer[2], len-1);
return (crc == telemetryRxBuffer[len+1]);
uint8_t * rxBuffer = getTelemetryRxBuffer(module);
uint8_t len = rxBuffer[1];
uint8_t crc = crc8(&rxBuffer[2], len-1);
return (crc == rxBuffer[len+1]);
}
template<int N>
bool getCrossfireTelemetryValue(uint8_t index, int32_t & value)
bool getCrossfireTelemetryValue(uint8_t index, int32_t & value, uint8_t module)
{
uint8_t * rxBuffer = getTelemetryRxBuffer(module);
bool result = false;
uint8_t * byte = &telemetryRxBuffer[index];
uint8_t * byte = &rxBuffer[index];
value = (*byte & 0x80) ? -1 : 0;
for (uint8_t i=0; i<N; i++) {
value <<= 8;
@@ -100,88 +112,115 @@ bool getCrossfireTelemetryValue(uint8_t index, int32_t & value)
return result;
}
void processCrossfireTelemetryFrame()
void processCrossfireTelemetryFrame(uint8_t module)
{
if (!checkCrossfireTelemetryFrameCRC()) {
uint8_t * rxBuffer = getTelemetryRxBuffer(module);
uint8_t &rxBufferCount = getTelemetryRxBufferCount(module);
if (!checkCrossfireTelemetryFrameCRC(module)) {
TRACE("[XF] CRC error");
return;
}
if (telemetryState == TELEMETRY_INIT && moduleState[EXTERNAL_MODULE].counter != CRSF_FRAME_MODELID_SENT) {
moduleState[EXTERNAL_MODULE].counter = CRSF_FRAME_MODELID;
if (telemetryState == TELEMETRY_INIT &&
moduleState[module].counter != CRSF_FRAME_MODELID_SENT) {
moduleState[module].counter = CRSF_FRAME_MODELID;
}
uint8_t id = telemetryRxBuffer[2];
uint8_t id = rxBuffer[2];
int32_t value;
switch(id) {
case CF_VARIO_ID:
if (getCrossfireTelemetryValue<2>(3, value))
if (getCrossfireTelemetryValue<2>(3, value, module))
processCrossfireTelemetryValue(VERTICAL_SPEED_INDEX, value);
break;
case GPS_ID:
if (getCrossfireTelemetryValue<4>(3, value))
if (getCrossfireTelemetryValue<4>(3, value, module))
processCrossfireTelemetryValue(GPS_LATITUDE_INDEX, value/10);
if (getCrossfireTelemetryValue<4>(7, value))
if (getCrossfireTelemetryValue<4>(7, value, module))
processCrossfireTelemetryValue(GPS_LONGITUDE_INDEX, value/10);
if (getCrossfireTelemetryValue<2>(11, value))
if (getCrossfireTelemetryValue<2>(11, value, module))
processCrossfireTelemetryValue(GPS_GROUND_SPEED_INDEX, value);
if (getCrossfireTelemetryValue<2>(13, value))
if (getCrossfireTelemetryValue<2>(13, value, module))
processCrossfireTelemetryValue(GPS_HEADING_INDEX, value);
if (getCrossfireTelemetryValue<2>(15, value))
if (getCrossfireTelemetryValue<2>(15, value, module))
processCrossfireTelemetryValue(GPS_ALTITUDE_INDEX, value - 1000);
if (getCrossfireTelemetryValue<1>(17, value))
if (getCrossfireTelemetryValue<1>(17, value, module))
processCrossfireTelemetryValue(GPS_SATELLITES_INDEX, value);
break;
case LINK_ID:
for (unsigned int i=0; i<=TX_SNR_INDEX; i++) {
if (getCrossfireTelemetryValue<1>(3+i, value)) {
if (getCrossfireTelemetryValue<1>(3+i, value, module)) {
if (i == TX_POWER_INDEX) {
static const int32_t power_values[] = { 0, 10, 25, 100, 500, 1000, 2000, 250, 50 };
value = ((unsigned)value < DIM(power_values) ? power_values[value] : 0);
static const int32_t power_values[] = {0, 10, 25, 100, 500,
1000, 2000, 250, 50};
value =
((unsigned)value < DIM(power_values) ? power_values[value] : 0);
}
processCrossfireTelemetryValue(i, value);
if (i == RX_QUALITY_INDEX) {
if (value) {
telemetryData.rssi.set(value);
telemetryStreaming = TELEMETRY_TIMEOUT10ms;
telemetryData.telemetryValid |= 1 << module;
}
else {
telemetryData.rssi.reset();
telemetryStreaming = 0;
if (telemetryData.telemetryValid & (1 << module)) {
telemetryData.rssi.reset();
telemetryStreaming = 0;
}
telemetryData.telemetryValid &= ~(1 << module);
}
}
}
}
break;
case LINK_RX_ID:
if (getCrossfireTelemetryValue<1>(4, value, module))
processCrossfireTelemetryValue(RX_RSSI_PERC_INDEX, value);
if (getCrossfireTelemetryValue<1>(7, value, module))
processCrossfireTelemetryValue(TX_RF_POWER_INDEX, value);
break;
case LINK_TX_ID:
if (getCrossfireTelemetryValue<1>(4, value, module))
processCrossfireTelemetryValue(TX_RSSI_PERC_INDEX, value);
if (getCrossfireTelemetryValue<1>(7, value, module))
processCrossfireTelemetryValue(RX_RF_POWER_INDEX, value);
if (getCrossfireTelemetryValue<1>(8, value, module))
processCrossfireTelemetryValue(TX_FPS_INDEX, value * 10);
break;
case BATTERY_ID:
if (getCrossfireTelemetryValue<2>(3, value))
if (getCrossfireTelemetryValue<2>(3, value, module))
processCrossfireTelemetryValue(BATT_VOLTAGE_INDEX, value);
if (getCrossfireTelemetryValue<2>(5, value))
if (getCrossfireTelemetryValue<2>(5, value, module))
processCrossfireTelemetryValue(BATT_CURRENT_INDEX, value);
if (getCrossfireTelemetryValue<3>(7, value))
if (getCrossfireTelemetryValue<3>(7, value, module))
processCrossfireTelemetryValue(BATT_CAPACITY_INDEX, value);
if (getCrossfireTelemetryValue<1>(10, value))
if (getCrossfireTelemetryValue<1>(10, value, module))
processCrossfireTelemetryValue(BATT_REMAINING_INDEX, value);
break;
case ATTITUDE_ID:
if (getCrossfireTelemetryValue<2>(3, value))
if (getCrossfireTelemetryValue<2>(3, value, module))
processCrossfireTelemetryValue(ATTITUDE_PITCH_INDEX, value/10);
if (getCrossfireTelemetryValue<2>(5, value))
if (getCrossfireTelemetryValue<2>(5, value, module))
processCrossfireTelemetryValue(ATTITUDE_ROLL_INDEX, value/10);
if (getCrossfireTelemetryValue<2>(7, value))
if (getCrossfireTelemetryValue<2>(7, value, module))
processCrossfireTelemetryValue(ATTITUDE_YAW_INDEX, value/10);
break;
case FLIGHT_MODE_ID:
{
const CrossfireSensor & sensor = crossfireSensors[FLIGHT_MODE_INDEX];
auto textLength = min<int>(16, telemetryRxBuffer[1]);
telemetryRxBuffer[textLength] = '\0';
setTelemetryText(PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id, 0, sensor.subId, (const char *)telemetryRxBuffer + 3);
auto textLength = min<int>(16, rxBuffer[1]);
rxBuffer[textLength] = '\0';
setTelemetryText(PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id, 0, sensor.subId,
(const char *)rxBuffer + 3);
break;
}
@@ -192,24 +231,25 @@ void processCrossfireTelemetryFrame()
uint32_t update_interval;
int32_t offset;
if (getCrossfireTelemetryValue<4>(6, (int32_t&)update_interval) && getCrossfireTelemetryValue<4>(10, offset)) {
if (getCrossfireTelemetryValue<4>(6, (int32_t &)update_interval,
module) &&
getCrossfireTelemetryValue<4>(10, offset, module)) {
// values are in 10th of micro-seconds
update_interval /= 10;
offset /= 10;
TRACE("[XF] Rate: %d, Lag: %d", update_interval, offset);
getModuleSyncStatus(EXTERNAL_MODULE).update(update_interval, offset);
getModuleSyncStatus(module).update(update_interval, offset);
}
}
break;
#if defined(LUA)
default:
if (luaInputTelemetryFifo && luaInputTelemetryFifo->hasSpace(telemetryRxBufferCount-2) ) {
for (uint8_t i=1; i<telemetryRxBufferCount-1; i++) {
if (luaInputTelemetryFifo && luaInputTelemetryFifo->hasSpace(rxBufferCount-2) ) {
for (uint8_t i=1; i<rxBufferCount-1; i++) {
// destination address and CRC are skipped
luaInputTelemetryFifo->push(telemetryRxBuffer[i]);
luaInputTelemetryFifo->push(rxBuffer[i]);
}
}
break;
@@ -217,8 +257,10 @@ void processCrossfireTelemetryFrame()
}
}
void processCrossfireTelemetryData(uint8_t data)
void processCrossfireTelemetryData(uint8_t data, uint8_t module)
{
uint8_t * rxBuffer = getTelemetryRxBuffer(module);
uint8_t &rxBufferCount = getTelemetryRxBufferCount(module);
#if defined(AUX_SERIAL)
if (g_eeGeneral.auxSerialMode == UART_MODE_TELEMETRY_MIRROR) {
auxSerialPutc(data);
@@ -231,35 +273,36 @@ void processCrossfireTelemetryData(uint8_t data)
}
#endif
if (telemetryRxBufferCount == 0 && data != RADIO_ADDRESS) {
if (rxBufferCount == 0 && data != RADIO_ADDRESS && data != UART_SYNC) {
TRACE("[XF] address 0x%02X error", data);
return;
}
if (telemetryRxBufferCount == 1 && (data < 2 || data > TELEMETRY_RX_PACKET_SIZE-2)) {
if (rxBufferCount == 1 && (data < 2 || data > TELEMETRY_RX_PACKET_SIZE-2)) {
TRACE("[XF] length 0x%02X error", data);
telemetryRxBufferCount = 0;
rxBufferCount = 0;
return;
}
if (telemetryRxBufferCount < TELEMETRY_RX_PACKET_SIZE) {
telemetryRxBuffer[telemetryRxBufferCount++] = data;
if (rxBufferCount < TELEMETRY_RX_PACKET_SIZE) {
rxBuffer[rxBufferCount++] = data;
}
else {
TRACE("[XF] array size %d error", telemetryRxBufferCount);
telemetryRxBufferCount = 0;
TRACE("[XF] array size %d error", rxBufferCount);
rxBufferCount = 0;
}
if (telemetryRxBufferCount > 4) {
uint8_t length = telemetryRxBuffer[1];
if (length + 2 == telemetryRxBufferCount) {
if (rxBufferCount > 4) {
uint8_t length = rxBuffer[1];
if (length + 2 == rxBufferCount) {
#if defined(BLUETOOTH)
if (g_eeGeneral.bluetoothMode == BLUETOOTH_TELEMETRY && bluetooth.state == BLUETOOTH_STATE_CONNECTED) {
bluetooth.write(telemetryRxBuffer, telemetryRxBufferCount);
if (g_eeGeneral.bluetoothMode == BLUETOOTH_TELEMETRY &&
bluetooth.state == BLUETOOTH_STATE_CONNECTED) {
bluetooth.write(rxBuffer, rxBufferCount);
}
#endif
processCrossfireTelemetryFrame();
telemetryRxBufferCount = 0;
processCrossfireTelemetryFrame(module);
rxBufferCount = 0;
}
}
}
+8 -1
View File
@@ -36,6 +36,8 @@
#define BATTERY_ID 0x08
#define LINK_ID 0x14
#define CHANNELS_ID 0x16
#define LINK_RX_ID 0x1C
#define LINK_TX_ID 0x1D
#define ATTITUDE_ID 0x1E
#define FLIGHT_MODE_ID 0x21
#define PING_DEVICES_ID 0x28
@@ -67,6 +69,11 @@ enum CrossfireSensorIndexes {
TX_RSSI_INDEX,
TX_QUALITY_INDEX,
TX_SNR_INDEX,
RX_RSSI_PERC_INDEX,
RX_RF_POWER_INDEX,
TX_RSSI_PERC_INDEX,
TX_RF_POWER_INDEX,
TX_FPS_INDEX,
BATT_VOLTAGE_INDEX,
BATT_CURRENT_INDEX,
BATT_CAPACITY_INDEX,
@@ -91,7 +98,7 @@ enum CrossfireFrames{
CRSF_FRAME_MODELID_SENT
};
void processCrossfireTelemetryData(uint8_t data);
void processCrossfireTelemetryData(uint8_t data, uint8_t module);
void crossfireSetDefault(int index, uint8_t id, uint8_t subId);
uint8_t createCrossfireModelIDFrame(uint8_t * frame);
+4 -26
View File
@@ -103,10 +103,6 @@ static uint16_t& getMultiTelemetryLastRxTS(uint8_t module)
return multiTelemetryLastRxTS[module];
}
// Use additional telemetry buffer
uint8_t intTelemetryRxBuffer[TELEMETRY_RX_PACKET_SIZE];
uint8_t intTelemetryRxBufferCount;
#else // !INTERNAL_MODULE_MULTI
static MultiModuleStatus multiModuleStatus;
@@ -556,28 +552,10 @@ void MultiModuleStatus::getStatusString(char * statusText) const
}
}
static uint8_t * getRxBuffer(uint8_t moduleIdx)
{
#if defined(INTERNAL_MODULE_MULTI)
if (moduleIdx == INTERNAL_MODULE)
return intTelemetryRxBuffer;
#endif
return telemetryRxBuffer;
}
static uint8_t &getRxBufferCount(uint8_t moduleIdx)
{
#if defined(INTERNAL_MODULE_MULTI)
if (moduleIdx == INTERNAL_MODULE)
return intTelemetryRxBufferCount;
#endif
return telemetryRxBufferCount;
}
static void processMultiTelemetryByte(const uint8_t data, uint8_t module)
{
uint8_t * rxBuffer = getRxBuffer(module);
uint8_t &rxBufferCount = getRxBufferCount(module);
uint8_t * rxBuffer = getTelemetryRxBuffer(module);
uint8_t &rxBufferCount = getTelemetryRxBufferCount(module);
if (rxBufferCount < TELEMETRY_RX_PACKET_SIZE) {
rxBuffer[rxBufferCount++] = data;
@@ -607,8 +585,8 @@ static void processMultiTelemetryByte(const uint8_t data, uint8_t module)
void processMultiTelemetryData(uint8_t data, uint8_t module)
{
uint8_t * rxBuffer = getRxBuffer(module);
uint8_t &rxBufferCount = getRxBufferCount(module);
uint8_t * rxBuffer = getTelemetryRxBuffer(module);
uint8_t &rxBufferCount = getTelemetryRxBufferCount(module);
uint16_t &lastRxTS = getMultiTelemetryLastRxTS(module);
uint16_t nowMs = (uint16_t)RTOS_GET_MS();
+22 -3
View File
@@ -40,15 +40,34 @@ TelemetryData telemetryData;
uint8_t telemetryProtocol = 255;
#if defined(PCBSKY9X) && defined(REVX)
uint8_t serialInversion = 0;
#if defined(INTERNAL_MODULE_SERIAL_TELEMETRY)
uint8_t intTelemetryRxBuffer[TELEMETRY_RX_PACKET_SIZE];
uint8_t intTelemetryRxBufferCount;
#endif
uint8_t * getTelemetryRxBuffer(uint8_t moduleIdx)
{
#if defined(INTERNAL_MODULE_SERIAL_TELEMETRY)
if (moduleIdx == INTERNAL_MODULE)
return intTelemetryRxBuffer;
#endif
return telemetryRxBuffer;
}
uint8_t &getTelemetryRxBufferCount(uint8_t moduleIdx)
{
#if defined(INTERNAL_MODULE_SERIAL_TELEMETRY)
if (moduleIdx == INTERNAL_MODULE)
return intTelemetryRxBufferCount;
#endif
return telemetryRxBufferCount;
}
void processTelemetryData(uint8_t data)
{
#if defined(CROSSFIRE)
if (telemetryProtocol == PROTOCOL_TELEMETRY_CROSSFIRE) {
processCrossfireTelemetryData(data);
processCrossfireTelemetryData(data, EXTERNAL_MODULE);
return;
}
#endif
+6
View File
@@ -71,9 +71,15 @@ constexpr uint8_t TELEMETRY_TIMEOUT10ms = 100; // 1 second
#define TELEMETRY_RX_PACKET_SIZE 19 // 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1)
#endif
//TODO: remove this public definition
extern uint8_t telemetryRxBuffer[TELEMETRY_RX_PACKET_SIZE];
extern uint8_t telemetryRxBufferCount;
//TODO: use module scoped buffers instead
uint8_t* getTelemetryRxBuffer(uint8_t moduleIdx);
uint8_t& getTelemetryRxBufferCount(uint8_t moduleIdx);
#define TELEMETRY_AVERAGE_COUNT 3
enum {
+5
View File
@@ -561,6 +561,11 @@ const char STR_SENSOR_RF_MODE[] = TR_SENSOR_RF_MODE;
const char STR_SENSOR_TX_POWER[] = TR_SENSOR_TX_POWER;
const char STR_SENSOR_TX_RSSI[] = TR_SENSOR_TX_RSSI;
const char STR_SENSOR_TX_QUALITY[] = TR_SENSOR_TX_QUALITY;
const char STR_SENSOR_RX_RSSI_PERC[] = TR_SENSOR_RX_RSSI_PERC;
const char STR_SENSOR_RX_RF_POWER[] = TR_SENSOR_RX_RF_POWER;
const char STR_SENSOR_TX_RSSI_PERC[] = TR_SENSOR_TX_RSSI_PERC;
const char STR_SENSOR_TX_RF_POWER[] = TR_SENSOR_TX_RF_POWER;
const char STR_SENSOR_TX_FPS[] = TR_SENSOR_TX_FPS;
const char STR_SENSOR_TX_SNR[] = TR_SENSOR_TX_SNR;
const char STR_SENSOR_TX_NOISE[] = TR_SENSOR_TX_NOISE;
const char STR_SENSOR_PITCH[] = TR_SENSOR_PITCH;
+5
View File
@@ -894,6 +894,11 @@ extern const char STR_SENSOR_RF_MODE[];
extern const char STR_SENSOR_TX_POWER[];
extern const char STR_SENSOR_TX_RSSI[];
extern const char STR_SENSOR_TX_QUALITY[];
extern const char STR_SENSOR_RX_RSSI_PERC[];
extern const char STR_SENSOR_RX_RF_POWER[];
extern const char STR_SENSOR_TX_RSSI_PERC[];
extern const char STR_SENSOR_TX_RF_POWER[];
extern const char STR_SENSOR_TX_FPS[];
extern const char STR_SENSOR_TX_SNR[];
extern const char STR_SENSOR_TX_NOISE[];
extern const char STR_SENSOR_PITCH[];
+5
View File
@@ -257,6 +257,11 @@
#define TR_SENSOR_TX_POWER "TPWR"
#define TR_SENSOR_TX_RSSI "TRSS"
#define TR_SENSOR_TX_QUALITY "TQly"
#define TR_SENSOR_RX_RSSI_PERC "RRSP"
#define TR_SENSOR_RX_RF_POWER "RPWR"
#define TR_SENSOR_TX_RSSI_PERC "TRSP"
#define TR_SENSOR_TX_RF_POWER "TPWR"
#define TR_SENSOR_TX_FPS "TFPS"
#define TR_SENSOR_TX_SNR "TSNR"
#define TR_SENSOR_TX_NOISE "TNse"
#define TR_SENSOR_PITCH "Ptch"