mirror of
https://github.com/opentx/opentx.git
synced 2025-07-25 17:25:13 +03:00
WiP
This commit is contained in:
parent
1d47a0278e
commit
bd97ae0b8e
15 changed files with 173 additions and 35 deletions
|
@ -163,12 +163,14 @@ void enablePulsesExternalModule(uint8_t protocol)
|
||||||
#if defined(PXX1)
|
#if defined(PXX1)
|
||||||
case PROTOCOL_CHANNELS_PXX1_PULSES:
|
case PROTOCOL_CHANNELS_PXX1_PULSES:
|
||||||
extmodulePxx1PulsesStart();
|
extmodulePxx1PulsesStart();
|
||||||
|
mixerSchedulerSetPeriod(EXTERNAL_MODULE, PXX_PULSES_PERIOD);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(PXX1) && defined(HARDWARE_EXTERNAL_MODULE_SIZE_SML)
|
#if defined(PXX1) && defined(HARDWARE_EXTERNAL_MODULE_SIZE_SML)
|
||||||
case PROTOCOL_CHANNELS_PXX1_SERIAL:
|
case PROTOCOL_CHANNELS_PXX1_SERIAL:
|
||||||
extmodulePxx1SerialStart();
|
extmodulePxx1SerialStart();
|
||||||
|
mixerSchedulerSetPeriod(EXTERNAL_MODULE, EXTMODULE_PXX1_SERIAL_PERIOD);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -176,41 +178,48 @@ void enablePulsesExternalModule(uint8_t protocol)
|
||||||
case PROTOCOL_CHANNELS_DSM2_LP45:
|
case PROTOCOL_CHANNELS_DSM2_LP45:
|
||||||
case PROTOCOL_CHANNELS_DSM2_DSM2:
|
case PROTOCOL_CHANNELS_DSM2_DSM2:
|
||||||
case PROTOCOL_CHANNELS_DSM2_DSMX:
|
case PROTOCOL_CHANNELS_DSM2_DSMX:
|
||||||
extmoduleSerialStart(DSM2_BAUDRATE, DSM2_PERIOD * 2000, false);
|
extmoduleSerialStart(DSM2_BAUDRATE, DSM2_PERIOD * 2, false);
|
||||||
|
mixerSchedulerSetPeriod(EXTERNAL_MODULE, DSM2_PERIOD);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CROSSFIRE)
|
#if defined(CROSSFIRE)
|
||||||
case PROTOCOL_CHANNELS_CROSSFIRE:
|
case PROTOCOL_CHANNELS_CROSSFIRE:
|
||||||
EXTERNAL_MODULE_ON();
|
EXTERNAL_MODULE_ON();
|
||||||
|
mixerSchedulerSetPeriod(EXTERNAL_MODULE, CROSSFIRE_PERIOD);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(PXX2) && defined(EXTMODULE_USART)
|
#if defined(PXX2) && defined(EXTMODULE_USART)
|
||||||
case PROTOCOL_CHANNELS_PXX2_HIGHSPEED:
|
case PROTOCOL_CHANNELS_PXX2_HIGHSPEED:
|
||||||
extmoduleInvertedSerialStart(PXX2_HIGHSPEED_BAUDRATE);
|
extmoduleInvertedSerialStart(PXX2_HIGHSPEED_BAUDRATE);
|
||||||
|
mixerSchedulerSetPeriod(EXTERNAL_MODULE, PXX2_PERIOD);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROTOCOL_CHANNELS_PXX2_LOWSPEED:
|
case PROTOCOL_CHANNELS_PXX2_LOWSPEED:
|
||||||
extmoduleInvertedSerialStart(PXX2_LOWSPEED_BAUDRATE);
|
extmoduleInvertedSerialStart(PXX2_LOWSPEED_BAUDRATE);
|
||||||
|
mixerSchedulerSetPeriod(EXTERNAL_MODULE, PXX2_PERIOD);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MULTIMODULE)
|
#if defined(MULTIMODULE)
|
||||||
case PROTOCOL_CHANNELS_MULTIMODULE:
|
case PROTOCOL_CHANNELS_MULTIMODULE:
|
||||||
extmoduleSerialStart(MULTIMODULE_BAUDRATE, MULTIMODULE_PERIOD * 2000, true);
|
extmoduleSerialStart(MULTIMODULE_BAUDRATE, MULTIMODULE_PERIOD * 2, true);
|
||||||
|
mixerSchedulerSetPeriod(EXTERNAL_MODULE, 6666/*MULTIMODULE_PERIOD*/);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SBUS)
|
#if defined(SBUS)
|
||||||
case PROTOCOL_CHANNELS_SBUS:
|
case PROTOCOL_CHANNELS_SBUS:
|
||||||
extmoduleSerialStart(SBUS_BAUDRATE, SBUS_PERIOD_HALF_US, false);
|
extmoduleSerialStart(SBUS_BAUDRATE, SBUS_PERIOD_HALF_US, false);
|
||||||
|
mixerSchedulerSetPeriod(EXTERNAL_MODULE, SBUS_PERIOD);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(PPM)
|
#if defined(PPM)
|
||||||
case PROTOCOL_CHANNELS_PPM:
|
case PROTOCOL_CHANNELS_PPM:
|
||||||
extmodulePpmStart();
|
extmodulePpmStart();
|
||||||
|
mixerSchedulerSetPeriod(EXTERNAL_MODULE, PPM_PERIOD(EXTERNAL_MODULE));
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -295,12 +304,24 @@ static void enablePulsesInternalModule(uint8_t protocol)
|
||||||
#if defined(PXX1) && !defined(INTMODULE_USART)
|
#if defined(PXX1) && !defined(INTMODULE_USART)
|
||||||
case PROTOCOL_CHANNELS_PXX1_PULSES:
|
case PROTOCOL_CHANNELS_PXX1_PULSES:
|
||||||
intmodulePxx1PulsesStart();
|
intmodulePxx1PulsesStart();
|
||||||
|
#if defined(INTMODULE_HEARTBEAT)
|
||||||
|
mixerSchedulerStop();
|
||||||
|
#else
|
||||||
|
mixerSchedulerSetPeriod(INTERNAL_MODULE, INTMODULE_PXX1_SERIAL_PERIOD);
|
||||||
|
mixerSchedulerStart();
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(PXX1) && defined(INTMODULE_USART)
|
#if defined(PXX1) && defined(INTMODULE_USART)
|
||||||
case PROTOCOL_CHANNELS_PXX1_SERIAL:
|
case PROTOCOL_CHANNELS_PXX1_SERIAL:
|
||||||
intmodulePxx1SerialStart();
|
intmodulePxx1SerialStart();
|
||||||
|
#if defined(INTMODULE_HEARTBEAT)
|
||||||
|
mixerSchedulerStop();
|
||||||
|
#else
|
||||||
|
mixerSchedulerSetPeriod(INTERNAL_MODULE, INTMODULE_PXX1_SERIAL_PERIOD);
|
||||||
|
mixerSchedulerStart();
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -310,6 +331,13 @@ static void enablePulsesInternalModule(uint8_t protocol)
|
||||||
#if defined(HARDWARE_INTERNAL_MODULE) && defined(INTERNAL_MODULE_PXX2) && defined(ACCESS_LIB)
|
#if defined(HARDWARE_INTERNAL_MODULE) && defined(INTERNAL_MODULE_PXX2) && defined(ACCESS_LIB)
|
||||||
globalData.authenticationCount = 0;
|
globalData.authenticationCount = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(INTMODULE_HEARTBEAT)
|
||||||
|
mixerSchedulerStop();
|
||||||
|
#else
|
||||||
|
mixerSchedulerSetPeriod(INTERNAL_MODULE, INTMODULE_PXX2_PERIOD);
|
||||||
|
mixerSchedulerStart();
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -317,6 +345,7 @@ static void enablePulsesInternalModule(uint8_t protocol)
|
||||||
case PROTOCOL_CHANNELS_MULTIMODULE:
|
case PROTOCOL_CHANNELS_MULTIMODULE:
|
||||||
intmodulePulsesData.multi.initFrame();
|
intmodulePulsesData.multi.initFrame();
|
||||||
intmoduleSerialStart(MULTIMODULE_BAUDRATE, true, USART_Parity_Even, USART_StopBits_2, USART_WordLength_9b);
|
intmoduleSerialStart(MULTIMODULE_BAUDRATE, true, USART_Parity_Even, USART_StopBits_2, USART_WordLength_9b);
|
||||||
|
mixerSchedulerSetPeriod(INTERNAL_MODULE, MULTIMODULE_PERIOD);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -232,14 +232,14 @@ typedef Dsm2TimerPulsesData Dsm2PulsesData;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PPM_PERIOD_HALF_US(module) ((g_model.moduleData[module].ppm.frameLength * 5 + 225) * 200) /*half us*/
|
#define PPM_PERIOD_HALF_US(module) ((g_model.moduleData[module].ppm.frameLength * 5 + 225) * 200) /*half us*/
|
||||||
#define PPM_PERIOD(module) (PPM_PERIOD_HALF_US(module) / 2000) /*ms*/
|
#define PPM_PERIOD(module) (PPM_PERIOD_HALF_US(module) / 2) /*us*/
|
||||||
#define DSM2_BAUDRATE 125000
|
#define DSM2_BAUDRATE 125000
|
||||||
#define DSM2_PERIOD 22 /*ms*/
|
#define DSM2_PERIOD 22000 /*us*/
|
||||||
#define SBUS_BAUDRATE 100000
|
#define SBUS_BAUDRATE 100000
|
||||||
#define SBUS_PERIOD_HALF_US ((g_model.moduleData[EXTERNAL_MODULE].sbus.refreshRate * 5 + 225) * 200) /*half us*/
|
#define SBUS_PERIOD_HALF_US ((g_model.moduleData[EXTERNAL_MODULE].sbus.refreshRate * 5 + 225) * 200) /*half us*/
|
||||||
#define SBUS_PERIOD (SBUS_PERIOD_HALF_US / 2000) /*ms*/
|
#define SBUS_PERIOD (SBUS_PERIOD_HALF_US / 2) /*us*/
|
||||||
#define MULTIMODULE_BAUDRATE 100000
|
#define MULTIMODULE_BAUDRATE 100000
|
||||||
#define MULTIMODULE_PERIOD 7 /*ms*/
|
#define MULTIMODULE_PERIOD 7000 /*us*/
|
||||||
|
|
||||||
#define CROSSFIRE_FRAME_MAXLEN 64
|
#define CROSSFIRE_FRAME_MAXLEN 64
|
||||||
PACK(struct CrossfirePulsesData {
|
PACK(struct CrossfirePulsesData {
|
||||||
|
|
|
@ -29,20 +29,20 @@
|
||||||
|
|
||||||
#define PXX2_LOWSPEED_BAUDRATE 230400
|
#define PXX2_LOWSPEED_BAUDRATE 230400
|
||||||
#define PXX2_HIGHSPEED_BAUDRATE 450000
|
#define PXX2_HIGHSPEED_BAUDRATE 450000
|
||||||
#define PXX2_PERIOD 4 // 4ms
|
#define PXX2_PERIOD 4000/*us*/
|
||||||
#define PXX2_TOOLS_PERIOD 1 // 1ms
|
#define PXX2_TOOLS_PERIOD 1000/*us*/
|
||||||
#define PXX2_FRAME_MAXLENGTH 64
|
#define PXX2_FRAME_MAXLENGTH 64
|
||||||
|
|
||||||
#define PXX_PULSES_PERIOD 9/*ms*/
|
#define PXX_PULSES_PERIOD 9000/*us*/
|
||||||
#define EXTMODULE_PXX1_SERIAL_PERIOD 4/*ms*/
|
#define EXTMODULE_PXX1_SERIAL_PERIOD 4000/*us*/
|
||||||
#define EXTMODULE_PXX1_SERIAL_BAUDRATE 420000
|
#define EXTMODULE_PXX1_SERIAL_BAUDRATE 420000
|
||||||
|
|
||||||
#if defined(PXX_FREQUENCY_HIGH)
|
#if defined(PXX_FREQUENCY_HIGH)
|
||||||
#define INTMODULE_PXX1_SERIAL_BAUDRATE 450000
|
#define INTMODULE_PXX1_SERIAL_BAUDRATE 450000
|
||||||
#define INTMODULE_PXX1_SERIAL_PERIOD 4/*ms*/
|
#define INTMODULE_PXX1_SERIAL_PERIOD 4000/*us*/
|
||||||
#else
|
#else
|
||||||
#define INTMODULE_PXX1_SERIAL_BAUDRATE 115200
|
#define INTMODULE_PXX1_SERIAL_BAUDRATE 115200
|
||||||
#define INTMODULE_PXX1_SERIAL_PERIOD 9/*ms*/
|
#define INTMODULE_PXX1_SERIAL_PERIOD 9000/*us*/
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Used by the Sky9x family boards
|
// Used by the Sky9x family boards
|
||||||
|
|
|
@ -78,7 +78,8 @@ extern "C++" {
|
||||||
|
|
||||||
static inline void RTOS_CREATE_FLAG(uint32_t &flag)
|
static inline void RTOS_CREATE_FLAG(uint32_t &flag)
|
||||||
{
|
{
|
||||||
flag = 0; // TODO: real flags (use semaphores?)
|
//TODO: use pthread condition
|
||||||
|
flag = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void RTOS_SET_FLAG(uint32_t &flag)
|
static inline void RTOS_SET_FLAG(uint32_t &flag)
|
||||||
|
@ -86,6 +87,14 @@ extern "C++" {
|
||||||
flag = 1;
|
flag = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void RTOS_CLEAR_FLAG(uint32_t &flag)
|
||||||
|
{
|
||||||
|
flag = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: #define RTOS_WAIT_FLAG(flag, timeout)
|
||||||
|
#define RTOS_ISR_SET_FLAG RTOS_SET_FLAG
|
||||||
|
|
||||||
template<int SIZE>
|
template<int SIZE>
|
||||||
class FakeTaskStack
|
class FakeTaskStack
|
||||||
{
|
{
|
||||||
|
@ -146,6 +155,7 @@ template<int SIZE>
|
||||||
{
|
{
|
||||||
return (uint32_t)(simuTimerMicros() / 1000);
|
return (uint32_t)(simuTimerMicros() / 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(RTOS_COOS)
|
#elif defined(RTOS_COOS)
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -233,6 +243,15 @@ template<int SIZE>
|
||||||
#define RTOS_CLEAR_FLAG(flag) (void)CoClearFlag(flag)
|
#define RTOS_CLEAR_FLAG(flag) (void)CoClearFlag(flag)
|
||||||
#define RTOS_WAIT_FLAG(flag,timeout) (void)CoWaitForSingleFlag(flag,timeout)
|
#define RTOS_WAIT_FLAG(flag,timeout) (void)CoWaitForSingleFlag(flag,timeout)
|
||||||
|
|
||||||
|
static inline void RTOS_ISR_SET_FLAG(RTOS_FLAG_HANDLE flag)
|
||||||
|
{
|
||||||
|
CoEnterISR();
|
||||||
|
CoSchedLock();
|
||||||
|
isr_SetFlag(flag);
|
||||||
|
CoSchedUnlock();
|
||||||
|
CoExitISR();
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
template<int SIZE>
|
template<int SIZE>
|
||||||
class TaskStack
|
class TaskStack
|
||||||
|
|
|
@ -148,4 +148,6 @@ void delay_ms(uint32_t ms);
|
||||||
GPIO_Init(GPIO, &GPIO_InitStructure); \
|
GPIO_Init(GPIO, &GPIO_InitStructure); \
|
||||||
GPIO_SetBits(GPIO, KEYS_ ## GPIO ## _PINS)
|
GPIO_SetBits(GPIO, KEYS_ ## GPIO ## _PINS)
|
||||||
|
|
||||||
|
#include "mixer_scheduler_driver.h"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -65,6 +65,9 @@ void stop_intmodule_heartbeat()
|
||||||
EXTI_Init(&EXTI_InitStructure);
|
EXTI_Init(&EXTI_InitStructure);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// from mixer_scheduler_driver
|
||||||
|
void mixerScheduleISRTrigger();
|
||||||
|
|
||||||
void check_intmodule_heartbeat()
|
void check_intmodule_heartbeat()
|
||||||
{
|
{
|
||||||
if (EXTI_GetITStatus(INTMODULE_HEARTBEAT_EXTI_LINE) != RESET) {
|
if (EXTI_GetITStatus(INTMODULE_HEARTBEAT_EXTI_LINE) != RESET) {
|
||||||
|
@ -75,6 +78,8 @@ void check_intmodule_heartbeat()
|
||||||
#endif
|
#endif
|
||||||
heartbeatCapture.count++;
|
heartbeatCapture.count++;
|
||||||
EXTI_ClearITPendingBit(INTMODULE_HEARTBEAT_EXTI_LINE);
|
EXTI_ClearITPendingBit(INTMODULE_HEARTBEAT_EXTI_LINE);
|
||||||
|
|
||||||
|
mixerScheduleISRTrigger();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -20,20 +20,51 @@
|
||||||
|
|
||||||
#include "opentx.h"
|
#include "opentx.h"
|
||||||
|
|
||||||
|
#define MIXER_SCHEDULER_DEFAULT_PERIOD_US 4000u // 4ms
|
||||||
|
|
||||||
|
// Global trigger flag
|
||||||
RTOS_FLAG_HANDLE mixerFlag;
|
RTOS_FLAG_HANDLE mixerFlag;
|
||||||
|
|
||||||
|
// Mixer schedule
|
||||||
|
struct MixerSchedule {
|
||||||
|
|
||||||
|
// period in us
|
||||||
|
volatile uint16_t period;
|
||||||
|
};
|
||||||
|
|
||||||
|
static MixerSchedule mixerSchedules[NUM_MODULES];
|
||||||
|
|
||||||
|
static inline uint32_t getSchedulePeriod()
|
||||||
|
{
|
||||||
|
if (mixerSchedules[INTERNAL_MODULE].period) {
|
||||||
|
return mixerSchedules[INTERNAL_MODULE].period;
|
||||||
|
}
|
||||||
|
else if (mixerSchedules[EXTERNAL_MODULE].period) {
|
||||||
|
return mixerSchedules[EXTERNAL_MODULE].period;
|
||||||
|
}
|
||||||
|
|
||||||
|
return MIXER_SCHEDULER_DEFAULT_PERIOD_US;
|
||||||
|
}
|
||||||
|
|
||||||
void mixerSchedulerInit()
|
void mixerSchedulerInit()
|
||||||
{
|
{
|
||||||
RTOS_CREATE_FLAG(mixerFlag);
|
RTOS_CREATE_FLAG(mixerFlag);
|
||||||
|
memset(mixerSchedules, 0, sizeof(mixerSchedules));
|
||||||
}
|
}
|
||||||
|
|
||||||
void mixerSchedulerStart(uint16_t periodUs)
|
void mixerSchedulerSetPeriod(uint8_t moduleIdx, uint16_t periodUs)
|
||||||
|
{
|
||||||
|
mixerSchedules[moduleIdx].period = periodUs;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start scheduler with default period
|
||||||
|
void mixerSchedulerStart()
|
||||||
{
|
{
|
||||||
MIXER_SCHEDULER_TIMER->CR1 = TIM_CR1_URS; // do not generate interrupt on soft update
|
MIXER_SCHEDULER_TIMER->CR1 = TIM_CR1_URS; // do not generate interrupt on soft update
|
||||||
MIXER_SCHEDULER_TIMER->PSC = INTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS (2Mhz)
|
MIXER_SCHEDULER_TIMER->PSC = MIXER_SCHEDULER_TIMER_FREQ / 2000000 - 1; // 0.5uS (2Mhz)
|
||||||
MIXER_SCHEDULER_TIMER->CCER = 0;
|
MIXER_SCHEDULER_TIMER->CCER = 0;
|
||||||
MIXER_SCHEDULER_TIMER->CCMR1 = 0;
|
MIXER_SCHEDULER_TIMER->CCMR1 = 0;
|
||||||
MIXER_SCHEDULER_TIMER->ARR = 2 * periodUs - 1;
|
MIXER_SCHEDULER_TIMER->ARR = 2 * getSchedulePeriod() - 1;
|
||||||
MIXER_SCHEDULER_TIMER->EGR = TIM_EGR_UG; // reset timer
|
MIXER_SCHEDULER_TIMER->EGR = TIM_EGR_UG; // reset timer
|
||||||
|
|
||||||
NVIC_EnableIRQ(MIXER_SCHEDULER_TIMER_IRQn);
|
NVIC_EnableIRQ(MIXER_SCHEDULER_TIMER_IRQn);
|
||||||
|
@ -66,15 +97,19 @@ void mixerSchedulerWaitForTrigger(uint8_t timeoutMs)
|
||||||
RTOS_WAIT_FLAG(mixerFlag, timeoutMs);
|
RTOS_WAIT_FLAG(mixerFlag, timeoutMs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mixerScheduleISRTrigger()
|
||||||
|
{
|
||||||
|
RTOS_ISR_SET_FLAG(mixerFlag);
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" void MIXER_SCHEDULER_TIMER_IRQHandler(void)
|
extern "C" void MIXER_SCHEDULER_TIMER_IRQHandler(void)
|
||||||
{
|
{
|
||||||
MIXER_SCHEDULER_TIMER->SR &= ~TIM_SR_UIF; // clear flag
|
MIXER_SCHEDULER_TIMER->SR &= ~TIM_SR_UIF; // clear flag
|
||||||
mixerSchedulerDisableTrigger();
|
mixerSchedulerDisableTrigger();
|
||||||
|
|
||||||
|
// set next period
|
||||||
|
MIXER_SCHEDULER_TIMER->ARR = 2 * getSchedulePeriod() - 1;
|
||||||
|
|
||||||
// trigger mixer start
|
// trigger mixer start
|
||||||
CoEnterISR();
|
mixerScheduleISRTrigger();
|
||||||
CoSchedLock();
|
|
||||||
isr_SetFlag(mixerFlag);
|
|
||||||
CoSchedUnlock();
|
|
||||||
CoExitISR();
|
|
||||||
}
|
}
|
45
radio/src/targets/common/arm/stm32/mixer_scheduler_driver.h
Normal file
45
radio/src/targets/common/arm/stm32/mixer_scheduler_driver.h
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) OpenTX
|
||||||
|
*
|
||||||
|
* Based on code named
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MIXER_SCHEDULER_DRIVER_H_
|
||||||
|
#define _MIXER_SCHEDULER_DRIVER_H_
|
||||||
|
|
||||||
|
// Call once to initialize the mixer scheduler
|
||||||
|
void mixerSchedulerInit();
|
||||||
|
|
||||||
|
// Configure and start the scheduler timer
|
||||||
|
void mixerSchedulerStart();
|
||||||
|
|
||||||
|
// Stop the scheduler timer
|
||||||
|
void mixerSchedulerStop();
|
||||||
|
|
||||||
|
// Set the scheduling period for a given module
|
||||||
|
void mixerSchedulerSetPeriod(uint8_t moduleIdx, uint16_t periodUs);
|
||||||
|
|
||||||
|
// Wait for the scheduler timer to trigger
|
||||||
|
void mixerSchedulerWaitForTrigger(uint8_t timeoutMs);
|
||||||
|
|
||||||
|
// Enable the timer trigger
|
||||||
|
void mixerSchedulerEnableTrigger();
|
||||||
|
|
||||||
|
// Disable the timer trigger
|
||||||
|
void mixerSchedulerDisableTrigger();
|
||||||
|
|
||||||
|
#endif
|
|
@ -190,7 +190,7 @@ set(TARGET_SRC
|
||||||
led_driver.cpp
|
led_driver.cpp
|
||||||
extmodule_driver.cpp
|
extmodule_driver.cpp
|
||||||
trainer_driver.cpp
|
trainer_driver.cpp
|
||||||
mixer_scheduler_driver.cpp
|
../common/arm/stm32/mixer_scheduler_driver.cpp
|
||||||
../common/arm/stm32/heartbeat_driver.cpp
|
../common/arm/stm32/heartbeat_driver.cpp
|
||||||
../common/arm/stm32/timers_driver.cpp
|
../common/arm/stm32/timers_driver.cpp
|
||||||
../common/arm/stm32/intmodule_serial_driver.cpp
|
../common/arm/stm32/intmodule_serial_driver.cpp
|
||||||
|
|
|
@ -190,14 +190,6 @@ void stop_trainer_ppm();
|
||||||
void init_trainer_capture();
|
void init_trainer_capture();
|
||||||
void stop_trainer_capture();
|
void stop_trainer_capture();
|
||||||
|
|
||||||
// Mixer scheduler driver
|
|
||||||
void mixerSchedulerInit();
|
|
||||||
void mixerSchedulerStart(uint16_t periodUs);
|
|
||||||
void mixerSchedulerStop();
|
|
||||||
void mixerSchedulerWaitForTrigger(uint8_t timeoutMs);
|
|
||||||
void mixerSchedulerEnableTrigger();
|
|
||||||
void mixerSchedulerDisableTrigger();
|
|
||||||
|
|
||||||
// Keys driver
|
// Keys driver
|
||||||
enum EnumKeys
|
enum EnumKeys
|
||||||
{
|
{
|
||||||
|
|
|
@ -373,6 +373,7 @@ set(TARGET_SRC
|
||||||
../common/arm/stm32/audio_dac_driver.cpp
|
../common/arm/stm32/audio_dac_driver.cpp
|
||||||
../common/arm/stm32/adc_driver.cpp
|
../common/arm/stm32/adc_driver.cpp
|
||||||
../common/arm/stm32/heartbeat_driver.cpp
|
../common/arm/stm32/heartbeat_driver.cpp
|
||||||
|
../common/arm/stm32/mixer_scheduler_driver.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES)
|
if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES)
|
||||||
|
|
|
@ -102,6 +102,7 @@ void boardInit()
|
||||||
AUX_SERIAL_RCC_APB1Periph |
|
AUX_SERIAL_RCC_APB1Periph |
|
||||||
INTMODULE_RCC_APB1Periph |
|
INTMODULE_RCC_APB1Periph |
|
||||||
TRAINER_MODULE_RCC_APB1Periph |
|
TRAINER_MODULE_RCC_APB1Periph |
|
||||||
|
MIXER_SCHEDULER_TIMER_RCC_APB1Periph |
|
||||||
BT_RCC_APB1Periph |
|
BT_RCC_APB1Periph |
|
||||||
GYRO_RCC_APB1Periph,
|
GYRO_RCC_APB1Periph,
|
||||||
ENABLE);
|
ENABLE);
|
||||||
|
|
|
@ -356,7 +356,7 @@ extern "C" void EXTMODULE_TIMER_CC_IRQHandler()
|
||||||
{
|
{
|
||||||
EXTMODULE_TIMER->DIER &= ~TIM_DIER_CC2IE; // Stop this interrupt
|
EXTMODULE_TIMER->DIER &= ~TIM_DIER_CC2IE; // Stop this interrupt
|
||||||
EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF;
|
EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF;
|
||||||
if (setupPulsesExternalModule()) {
|
|
||||||
extmoduleSendNextFrame();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
// if (setupPulsesExternalModule()) {
|
||||||
|
// extmoduleSendNextFrame();
|
||||||
|
// }
|
||||||
|
|
|
@ -1970,4 +1970,11 @@
|
||||||
#define TIMER_2MHz_RCC_APB1Periph RCC_APB1Periph_TIM7
|
#define TIMER_2MHz_RCC_APB1Periph RCC_APB1Periph_TIM7
|
||||||
#define TIMER_2MHz_TIMER TIM7
|
#define TIMER_2MHz_TIMER TIM7
|
||||||
|
|
||||||
|
// Mixer scheduler timer
|
||||||
|
#define MIXER_SCHEDULER_TIMER_RCC_APB1Periph RCC_APB1Periph_TIM13
|
||||||
|
#define MIXER_SCHEDULER_TIMER TIM13
|
||||||
|
#define MIXER_SCHEDULER_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
|
||||||
|
#define MIXER_SCHEDULER_TIMER_IRQn TIM8_UP_TIM13_IRQn
|
||||||
|
#define MIXER_SCHEDULER_TIMER_IRQHandler TIM8_UP_TIM13_IRQHandler
|
||||||
|
|
||||||
#endif // _HAL_H_
|
#endif // _HAL_H_
|
||||||
|
|
|
@ -123,7 +123,7 @@ TASK_FUNCTION(mixerTask)
|
||||||
s_pulses_paused = true;
|
s_pulses_paused = true;
|
||||||
|
|
||||||
mixerSchedulerInit();
|
mixerSchedulerInit();
|
||||||
mixerSchedulerStart(6666); // 150 Hz
|
mixerSchedulerStart();
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
#if defined(PCBTARANIS) && defined(SBUS)
|
#if defined(PCBTARANIS) && defined(SBUS)
|
||||||
|
@ -206,6 +206,8 @@ TASK_FUNCTION(mixerTask)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//TODO: remove that one
|
||||||
void scheduleNextMixerCalculation(uint8_t module, uint16_t period_ms)
|
void scheduleNextMixerCalculation(uint8_t module, uint16_t period_ms)
|
||||||
{
|
{
|
||||||
// Schedule next mixer calculation time,
|
// Schedule next mixer calculation time,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue