1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-16 04:45:24 +03:00

Fix LED_STRIP feature // Add DMA drivers // UART fixes

This commit is contained in:
borisbstyle 2016-02-10 22:36:05 +01:00
parent 2af929797d
commit 3a156f98ab
17 changed files with 309 additions and 196 deletions

View file

@ -296,6 +296,7 @@ COMMON_SRC = build_config.c \
drivers/sound_beeper.c \ drivers/sound_beeper.c \
drivers/system.c \ drivers/system.c \
drivers/gyro_sync.c \ drivers/gyro_sync.c \
drivers/dma.c \
drivers/buf_writer.c \ drivers/buf_writer.c \
io/beeper.c \ io/beeper.c \
io/rc_controls.c \ io/rc_controls.c \

83
src/main/drivers/dma.c Normal file
View file

@ -0,0 +1,83 @@
/*
* This file is part of Cleanflight.
*
* Cleanflight is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Cleanflight 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.
*
* You should have received a copy of the GNU General Public License
* along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdbool.h>
#include <string.h>
#include <stdint.h>
#include <platform.h>
#include "build_config.h"
#include "drivers/dma.h"
/*
* DMA handlers for DMA resources that are shared between different features depending on run-time configuration.
*/
static dmaHandlers_t dmaHandlers;
void dmaNoOpHandler(DMA_Channel_TypeDef *channel)
{
UNUSED(channel);
}
void DMA1_Channel2_IRQHandler(void)
{
dmaHandlers.dma1Channel2IRQHandler(DMA1_Channel2);
}
void DMA1_Channel3_IRQHandler(void)
{
dmaHandlers.dma1Channel3IRQHandler(DMA1_Channel3);
}
void DMA1_Channel6_IRQHandler(void)
{
dmaHandlers.dma1Channel6IRQHandler(DMA1_Channel6);
}
void DMA1_Channel7_IRQHandler(void)
{
dmaHandlers.dma1Channel7IRQHandler(DMA1_Channel7);
}
void dmaInit(void)
{
memset(&dmaHandlers, 0, sizeof(dmaHandlers));
dmaHandlers.dma1Channel2IRQHandler = dmaNoOpHandler;
dmaHandlers.dma1Channel3IRQHandler = dmaNoOpHandler;
dmaHandlers.dma1Channel6IRQHandler = dmaNoOpHandler;
dmaHandlers.dma1Channel7IRQHandler = dmaNoOpHandler;
}
void dmaSetHandler(dmaHandlerIdentifier_e identifier, dmaCallbackHandlerFuncPtr callback)
{
switch (identifier) {
case DMA1_CH2_HANDLER:
dmaHandlers.dma1Channel2IRQHandler = callback;
break;
case DMA1_CH3_HANDLER:
dmaHandlers.dma1Channel3IRQHandler = callback;
break;
case DMA1_CH6_HANDLER:
dmaHandlers.dma1Channel6IRQHandler = callback;
break;
case DMA1_CH7_HANDLER:
dmaHandlers.dma1Channel7IRQHandler = callback;
break;
}
}

35
src/main/drivers/dma.h Normal file
View file

@ -0,0 +1,35 @@
/*
* This file is part of Cleanflight.
*
* Cleanflight is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Cleanflight 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.
*
* You should have received a copy of the GNU General Public License
* along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.
*/
typedef void (*dmaCallbackHandlerFuncPtr)(DMA_Channel_TypeDef *channel);
typedef enum {
DMA1_CH2_HANDLER = 0,
DMA1_CH3_HANDLER,
DMA1_CH6_HANDLER,
DMA1_CH7_HANDLER,
} dmaHandlerIdentifier_e;
typedef struct dmaHandlers_s {
dmaCallbackHandlerFuncPtr dma1Channel2IRQHandler;
dmaCallbackHandlerFuncPtr dma1Channel3IRQHandler;
dmaCallbackHandlerFuncPtr dma1Channel6IRQHandler;
dmaCallbackHandlerFuncPtr dma1Channel7IRQHandler;
} dmaHandlers_t;
void dmaInit(void);
void dmaSetHandler(dmaHandlerIdentifier_e identifier, dmaCallbackHandlerFuncPtr callback);

View file

@ -17,20 +17,15 @@
#pragma once #pragma once
struct {
GPIO_TypeDef *gpio;
uint16_t pin;
} led_config[3];
// Helpful macros // Helpful macros
#ifdef LED0 #ifdef LED0
#define LED0_TOGGLE digitalToggle(led_config[0].gpio, led_config[0].pin) #define LED0_TOGGLE digitalToggle(LED0_GPIO, LED0_PIN)
#ifndef LED0_INVERTED #ifndef LED0_INVERTED
#define LED0_OFF digitalHi(led_config[0].gpio, led_config[0].pin) #define LED0_OFF digitalHi(LED0_GPIO, LED0_PIN)
#define LED0_ON digitalLo(led_config[0].gpio, led_config[0].pin) #define LED0_ON digitalLo(LED0_GPIO, LED0_PIN)
#else #else
#define LED0_OFF digitalLo(led_config[0].gpio, led_config[0].pin) #define LED0_OFF digitalLo(LED0_GPIO, LED0_PIN)
#define LED0_ON digitalHi(led_config[0].gpio, led_config[0].pin) #define LED0_ON digitalHi(LED0_GPIO, LED0_PIN)
#endif // inverted #endif // inverted
#else #else
#define LED0_TOGGLE do {} while(0) #define LED0_TOGGLE do {} while(0)
@ -39,13 +34,13 @@ struct {
#endif #endif
#ifdef LED1 #ifdef LED1
#define LED1_TOGGLE digitalToggle(led_config[1].gpio, led_config[1].pin) #define LED1_TOGGLE digitalToggle(LED1_GPIO, LED1_PIN)
#ifndef LED1_INVERTED #ifndef LED1_INVERTED
#define LED1_OFF digitalHi(led_config[1].gpio, led_config[1].pin) #define LED1_OFF digitalHi(LED1_GPIO, LED1_PIN)
#define LED1_ON digitalLo(led_config[1].gpio, led_config[1].pin) #define LED1_ON digitalLo(LED1_GPIO, LED1_PIN)
#else #else
#define LED1_OFF digitalLo(led_config[1].gpio, led_config[1].pin) #define LED1_OFF digitalLo(LED1_GPIO, LED1_PIN)
#define LED1_ON digitalHi(led_config[1].gpio, led_config[1].pin) #define LED1_ON digitalHi(LED1_GPIO, LED1_PIN)
#endif // inverted #endif // inverted
#else #else
#define LED1_TOGGLE do {} while(0) #define LED1_TOGGLE do {} while(0)
@ -55,13 +50,13 @@ struct {
#ifdef LED2 #ifdef LED2
#define LED2_TOGGLE digitalToggle(led_config[2].gpio, led_config[2].pin) #define LED2_TOGGLE digitalToggle(LED2_GPIO, LED2_PIN)
#ifndef LED2_INVERTED #ifndef LED2_INVERTED
#define LED2_OFF digitalHi(led_config[2].gpio, led_config[2].pin) #define LED2_OFF digitalHi(LED2_GPIO, LED2_PIN)
#define LED2_ON digitalLo(led_config[2].gpio, led_config[2].pin) #define LED2_ON digitalLo(LED2_GPIO, LED2_PIN)
#else #else
#define LED2_OFF digitalLo(led_config[2].gpio, led_config[2].pin) #define LED2_OFF digitalLo(LED2_GPIO, LED2_PIN)
#define LED2_ON digitalHi(led_config[2].gpio, led_config[2].pin) #define LED2_ON digitalHi(LED2_GPIO, LED2_PIN)
#endif // inverted #endif // inverted
#else #else
#define LED2_TOGGLE do {} while(0) #define LED2_TOGGLE do {} while(0)
@ -69,4 +64,4 @@ struct {
#define LED2_ON do {} while(0) #define LED2_ON do {} while(0)
#endif #endif
void ledInit(bool alternative_led); void ledInit(void);

View file

@ -19,7 +19,7 @@
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include "platform.h" #include <platform.h>
#include "common/utils.h" #include "common/utils.h"
@ -28,37 +28,56 @@
#include "light_led.h" #include "light_led.h"
void ledInit(bool alternative_led)
void ledInit(void)
{ {
UNUSED(alternative_led);
#if defined(LED0) || defined(LED1) || defined(LED2) #if defined(LED0) || defined(LED1) || defined(LED2)
gpio_config_t cfg; uint32_t i;
cfg.mode = Mode_Out_PP;
cfg.speed = Speed_2MHz; struct {
GPIO_TypeDef *gpio;
gpio_config_t cfg;
} gpio_setup[] = {
#ifdef LED0
{
.gpio = LED0_GPIO,
.cfg = { LED0_PIN, Mode_Out_PP, Speed_2MHz }
},
#endif
#ifdef LED1
{
.gpio = LED1_GPIO,
.cfg = { LED1_PIN, Mode_Out_PP, Speed_2MHz }
},
#endif
#ifdef LED2
{
.gpio = LED2_GPIO,
.cfg = { LED2_PIN, Mode_Out_PP, Speed_2MHz }
}
#endif
};
uint8_t gpio_count = ARRAYLEN(gpio_setup);
#ifdef LED0 #ifdef LED0
RCC_APB2PeriphClockCmd(LED0_PERIPHERAL, ENABLE); RCC_APB2PeriphClockCmd(LED0_PERIPHERAL, ENABLE);
led_config[0].gpio = LED0_GPIO;
led_config[0].pin = LED0_PIN;
cfg.pin = led_config[0].pin;
LED0_OFF;
gpioInit(led_config[0].gpio, &cfg);
#endif #endif
#ifdef LED1 #ifdef LED1
RCC_APB2PeriphClockCmd(LED1_PERIPHERAL, ENABLE); RCC_APB2PeriphClockCmd(LED1_PERIPHERAL, ENABLE);
led_config[1].gpio = LED1_GPIO;
led_config[1].pin = LED1_PIN;
cfg.pin = led_config[1].pin;
LED1_OFF;
gpioInit(led_config[1].gpio, &cfg);
#endif #endif
#ifdef LED2 #ifdef LED2
RCC_APB2PeriphClockCmd(LED2_PERIPHERAL, ENABLE); RCC_APB2PeriphClockCmd(LED2_PERIPHERAL, ENABLE);
led_config[2].gpio = LED2_GPIO;
led_config[2].pin = LED2_PIN;
cfg.pin = led_config[2].pin;
LED2_OFF;
gpioInit(led_config[2].gpio, &cfg);
#endif #endif
LED0_OFF;
LED1_OFF;
LED2_OFF;
for (i = 0; i < gpio_count; i++) {
gpioInit(gpio_setup[i].gpio, &gpio_setup[i].cfg);
}
#endif #endif
} }

View file

@ -19,7 +19,7 @@
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include "platform.h" #include <platform.h>
#include "common/utils.h" #include "common/utils.h"
@ -27,62 +27,52 @@
#include "light_led.h" #include "light_led.h"
void ledInit(bool alternative_led) void ledInit(void)
{ {
#if defined(LED0) || defined(LED1) || defined(LED2) uint32_t i;
gpio_config_t cfg;
cfg.mode = Mode_Out_PP; struct {
cfg.speed = Speed_2MHz; GPIO_TypeDef *gpio;
gpio_config_t cfg;
} gpio_setup[] = {
#ifdef LED0 #ifdef LED0
if (alternative_led) { {
#ifdef LED0_PERIPHERAL_2 .gpio = LED0_GPIO,
RCC_AHBPeriphClockCmd(LED0_PERIPHERAL_2, ENABLE); .cfg = { LED0_PIN, Mode_Out_PP, Speed_2MHz }
led_config[0].gpio = LED0_GPIO_2; },
led_config[0].pin = LED0_PIN_2;
#endif
} else {
RCC_AHBPeriphClockCmd(LED0_PERIPHERAL, ENABLE);
led_config[0].gpio = LED0_GPIO;
led_config[0].pin = LED0_PIN;
}
cfg.pin = led_config[0].pin;
LED0_OFF;
gpioInit(led_config[0].gpio, &cfg);
#endif #endif
#ifdef LED1 #ifdef LED1
if (alternative_led) { {
#ifdef LED1_PERIPHERAL_2 .gpio = LED1_GPIO,
RCC_AHBPeriphClockCmd(LED1_PERIPHERAL_2, ENABLE); .cfg = { LED1_PIN, Mode_Out_PP, Speed_2MHz }
led_config[1].gpio = LED1_GPIO_2; },
led_config[1].pin = LED1_PIN_2;
#endif
} else {
RCC_AHBPeriphClockCmd(LED1_PERIPHERAL, ENABLE);
led_config[1].gpio = LED1_GPIO;
led_config[1].pin = LED1_PIN;
}
cfg.pin = led_config[1].pin;
LED1_OFF;
gpioInit(led_config[1].gpio, &cfg);
#endif #endif
#ifdef LED2 #ifdef LED2
if (alternative_led) { {
#ifdef LED2_PERIPHERAL_2 .gpio = LED2_GPIO,
RCC_AHBPeriphClockCmd(LED2_PERIPHERAL_2, ENABLE); .cfg = { LED2_PIN, Mode_Out_PP, Speed_2MHz }
led_config[2].gpio = LED2_GPIO_2; }
led_config[2].pin = LED2_PIN_2;
#endif #endif
} else { };
RCC_AHBPeriphClockCmd(LED2_PERIPHERAL, ENABLE);
led_config[2].gpio = LED2_GPIO; uint8_t gpio_count = ARRAYLEN(gpio_setup);
led_config[2].pin = LED2_PIN;
} #ifdef LED0
cfg.pin = led_config[2].pin; RCC_AHBPeriphClockCmd(LED0_PERIPHERAL, ENABLE);
#endif
#ifdef LED1
RCC_AHBPeriphClockCmd(LED1_PERIPHERAL, ENABLE);
#endif
#ifdef LED2
RCC_AHBPeriphClockCmd(LED2_PERIPHERAL, ENABLE);
#endif
LED0_OFF;
LED1_OFF;
LED2_OFF; LED2_OFF;
gpioInit(led_config[2].gpio, &cfg);
#endif for (i = 0; i < gpio_count; i++) {
#else gpioInit(gpio_setup[i].gpio, &gpio_setup[i].cfg);
UNUSED(alternative_led); }
#endif
} }

View file

@ -27,12 +27,13 @@
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include "platform.h" #include <platform.h>
#include "build_config.h" #include "build_config.h"
#include "common/color.h" #include "common/color.h"
#include "common/colorconversion.h" #include "common/colorconversion.h"
#include "drivers/dma.h"
#include "drivers/light_ws2811strip.h" #include "drivers/light_ws2811strip.h"
uint8_t ledStripDMABuffer[WS2811_DMA_BUFFER_SIZE]; uint8_t ledStripDMABuffer[WS2811_DMA_BUFFER_SIZE];
@ -76,9 +77,18 @@ void setStripColors(const hsvColor_t *colors)
} }
} }
void ws2811DMAHandler(DMA_Channel_TypeDef *channel) {
if (DMA_GetFlagStatus(WS2811_DMA_TC_FLAG)) {
ws2811LedDataTransferInProgress = 0;
DMA_Cmd(channel, DISABLE);
DMA_ClearFlag(WS2811_DMA_TC_FLAG);
}
}
void ws2811LedStripInit(void) void ws2811LedStripInit(void)
{ {
memset(&ledStripDMABuffer, 0, WS2811_DMA_BUFFER_SIZE); memset(&ledStripDMABuffer, 0, WS2811_DMA_BUFFER_SIZE);
dmaSetHandler(WS2811_DMA_HANDLER_IDENTIFER, ws2811DMAHandler);
ws2811LedStripHardwareInit(); ws2811LedStripHardwareInit();
ws2811UpdateStrip(); ws2811UpdateStrip();
} }

View file

@ -18,7 +18,7 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include <platform.h>
#include "common/color.h" #include "common/color.h"
#include "drivers/light_ws2811strip.h" #include "drivers/light_ws2811strip.h"
@ -112,15 +112,6 @@ void ws2811LedStripHardwareInit(void)
ws2811UpdateStrip(); ws2811UpdateStrip();
} }
void DMA1_Channel6_IRQHandler(void)
{
if (DMA_GetFlagStatus(DMA1_FLAG_TC6)) {
ws2811LedDataTransferInProgress = 0;
DMA_Cmd(DMA1_Channel6, DISABLE); // disable DMA channel 6
DMA_ClearFlag(DMA1_FLAG_TC6); // clear DMA1 Channel 6 transfer complete flag
}
}
void ws2811LedStripDMAEnable(void) void ws2811LedStripDMAEnable(void)
{ {
DMA_SetCurrDataCounter(DMA1_Channel6, WS2811_DMA_BUFFER_SIZE); // load number of bytes to be transferred DMA_SetCurrDataCounter(DMA1_Channel6, WS2811_DMA_BUFFER_SIZE); // load number of bytes to be transferred

View file

@ -18,7 +18,7 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include <platform.h>
#include "gpio.h" #include "gpio.h"
#include "nvic.h" #include "nvic.h"
@ -27,7 +27,6 @@
#include "drivers/light_ws2811strip.h" #include "drivers/light_ws2811strip.h"
#ifndef WS2811_GPIO #ifndef WS2811_GPIO
#define USE_LED_STRIP_ON_DMA1_CHANNEL3
#define WS2811_GPIO GPIOB #define WS2811_GPIO GPIOB
#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOB #define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOB
#define WS2811_GPIO_AF GPIO_AF_1 #define WS2811_GPIO_AF GPIO_AF_1
@ -37,6 +36,9 @@
#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM16 #define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM16
#define WS2811_DMA_CHANNEL DMA1_Channel3 #define WS2811_DMA_CHANNEL DMA1_Channel3
#define WS2811_IRQ DMA1_Channel3_IRQn #define WS2811_IRQ DMA1_Channel3_IRQn
#define WS2811_DMA_TC_FLAG DMA1_FLAG_TC3
#define WS2811_DMA_HANDLER_IDENTIFER DMA1_CH3_HANDLER
#endif #endif
void ws2811LedStripHardwareInit(void) void ws2811LedStripHardwareInit(void)
@ -124,39 +126,6 @@ void ws2811LedStripHardwareInit(void)
ws2811UpdateStrip(); ws2811UpdateStrip();
} }
#ifdef USE_LED_STRIP_ON_DMA1_CHANNEL3
void DMA1_Channel3_IRQHandler(void)
{
if (DMA_GetFlagStatus(DMA1_FLAG_TC3)) {
ws2811LedDataTransferInProgress = 0;
DMA_Cmd(DMA1_Channel3, DISABLE); // disable DMA channel
DMA_ClearFlag(DMA1_FLAG_TC3); // clear DMA1 Channel transfer complete flag
}
}
#endif
#ifdef USE_LED_STRIP_ON_DMA1_CHANNEL2
void DMA1_Channel2_IRQHandler(void)
{
if (DMA_GetFlagStatus(DMA1_FLAG_TC2)) {
ws2811LedDataTransferInProgress = 0;
DMA_Cmd(DMA1_Channel2, DISABLE); // disable DMA channel
DMA_ClearFlag(DMA1_FLAG_TC2); // clear DMA1 Channel transfer complete flag
}
}
#endif
#ifdef USE_LED_STRIP_ON_DMA1_CHANNEL7
void DMA1_Channel7_IRQHandler(void)
{
if (DMA_GetFlagStatus(DMA1_FLAG_TC7)) {
ws2811LedDataTransferInProgress = 0;
DMA_Cmd(DMA1_Channel7, DISABLE); // disable DMA channel
DMA_ClearFlag(DMA1_FLAG_TC7); // clear DMA1 Channel transfer complete flag
}
}
#endif
void ws2811LedStripDMAEnable(void) void ws2811LedStripDMAEnable(void)
{ {
DMA_SetCurrDataCounter(WS2811_DMA_CHANNEL, WS2811_DMA_BUFFER_SIZE); // load number of bytes to be transferred DMA_SetCurrDataCounter(WS2811_DMA_CHANNEL, WS2811_DMA_BUFFER_SIZE); // load number of bytes to be transferred

View file

@ -26,7 +26,7 @@
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include "platform.h" #include <platform.h>
#include "system.h" #include "system.h"
#include "gpio.h" #include "gpio.h"
@ -49,7 +49,7 @@ static uartPort_t uartPort3;
#endif #endif
// Using RX DMA disables the use of receive callbacks // Using RX DMA disables the use of receive callbacks
//#define USE_USART1_RX_DMA #define USE_USART1_RX_DMA
#if defined(CC3D) // FIXME move board specific code to target.h files. #if defined(CC3D) // FIXME move board specific code to target.h files.
#undef USE_USART1_RX_DMA #undef USE_USART1_RX_DMA

View file

@ -27,7 +27,7 @@
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include "platform.h" #include <platform.h>
#include "system.h" #include "system.h"
#include "gpio.h" #include "gpio.h"

View file

@ -19,10 +19,11 @@
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include "platform.h" #include <platform.h>
#include "build_config.h" #include "build_config.h"
#include "drivers/dma.h"
#include "drivers/transponder_ir.h" #include "drivers/transponder_ir.h"
/* /*
@ -37,9 +38,19 @@ uint8_t transponderIrDMABuffer[TRANSPONDER_DMA_BUFFER_SIZE];
volatile uint8_t transponderIrDataTransferInProgress = 0; volatile uint8_t transponderIrDataTransferInProgress = 0;
void transponderDMAHandler(DMA_Channel_TypeDef *channel)
{
if (DMA_GetFlagStatus(TRANSPONDER_DMA_TC_FLAG)) {
transponderIrDataTransferInProgress = 0;
DMA_Cmd(channel, DISABLE);
DMA_ClearFlag(TRANSPONDER_DMA_TC_FLAG);
}
}
void transponderIrInit(void) void transponderIrInit(void)
{ {
memset(&transponderIrDMABuffer, 0, TRANSPONDER_DMA_BUFFER_SIZE); memset(&transponderIrDMABuffer, 0, TRANSPONDER_DMA_BUFFER_SIZE);
dmaSetHandler(TRANSPONDER_DMA_HANDLER_IDENTIFER, transponderDMAHandler);
transponderIrHardwareInit(); transponderIrHardwareInit();
} }
@ -112,4 +123,3 @@ void transponderIrTransmit(void)
transponderIrDataTransferInProgress = 1; transponderIrDataTransferInProgress = 1;
transponderIrDMAEnable(); transponderIrDMAEnable();
} }

View file

@ -30,6 +30,7 @@
#define BIT_TOGGLE_0 0 #define BIT_TOGGLE_0 0
void transponderIrInit(void); void transponderIrInit(void);
void transponderIrDisable(void);
void transponderIrHardwareInit(void); void transponderIrHardwareInit(void);
void transponderIrDMAEnable(void); void transponderIrDMAEnable(void);

View file

@ -18,10 +18,11 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include <platform.h>
#include "drivers/gpio.h"
#include "drivers/transponder_ir.h" #include "drivers/transponder_ir.h"
#include "nvic.h" #include "drivers/nvic.h"
#ifndef TRANSPONDER_GPIO #ifndef TRANSPONDER_GPIO
#define USE_TRANSPONDER_ON_DMA1_CHANNEL3 #define USE_TRANSPONDER_ON_DMA1_CHANNEL3
@ -34,6 +35,8 @@
#define TRANSPONDER_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM16 #define TRANSPONDER_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM16
#define TRANSPONDER_DMA_CHANNEL DMA1_Channel3 #define TRANSPONDER_DMA_CHANNEL DMA1_Channel3
#define TRANSPONDER_IRQ DMA1_Channel3_IRQn #define TRANSPONDER_IRQ DMA1_Channel3_IRQn
#define TRANSPONDER_DMA_TC_FLAG DMA1_FLAG_TC3
#define TRANSPONDER_DMA_HANDLER_IDENTIFER DMA1_CH3_HANDLER
#endif #endif
void transponderIrHardwareInit(void) void transponderIrHardwareInit(void)
@ -116,39 +119,6 @@ void transponderIrHardwareInit(void)
NVIC_Init(&NVIC_InitStructure); NVIC_Init(&NVIC_InitStructure);
} }
#ifdef USE_TRANSPONDER_ON_DMA1_CHANNEL3
void DMA1_Channel3_IRQHandler(void)
{
if (DMA_GetFlagStatus(DMA1_FLAG_TC3)) {
transponderIrDataTransferInProgress = 0;
DMA_Cmd(DMA1_Channel3, DISABLE); // disable DMA channel
DMA_ClearFlag(DMA1_FLAG_TC3); // clear DMA1 Channel transfer complete flag
}
}
#endif
#ifdef USE_TRANSPONDER_ON_DMA1_CHANNEL2
void DMA1_Channel2_IRQHandler(void)
{
if (DMA_GetFlagStatus(DMA1_FLAG_TC2)) {
transponderIrDataTransferInProgress = 0;
DMA_Cmd(DMA1_Channel2, DISABLE); // disable DMA channel
DMA_ClearFlag(DMA1_FLAG_TC2); // clear DMA1 Channel transfer complete flag
}
}
#endif
#ifdef USE_TRANSPONDER_ON_DMA1_CHANNEL7
void DMA1_Channel7_IRQHandler(void)
{
if (DMA_GetFlagStatus(DMA1_FLAG_TC7)) {
transponderIrDataTransferInProgress = 0;
DMA_Cmd(DMA1_Channel7, DISABLE); // disable DMA channel
DMA_ClearFlag(DMA1_FLAG_TC7); // clear DMA1 Channel transfer complete flag
}
}
#endif
void transponderIrDMAEnable(void) void transponderIrDMAEnable(void)
{ {
DMA_SetCurrDataCounter(TRANSPONDER_DMA_CHANNEL, TRANSPONDER_DMA_BUFFER_SIZE); // load number of bytes to be transferred DMA_SetCurrDataCounter(TRANSPONDER_DMA_CHANNEL, TRANSPONDER_DMA_BUFFER_SIZE); // load number of bytes to be transferred
@ -157,4 +127,24 @@ void transponderIrDMAEnable(void)
DMA_Cmd(TRANSPONDER_DMA_CHANNEL, ENABLE); DMA_Cmd(TRANSPONDER_DMA_CHANNEL, ENABLE);
} }
void transponderIrDisable(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DMA_Cmd(TRANSPONDER_DMA_CHANNEL, DISABLE);
TIM_Cmd(TRANSPONDER_TIMER, DISABLE);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = TRANSPONDER_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(TRANSPONDER_GPIO, &GPIO_InitStructure);
#ifdef TRANSPONDER_INVERTED
digitalHi(TRANSPONDER_GPIO, TRANSPONDER_PIN);
#else
digitalLo(TRANSPONDER_GPIO, TRANSPONDER_PIN);
#endif
}

View file

@ -37,13 +37,12 @@
#include <common/printf.h> #include <common/printf.h>
#include "io/rc_controls.h"
#include "sensors/battery.h" #include "sensors/battery.h"
#include "io/rc_controls.h"
#include "io/ledstrip.h" #include "io/ledstrip.h"
#include "rx/rx.h"
#include "flight/failsafe.h" #include "flight/failsafe.h"
#include "config/runtime_config.h" #include "config/runtime_config.h"
@ -382,6 +381,10 @@ void updateLedCount(void)
ledCount = 0; ledCount = 0;
ledsInRingCount = 0; ledsInRingCount = 0;
if( ledConfigs == 0 ){
return;
}
for (ledIndex = 0; ledIndex < MAX_LED_STRIP_LENGTH; ledIndex++) { for (ledIndex = 0; ledIndex < MAX_LED_STRIP_LENGTH; ledIndex++) {
ledConfig = &ledConfigs[ledIndex]; ledConfig = &ledConfigs[ledIndex];
@ -778,13 +781,18 @@ void applyLedThrottleLayer()
#define ROTATION_SEQUENCE_LED_COUNT 6 // 2 on, 4 off #define ROTATION_SEQUENCE_LED_COUNT 6 // 2 on, 4 off
#define ROTATION_SEQUENCE_LED_WIDTH 2 #define ROTATION_SEQUENCE_LED_WIDTH 2
#define RING_PATTERN_NOT_CALCULATED 255
void applyLedThrustRingLayer(void) void applyLedThrustRingLayer(void)
{ {
const ledConfig_t *ledConfig;
hsvColor_t ringColor;
uint8_t ledIndex; uint8_t ledIndex;
// initialised to special value instead of using more memory for a flag.
static uint8_t rotationSeqLedCount = RING_PATTERN_NOT_CALCULATED;
static uint8_t rotationPhase = ROTATION_SEQUENCE_LED_COUNT; static uint8_t rotationPhase = ROTATION_SEQUENCE_LED_COUNT;
bool nextLedOn = false; bool nextLedOn = false;
hsvColor_t ringColor;
const ledConfig_t *ledConfig;
uint8_t ledRingIndex = 0; uint8_t ledRingIndex = 0;
for (ledIndex = 0; ledIndex < ledCount; ledIndex++) { for (ledIndex = 0; ledIndex < ledCount; ledIndex++) {
@ -797,7 +805,7 @@ void applyLedThrustRingLayer(void)
bool applyColor = false; bool applyColor = false;
if (ARMING_FLAG(ARMED)) { if (ARMING_FLAG(ARMED)) {
if ((ledRingIndex + rotationPhase) % ROTATION_SEQUENCE_LED_COUNT < ROTATION_SEQUENCE_LED_WIDTH) { if ((ledRingIndex + rotationPhase) % rotationSeqLedCount < ROTATION_SEQUENCE_LED_WIDTH) {
applyColor = true; applyColor = true;
} }
} else { } else {
@ -818,9 +826,29 @@ void applyLedThrustRingLayer(void)
ledRingIndex++; ledRingIndex++;
} }
uint8_t ledRingLedCount = ledRingIndex;
if (rotationSeqLedCount == RING_PATTERN_NOT_CALCULATED) {
// update ring pattern according to total number of ring leds found
rotationSeqLedCount = ledRingLedCount;
// try to split in segments/rings of exactly ROTATION_SEQUENCE_LED_COUNT leds
if ((ledRingLedCount % ROTATION_SEQUENCE_LED_COUNT) == 0) {
rotationSeqLedCount = ROTATION_SEQUENCE_LED_COUNT;
} else {
// else split up in equal segments/rings of at most ROTATION_SEQUENCE_LED_COUNT leds
while ((rotationSeqLedCount > ROTATION_SEQUENCE_LED_COUNT) && ((rotationSeqLedCount % 2) == 0)) {
rotationSeqLedCount >>= 1;
}
}
// trigger start over
rotationPhase = 1;
}
rotationPhase--; rotationPhase--;
if (rotationPhase == 0) { if (rotationPhase == 0) {
rotationPhase = ROTATION_SEQUENCE_LED_COUNT; rotationPhase = rotationSeqLedCount;
} }
} }
@ -1017,7 +1045,7 @@ bool parseColor(uint8_t index, const char *colorConfig)
void applyDefaultColors(hsvColor_t *colors, uint8_t colorCount) void applyDefaultColors(hsvColor_t *colors, uint8_t colorCount)
{ {
memset(colors, 0, colorCount * sizeof(colors)); memset(colors, 0, colorCount * sizeof(hsvColor_t));
for (uint8_t colorIndex = 0; colorIndex < colorCount && colorIndex < (sizeof(defaultColors) / sizeof(defaultColors[0])); colorIndex++) { for (uint8_t colorIndex = 0; colorIndex < colorCount && colorIndex < (sizeof(defaultColors) / sizeof(defaultColors[0])); colorIndex++) {
*colors++ = *defaultColors[colorIndex]; *colors++ = *defaultColors[colorIndex];
} }

View file

@ -95,4 +95,3 @@ void applyDefaultColors(hsvColor_t *colors, uint8_t colorCount);
void ledStripEnable(void); void ledStripEnable(void);
void reevalulateLedConfig(void); void reevalulateLedConfig(void);

View file

@ -189,15 +189,7 @@ void init(void)
// Latch active features to be used for feature() in the remainder of init(). // Latch active features to be used for feature() in the remainder of init().
latchActiveFeatures(); latchActiveFeatures();
#ifdef ALIENFLIGHTF3 ledInit();
if (hardwareRevision == AFF3_REV_1) {
ledInit(false);
} else {
ledInit(true);
}
#else
ledInit(false);
#endif
#ifdef SPRACINGF3MINI #ifdef SPRACINGF3MINI
gpio_config_t buttonAGpioConfig = { gpio_config_t buttonAGpioConfig = {