feat(ACCESS): Configure AUX serial port as "External module" (#2562)
* Enable RX DMA on external module USART * feat(ACCESS): configure AUX serial port as "External module" (#2562) This allows configuring the external access mod on runtime rather than by compilation option. * fix: fetch external module driver
This commit is contained in:
@@ -864,7 +864,9 @@ void applyModelConfig(uint8_t module)
|
||||
static void* initExternal(uint8_t module)
|
||||
{
|
||||
#if defined(AFHDS3_EXT_UART)
|
||||
const etx_serial_driver_t* drv = &ExtmoduleSerialDriver;
|
||||
auto drv = extmoduleGetSerialPort();
|
||||
if (!drv) return nullptr;
|
||||
|
||||
uint16_t period = AFHDS3_UART_COMMAND_TIMEOUT * 1000 /* us */;
|
||||
#else
|
||||
const etx_serial_driver_t* drv = nullptr;
|
||||
|
||||
@@ -207,9 +207,11 @@ uint8_t getModuleType(uint8_t module)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HARDWARE_EXTERNAL_MODULE)
|
||||
if (module == EXTERNAL_MODULE && isExternalModuleAvailable(type)) {
|
||||
return type;
|
||||
}
|
||||
#endif
|
||||
|
||||
return MODULE_TYPE_NONE;
|
||||
}
|
||||
@@ -579,7 +581,7 @@ void enablePulsesExternalModule(uint8_t protocol)
|
||||
break;
|
||||
#endif
|
||||
|
||||
#if defined(PXX2) && defined(EXTMODULE_USART)
|
||||
#if defined(PXX2)
|
||||
case PROTOCOL_CHANNELS_PXX2_HIGHSPEED:
|
||||
externalModuleContext = Pxx2ExternalDriver.init(EXTERNAL_MODULE);
|
||||
externalModuleDriver = &Pxx2ExternalDriver;
|
||||
|
||||
@@ -295,7 +295,10 @@ static const etx_serial_init pxx1ExtSerialInit = {
|
||||
|
||||
static void* pxx1InitExternal(uint8_t module)
|
||||
{
|
||||
void* uart_ctx = ExtmoduleSerialDriver.init(&pxx1ExtSerialInit);
|
||||
auto drv = extmoduleGetSerialPort();
|
||||
if (!drv) return nullptr;
|
||||
|
||||
void* uart_ctx = drv->init(&pxx1ExtSerialInit);
|
||||
|
||||
mixerSchedulerSetPeriod(EXTERNAL_MODULE, EXTMODULE_PXX1_SERIAL_PERIOD);
|
||||
EXTERNAL_MODULE_ON();
|
||||
@@ -307,7 +310,9 @@ static void pxx1DeInitExternal(void* context)
|
||||
{
|
||||
EXTERNAL_MODULE_OFF();
|
||||
mixerSchedulerSetPeriod(EXTERNAL_MODULE, 0);
|
||||
ExtmoduleSerialDriver.deinit(context);
|
||||
|
||||
auto drv = extmoduleGetSerialPort();
|
||||
if (drv) drv->deinit(context);
|
||||
}
|
||||
|
||||
static void pxx1SetupPulsesExternal(void* context, int16_t* channels, uint8_t nChannels)
|
||||
@@ -323,8 +328,11 @@ static void pxx1SetupPulsesExternal(void* context, int16_t* channels, uint8_t nC
|
||||
|
||||
static void pxx1SendPulsesExternal(void* context)
|
||||
{
|
||||
ExtmoduleSerialDriver.sendBuffer(context, extmodulePulsesData.pxx_uart.getData(),
|
||||
extmodulePulsesData.pxx_uart.getSize());
|
||||
auto drv = extmoduleGetSerialPort();
|
||||
if (!drv) return;
|
||||
|
||||
drv->sendBuffer(context, extmodulePulsesData.pxx_uart.getData(),
|
||||
extmodulePulsesData.pxx_uart.getSize());
|
||||
}
|
||||
|
||||
const etx_module_driver_t Pxx1ExternalSerialDriver = {
|
||||
|
||||
@@ -812,6 +812,7 @@ static void pxx2ProcessData(void* context, uint8_t data, uint8_t* buffer, uint8_
|
||||
|
||||
|
||||
#include "hal/module_driver.h"
|
||||
#include "extmodule_serial_driver.h"
|
||||
|
||||
const etx_module_driver_t Pxx2InternalDriver = {
|
||||
.protocol = PROTOCOL_CHANNELS_PXX2_HIGHSPEED,
|
||||
@@ -823,9 +824,6 @@ const etx_module_driver_t Pxx2InternalDriver = {
|
||||
.processData = pxx2ProcessData,
|
||||
};
|
||||
|
||||
#if defined(EXTMODULE_USART)
|
||||
#include "extmodule_serial_driver.h"
|
||||
|
||||
static void* pxx2InitExternal(uint8_t module, uint32_t baudrate)
|
||||
{
|
||||
etx_serial_init params(pxx2SerialInitParams);
|
||||
@@ -837,9 +835,10 @@ static void* pxx2InitExternal(uint8_t module, uint32_t baudrate)
|
||||
telemetryProtocol = PROTOCOL_TELEMETRY_FRSKY_SPORT;
|
||||
|
||||
auto state = &pxx2State[module];
|
||||
state->init(module, &extmodulePulsesData.pxx2, &ExtmoduleSerialDriver,
|
||||
ExtmoduleSerialDriver.init(¶ms));
|
||||
|
||||
auto drv = extmoduleGetSerialPort();
|
||||
if (!drv) return nullptr;
|
||||
|
||||
state->init(module, &extmodulePulsesData.pxx2, drv, drv->init(¶ms));
|
||||
return state;
|
||||
}
|
||||
|
||||
@@ -855,9 +854,11 @@ static void* pxx2InitExtHighSpeed(uint8_t module)
|
||||
|
||||
static void pxx2DeInitExternal(void* context)
|
||||
{
|
||||
auto state = (PXX2State*)context;
|
||||
if (state) state->deinit();
|
||||
|
||||
EXTERNAL_MODULE_OFF();
|
||||
mixerSchedulerSetPeriod(EXTERNAL_MODULE, 0);
|
||||
ExtmoduleSerialDriver.deinit(context);
|
||||
telemetryProtocol = 0xFF;
|
||||
}
|
||||
|
||||
@@ -897,4 +898,3 @@ const etx_module_driver_t Pxx2LowSpeedExternalDriver = {
|
||||
.getByte = pxx2GetByte,
|
||||
.processData = pxx2ProcessData,
|
||||
};
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user