From 803b472c8517d0c6fd5a404c06665320cba7841b Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 19 Nov 2021 15:34:39 +0100 Subject: [PATCH] Move all serial internal module functions into proper drivers --- radio/src/hal/module_driver.h | 2 +- radio/src/io/frsky_firmware_update.cpp | 9 +- radio/src/pulses/crossfire.cpp | 17 ++- radio/src/pulses/crossfire.h | 2 +- radio/src/pulses/pulses.cpp | 49 +++--- radio/src/pulses/pxx2.cpp | 142 ++++++++++++++++-- radio/src/pulses/pxx2.h | 16 +- .../common/arm/stm32/heartbeat_driver.h | 27 ++++ .../arm/stm32/rotary_encoder_driver.cpp | 1 + radio/src/targets/horus/board.h | 3 - radio/src/targets/horus/extmodule_driver.cpp | 2 +- radio/src/targets/taranis/board.h | 10 -- .../src/targets/taranis/extmodule_driver.cpp | 9 +- radio/src/telemetry/frsky_pxx2.cpp | 7 +- radio/src/trainer.cpp | 1 + 15 files changed, 216 insertions(+), 81 deletions(-) create mode 100644 radio/src/targets/common/arm/stm32/heartbeat_driver.h diff --git a/radio/src/hal/module_driver.h b/radio/src/hal/module_driver.h index 22311af9d..b9f846740 100644 --- a/radio/src/hal/module_driver.h +++ b/radio/src/hal/module_driver.h @@ -42,7 +42,7 @@ enum ChannelsProtocols { PROTOCOL_CHANNELS_GHOST }; -struct etx_hal_module_driver_t { +struct etx_module_driver_t { // Protocol implemented by this module driver ChannelsProtocols protocol; diff --git a/radio/src/io/frsky_firmware_update.cpp b/radio/src/io/frsky_firmware_update.cpp index 605894b4b..8ff142cb5 100644 --- a/radio/src/io/frsky_firmware_update.cpp +++ b/radio/src/io/frsky_firmware_update.cpp @@ -251,11 +251,14 @@ void FrskyDeviceFirmwareUpdate::sendFrame() switch (module) { #if defined(INTERNAL_MODULE_PXX2) case INTERNAL_MODULE: - return intmoduleSendBuffer(outputTelemetryBuffer.data, ptr - outputTelemetryBuffer.data); + IntmoduleSerialDriver.sendBuffer(outputTelemetryBuffer.data, + ptr - outputTelemetryBuffer.data); + return; #endif default: - return sportSendBuffer(outputTelemetryBuffer.data, ptr - outputTelemetryBuffer.data); + sportSendBuffer(outputTelemetryBuffer.data, ptr - outputTelemetryBuffer.data); + return; } } @@ -306,6 +309,7 @@ const char * FrskyDeviceFirmwareUpdate::sendReqVersion() // X9D / X9D+ / X9E / XLite IXJT = use S.PORT @ 57600 bauds // XLite PRO / X9Lite / X9D+ 2019 ISRM = use TX + RX @ 57600 bauds +#if defined(INTMODULE_USART) static const etx_serial_init serialInitParams = { .baudrate = 0, .parity = ETX_Parity_None, @@ -315,6 +319,7 @@ static const etx_serial_init serialInitParams = { .on_receive = intmoduleFifoReceive, .on_error = intmoduleFifoError, }; +#endif const char * FrskyDeviceFirmwareUpdate::doFlashFirmware(const char * filename, ProgressHandler progressHandler) { diff --git a/radio/src/pulses/crossfire.cpp b/radio/src/pulses/crossfire.cpp index 438083b16..bbcec7e1e 100644 --- a/radio/src/pulses/crossfire.cpp +++ b/radio/src/pulses/crossfire.cpp @@ -127,7 +127,6 @@ static void intmoduleCRSF_rx(uint8_t data) } #endif } -#endif static const etx_serial_init intmoduleCrossfireInitParams = { .baudrate = 0, @@ -138,6 +137,7 @@ static const etx_serial_init intmoduleCrossfireInitParams = { .on_receive = intmoduleCRSF_rx, .on_error = nullptr, }; +#endif static void* crossfireInit(uint8_t module) { @@ -156,16 +156,17 @@ static void* crossfireInit(uint8_t module) } else { // TODO: setup S.PORT // - for now, the init is still done via telemetryWakeup().... + telemetryInit(PROTOCOL_TELEMETRY_CROSSFIRE); } // mixer setup - mixerSchedulerSetPeriod(INTERNAL_MODULE, CROSSFIRE_PERIOD); - return (void*)(uint32_t)module; + mixerSchedulerSetPeriod(module, CROSSFIRE_PERIOD); + return (void*)(ulong)module; } static void crossfireDeInit(void* context) { - uint32_t module = (uint32_t)context; + ulong module = (ulong)context; if (module == INTERNAL_MODULE) { #if defined(INTERNAL_MODULE_CRSF) @@ -180,7 +181,7 @@ static void crossfireDeInit(void* context) static void crossfireSetupPulses(void* context, int16_t* channels, uint8_t nChannels) { - uint32_t module = (uint32_t)context; + ulong module = (ulong)context; ModuleSyncStatus& status = getModuleSyncStatus(module); if (status.isValid()) { @@ -194,11 +195,13 @@ static void crossfireSetupPulses(void* context, int16_t* channels, uint8_t nChan static void crossfireSendPulses(void* context) { - uint32_t module = (uint32_t)context; + ulong module = (ulong)context; if (module == INTERNAL_MODULE) { +#if defined(INTERNAL_MODULE_CRSF) IntmoduleSerialDriver.sendBuffer(intmodulePulsesData.crossfire.pulses, intmodulePulsesData.crossfire.length); +#endif } else { sportSendBuffer(extmodulePulsesData.crossfire.pulses, extmodulePulsesData.crossfire.length); @@ -207,7 +210,7 @@ static void crossfireSendPulses(void* context) #include "hal/module_driver.h" -etx_hal_module_driver_t CrossfireModuleDriver = { +etx_module_driver_t CrossfireModuleDriver = { .protocol = PROTOCOL_CHANNELS_CROSSFIRE, .init = crossfireInit, .deinit = crossfireDeInit, diff --git a/radio/src/pulses/crossfire.h b/radio/src/pulses/crossfire.h index c3d978c37..08d5b16f1 100644 --- a/radio/src/pulses/crossfire.h +++ b/radio/src/pulses/crossfire.h @@ -23,4 +23,4 @@ #include "hal/module_driver.h" -extern etx_hal_module_driver_t CrossfireModuleDriver; +extern etx_module_driver_t CrossfireModuleDriver; diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 034cd6ac6..ada5476fb 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -21,6 +21,7 @@ #include "opentx.h" #include "mixer_scheduler.h" +#include "heartbeat_driver.h" #include "io/frsky_pxx2.h" #include "io/multi_protolist.h" @@ -322,13 +323,11 @@ void enablePulsesExternalModule(uint8_t protocol) #if defined(PXX2) && defined(EXTMODULE_USART) case PROTOCOL_CHANNELS_PXX2_HIGHSPEED: - extmoduleInvertedSerialStart(PXX2_HIGHSPEED_BAUDRATE); - mixerSchedulerSetPeriod(EXTERNAL_MODULE, PXX2_NO_HEARTBEAT_PERIOD); + Pxx2ModuleDriver.init(EXTERNAL_MODULE); break; case PROTOCOL_CHANNELS_PXX2_LOWSPEED: - extmoduleInvertedSerialStart(PXX2_LOWSPEED_BAUDRATE); - mixerSchedulerSetPeriod(EXTERNAL_MODULE, PXX2_NO_HEARTBEAT_PERIOD); + Pxx2LowSpeedModuleDriver.init(EXTERNAL_MODULE); break; #endif @@ -375,6 +374,10 @@ void enablePulsesExternalModule(uint8_t protocol) bool setupPulsesExternalModule(uint8_t protocol) { + int16_t* channels = + &channelOutputs[g_model.moduleData[EXTERNAL_MODULE].channelsStart]; + uint8_t nChannels = 16; // TODO: MAX_CHANNELS - channelsStart + switch (protocol) { #if defined(PXX1) @@ -392,7 +395,7 @@ bool setupPulsesExternalModule(uint8_t protocol) #if defined(PXX2) case PROTOCOL_CHANNELS_PXX2_HIGHSPEED: case PROTOCOL_CHANNELS_PXX2_LOWSPEED: - extmodulePulsesData.pxx2.setupFrame(EXTERNAL_MODULE); + Pxx2ModuleDriver.setupPulses((void*)EXTERNAL_MODULE, channels, nChannels); return true; #endif @@ -415,9 +418,6 @@ bool setupPulsesExternalModule(uint8_t protocol) #if defined(CROSSFIRE) case PROTOCOL_CHANNELS_CROSSFIRE: if (CrossfireModuleDriver.setupPulses) { - int16_t* channels = - &channelOutputs[g_model.moduleData[EXTERNAL_MODULE].channelsStart]; - uint8_t nChannels = 16; // TODO: MAX_CHANNELS - channelsStart CrossfireModuleDriver.setupPulses((void*)EXTERNAL_MODULE, channels, nChannels); } @@ -496,17 +496,9 @@ static void enablePulsesInternalModule(uint8_t protocol) #endif #if defined(PXX2) - case PROTOCOL_CHANNELS_PXX2_HIGHSPEED: { - intmoduleFifo.clear(); - IntmoduleSerialDriver.init(&pxx2SerialInitParams) - resetAccessAuthenticationCount(); - -#if defined(INTMODULE_HEARTBEAT) - // use backup trigger (1 ms later) - init_intmodule_heartbeat(); -#endif - mixerSchedulerSetPeriod(INTERNAL_MODULE, PXX2_PERIOD); - } break; + case PROTOCOL_CHANNELS_PXX2_HIGHSPEED: + Pxx2ModuleDriver.init(INTERNAL_MODULE); + break; #endif #if defined(INTERNAL_MODULE_MULTI) @@ -568,6 +560,10 @@ static void enablePulsesInternalModule(uint8_t protocol) bool setupPulsesInternalModule(uint8_t protocol) { + int16_t* channels = + &channelOutputs[g_model.moduleData[INTERNAL_MODULE].channelsStart]; + uint8_t nChannels = 16; // TODO: MAX_CHANNELS - channelsStart + switch (protocol) { #if defined(HARDWARE_INTERNAL_MODULE) && defined(PXX1) && !defined(INTMODULE_USART) case PROTOCOL_CHANNELS_PXX1_PULSES: @@ -583,16 +579,8 @@ bool setupPulsesInternalModule(uint8_t protocol) #if defined(PXX2) case PROTOCOL_CHANNELS_PXX2_HIGHSPEED: - { - bool result = intmodulePulsesData.pxx2.setupFrame(INTERNAL_MODULE); - if (moduleState[INTERNAL_MODULE].mode == MODULE_MODE_SPECTRUM_ANALYSER || moduleState[INTERNAL_MODULE].mode == MODULE_MODE_POWER_METER) { - mixerSchedulerSetPeriod(INTERNAL_MODULE, PXX2_TOOLS_PERIOD); - } - else { - mixerSchedulerSetPeriod(INTERNAL_MODULE, PXX2_PERIOD); - } - return result; - } + Pxx2ModuleDriver.setupPulses((void*)INTERNAL_MODULE, channels, nChannels); + return true; #endif #if defined(PCBTARANIS) && defined(INTERNAL_MODULE_PPM) @@ -652,8 +640,7 @@ void intmoduleSendNextFrame() switch (moduleState[INTERNAL_MODULE].protocol) { #if defined(PXX2) case PROTOCOL_CHANNELS_PXX2_HIGHSPEED: - intmoduleSendBuffer(intmodulePulsesData.pxx2.getData(), - intmodulePulsesData.pxx2.getSize()); + Pxx2ModuleDriver.sendPulses((void*)INTERNAL_MODULE); break; #endif diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index d425418a1..75aa32694 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -24,6 +24,8 @@ #include "pulses/pxx2.h" #include "io/frsky_firmware_update.h" #include "libopenui/src/libopenui_file.h" +#include "mixer_scheduler.h" +#include "heartbeat_driver.h" #if defined(INTMODULE_USART) #include "intmodule_serial_driver.h" @@ -124,7 +126,7 @@ void Pxx2Pulses::addPulsesValues(uint16_t low, uint16_t high) Pxx2Transport::addByte(high >> 4u); // High byte of channel } -void Pxx2Pulses::addChannels(uint8_t module) +void Pxx2Pulses::addChannels(uint8_t module, int16_t* channels, uint8_t nChannels) { uint16_t pulseValue = 0; uint16_t pulseValueLow = 0; @@ -133,7 +135,7 @@ void Pxx2Pulses::addChannels(uint8_t module) uint8_t count = sentModuleChannels(module); for (int8_t i = 0; i < count; i++, channel++) { - int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; + int value = channels[i] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; pulseValue = limit(1, (value * 512 / 682) + 1024, 2046); #if defined(DEBUG_LATENCY_RF_ONLY) if (latencyToggleSwitch) @@ -183,7 +185,7 @@ void Pxx2Pulses::addFailsafe(uint8_t module) } } -void Pxx2Pulses::setupChannelsFrame(uint8_t module) +void Pxx2Pulses::setupChannelsFrame(uint8_t module, int16_t* channels, uint8_t nChannels) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_CHANNELS); @@ -197,7 +199,7 @@ void Pxx2Pulses::setupChannelsFrame(uint8_t module) if (flag0 & PXX2_CHANNELS_FLAG0_FAILSAFE) addFailsafe(module); else - addChannels(module); + addChannels(module, channels, nChannels); } void Pxx2Pulses::setupTelemetryFrame(uint8_t module) @@ -209,7 +211,7 @@ void Pxx2Pulses::setupTelemetryFrame(uint8_t module) } } -void Pxx2Pulses::setupHardwareInfoFrame(uint8_t module) +void Pxx2Pulses::setupHardwareInfoFrame(uint8_t module, int16_t* channels, uint8_t nChannels) { ModuleInformation * destination = moduleState[module].moduleInformation; @@ -222,12 +224,12 @@ void Pxx2Pulses::setupHardwareInfoFrame(uint8_t module) } else { moduleState[module].mode = MODULE_MODE_NORMAL; - setupChannelsFrame(module); + setupChannelsFrame(module, channels, nChannels); } } else { destination->timeout--; - setupChannelsFrame(module); + setupChannelsFrame(module, channels, nChannels); } } @@ -250,7 +252,7 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) } } -void Pxx2Pulses::setupModuleSettingsFrame(uint8_t module) +void Pxx2Pulses::setupModuleSettingsFrame(uint8_t module, int16_t* channels, uint8_t nChannels) { ModuleSettings * destination = moduleState[module].moduleSettings; @@ -270,11 +272,11 @@ void Pxx2Pulses::setupModuleSettingsFrame(uint8_t module) destination->timeout = get_tmr10ms() + 200/*next try in 2s*/; } else { - setupChannelsFrame(module); + setupChannelsFrame(module, channels, nChannels); } } -void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) +void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module, int16_t* channels, uint8_t nChannels) { if (get_tmr10ms() > reusableBuffer.hardwareAndSettings.receiverSettings.timeout) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); @@ -305,7 +307,7 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) reusableBuffer.hardwareAndSettings.receiverSettings.timeout = get_tmr10ms() + 200/*next try in 2s*/; } else { - setupChannelsFrame(module); + setupChannelsFrame(module, channels, nChannels); } } @@ -456,7 +458,7 @@ void Pxx2Pulses::setupAuthenticationFrame(uint8_t module, uint8_t mode, const ui endFrame(); } -bool Pxx2Pulses::setupFrame(uint8_t module) +bool Pxx2Pulses::setupFrame(uint8_t module, int16_t* channels, uint8_t nChannels) { if (moduleState[module].mode == MODULE_MODE_OTA_UPDATE) return false; @@ -470,13 +472,13 @@ bool Pxx2Pulses::setupFrame(uint8_t module) switch (moduleState[module].mode) { case MODULE_MODE_GET_HARDWARE_INFO: - setupHardwareInfoFrame(module); + setupHardwareInfoFrame(module, channels, nChannels); break; case MODULE_MODE_MODULE_SETTINGS: - setupModuleSettingsFrame(module); + setupModuleSettingsFrame(module, channels, nChannels); break; case MODULE_MODE_RECEIVER_SETTINGS: - setupReceiverSettingsFrame(module); + setupReceiverSettingsFrame(module, channels, nChannels); break; case MODULE_MODE_REGISTER: setupRegisterFrame(module); @@ -509,7 +511,7 @@ bool Pxx2Pulses::setupFrame(uint8_t module) outputTelemetryBuffer.reset(); } else { - setupChannelsFrame(module); + setupChannelsFrame(module, channels, nChannels); } break; } @@ -644,3 +646,111 @@ void Pxx2OtaUpdate::flashFirmware(const char * filename, ProgressHandler progres resumePulses(); } + +static void* pxx2Init(uint8_t module) +{ + if (module == INTERNAL_MODULE) { + intmoduleFifo.clear(); + IntmoduleSerialDriver.init(&pxx2SerialInitParams); + resetAccessAuthenticationCount(); + +#if defined(INTMODULE_HEARTBEAT) + // use backup trigger (1 ms later) + init_intmodule_heartbeat(); +#endif + mixerSchedulerSetPeriod(INTERNAL_MODULE, PXX2_PERIOD); + } else { +#if defined(EXTMODULE_USART) + extmoduleInvertedSerialStart(PXX2_HIGHSPEED_BAUDRATE); + mixerSchedulerSetPeriod(EXTERNAL_MODULE, PXX2_NO_HEARTBEAT_PERIOD); +#else + return nullptr; +#endif + } + + return (void*)(uint32_t)module; +} + +static void pxx2DeInit(void* context) +{ + uint32_t module = (uint32_t)context; + + if (module == INTERNAL_MODULE) { + IntmoduleSerialDriver.deinit(); +#if defined(INTMODULE_HEARTBEAT) + stop_intmodule_heartbeat(); +#endif + mixerSchedulerSetPeriod(INTERNAL_MODULE, 0); + } else { + mixerSchedulerSetPeriod(EXTERNAL_MODULE, 0); + extmoduleStop(); + } +} + +static void* pxx2InitLowSpeed(uint8_t module) +{ + if (module == EXTERNAL_MODULE) { + extmoduleInvertedSerialStart(PXX2_LOWSPEED_BAUDRATE); + mixerSchedulerSetPeriod(EXTERNAL_MODULE, PXX2_NO_HEARTBEAT_PERIOD); + return (void*)EXTERNAL_MODULE; + } + + return nullptr; +} + +static bool pxx2InternalSendNextFrame = true; + +static void pxx2SetupPulses(void* context, int16_t* channels, uint8_t nChannels) +{ + uint32_t module = (uint32_t)context; + + if (module == INTERNAL_MODULE) { + + pxx2InternalSendNextFrame = intmodulePulsesData.pxx2.setupFrame( + INTERNAL_MODULE, channels, nChannels); + + if (moduleState[INTERNAL_MODULE].mode == MODULE_MODE_SPECTRUM_ANALYSER || + moduleState[INTERNAL_MODULE].mode == MODULE_MODE_POWER_METER) { + mixerSchedulerSetPeriod(INTERNAL_MODULE, PXX2_TOOLS_PERIOD); + } else { + mixerSchedulerSetPeriod(INTERNAL_MODULE, PXX2_PERIOD); + } + } else { + extmodulePulsesData.pxx2.setupFrame(EXTERNAL_MODULE, channels, nChannels); + } +} + +static void pxx2SendPulses(void* context) +{ + uint32_t module = (uint32_t)context; + + if (module == INTERNAL_MODULE) { + if (pxx2InternalSendNextFrame) { + IntmoduleSerialDriver.sendBuffer(intmodulePulsesData.pxx2.getData(), + intmodulePulsesData.pxx2.getSize()); + } + } else { +#if defined(EXTMODULE_USART) + extmoduleSendBuffer(extmodulePulsesData.pxx2.getData(), + extmodulePulsesData.pxx2.getSize()); +#endif + } +} + +#include "hal/module_driver.h" + +const etx_module_driver_t Pxx2ModuleDriver = { + .protocol = PROTOCOL_CHANNELS_PXX2_HIGHSPEED, + .init = pxx2Init, + .deinit = pxx2DeInit, + .setupPulses = pxx2SetupPulses, + .sendPulses = pxx2SendPulses, +}; + +const etx_module_driver_t Pxx2LowSpeedModuleDriver = { + .protocol = PROTOCOL_CHANNELS_PXX2_LOWSPEED, + .init = pxx2InitLowSpeed, + .deinit = pxx2DeInit, + .setupPulses = pxx2SetupPulses, + .sendPulses = pxx2SendPulses, +}; diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 3002edeb9..65b30ff76 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -26,7 +26,9 @@ #include "io/frsky_pxx2.h" #include "popups.h" #include "./pxx.h" + #include "hal/serial_driver.h" +#include "hal/module_driver.h" #define PXX2_TYPE_C_MODULE 0x01 #define PXX2_TYPE_ID_REGISTER 0x01 @@ -466,11 +468,11 @@ class Pxx2Pulses: public Pxx2Transport { friend class Pxx2OtaUpdate; public: - bool setupFrame(uint8_t module); + bool setupFrame(uint8_t module, int16_t* channels, uint8_t nChannels); void setupAuthenticationFrame(uint8_t module, uint8_t mode, const uint8_t * outputMessage); protected: - void setupHardwareInfoFrame(uint8_t module); + void setupHardwareInfoFrame(uint8_t module, int16_t* channels, uint8_t nChannels); void setupRegisterFrame(uint8_t module); @@ -482,11 +484,11 @@ class Pxx2Pulses: public Pxx2Transport { void setupShareMode(uint8_t module); - void setupModuleSettingsFrame(uint8_t module); + void setupModuleSettingsFrame(uint8_t module, int16_t* channels, uint8_t nChannels); - void setupReceiverSettingsFrame(uint8_t module); + void setupReceiverSettingsFrame(uint8_t module, int16_t* channels, uint8_t nChannels); - void setupChannelsFrame(uint8_t module); + void setupChannelsFrame(uint8_t module, int16_t* channels, uint8_t nChannels); void setupTelemetryFrame(uint8_t module); @@ -518,7 +520,7 @@ class Pxx2Pulses: public Pxx2Transport { void addPulsesValues(uint16_t low, uint16_t high); - void addChannels(uint8_t module); + void addChannels(uint8_t module, int16_t* channels, uint8_t nChannels); void addFailsafe(uint8_t module); @@ -577,5 +579,7 @@ class Pxx2OtaUpdate { }; extern const etx_serial_init pxx2SerialInitParams; +extern const etx_module_driver_t Pxx2ModuleDriver; +extern const etx_module_driver_t Pxx2LowSpeedModuleDriver; #endif diff --git a/radio/src/targets/common/arm/stm32/heartbeat_driver.h b/radio/src/targets/common/arm/stm32/heartbeat_driver.h new file mode 100644 index 000000000..aad432d73 --- /dev/null +++ b/radio/src/targets/common/arm/stm32/heartbeat_driver.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#pragma once + +void init_intmodule_heartbeat(); +void check_intmodule_heartbeat(); +void stop_intmodule_heartbeat(); + diff --git a/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp b/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp index df8f19a72..7fbb2b451 100644 --- a/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp +++ b/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp @@ -20,6 +20,7 @@ */ #include "opentx.h" +#include "heartbeat_driver.h" uint8_t rotencPosition; diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index c6af84ed1..a9f40e99e 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -194,9 +194,6 @@ void SDRAM_Init(); #define IS_PXX1_INTERNAL_ENABLED() (true) #endif -void init_intmodule_heartbeat(); -void check_intmodule_heartbeat(); - void extmoduleSerialStart(); void extmoduleInvertedSerialStart(uint32_t baudrate); void extmoduleSendBuffer(const uint8_t * data, uint8_t size); diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index 24529e826..38581f661 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -345,7 +345,7 @@ void extmoduleSendNextFrame() #if defined(PXX2) && defined(EXTMODULE_USART) case PROTOCOL_CHANNELS_PXX2_HIGHSPEED: case PROTOCOL_CHANNELS_PXX2_LOWSPEED: - extmoduleSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); + Pxx2ModuleDriver.sendPulses((void*)EXTERNAL_MODULE); break; #endif diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 3c87ec172..17c8f8def 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -192,16 +192,6 @@ void extmoduleSendInvertedByte(uint8_t byte); #define stop_trainer_module_sbus() #endif -#if defined(INTMODULE_HEARTBEAT_GPIO) -void init_intmodule_heartbeat(); -void stop_intmodule_heartbeat(); -void check_intmodule_heartbeat(); -#else -#define init_intmodule_heartbeat() -#define stop_intmodule_heartbeat() -#define check_intmodule_heartbeat() -#endif - void check_telemetry_exti(); // SBUS diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index a9522fd80..9a1d63841 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -21,6 +21,10 @@ #include "opentx.h" +#if defined(CROSSFIRE) +#include "pulses/crossfire.h" +#endif + void extmoduleStop() { NVIC_DisableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); @@ -286,7 +290,7 @@ void extmoduleSendNextFrame() #if defined(PXX2) case PROTOCOL_CHANNELS_PXX2_HIGHSPEED: case PROTOCOL_CHANNELS_PXX2_LOWSPEED: - extmoduleSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); + Pxx2ModuleDriver.sendPulses((void*)EXTERNAL_MODULE); break; #endif #endif @@ -295,7 +299,8 @@ void extmoduleSendNextFrame() case PROTOCOL_CHANNELS_AFHDS3: { #if defined(EXTMODULE_USART) && defined(EXTMODULE_TX_INVERT_GPIO) - extmoduleSendBuffer(extmodulePulsesData.afhds3.getData(), extmodulePulsesData.afhds3.getSize()); + extmoduleSendBuffer(extmodulePulsesData.afhds3.getData(), + extmodulePulsesData.afhds3.getSize()); #else if (EXTMODULE_TIMER_DMA_STREAM->CR & DMA_SxCR_EN) return; diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 53e00fabb..0fdbb235f 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -25,6 +25,10 @@ #include "libopenui.h" #endif +#if defined(INTMODULE_USART) +#include "intmodule_serial_driver.h" +#endif + void processGetHardwareInfoFrame(uint8_t module, const uint8_t * frame) { if (moduleState[module].mode != MODULE_MODE_GET_HARDWARE_INFO) { @@ -247,7 +251,8 @@ void processAuthenticationFrame(uint8_t module, const uint8_t * frame) Pxx2Pulses &pxx2 = intmodulePulsesData.pxx2; pxx2.setupAuthenticationFrame(module, cryptoType, (const uint8_t *)messageDigest); - intmoduleSendBuffer(pxx2.getData(), pxx2.getSize()); + + IntmoduleSerialDriver.sendBuffer(pxx2.getData(), pxx2.getSize()); // we remain in AUTHENTICATION mode to avoid a CHANNELS frame is sent at the // end of the mixing process authenticateFrames++; diff --git a/radio/src/trainer.cpp b/radio/src/trainer.cpp index fd8d88504..8b88a57df 100644 --- a/radio/src/trainer.cpp +++ b/radio/src/trainer.cpp @@ -20,6 +20,7 @@ */ #include "opentx.h" +#include "heartbeat_driver.h" int16_t ppmInput[MAX_TRAINER_CHANNELS]; uint8_t ppmInputValidityTimer;