1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-25 01:05:27 +03:00
betaflight/src/telemetry_common.c
Dominic Clifton 92bed4a33d STM32F30x - Working parallel PWM. Timer IRQ handle was not defined for
TIM8 correctly. Software serial conficted with parallel PWM input. Fixed
crash due to incorrect timerConfig index calculation code.

The crash occurred when capture compare interrupt handlers attempted to
call an invalid callback.

Note: the crash does not affect existing baseflight code since the
formula is OK when using a 2 dimensional array with equal dimensions.

Formula details here:
https://docs.google.com/spreadsheets/d/1UuxnC0VKiprvt1wt3KXffefEWJUb_-ILFLQuP377Anw
2014-05-02 17:09:41 +01:00

163 lines
4 KiB
C

#include <stdbool.h>
#include <stdint.h>
#include "platform.h"
#include "drivers/gpio_common.h"
#include "drivers/timer_common.h"
#include "drivers/serial_common.h"
#include "drivers/serial_softserial.h"
#include "serial_common.h"
#include "runtime_config.h"
#include "config.h"
#include "telemetry_frsky.h"
#include "telemetry_hott.h"
#include "telemetry_common.h"
static bool isTelemetryConfigurationValid = false; // flag used to avoid repeated configuration checks
telemetryConfig_t *telemetryConfig;
void useTelemetryConfig(telemetryConfig_t *telemetryConfigToUse)
{
telemetryConfig = telemetryConfigToUse;
}
bool isTelemetryProviderFrSky(void)
{
return telemetryConfig->telemetry_provider == TELEMETRY_PROVIDER_FRSKY;
}
bool isTelemetryProviderHoTT(void)
{
return telemetryConfig->telemetry_provider == TELEMETRY_PROVIDER_HOTT;
}
bool canUseTelemetryWithCurrentConfiguration(void)
{
if (!feature(FEATURE_TELEMETRY)) {
return false;
}
if (!feature(FEATURE_SOFTSERIAL)) {
if (telemetryConfig->telemetry_port == TELEMETRY_PORT_SOFTSERIAL_1 || telemetryConfig->telemetry_port == TELEMETRY_PORT_SOFTSERIAL_2) {
// softserial feature must be enabled to use telemetry on softserial ports
return false;
}
}
if (isTelemetryProviderHoTT()) {
if (telemetryConfig->telemetry_port == TELEMETRY_PORT_UART) {
// HoTT requires a serial port that supports RX/TX mode swapping
return false;
}
}
return true;
}
void initTelemetry(serialPorts_t *serialPorts)
{
// Force telemetry to uart when softserial disabled
if (canSoftwareSerialBeUsed())
telemetryConfig->telemetry_port = TELEMETRY_PORT_UART;
#ifdef FY90Q
// FY90Q does not support softserial
telemetryConfig->telemetry_port = TELEMETRY_PORT_UART;
serialPorts->telemport = serialPorts->mainport;
#endif
isTelemetryConfigurationValid = canUseTelemetryWithCurrentConfiguration();
#ifndef FY90Q
if (telemetryConfig->telemetry_port == TELEMETRY_PORT_SOFTSERIAL_1)
serialPorts->telemport = &(softSerialPorts[0].port);
else if (telemetryConfig->telemetry_port == TELEMETRY_PORT_SOFTSERIAL_2)
serialPorts->telemport = &(softSerialPorts[1].port);
else
serialPorts->telemport = serialPorts->mainport;
#endif
checkTelemetryState();
}
static bool telemetryEnabled = false;
bool determineNewTelemetryEnabledState(void)
{
bool enabled = true;
if (telemetryConfig->telemetry_port == TELEMETRY_PORT_UART) {
if (!telemetryConfig->telemetry_switch)
enabled = f.ARMED;
else
enabled = rcOptions[BOXTELEMETRY];
}
return enabled;
}
bool shouldChangeTelemetryStateNow(bool newState)
{
return newState != telemetryEnabled;
}
static void configureTelemetryPort(void)
{
if (isTelemetryProviderFrSky()) {
configureFrSkyTelemetryPort();
}
if (isTelemetryProviderHoTT()) {
configureHoTTTelemetryPort();
}
}
void freeTelemetryPort(void)
{
if (isTelemetryProviderFrSky()) {
freeFrSkyTelemetryPort();
}
if (isTelemetryProviderHoTT()) {
freeHoTTTelemetryPort();
}
}
void checkTelemetryState(void)
{
if (!isTelemetryConfigurationValid) {
return;
}
bool newEnabledState = determineNewTelemetryEnabledState();
if (!shouldChangeTelemetryStateNow(newEnabledState)) {
return;
}
if (newEnabledState)
configureTelemetryPort();
else
freeTelemetryPort();
telemetryEnabled = newEnabledState;
}
void handleTelemetry(void)
{
if (!isTelemetryConfigurationValid || !determineNewTelemetryEnabledState())
return;
if (isTelemetryProviderFrSky()) {
handleFrSkyTelemetry();
}
if (isTelemetryProviderHoTT()) {
handleHoTTTelemetry();
}
}