1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-24 00:35:18 +03:00

RAM saving

This commit is contained in:
Bertrand Songis 2019-02-09 11:33:38 +01:00
parent c12eb34691
commit 62c7a1978e
23 changed files with 306 additions and 204 deletions

View file

@ -289,24 +289,6 @@ enum SwashType {
#define TIMER_COUNTDOWN_START(x) 10
#endif
enum ChannelsProtocols {
PROTOCOL_CHANNELS_UNINITIALIZED,
PROTOCOL_CHANNELS_NONE,
PROTOCOL_CHANNELS_PPM,
#if defined(PXX) || defined(DSM2)
PROTOCOL_CHANNELS_PXX,
#endif
#if defined(DSM2)
PROTOCOL_CHANNELS_DSM2_LP45,
PROTOCOL_CHANNELS_DSM2_DSM2,
PROTOCOL_CHANNELS_DSM2_DSMX,
#endif
PROTOCOL_CHANNELS_CROSSFIRE,
PROTOCOL_CHANNELS_MULTIMODULE,
PROTOCOL_CHANNELS_SBUS,
PROTOCOL_CHANNELS_PXX2
};
enum XJTRFProtocols {
RF_PROTO_OFF = -1,
RF_PROTO_X16,

View file

@ -47,21 +47,21 @@ uint8_t createCrossfireChannelsFrame(uint8_t * frame, int16_t * pulses)
return buf - frame;
}
void setupPulsesCrossfire(uint8_t module)
void setupPulsesCrossfire()
{
if (telemetryProtocol == PROTOCOL_TELEMETRY_CROSSFIRE) {
uint8_t * pulses = modulePulsesData[module].crossfire.pulses;
uint8_t * pulses = extmodulePulsesData.crossfire.pulses;
#if defined(LUA)
if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) {
memcpy(pulses, outputTelemetryBuffer, outputTelemetryBufferSize);
modulePulsesData[module].crossfire.length = outputTelemetryBufferSize;
extmodulePulsesData.crossfire.length = outputTelemetryBufferSize;
outputTelemetryBufferTrigger = 0x00;
outputTelemetryBufferSize = 0;
}
else
#endif
{
modulePulsesData[module].crossfire.length = createCrossfireChannelsFrame(pulses, &channelOutputs[g_model.moduleData[module].channelsStart]);
extmodulePulsesData.crossfire.length = createCrossfireChannelsFrame(pulses, &channelOutputs[g_model.moduleData[EXTERNAL_MODULE].channelsStart]);
}
}
}

View file

@ -38,13 +38,13 @@ uint8_t dsm2BindTimer = DSM2_BIND_TIMEOUT;
#if defined(PPM_PIN_SERIAL)
void putDsm2SerialBit(uint8_t bit)
{
modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte >>= 1;
extmodulePulsesData.dsm2.serialByte >>= 1;
if (bit & 1) {
modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte |= 0x80;
extmodulePulsesData.dsm2.serialByte |= 0x80;
}
if (++modulePulsesData[EXTERNAL_MODULE].dsm2.serialBitCount >= 8) {
*modulePulsesData[EXTERNAL_MODULE].dsm2.ptr++ = modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte;
modulePulsesData[EXTERNAL_MODULE].dsm2.serialBitCount = 0;
if (++extmodulePulsesData.dsm2.serialBitCount >= 8) {
*extmodulePulsesData.dsm2.ptr++ = extmodulePulsesData.dsm2.serialByte;
extmodulePulsesData.dsm2.serialBitCount = 0;
}
}
@ -69,14 +69,14 @@ void putDsm2Flush()
#else
void _send_1(uint8_t v)
{
if (modulePulsesData[EXTERNAL_MODULE].dsm2.index & 1)
if (extmodulePulsesData.dsm2.index & 1)
v += 2;
else
v -= 2;
*modulePulsesData[EXTERNAL_MODULE].dsm2.ptr++ = v - 1;
modulePulsesData[EXTERNAL_MODULE].dsm2.index += 1;
modulePulsesData[EXTERNAL_MODULE].dsm2.rest -= v;
*extmodulePulsesData.dsm2.ptr++ = v - 1;
extmodulePulsesData.dsm2.index += 1;
extmodulePulsesData.dsm2.rest -= v;
}
void sendByteDsm2(uint8_t b) // max 10 changes 0 10 10 10 10 1
@ -100,31 +100,31 @@ void sendByteDsm2(uint8_t b) // max 10 changes 0 10 10 10 10 1
void putDsm2Flush()
{
if (modulePulsesData[EXTERNAL_MODULE].dsm2.index & 1)
*modulePulsesData[EXTERNAL_MODULE].dsm2.ptr++ = modulePulsesData[EXTERNAL_MODULE].dsm2.rest;
if (extmodulePulsesData.dsm2.index & 1)
*extmodulePulsesData.dsm2.ptr++ = extmodulePulsesData.dsm2.rest;
else
*(modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - 1) = modulePulsesData[EXTERNAL_MODULE].dsm2.rest;
*(extmodulePulsesData.dsm2.ptr - 1) = extmodulePulsesData.dsm2.rest;
}
#endif
// This is the data stream to send, prepare after 19.5 mS
// Send after 22.5 mS
void setupPulsesDSM2(uint8_t module)
void setupPulsesDSM2()
{
uint8_t dsmDat[14];
#if defined(PPM_PIN_SERIAL)
modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte = 0 ;
modulePulsesData[EXTERNAL_MODULE].dsm2.serialBitCount = 0 ;
extmodulePulsesData.dsm2.serialByte = 0 ;
extmodulePulsesData.dsm2.serialBitCount = 0 ;
#else
modulePulsesData[EXTERNAL_MODULE].dsm2.index = 0;
modulePulsesData[EXTERNAL_MODULE].dsm2.rest = DSM2_PERIOD * 2000;
extmodulePulsesData.dsm2.index = 0;
extmodulePulsesData.dsm2.rest = DSM2_PERIOD * 2000;
#endif
modulePulsesData[EXTERNAL_MODULE].dsm2.ptr = modulePulsesData[EXTERNAL_MODULE].dsm2.pulses;
extmodulePulsesData.dsm2.ptr = extmodulePulsesData.dsm2.pulses;
switch (moduleSettings[module].protocol) {
switch (moduleSettings[EXTERNAL_MODULE].protocol) {
case PROTOCOL_CHANNELS_DSM2_LP45:
dsmDat[0] = 0x00;
break;
@ -140,29 +140,29 @@ void setupPulsesDSM2(uint8_t module)
if (dsm2BindTimer > 0) {
dsm2BindTimer--;
if (switchState(SW_DSM2_BIND)) {
moduleSettings[port].mode = MODULE_MODE_BIND;
moduleSettings[EXTERNAL_MODULE].mode = MODULE_MODE_BIND;
dsmDat[0] |= DSM2_SEND_BIND;
}
}
else if (moduleSettings[port].mode == MODULE_MODE_RANGECHECK) {
else if (moduleSettings[EXTERNAL_MODULE].mode == MODULE_MODE_RANGECHECK) {
dsmDat[0] |= DSM2_SEND_RANGECHECK;
}
else {
moduleSettings[port].mode = 0;
}
#else
if (moduleSettings[module].mode == MODULE_MODE_BIND) {
if (moduleSettings[EXTERNAL_MODULE].mode == MODULE_MODE_BIND) {
dsmDat[0] |= DSM2_SEND_BIND;
}
else if (moduleSettings[module].mode == MODULE_MODE_RANGECHECK) {
else if (moduleSettings[EXTERNAL_MODULE].mode == MODULE_MODE_RANGECHECK) {
dsmDat[0] |= DSM2_SEND_RANGECHECK;
}
#endif
dsmDat[1] = g_model.header.modelId[module]; // DSM2 Header second byte for model match
dsmDat[1] = g_model.header.modelId[EXTERNAL_MODULE]; // DSM2 Header second byte for model match
for (int i=0; i<DSM2_CHANS; i++) {
int channel = g_model.moduleData[module].channelsStart+i;
int channel = g_model.moduleData[EXTERNAL_MODULE].channelsStart+i;
int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER;
uint16_t pulse = limit(0, ((value*13)>>5)+512, 1023);
dsmDat[2+2*i] = (i<<2) | ((pulse>>8)&0x03);

View file

@ -86,31 +86,31 @@ static void sendFailsafeChannels(uint8_t port)
}
}
void setupPulsesMultimodule(uint8_t port)
void setupPulsesMultimodule()
{
static int counter = 0;
#if defined(PPM_PIN_SERIAL)
modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte = 0 ;
modulePulsesData[EXTERNAL_MODULE].dsm2.serialBitCount = 0 ;
extmodulePulsesData.dsm2.serialByte = 0 ;
extmodulePulsesData.dsm2.serialBitCount = 0 ;
#else
modulePulsesData[EXTERNAL_MODULE].dsm2.rest = multiSyncStatus.getAdjustedRefreshRate();
modulePulsesData[EXTERNAL_MODULE].dsm2.index = 0;
extmodulePulsesData.dsm2.rest = multiSyncStatus.getAdjustedRefreshRate();
extmodulePulsesData.dsm2.index = 0;
#endif
modulePulsesData[EXTERNAL_MODULE].dsm2.ptr = modulePulsesData[EXTERNAL_MODULE].dsm2.pulses;
extmodulePulsesData.dsm2.ptr = extmodulePulsesData.dsm2.pulses;
// Every 1000 cycles (=9s) send a config packet that configures the multimodule (inversion, telemetry type)
counter++;
if (counter % 1000== 500) {
sendSetupFrame();
} else if (counter % 1000 == 0 && g_model.moduleData[port].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[port].failsafeMode != FAILSAFE_RECEIVER) {
sendFrameProtocolHeader(port, true);
} else if (counter % 1000 == 0 && g_model.moduleData[EXTERNAL_MODULE].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[EXTERNAL_MODULE].failsafeMode != FAILSAFE_RECEIVER) {
sendFrameProtocolHeader(EXTERNAL_MODULE, true);
sendFailsafeChannels(port);
} else {
// Normal Frame
sendFrameProtocolHeader(port, false);
sendChannels(port);
sendFrameProtocolHeader(EXTERNAL_MODULE, false);
sendChannels(EXTERNAL_MODULE);
}
putDsm2Flush();

View file

@ -59,12 +59,21 @@ void setupPulsesPPM(PpmPulsesData<T> * ppmPulsesData, uint8_t channelsStart, int
#endif
}
void setupPulsesPPMModule(uint8_t port)
{
setupPulsesPPM<pulse_duration_t>(&modulePulsesData[port].ppm, g_model.moduleData[port].channelsStart, g_model.moduleData[port].channelsCount, g_model.moduleData[port].ppm.frameLength);
}
void setupPulsesPPMTrainer()
{
setupPulsesPPM<trainer_pulse_duration_t>(&trainerPulsesData.ppm, g_model.trainerData.channelsStart, g_model.trainerData.channelsCount, g_model.trainerData.frameLength);
}
#if defined(PCBSKY9X) || defined(TARANIS_INTERNAL_PPM)
void setupPulsesPPMInternalModule()
{
setupPulsesPPM(&intmodulePulsesData.ppm, g_model.moduleData[INTERNAL_MODULE].channelsStart, g_model.moduleData[INTERNAL_MODULE].channelsCount, g_model.moduleData[INTERNAL_MODULE].ppm.frameLength);
}
#endif
void setupPulsesPPMExternalModule()
{
setupPulsesPPM(&extmodulePulsesData.ppm, g_model.moduleData[EXTERNAL_MODULE].channelsStart, g_model.moduleData[EXTERNAL_MODULE].channelsCount, g_model.moduleData[EXTERNAL_MODULE].ppm.frameLength);
}

View file

@ -24,7 +24,8 @@
uint8_t s_pulses_paused = 0;
ModuleSettings moduleSettings[NUM_MODULES];
ModulePulsesData modulePulsesData[NUM_MODULES] __DMA;
InternalModulePulsesData intmodulePulsesData __DMA;
ExternalModulePulsesData extmodulePulsesData __DMA;
TrainerPulsesData trainerPulsesData __DMA;
uint8_t getModuleType(uint8_t module)
@ -49,7 +50,7 @@ uint8_t getRequiredProtocol(uint8_t module)
break;
case MODULE_TYPE_XJT:
protocol = PROTOCOL_CHANNELS_PXX;
protocol = PROTOCOL_CHANNELS_PXX1;
break;
case MODULE_TYPE_XJT2:
@ -112,31 +113,12 @@ uint8_t getRequiredProtocol(uint8_t module)
return protocol;
}
void setupPulsesPXX(uint8_t module)
{
#if defined(INTMODULE_USART) && defined(EXTMODULE_USART)
modulePulsesData[module].pxx_uart.setupFrame(module);
#elif !defined(INTMODULE_USART) && !defined(EXTMODULE_USART)
modulePulsesData[module].pxx.setupFrame(module);
#else
if (IS_UART_MODULE(module))
modulePulsesData[module].pxx_uart.setupFrame(module);
else
modulePulsesData[module].pxx.setupFrame(module);
#endif
}
void setupPulsesPXX2(uint8_t module)
{
modulePulsesData[module].pxx2.setupFrame(module);
}
void disablePulses(uint8_t module, uint8_t protocol)
{
// stop existing protocol hardware
switch (protocol) {
case PROTOCOL_CHANNELS_PXX:
case PROTOCOL_CHANNELS_PXX1:
disable_pxx(module);
break;
@ -176,7 +158,7 @@ void enablePulses(uint8_t module, uint8_t protocol)
// start new protocol hardware here
switch (protocol) {
case PROTOCOL_CHANNELS_PXX:
case PROTOCOL_CHANNELS_PXX1:
init_pxx(module);
break;
@ -214,53 +196,103 @@ void enablePulses(uint8_t module, uint8_t protocol)
}
}
void setupPulses(uint8_t module, uint8_t protocol)
#if defined(PXX1)
void setupPulsesPXXInternalModule()
{
#if defined(INTMODULE_USART)
intmodulePulsesData.pxx_uart.setupFrame(INTERNAL_MODULE);
#else
intmodulePulsesData.pxx.setupFrame(INTERNAL_MODULE);
#endif
}
void setupPulsesPXXExternalModule()
{
#if defined(EXTMODULE_USART)
extmodulePulsesData.pxx_uart.setupFrame(EXTERNAL_MODULE);
#elif !defined(INTMODULE_USART) && !defined(EXTMODULE_USART)
extmodulePulsesData.pxx.setupFrame(EXTERNAL_MODULE);
#endif
}
#endif
void setupPulsesInternalModule(uint8_t protocol)
{
switch (protocol) {
case PROTOCOL_CHANNELS_PXX:
setupPulsesPXX(module);
scheduleNextMixerCalculation(module, PXX_PERIOD);
#if defined(PXX1)
case PROTOCOL_CHANNELS_PXX1:
setupPulsesPXXInternalModule();
scheduleNextMixerCalculation(INTERNAL_MODULE, PXX_PERIOD);
break;
#endif
#if defined(PXX2)
case PROTOCOL_CHANNELS_PXX2:
intmodulePulsesData.pxx2.setupFrame(INTERNAL_MODULE);
scheduleNextMixerCalculation(INTERNAL_MODULE, moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_SPECTRUM_ANALYSER ? 1 : PXX2_PERIOD);
break;
#endif
#if defined(PCBSKY9X) || defined(TARANIS_INTERNAL_PPM)
case PROTOCOL_CHANNELS_PPM:
setupPulsesPPM(&extmodulePulsesData.ppm, g_model.moduleData[INTERNAL_MODULE].channelsStart, g_model.moduleData[INTERNAL_MODULE].channelsCount, g_model.moduleData[INTERNAL_MODULE].ppm.frameLength);
scheduleNextMixerCalculation(INTERNAL_MODULE, PPM_PERIOD(INTERNAL_MODULE));
break;
#endif
default:
break;
}
}
void setupPulsesExternalModule(uint8_t protocol)
{
switch (protocol) {
#if defined(PXX1)
case PROTOCOL_CHANNELS_PXX1:
setupPulsesPXXExternalModule();
scheduleNextMixerCalculation(EXTERNAL_MODULE, PXX_PERIOD);
break;
#endif
#if defined(PXX2)
case PROTOCOL_CHANNELS_PXX2:
extmodulePulsesData.pxx2.setupFrame(EXTERNAL_MODULE);
scheduleNextMixerCalculation(EXTERNAL_MODULE, PXX2_PERIOD);
break;
#endif
case PROTOCOL_CHANNELS_SBUS:
setupPulsesSbus(module);
scheduleNextMixerCalculation(module, SBUS_PERIOD);
setupPulsesSbus();
scheduleNextMixerCalculation(EXTERNAL_MODULE, SBUS_PERIOD);
break;
#if defined(DSM2)
case PROTOCOL_CHANNELS_DSM2_LP45:
case PROTOCOL_CHANNELS_DSM2_DSM2:
case PROTOCOL_CHANNELS_DSM2_DSMX:
setupPulsesDSM2(module);
scheduleNextMixerCalculation(module, DSM2_PERIOD);
setupPulsesDSM2();
scheduleNextMixerCalculation(EXTERNAL_MODULE, DSM2_PERIOD);
break;
#endif
#if defined(CROSSFIRE)
case PROTOCOL_CHANNELS_CROSSFIRE:
setupPulsesCrossfire(module);
scheduleNextMixerCalculation(module, CROSSFIRE_PERIOD);
setupPulsesCrossfire();
scheduleNextMixerCalculation(EXTERNAL_MODULE, CROSSFIRE_PERIOD);
break;
#endif
case PROTOCOL_CHANNELS_PXX2:
setupPulsesPXX2(module);
scheduleNextMixerCalculation(module, moduleSettings[module].mode == MODULE_MODE_SPECTRUM_ANALYSER ? 1 : PXX2_PERIOD);
break;
#if defined(MULTIMODULE)
case PROTOCOL_CHANNELS_MULTIMODULE:
setupPulsesMultimodule(module);
scheduleNextMixerCalculation(module, MULTIMODULE_PERIOD);
setupPulsesMultimodule();
scheduleNextMixerCalculation(EXTERNAL_MODULE, MULTIMODULE_PERIOD);
break;
#endif
case PROTOCOL_CHANNELS_PPM:
#if defined(PCBSKY9X)
case PROTOCOL_CHANNELS_NONE:
#endif
setupPulsesPPMModule(module);
scheduleNextMixerCalculation(module, PPM_PERIOD(module));
setupPulsesPPMExternalModule();
scheduleNextMixerCalculation(EXTERNAL_MODULE, PPM_PERIOD(EXTERNAL_MODULE));
break;
default:
@ -268,6 +300,19 @@ void setupPulses(uint8_t module, uint8_t protocol)
}
}
void setupPulses(uint8_t module, uint8_t protocol)
{
switch (module) {
case INTERNAL_MODULE:
setupPulsesInternalModule(protocol);
break;
case EXTERNAL_MODULE:
setupPulsesExternalModule(protocol);
break;
}
}
bool setupPulses(uint8_t module)
{
uint8_t protocol = getRequiredProtocol(module);

View file

@ -23,8 +23,14 @@
#include "definitions.h"
#include "dataconstants.h"
#if defined(PXX2)
#include "pulses/pxx2.h"
#endif
#if defined(PXX1)
#include "pulses/pxx1.h"
#endif
#if NUM_MODULES > 1
#define IS_RANGECHECK_ENABLE() (moduleSettings[0].mode == MODULE_MODE_RANGECHECK || moduleSettings[1].mode == MODULE_MODE_RANGECHECK)
@ -99,6 +105,7 @@ PACK(struct Dsm2SerialPulsesData {
uint8_t serialBitCount;
uint16_t _alignment;
});
typedef Dsm2SerialPulsesData Dsm2PulsesData;
#else
#define MAX_PULSES_TRANSITIONS 300
PACK(struct Dsm2TimerPulsesData {
@ -107,6 +114,7 @@ PACK(struct Dsm2TimerPulsesData {
uint16_t rest;
uint8_t index;
});
typedef Dsm2TimerPulsesData Dsm2PulsesData;
#endif
#define PPM_PERIOD_HALF_US(module) ((g_model.moduleData[module].ppm.frameLength * 5 + 225) * 200) /*half us*/
@ -125,25 +133,49 @@ PACK(struct CrossfirePulsesData {
uint8_t length;
});
union ModulePulsesData {
#if defined(INTMODULE_USART) || defined(EXTMODULE_USART)
UartPxxPulses pxx_uart;
#endif
#if defined(PPM_PIN_SERIAL)
SerialPxxPulses pxx;
#elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART)
PwmPxxPulses pxx;
union InternalModulePulsesData {
#if defined(PXX1)
#if defined(INTMODULE_USART) || defined(EXTMODULE_USART)
UartPxx1Pulses pxx_uart;
#endif
#if defined(PPM_PIN_SERIAL)
SerialPxx1Pulses pxx;
#elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART)
PwmPxx1Pulses pxx;
#endif
#endif
#if defined(PXX2)
Pxx2Pulses pxx2;
#endif
#if defined(PPM_PIN_SERIAL)
Dsm2SerialPulsesData dsm2;
#else
Dsm2TimerPulsesData dsm2;
#if defined(TARANIS_INTERNAL_PPM)
PpmPulsesData<pulse_duration_t> ppm;
#endif
} __ALIGNED(4);
union ExternalModulePulsesData {
#if defined(PXX1)
#if defined(INTMODULE_USART) || defined(EXTMODULE_USART)
UartPxx1Pulses pxx_uart;
#endif
#if defined(PPM_PIN_SERIAL)
SerialPxx1Pulses pxx;
#elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART)
PwmPxx1Pulses pxx;
#endif
#endif
#if defined(PXX2)
Pxx2Pulses pxx2;
#endif
#if defined(DSM2) || defined(MULTIMODULE) || defined(SBUS)
Dsm2PulsesData dsm2;
#endif
PpmPulsesData<pulse_duration_t> ppm;
CrossfirePulsesData crossfire;
} __ALIGNED(4);
@ -153,8 +185,9 @@ union ModulePulsesData {
* sizeof(ModulePulsesData). __ALIGNED is required for sizeof(ModulePulsesData) to be a multiple of the alignment.
*/
/* TODO: internal pulsedata only needs 200 bytes vs 300 bytes for external, both use 300 byte since we have a common struct */
extern ModulePulsesData modulePulsesData[NUM_MODULES];
extern InternalModulePulsesData intmodulePulsesData;
extern ExternalModulePulsesData extmodulePulsesData;
union TrainerPulsesData {
PpmPulsesData<trainer_pulse_duration_t> ppm;
@ -163,12 +196,12 @@ union TrainerPulsesData {
extern TrainerPulsesData trainerPulsesData;
bool setupPulses(uint8_t module);
void setupPulsesDSM2(uint8_t module);
void setupPulsesCrossfire(uint8_t module);
void setupPulsesMultimodule(uint8_t module);
void setupPulsesSbus(uint8_t module);
void setupPulsesPXX(uint8_t module);
void setupPulsesPPMModule(uint8_t module);
void setupPulsesDSM2();
void setupPulsesCrossfire();
void setupPulsesMultimodule();
void setupPulsesSbus();
void setupPulsesPPMInternalModule();
void setupPulsesPPMExternalModule();
void setupPulsesPPMTrainer();
void sendByteDsm2(uint8_t b);
void putDsm2Flush();
@ -194,6 +227,24 @@ inline void startPulses()
#endif
}
enum ChannelsProtocols {
PROTOCOL_CHANNELS_UNINITIALIZED,
PROTOCOL_CHANNELS_NONE,
PROTOCOL_CHANNELS_PPM,
#if defined(PXX) || defined(DSM2)
PROTOCOL_CHANNELS_PXX1,
#endif
#if defined(DSM2)
PROTOCOL_CHANNELS_DSM2_LP45,
PROTOCOL_CHANNELS_DSM2_DSM2,
PROTOCOL_CHANNELS_DSM2_DSMX,
#endif
PROTOCOL_CHANNELS_CROSSFIRE,
PROTOCOL_CHANNELS_MULTIMODULE,
PROTOCOL_CHANNELS_SBUS,
PROTOCOL_CHANNELS_PXX2
};
inline bool pulsesStarted() { return moduleSettings[0].protocol != PROTOCOL_CHANNELS_UNINITIALIZED; }
inline void pausePulses() { s_pulses_paused = true; }
inline void resumePulses() { s_pulses_paused = false; }

View file

@ -90,7 +90,12 @@ void PxxPulses<PxxTransport>::addChannels(uint8_t port, uint8_t sendFailsafe, ui
}
}
#if defined(PXX1)
template class PxxPulses<StandardPxx1Transport<PwmPxxBitTransport> >;
template class PxxPulses<StandardPxx1Transport<SerialPxxBitTransport> >;
template class PxxPulses<UartPxx1Transport>;
#endif
#if defined(PXX2)
template class PxxPulses<Pxx2Transport>;
#endif

View file

@ -160,8 +160,8 @@ class Pxx1Pulses: public PxxPulses<PxxTransport>
void add8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels);
};
typedef Pxx1Pulses<UartPxx1Transport> UartPxxPulses;
typedef Pxx1Pulses<StandardPxx1Transport<PwmPxxBitTransport>> PwmPxxPulses;
typedef Pxx1Pulses<StandardPxx1Transport<SerialPxxBitTransport>> SerialPxxPulses;
typedef Pxx1Pulses<UartPxx1Transport> UartPxx1Pulses;
typedef Pxx1Pulses<StandardPxx1Transport<PwmPxxBitTransport>> PwmPxx1Pulses;
typedef Pxx1Pulses<StandardPxx1Transport<SerialPxxBitTransport>> SerialPxx1Pulses;
#endif

View file

@ -48,17 +48,17 @@ static void _send_level(uint8_t v)
{
/* Copied over from DSM, this looks doubious and in my logic analyzer
output the low->high is about 2 ns late */
if (modulePulsesData[EXTERNAL_MODULE].dsm2.index & 1)
if (extmodulePulsesData.dsm2.index & 1)
v += 2;
else
v -= 2;
*modulePulsesData[EXTERNAL_MODULE].dsm2.ptr++ = v - 1;
modulePulsesData[EXTERNAL_MODULE].dsm2.index+=1;
modulePulsesData[EXTERNAL_MODULE].dsm2.rest -=v;
*extmodulePulsesData.dsm2.ptr++ = v - 1;
extmodulePulsesData.dsm2.index+=1;
extmodulePulsesData.dsm2.rest -=v;
}
void sendByteSbus(uint8_t b) //max 11 changes 0 10 10 10 10 P 1
void sendByteSbus(uint8_t b) // max 11 changes 0 10 10 10 10 P 1
{
bool lev = 0;
uint8_t parity = 1;
@ -107,17 +107,17 @@ inline int getChannelValue(uint8_t port, int channel)
return channelOutputs[ch] + 2 * PPM_CH_CENTER(ch) - 2*PPM_CENTER;
}
void setupPulsesSbus(uint8_t port)
void setupPulsesSbus()
{
#if defined(PPM_PIN_SERIAL)
modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte = 0;
modulePulsesData[EXTERNAL_MODULE].dsm2.serialBitCount = 0;
extmodulePulsesData.dsm2.serialByte = 0;
extmodulePulsesData.dsm2.serialBitCount = 0;
#else
modulePulsesData[EXTERNAL_MODULE].dsm2.rest = SBUS_PERIOD_HALF_US;
modulePulsesData[EXTERNAL_MODULE].dsm2.index = 0;
extmodulePulsesData.dsm2.rest = SBUS_PERIOD_HALF_US;
extmodulePulsesData.dsm2.index = 0;
#endif
modulePulsesData[EXTERNAL_MODULE].dsm2.ptr = modulePulsesData[EXTERNAL_MODULE].dsm2.pulses;
extmodulePulsesData.dsm2.ptr = extmodulePulsesData.dsm2.pulses;
// Sync Byte
sendByteSbus(SBUS_FRAME_BEGIN_BYTE);
@ -127,7 +127,7 @@ void setupPulsesSbus(uint8_t port)
// byte 1-22, channels 0..2047, limits not really clear (B
for (int i=0; i<SBUS_NORMAL_CHANS; i++) {
int value = getChannelValue(port, i);
int value = getChannelValue(EXTERNAL_MODULE, i);
value = value*8/10 + SBUS_CHAN_CENTER;
bits |= limit(0, value, 2047) << bitsavailable;
@ -141,9 +141,9 @@ void setupPulsesSbus(uint8_t port)
// flags
uint8_t flags=0;
if (getChannelValue(port, 16) > 0)
if (getChannelValue(EXTERNAL_MODULE, 16) > 0)
flags |=SBUS_FLAG_CHANNEL_17;
if (getChannelValue(port, 17) > 0)
if (getChannelValue(EXTERNAL_MODULE, 17) > 0)
flags |=SBUS_FLAG_CHANNEL_18;
sendByteSbus(flags);

View file

@ -30,11 +30,10 @@
#define SBUS_FAILSAFE_BIT 3
#define SBUS_CH_BITS 11
#define SBUS_CH_MASK ((1<<SBUS_CH_BITS)-1)
#define SBUS_CH_MASK ((1<<SBUS_CH_BITS) - 1)
#define SBUS_CH_CENTER 0x3E0
// Range for pulses (ppm input) is [-512:+512]
void processSbusFrame(uint8_t * sbus, int16_t * pulses, uint32_t size)
{

View file

@ -19,27 +19,33 @@ if(TIMERS EQUAL 3)
else()
add_definitions(-DTIMERS=2)
endif()
if(LOG_TELEMETRY)
add_definitions(-DLOG_TELEMETRY)
endif()
if(TRACE_SD_CARD)
add_definitions(-DTRACE_SD_CARD)
set(DEBUG ON)
set(DEBUG_TRACE_BUFFER ON)
endif()
if(TRACE_FATFS)
add_definitions(-DTRACE_FATFS)
set(DEBUG ON)
set(DEBUG_TRACE_BUFFER ON)
endif()
if(TRACE_AUDIO)
add_definitions(-DTRACE_AUDIO)
set(DEBUG ON)
set(DEBUG_TRACE_BUFFER ON)
endif()
if(DEBUG_TRACE_BUFFER)
add_definitions(-DDEBUG_TRACE_BUFFER)
endif()
if(DEBUG_INTERRUPTS)
add_definitions(-DDEBUG_INTERRUPTS)
set(DEBUG ON)
@ -47,14 +53,17 @@ if(DEBUG_INTERRUPTS)
add_definitions(-DDEBUG_USB_INTERRUPTS)
endif()
endif()
if(DEBUG_TASKS)
add_definitions(-DDEBUG_TASKS)
set(DEBUG ON)
endif()
if(DEBUG_TIMERS)
add_definitions(-DDEBUG_TIMERS)
set(DEBUG ON)
endif()
if(CLI)
add_definitions(-DCLI)
set(FIRMWARE_SRC ${FIRMWARE_SRC} cli.cpp)
@ -62,23 +71,30 @@ if(CLI)
elseif(DEBUG)
set(SRC ${SRC} dump.cpp)
endif()
if(DEBUG)
add_definitions(-DDEBUG)
endif()
if(SUPPORT_D16_EU_ONLY)
add_definitions(-DMODULE_D16_EU_ONLY_SUPPORT)
endif()
if(HAPTIC)
add_definitions(-DHAPTIC)
set(SRC ${SRC} haptic.cpp)
set(TARGET_SRC ${TARGET_SRC} haptic_driver.cpp)
endif()
add_definitions(-DPXX -DPXX1 -DPXX2 -DDSM2 -DSBUS -DCROSSFIRE)
if(MULTIMODULE)
add_definitions(-DMULTIMODULE)
set(SRC ${SRC} pulses/multi_arm.cpp telemetry/spektrum.cpp telemetry/flysky_ibus.cpp telemetry/multi.cpp)
endif()
add_definitions(-DCPUARM)
add_definitions(-DTELEMETRY_FRSKY -DTELEMETRY_FRSKY_SPORT -DGPS -DPXX -DDSM2)
add_definitions(-DTELEMETRY_FRSKY -DTELEMETRY_FRSKY_SPORT -DGPS)
add_definitions(-DBOLD_FONT -DBATTGRAPH -DTHRTRACE)
add_definitions(-DREQUIRED_SDCARD_VERSION="${SDCARD_VERSION}")
include_directories(${COOS_DIR} ${COOS_DIR}/kernel ${COOS_DIR}/portable)

View file

@ -8,7 +8,7 @@ option(USB_SERIAL "Enable USB serial (CDC)" OFF)
set(ARCH ARM)
set(STM32USB_DIR ${THIRDPARTY_DIR}/STM32_USB-Host-Device_Lib_V2.2.0/Libraries)
add_definitions(-DSTM32 -DLUA_INPUTS -DVARIO -DCROSSFIRE)
add_definitions(-DSTM32 -DLUA_INPUTS -DVARIO)
include_directories(${RADIO_SRC_DIRECTORY}/targets/common/arm/stm32)
include_directories(${STM32USB_DIR}/STM32_USB_OTG_Driver/inc)

View file

@ -97,8 +97,8 @@ void intmoduleSendNextFrame()
DMA_InitStructure.DMA_Channel = INTMODULE_DMA_CHANNEL;
DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&INTMODULE_USART->DR);
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(modulePulsesData[INTERNAL_MODULE].pxx2.getData());
DMA_InitStructure.DMA_BufferSize = modulePulsesData[INTERNAL_MODULE].pxx2.getSize();
DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(intmodulePulsesData.pxx2.getData());
DMA_InitStructure.DMA_BufferSize = intmodulePulsesData.pxx2.getSize();
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

View file

@ -185,7 +185,6 @@ void SDRAM_Init(void);
#define EXTERNAL_MODULE_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN)
#define IS_INTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) == Bit_SET)
#define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET)
#define IS_UART_MODULE(port) (port == INTERNAL_MODULE)
void init_ppm(uint32_t module_index);
void disable_ppm(uint32_t module_index);

View file

@ -223,23 +223,23 @@ void extmoduleSendNextFrame()
#if defined(PCBX10) || PCBREV >= 13
EXTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2;
EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC3P : 0);
EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance
EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance
EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA
EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1;
#else
EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2;
EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0);
EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance
EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance
EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA
EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_1 | DMA_SxCR_MSIZE_1 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1;
#endif
EXTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR);
EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].ppm.pulses);
EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].ppm.ptr - modulePulsesData[EXTERNAL_MODULE].ppm.pulses;
EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.ppm.pulses);
EXTMODULE_DMA_STREAM->NDTR = extmodulePulsesData.ppm.ptr - extmodulePulsesData.ppm.pulses;
EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA
}
else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX) {
EXTMODULE_TIMER->CCR2 = modulePulsesData[EXTERNAL_MODULE].pxx.getLast() - 4000; // 2mS in advance
else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1) {
EXTMODULE_TIMER->CCR2 = extmodulePulsesData.pxx.getLast() - 4000; // 2mS in advance
EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA
#if defined(PCBX10) || PCBREV >= 13
EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1;
@ -247,12 +247,12 @@ void extmoduleSendNextFrame()
EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_1 | DMA_SxCR_MSIZE_1 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1;
#endif
EXTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR);
EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx.getData());
EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].pxx.getSize();
EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.pxx.getData());
EXTMODULE_DMA_STREAM->NDTR = extmodulePulsesData.pxx.getSize();
EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA
}
else if (IS_DSM2_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_MULTIMODULE_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol)) {
EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - 1) - 4000; // 2mS in advance
EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.dsm2.ptr - 1) - 4000; // 2mS in advance
EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA
#if defined(PCBX10) || PCBREV >= 13
EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1;
@ -264,8 +264,8 @@ void extmoduleSendNextFrame()
EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); // reverse polarity for Sbus if needed
#endif
EXTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR);
EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].dsm2.pulses);
EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - modulePulsesData[EXTERNAL_MODULE].dsm2.pulses;
EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses);
EXTMODULE_DMA_STREAM->NDTR = extmodulePulsesData.dsm2.ptr - extmodulePulsesData.dsm2.pulses;
EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA
}
else {

View file

@ -63,8 +63,6 @@ void init_main_ppm(uint32_t period, uint32_t out_enable)
{
Pwm * pwmptr;
setupPulsesPPMModule(EXTERNAL_MODULE);
if (out_enable) {
module_output_active();
}
@ -294,8 +292,8 @@ extern "C" void PWM_IRQHandler(void)
else {
// Kick off serial output here
Ssc * sscptr = SSC;
sscptr->SSC_TPR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx.getData());
sscptr->SSC_TCR = modulePulsesData[EXTERNAL_MODULE].pxx.getSize();
sscptr->SSC_TPR = CONVERT_PTR_UINT(extmodulePulsesData.pxx.getData());
sscptr->SSC_TCR = extmodulePulsesData.pxx.getSize();
sscptr->SSC_PTCR = SSC_PTCR_TXTEN; // Start transfers
}
break;
@ -318,8 +316,8 @@ extern "C" void PWM_IRQHandler(void)
else {
// Kick off serial output here
Ssc * sscptr = SSC;
sscptr->SSC_TPR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].dsm2.pulses);
sscptr->SSC_TCR = (uint8_t *)modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - (uint8_t *)modulePulsesData[EXTERNAL_MODULE].dsm2.pulses;
sscptr->SSC_TPR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses);
sscptr->SSC_TCR = (uint8_t *)extmodulePulsesData.dsm2.ptr - (uint8_t *)extmodulePulsesData.dsm2.pulses;
sscptr->SSC_PTCR = SSC_PTCR_TXTEN; // Start transfers
}
break;
@ -344,15 +342,15 @@ extern "C" void PWM_IRQHandler(void)
else {
// Kick off serial output here
Ssc * sscptr = SSC;
sscptr->SSC_TPR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].dsm2.pulses);
sscptr->SSC_TCR = (uint8_t *)modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - (uint8_t *)modulePulsesData[EXTERNAL_MODULE].dsm2.pulses;
sscptr->SSC_TPR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses);
sscptr->SSC_TCR = (uint8_t *)extmodulePulsesData.dsm2.ptr - (uint8_t *)extmodulePulsesData.dsm2.pulses;
sscptr->SSC_PTCR = SSC_PTCR_TXTEN; // Start transfers
}
break;
default:
pwmptr->PWM_CH_NUM[3].PWM_CPDRUPD = *modulePulsesData[EXTERNAL_MODULE].ppm.ptr++;
if (*modulePulsesData[EXTERNAL_MODULE].ppm.ptr == 0) {
pwmptr->PWM_CH_NUM[3].PWM_CPDRUPD = *extmodulePulsesData.ppm.ptr++;
if (*extmodulePulsesData.ppm.ptr == 0) {
setExternalModulePolarity();
setupPulses(EXTERNAL_MODULE);
}
@ -365,7 +363,7 @@ extern "C" void PWM_IRQHandler(void)
if (reason & PWM_ISR1_CHID1) {
pwmptr->PWM_CH_NUM[1].PWM_CPDRUPD = *modulePulsesData[EXTRA_MODULE].ppm.ptr++;
if (*modulePulsesData[EXTRA_MODULE].ppm.ptr == 0) {
setupPulsesPPMModule(EXTRA_MODULE);
setupPulses(EXTRA_MODULE);
setExtraModulePolarity();
}
}

View file

@ -137,7 +137,6 @@ else()
intmodule_pulses_driver.cpp
trainer_driver.cpp
)
add_definitions(-DSBUS)
set(PULSES_SRC
${PULSES_SRC}
../sbus.cpp

View file

@ -172,13 +172,6 @@ uint32_t isBootloaderStart(const uint8_t * buffer);
#define EXTERNAL_MODULE_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN)
#define IS_INTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) == Bit_SET)
#define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET)
#if defined(INTMODULE_USART) && defined(EXTMODULE_USART)
#define IS_UART_MODULE(port) (true)
#elif defined(INTMODULE_USART)
#define IS_UART_MODULE(port) (port == INTERNAL_MODULE)
#else
#define IS_UART_MODULE(port) (false)
#endif
void init_ppm(uint8_t module);
void disable_ppm(uint8_t module);

View file

@ -221,23 +221,24 @@ void extmoduleSendNextFrame()
if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PPM) {
EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE) * 2;
EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here
EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance
EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance
EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA
EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1;
EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR);
EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].ppm.pulses);
EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].ppm.ptr - modulePulsesData[EXTERNAL_MODULE].ppm.pulses;
EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.ppm.pulses);
EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.ppm.ptr - extmodulePulsesData.ppm.pulses;
EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA
}
else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX) {
#if defined(PXX1)
else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1) {
#if defined(EXTMODULE_USART)
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(EXTMODULE_USART_DMA_STREAM);
DMA_InitStructure.DMA_Channel = EXTMODULE_USART_DMA_CHANNEL;
DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&EXTMODULE_USART->DR);
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx_uart.getData());
DMA_InitStructure.DMA_BufferSize = modulePulsesData[EXTERNAL_MODULE].pxx_uart.getSize();
DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(extmodulePulsesData.pxx_uart.getData());
DMA_InitStructure.DMA_BufferSize = extmodulePulsesData.pxx_uart.getSize();
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
@ -253,33 +254,38 @@ void extmoduleSendNextFrame()
USART_DMACmd(EXTMODULE_USART, USART_DMAReq_Tx, ENABLE);
EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE;
#else
EXTMODULE_TIMER->CCR2 = modulePulsesData[EXTERNAL_MODULE].pxx.getLast() - 4000; // 2mS in advance
EXTMODULE_TIMER->CCR2 = extmodulePulsesData.pxx.getLast() - 4000; // 2mS in advance
EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA
EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1;
EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR);
EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx.getData());
EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].pxx.getSize();
EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.pxx.getData());
EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.pxx.getSize();
EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA
#endif
}
#endif
#if defined(DSM2)
else if (IS_DSM2_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_MULTIMODULE_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol)) {
if (IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol))
EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // reverse polarity for Sbus if needed
EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - 1) - 4000; // 2mS in advance
EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.dsm2.ptr - 1) - 4000; // 2mS in advance
EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA
EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1;
EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR);
EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].dsm2.pulses);
EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - modulePulsesData[EXTERNAL_MODULE].dsm2.pulses;
EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses);
EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.dsm2.ptr - extmodulePulsesData.dsm2.pulses;
EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA
}
#endif
#if defined(CROSSFIRE)
else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_CROSSFIRE) {
sportSendBuffer(modulePulsesData[EXTERNAL_MODULE].crossfire.pulses, modulePulsesData[EXTERNAL_MODULE].crossfire.length);
sportSendBuffer(extmodulePulsesData.crossfire.pulses, extmodulePulsesData.crossfire.length);
}
#endif
else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) {
sportSendBuffer(modulePulsesData[EXTERNAL_MODULE].pxx2.getData(), modulePulsesData[EXTERNAL_MODULE].pxx2.getSize());
sportSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize());
}
else {
EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE;

View file

@ -34,25 +34,25 @@ void intmoduleStop()
void intmoduleSendNextFrame()
{
if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX) {
INTMODULE_TIMER->CCR2 = modulePulsesData[INTERNAL_MODULE].pxx.getLast() - 4000; // 2mS in advance
if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1) {
INTMODULE_TIMER->CCR2 = intmodulePulsesData.pxx.getLast() - 4000; // 2mS in advance
INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA
INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1;
INTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&INTMODULE_TIMER->ARR);
INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[INTERNAL_MODULE].pxx.getData());
INTMODULE_DMA_STREAM->NDTR = modulePulsesData[INTERNAL_MODULE].pxx.getSize();
INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(intmodulePulsesData.pxx.getData());
INTMODULE_DMA_STREAM->NDTR = intmodulePulsesData.pxx.getSize();
INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA
}
#if defined(TARANIS_INTERNAL_PPM)
else if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PPM) {
INTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(INTERNAL_MODULE) * 2;
INTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_MODULE_PPM_POLARITY(INTERNAL_MODULE) ? 0 : TIM_CCER_CC3P);
INTMODULE_TIMER->CCR2 = *(modulePulsesData[INTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance
INTMODULE_TIMER->CCR2 = *(intmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance
INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA
INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1;
INTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&INTMODULE_TIMER->ARR);
INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[INTERNAL_MODULE].ppm.pulses);
INTMODULE_DMA_STREAM->NDTR = modulePulsesData[INTERNAL_MODULE].ppm.ptr - modulePulsesData[INTERNAL_MODULE].ppm.pulses;
INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(intmodulePulsesData.ppm.pulses);
INTMODULE_DMA_STREAM->NDTR = intmodulePulsesData.ppm.ptr - intmodulePulsesData.ppm.pulses;
INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA
}
#endif

View file

@ -100,7 +100,7 @@ TASK_FUNCTION(mixerTask)
while(1) {
#if defined(SBUS)
#if !defined(PCBXLITE)
processSbusInput();
#endif

View file

@ -90,7 +90,7 @@ static void processMultiSyncPacket(const uint8_t *data)
multiSyncStatus.calcAdjustedRefreshRate(data[0] << 8 | data[1], data[2] << 8 | data[3]);
#if !defined(PPM_PIN_SERIAL)
TRACE("MP ADJ: rest: %d, lag %04d, diff: %04d target: %d, interval: %d, Refresh: %d, intAdjRefresh: %d, adjRefresh %d\r\n", modulePulsesData[EXTERNAL_MODULE].dsm2.rest,
TRACE("MP ADJ: rest: %d, lag %04d, diff: %04d target: %d, interval: %d, Refresh: %d, intAdjRefresh: %d, adjRefresh %d\r\n", extmodulePulsesData.dsm2.rest,
multiSyncStatus.inputLag, oldlag-multiSyncStatus.inputLag, multiSyncStatus.target, multiSyncStatus.interval, multiSyncStatus.refreshRate, multiSyncStatus.adjustedRefreshRate/50,
multiSyncStatus.getAdjustedRefreshRate());
#endif