Skip to content

Commit

Permalink
Make speedNegotiationProcess send heartbeat if telemetry disabled
Browse files Browse the repository at this point in the history
  • Loading branch information
klutvott123 committed Apr 15, 2022
1 parent 9360ab1 commit 9aac305
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 28 deletions.
2 changes: 2 additions & 0 deletions src/main/rx/crsf_protocol.h
Expand Up @@ -37,6 +37,7 @@ enum { CRSF_PAYLOAD_SIZE_MAX = CRSF_FRAME_SIZE_MAX - 6 };
typedef enum {
CRSF_FRAMETYPE_GPS = 0x02,
CRSF_FRAMETYPE_BATTERY_SENSOR = 0x08,
CRSF_FRAMETYPE_HEARTBEAT = 0x0B,
CRSF_FRAMETYPE_LINK_STATISTICS = 0x14,
CRSF_FRAMETYPE_RC_CHANNELS_PACKED = 0x16,
CRSF_FRAMETYPE_SUBSET_RC_CHANNELS_PACKED = 0x17,
Expand Down Expand Up @@ -83,6 +84,7 @@ enum {
enum {
CRSF_FRAME_GPS_PAYLOAD_SIZE = 15,
CRSF_FRAME_BATTERY_SENSOR_PAYLOAD_SIZE = 8,
CRSF_FRAME_HEARTBEAT_PAYLOAD_SIZE = 2,
CRSF_FRAME_LINK_STATISTICS_PAYLOAD_SIZE = 10,
CRSF_FRAME_LINK_STATISTICS_TX_PAYLOAD_SIZE = 6,
CRSF_FRAME_RC_CHANNELS_PAYLOAD_SIZE = 22, // 11 bits per channel * 16 channels = 22 bytes.
Expand Down
65 changes: 37 additions & 28 deletions src/main/telemetry/crsf.c
Expand Up @@ -32,13 +32,14 @@

#include "cms/cms.h"

#include "config/config.h"
#include "config/feature.h"

#include "config/config.h"
#include "common/crc.h"
#include "common/maths.h"
#include "common/printf.h"
#include "common/streambuf.h"
#include "common/time.h"
#include "common/utils.h"

#include "drivers/nvic.h"
Expand Down Expand Up @@ -248,6 +249,18 @@ void crsfFrameBatterySensor(sbuf_t *dst)
sbufWriteU8(dst, batteryRemainingPercentage);
}

/*
0x0B Heartbeat
Payload:
int16_t origin_add ( Origin Device address )
*/
void crsfFrameHeartbeat(sbuf_t *dst)
{
sbufWriteU8(dst, CRSF_FRAME_HEARTBEAT_PAYLOAD_SIZE + CRSF_FRAME_LENGTH_TYPE_CRC);
sbufWriteU8(dst, CRSF_FRAMETYPE_HEARTBEAT);
sbufWriteU16BigEndian(dst, CRSF_ADDRESS_FLIGHT_CONTROLLER);
}

typedef enum {
CRSF_ACTIVE_ANTENNA1 = 0,
CRSF_ACTIVE_ANTENNA2 = 1
Expand Down Expand Up @@ -418,40 +431,36 @@ void crsfScheduleSpeedNegotiationResponse(void)
crsfSpeed.isNewSpeedValid = false;
}

void speedNegotiationProcess(uint32_t currentTime)
void speedNegotiationProcess(timeUs_t currentTimeUs)
{
if (!featureIsEnabled(FEATURE_TELEMETRY) && getCrsfDesiredSpeed() == CRSF_BAUDRATE) {
// to notify the RX to fall back to default baud rate by sending device info frame if telemetry is disabled
if (crsfSpeed.hasPendingReply) {
bool found = ((crsfSpeed.index < BAUD_COUNT) && crsfRxUseNegotiatedBaud()) ? true : false;
sbuf_t crsfSpeedNegotiationBuf;
sbuf_t *dst = &crsfSpeedNegotiationBuf;
crsfInitializeFrame(dst);
crsfFrameSpeedNegotiationResponse(dst, found);
crsfRxSendTelemetryData(); // prevent overwriting previous data
crsfFinalize(dst);
crsfRxSendTelemetryData();
crsfSpeed.hasPendingReply = false;
crsfSpeed.isNewSpeedValid = found;
crsfSpeed.confirmationTime = currentTimeUs;
} else if (crsfSpeed.isNewSpeedValid) {
if (cmpTimeUs(currentTimeUs, crsfSpeed.confirmationTime) >= 4000) {
// delay 4ms before applying the new baudrate
crsfRxUpdateBaudrate(getCrsfDesiredSpeed());
crsfSpeed.isNewSpeedValid = false;
isCrsfV3Running = true;
}
} else if (!featureIsEnabled(FEATURE_TELEMETRY) && crsfRxUseNegotiatedBaud()) {
// Send heartbeat if telemetry is disabled to allow RX to detect baud rate mismatches
sbuf_t crsfPayloadBuf;
sbuf_t *dst = &crsfPayloadBuf;
crsfInitializeFrame(dst);
crsfFrameDeviceInfo(dst);
crsfFrameHeartbeat(dst);
crsfRxSendTelemetryData(); // prevent overwriting previous data
crsfFinalize(dst);
crsfRxSendTelemetryData();
} else {
if (crsfSpeed.hasPendingReply) {
bool found = ((crsfSpeed.index < BAUD_COUNT) && crsfRxUseNegotiatedBaud()) ? true : false;
sbuf_t crsfSpeedNegotiationBuf;
sbuf_t *dst = &crsfSpeedNegotiationBuf;
crsfInitializeFrame(dst);
crsfFrameSpeedNegotiationResponse(dst, found);
crsfRxSendTelemetryData(); // prevent overwriting previous data
crsfFinalize(dst);
crsfRxSendTelemetryData();
crsfSpeed.hasPendingReply = false;
crsfSpeed.isNewSpeedValid = found;
crsfSpeed.confirmationTime = currentTime;
return;
} else if (crsfSpeed.isNewSpeedValid) {
if (currentTime - crsfSpeed.confirmationTime >= 4000) {
// delay 4ms before applying the new baudrate
crsfRxUpdateBaudrate(getCrsfDesiredSpeed());
crsfSpeed.isNewSpeedValid = false;
isCrsfV3Running = true;
return;
}
}
}
}
#endif
Expand Down

0 comments on commit 9aac305

Please sign in to comment.