diff --git a/.gitignore b/.gitignore
index 245d33be92..fd8ff825fc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,4 +17,5 @@ startup_stm32f10x_md_gcc.s
# script-generated files
docs/Manual.pdf
README.pdf
-
+tools
+downloads
diff --git a/src/main/io/osd.c b/src/main/io/osd.c
index 3217b9f528..6c88e93896 100755
--- a/src/main/io/osd.c
+++ b/src/main/io/osd.c
@@ -520,6 +520,7 @@ OSD_Entry MenuLayout[]=
OSD_UINT8_Struct RSSI_entry = {&OSD_cfg.rssi_alarm,5,90,5};
OSD_UINT16_Struct CAP_entry = {&OSD_cfg.cap_alarm, 50, 30000, 50};
OSD_UINT16_Struct FLY_TIME_entry = {&OSD_cfg.time_alarm, 1, 200, 1};
+OSD_UINT16_Struct ALT_ALARM_entry = {&OSD_cfg.alt_alarm, 1, 200, 1};
OSD_Entry MenuAlarms[]=
{
@@ -527,6 +528,7 @@ OSD_Entry MenuAlarms[]=
{"RSSI", OME_UINT8, NULL, &RSSI_entry},
{"MAIN BATT.", OME_UINT16, NULL, &CAP_entry},
{"FLY TIME", OME_UINT16, NULL, &FLY_TIME_entry},
+ {"MAX ALTITUDE", OME_UINT16, NULL, &ALT_ALARM_entry},
{"BACK", OME_Back, NULL, NULL},
{NULL, OME_END, NULL, NULL}
};
@@ -550,6 +552,7 @@ OSD_Entry MenuLayoutPos[]=
{"GPS SPEED", OME_POS, OSD_EditElement, &masterConfig.osdProfile.item_pos[OSD_GPS_SPEED]},
{"GPS SATS.", OME_POS, OSD_EditElement, &masterConfig.osdProfile.item_pos[OSD_GPS_SATS]},
#endif
+ {"ALTITUDE", OME_POS, OSD_EditElement, &masterConfig.osdProfile.item_pos[OSD_ALTITUDE]},
{"BACK", OME_Back, NULL, NULL},
{NULL, OME_END, NULL, NULL}
};
@@ -575,6 +578,7 @@ OSD_Entry MenuLayoutActiv[]=
{"GPS SPEED", OME_VISIBLE, NULL, &masterConfig.osdProfile.item_pos[OSD_GPS_SPEED]},
{"GPS SATS.", OME_VISIBLE, NULL, &masterConfig.osdProfile.item_pos[OSD_GPS_SATS]},
#endif
+ {"ALTITUDE", OME_VISIBLE, NULL, &masterConfig.osdProfile.item_pos[OSD_ALTITUDE]},
{"BACK", OME_Back, NULL, NULL},
{NULL, OME_END, NULL, NULL}
};
@@ -596,10 +600,12 @@ void resetOsdConfig(osd_profile *osdProfile)
osdProfile->item_pos[OSD_MAH_DRAWN] = OSD_POS(15,3);
osdProfile->item_pos[OSD_GPS_SPEED] = OSD_POS(2,2);
osdProfile->item_pos[OSD_GPS_SATS] = OSD_POS(2,12);
+ osdProfile->item_pos[OSD_ALTITUDE] = OSD_POS(1,5);
osdProfile->rssi_alarm = 20;
osdProfile->cap_alarm = 2200;
osdProfile->time_alarm = 10; //in minutes
+ osdProfile->alt_alarm = 100; //meters or feet depend on configuration
osdProfile->video_system = 0;
}
@@ -777,6 +783,25 @@ void OSD_SPEED(void)
#endif
+void OSD_BARO_ALTITUDE(void)
+{
+
+ char buff[16];
+ int32_t alt = BaroAlt; // Metre x 100
+ char unitSym = 0xC; // m
+
+ if (!VISIBLE(OSD_cfg.item_pos[OSD_ALTITUDE]) || BLINK(OSD_cfg.item_pos[OSD_ALTITUDE]))
+ return;
+
+ if (masterConfig.osdProfile.units == OSD_UNIT_IMPERIAL) {
+ alt = (alt * 328) / 100; // Convert to feet x 100
+ unitSym = 0xF; // ft
+ }
+
+ sprintf(buff, "%c%d.%01d%c", alt < 0 ? '-' : ' ', abs(alt / 100), abs((alt % 100) / 10), unitSym);
+ max7456_write(OSD_X(OSD_cfg.item_pos[OSD_ALTITUDE]), OSD_Y(OSD_cfg.item_pos[OSD_ALTITUDE]), buff);
+}
+
void OSD_ON_TIME(void)
{
char buff[8];
@@ -873,6 +898,7 @@ void OSD_VTX_CHAN(void)
void OSD_UpdateAlarms(void)
{
uint16_t rval = rssi * 100 / 1024; //zmiana zakresu
+ int32_t alt = BaroAlt/100;
if (rval < OSD_cfg.rssi_alarm)
OSD_cfg.item_pos[OSD_RSSI_VALUE] |= BLINK_FLAG;
@@ -898,6 +924,16 @@ void OSD_UpdateAlarms(void)
OSD_cfg.item_pos[OSD_MAH_DRAWN] |= BLINK_FLAG;
else
OSD_cfg.item_pos[OSD_MAH_DRAWN] &= ~BLINK_FLAG;
+
+ if (masterConfig.osdProfile.units == OSD_UNIT_IMPERIAL) {
+ alt = (alt * 328) / 100; // Convert to feet
+ }
+
+ if (alt >= OSD_cfg.alt_alarm)
+ OSD_cfg.item_pos[OSD_ALTITUDE] |= BLINK_FLAG;
+ else
+ OSD_cfg.item_pos[OSD_ALTITUDE] &= ~BLINK_FLAG;
+
}
void OSD_TurnOffAlarms(void)
@@ -947,6 +983,7 @@ void OSD_DrawElements(void)
OSD_SPEED();
}
#endif
+ OSD_BARO_ALTITUDE();
}
uint8_t OSDHandleKey(uint8_t key)
diff --git a/src/main/io/osd.h b/src/main/io/osd.h
index 2a128b65e3..36586d7524 100755
--- a/src/main/io/osd.h
+++ b/src/main/io/osd.h
@@ -17,16 +17,25 @@ typedef enum {
OSD_MAH_DRAWN,
OSD_GPS_SPEED,
OSD_GPS_SATS,
+ OSD_ALTITUDE,
OSD_MAX_ITEMS, // MUST BE LAST
} osd_items_t;
+typedef enum {
+ OSD_UNIT_IMPERIAL,
+ OSD_UNIT_METRIC
+} osd_unit_t;
+
typedef struct {
uint16_t item_pos[OSD_MAX_ITEMS];
//alarms
uint8_t rssi_alarm;
uint16_t cap_alarm;
uint16_t time_alarm;
+ uint16_t alt_alarm;
+
uint8_t video_system;
+ osd_unit_t units;
} osd_profile;
typedef struct {
diff --git a/src/main/io/serial_cli.c b/src/main/io/serial_cli.c
index 512fd43f61..f07f6d40d0 100755
--- a/src/main/io/serial_cli.c
+++ b/src/main/io/serial_cli.c
@@ -916,6 +916,7 @@ const clivalue_t valueTable[] = {
#ifdef OSD
{ "osd_video_system", VAR_UINT8 | MASTER_VALUE, &masterConfig.osdProfile.video_system, .config.minmax = { 0, 2 } },
+ { "osd_units", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.osdProfile.units, .config.lookup = { TABLE_UNIT } },
{ "osd_rssi_alarm", VAR_UINT8 | MASTER_VALUE, &masterConfig.osdProfile.rssi_alarm, .config.minmax = { 0, 100 } },
{ "osd_cap_alarm", VAR_UINT16 | MASTER_VALUE, &masterConfig.osdProfile.cap_alarm, .config.minmax = { 0, 20000 } },
{ "osd_time_alarm", VAR_UINT16 | MASTER_VALUE, &masterConfig.osdProfile.time_alarm, .config.minmax = { 0, 60 } },
@@ -933,6 +934,7 @@ const clivalue_t valueTable[] = {
{ "osd_craft_name_pos", VAR_UINT16 | MASTER_VALUE, &masterConfig.osdProfile.item_pos[OSD_CRAFT_NAME], .config.minmax = { 0, 65536 } },
{ "osd_gps_speed_pos", VAR_UINT16 | MASTER_VALUE, &masterConfig.osdProfile.item_pos[OSD_GPS_SPEED], .config.minmax = { 0, 65536 } },
{ "osd_gps_sats_pos", VAR_UINT16 | MASTER_VALUE, &masterConfig.osdProfile.item_pos[OSD_GPS_SATS], .config.minmax = { 0, 65536 } },
+ { "osd_altitude", VAR_UINT16 | MASTER_VALUE, &masterConfig.osdProfile.item_pos[OSD_ALTITUDE], .config.minmax = { 0, 65536 } },
#endif
};
diff --git a/src/main/io/serial_msp.c b/src/main/io/serial_msp.c
index 661f81b987..31773f288b 100755
--- a/src/main/io/serial_msp.c
+++ b/src/main/io/serial_msp.c
@@ -1197,10 +1197,11 @@ static bool processOutCommand(uint8_t cmdMSP)
case MSP_OSD_CONFIG:
#ifdef OSD
- headSerialReply(7 + (OSD_MAX_ITEMS * 2));
+ headSerialReply(8 + (OSD_MAX_ITEMS * 2));
serialize8(1); // OSD supported
// send video system (AUTO/PAL/NTSC)
serialize8(masterConfig.osdProfile.video_system);
+ serialize8(masterConfig.osdProfile.units);
serialize8(masterConfig.osdProfile.rssi_alarm);
serialize16(masterConfig.osdProfile.cap_alarm);
serialize16(masterConfig.osdProfile.time_alarm);
@@ -1585,6 +1586,7 @@ static bool processInCommand(void)
// set all the other settings
if ((int8_t)addr == -1) {
masterConfig.osdProfile.video_system = read8();
+ masterConfig.osdProfile.units = read8();
}
// set a position setting
else {
diff --git a/src/main/mw.c b/src/main/mw.c
index b112aa6678..b791c5c0c5 100644
--- a/src/main/mw.c
+++ b/src/main/mw.c
@@ -979,8 +979,10 @@ void taskUpdateCompass(void)
void taskUpdateBaro(void)
{
if (sensors(SENSOR_BARO)) {
- uint32_t newDeadline = baroUpdate();
- rescheduleTask(TASK_SELF, newDeadline);
+ const uint32_t newDeadline = baroUpdate();
+ if (newDeadline != 0) {
+ rescheduleTask(TASK_SELF, newDeadline);
+ }
}
}
#endif
diff --git a/src/main/target/FURYF4/target.h b/src/main/target/FURYF4/target.h
index 2f0cfb8636..ab8f1e3869 100644
--- a/src/main/target/FURYF4/target.h
+++ b/src/main/target/FURYF4/target.h
@@ -140,7 +140,7 @@
#define USE_ADC
#define BOARD_HAS_VOLTAGE_DIVIDER
#define VBAT_ADC_PIN PC1
-#define RSSI_ADC_GPIO_PIN PC2
+#define RSSI_ADC_PIN PC2
#define CURRENT_METER_ADC_PIN PC3
#define DEFAULT_FEATURES (FEATURE_VBAT | FEATURE_BLACKBOX)
diff --git a/src/main/target/IMPULSERCF3/target.c b/src/main/target/IMPULSERCF3/target.c
new file mode 100644
index 0000000000..6c98e152c7
--- /dev/null
+++ b/src/main/target/IMPULSERCF3/target.c
@@ -0,0 +1,77 @@
+/*
+ * 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 .
+ */
+
+#include
+
+#include
+#include "drivers/io.h"
+#include "drivers/pwm_mapping.h"
+
+
+const uint16_t multiPPM[] = {
+ PWM1 | (MAP_TO_PPM_INPUT << 8),
+ PWM2 | (MAP_TO_MOTOR_OUTPUT << 8),
+ PWM3 | (MAP_TO_MOTOR_OUTPUT << 8),
+ PWM4 | (MAP_TO_MOTOR_OUTPUT << 8),
+ PWM5 | (MAP_TO_MOTOR_OUTPUT << 8),
+ PWM6 | (MAP_TO_MOTOR_OUTPUT << 8),
+ PWM7 | (MAP_TO_MOTOR_OUTPUT << 8),
+ 0xFFFF
+};
+
+const uint16_t multiPWM[] = {
+ PWM2 | (MAP_TO_MOTOR_OUTPUT << 8),
+ PWM3 | (MAP_TO_MOTOR_OUTPUT << 8),
+ PWM4 | (MAP_TO_MOTOR_OUTPUT << 8),
+ PWM5 | (MAP_TO_MOTOR_OUTPUT << 8),
+ PWM6 | (MAP_TO_MOTOR_OUTPUT << 8),
+ PWM7 | (MAP_TO_MOTOR_OUTPUT << 8),
+ 0xFFFF
+};
+
+const uint16_t airPPM[] = {
+ PWM1 | (MAP_TO_PPM_INPUT << 8),
+ PWM2 | (MAP_TO_MOTOR_OUTPUT << 8),
+ PWM3 | (MAP_TO_MOTOR_OUTPUT << 8),
+ PWM4 | (MAP_TO_SERVO_OUTPUT << 8),
+ PWM5 | (MAP_TO_SERVO_OUTPUT << 8),
+ PWM6 | (MAP_TO_MOTOR_OUTPUT << 8),
+ PWM7 | (MAP_TO_MOTOR_OUTPUT << 8),
+ 0xFFFF
+};
+
+const uint16_t airPWM[] = {
+ PWM2 | (MAP_TO_MOTOR_OUTPUT << 8),
+ PWM3 | (MAP_TO_MOTOR_OUTPUT << 8),
+ PWM4 | (MAP_TO_SERVO_OUTPUT << 8),
+ PWM5 | (MAP_TO_SERVO_OUTPUT << 8),
+ PWM6 | (MAP_TO_MOTOR_OUTPUT << 8),
+ PWM7 | (MAP_TO_MOTOR_OUTPUT << 8),
+ 0xFFFF
+};
+
+const timerHardware_t timerHardware[USABLE_TIMER_CHANNEL_COUNT] = {
+ { TIM2, IO_TAG(PA15), TIM_Channel_1, TIM2_IRQn, 0, IOCFG_AF_PP, GPIO_AF_1}, // PPM/SERIAL RX
+ { TIM3, IO_TAG(PB4), TIM_Channel_1, TIM3_IRQn, 0, IOCFG_AF_PP, GPIO_AF_2}, // PWM1
+ { TIM3, IO_TAG(PB5), TIM_Channel_2, TIM3_IRQn, 0, IOCFG_AF_PP, GPIO_AF_2}, // PWM2
+ { TIM3, IO_TAG(PB1), TIM_Channel_4, TIM3_IRQn, 0, IOCFG_AF_PP, GPIO_AF_2}, // PWM3
+ { TIM3, IO_TAG(PB0), TIM_Channel_3, TIM3_IRQn, 0, IOCFG_AF_PP, GPIO_AF_2}, // PWM4
+ { TIM16, IO_TAG(PB8), TIM_Channel_1, TIM1_UP_TIM16_IRQn, 1, IOCFG_AF_PP, GPIO_AF_1}, // PWM5
+ { TIM17, IO_TAG(PB9), TIM_Channel_1, TIM1_TRG_COM_TIM17_IRQn, 1, IOCFG_AF_PP, GPIO_AF_1}, // PWM6
+ { TIM1, IO_TAG(PA8), TIM_Channel_1, TIM1_CC_IRQn, 1, IOCFG_AF_PP, GPIO_AF_6}, // LED_STRIP
+};
+
diff --git a/src/main/target/IMPULSERCF3/target.h b/src/main/target/IMPULSERCF3/target.h
new file mode 100644
index 0000000000..f293c070b3
--- /dev/null
+++ b/src/main/target/IMPULSERCF3/target.h
@@ -0,0 +1,113 @@
+/*
+ * 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 .
+ */
+
+#pragma once
+
+#define TARGET_BOARD_IDENTIFIER "IMF3"
+
+#define CONFIG_FASTLOOP_PREFERRED_ACC ACC_NONE
+
+#define LED0 PB7
+
+#define BEEPER PC15
+
+#define USABLE_TIMER_CHANNEL_COUNT 8
+
+#define USB_IO
+
+#define USE_EXTI
+#define MPU_INT_EXTI PC13
+#define EXTI15_10_CALLBACK_HANDLER_COUNT 1
+#define USE_MPU_DATA_READY_SIGNAL
+#define ENSURE_MPU_DATA_READY_IS_LOW
+
+#define GYRO
+#define USE_GYRO_SPI_MPU6000
+#define GYRO_MPU6000_ALIGN CW0_DEG
+
+#define ACC
+#define USE_ACC_SPI_MPU6000
+#define ACC_MPU6000_ALIGN CW0_DEG
+
+#define USE_FLASHFS
+#define USE_FLASH_M25P16
+
+#define USE_VCP
+#define USE_UART1
+#define USE_UART2
+#define USE_UART3
+#define SERIAL_PORT_COUNT 4
+
+#define UART1_TX_PIN PA9
+#define UART1_RX_PIN PA10
+
+#define UART2_TX_PIN PA14
+#define UART2_RX_PIN PA15
+
+#define UART3_TX_PIN PB10
+#define UART3_RX_PIN PB11
+
+#define USE_SPI
+#define USE_SPI_DEVICE_1 // PA4, 5, 6, 7
+#define USE_SPI_DEVICE_2 // PB12,13,14,15 on AF5
+
+#define M25P16_CS_GPIO GPIOB
+#define M25P16_CS_PIN PB12
+#define M25P16_SPI_INSTANCE SPI2
+
+#define MPU6000_CS_PIN PA4
+#define MPU6000_SPI_INSTANCE SPI1
+
+#define BOARD_HAS_VOLTAGE_DIVIDER
+#define USE_ADC
+#define ADC_INSTANCE ADC1
+#define CURRENT_METER_ADC_PIN PA0
+#define RSSI_ADC_PIN PA1
+#define VBAT_ADC_PIN PA2
+
+#define LED_STRIP
+
+#define USE_LED_STRIP_ON_DMA1_CHANNEL2
+#define WS2811_PIN PA8
+#define WS2811_TIMER TIM1
+#define WS2811_DMA_CHANNEL DMA1_Channel2
+#define WS2811_IRQ DMA1_Channel2_IRQn
+#define WS2811_DMA_TC_FLAG DMA1_FLAG_TC2
+#define WS2811_DMA_HANDLER_IDENTIFER DMA1_CH2_HANDLER
+
+#define ENABLE_BLACKBOX_LOGGING_ON_SPIFLASH_BY_DEFAULT
+
+#define DEFAULT_FEATURES (FEATURE_VBAT | FEATURE_BLACKBOX)
+#define DEFAULT_RX_FEATURE FEATURE_RX_SERIAL
+#define SERIALRX_UART SERIAL_PORT_USART3
+
+#define SPEKTRUM_BIND
+// USART2, PA15
+#define BIND_PIN PA15
+
+#define USE_SERIAL_4WAY_BLHELI_INTERFACE
+
+// IO - stm32f303cc in 48pin package
+#define TARGET_IO_PORTA 0xffff
+#define TARGET_IO_PORTB 0xffff
+#define TARGET_IO_PORTC (BIT(13)|BIT(14)|BIT(15))
+//#define TARGET_IO_PORTF (BIT(0)|BIT(1))
+// !!TODO - check the following line is correct
+#define TARGET_IO_PORTF (BIT(0)|BIT(1)|BIT(3)|BIT(4))
+
+#define USED_TIMERS (TIM_N(1) | TIM_N(2) | TIM_N(3) | TIM_N(16) |TIM_N(17))
+
diff --git a/src/main/target/IMPULSERCF3/target.mk b/src/main/target/IMPULSERCF3/target.mk
new file mode 100644
index 0000000000..ec4b5802f2
--- /dev/null
+++ b/src/main/target/IMPULSERCF3/target.mk
@@ -0,0 +1,10 @@
+F3_TARGETS += $(TARGET)
+FEATURES = VCP ONBOARDFLASH
+
+TARGET_SRC = \
+ drivers/accgyro_mpu.c \
+ drivers/accgyro_spi_mpu6000.c \
+ drivers/flash_m25p16.c \
+ drivers/light_ws2811strip.c \
+ drivers/light_ws2811strip_stm32f30x.c
+
diff --git a/src/main/target/OMNIBUSF4/target.c b/src/main/target/OMNIBUSF4/target.c
index 7dd021055e..0c3c9ecfcb 100644
--- a/src/main/target/OMNIBUSF4/target.c
+++ b/src/main/target/OMNIBUSF4/target.c
@@ -29,11 +29,6 @@ const uint16_t multiPPM[] = {
PWM10 | (MAP_TO_MOTOR_OUTPUT << 8),
PWM11 | (MAP_TO_MOTOR_OUTPUT << 8),
PWM12 | (MAP_TO_MOTOR_OUTPUT << 8),
- PWM2 | (MAP_TO_MOTOR_OUTPUT << 8), // Swap to servo if needed
- PWM3 | (MAP_TO_MOTOR_OUTPUT << 8), // Swap to servo if needed
- PWM4 | (MAP_TO_MOTOR_OUTPUT << 8), // Swap to servo if needed
- PWM5 | (MAP_TO_MOTOR_OUTPUT << 8), // Swap to servo if needed
- PWM1 | (MAP_TO_MOTOR_OUTPUT << 8), // Swap to servo if needed
0xFFFF
};
@@ -61,11 +56,6 @@ const uint16_t airPPM[] = {
PWM10 | (MAP_TO_SERVO_OUTPUT << 8),
PWM11 | (MAP_TO_SERVO_OUTPUT << 8),
PWM12 | (MAP_TO_SERVO_OUTPUT << 8),
- PWM2 | (MAP_TO_SERVO_OUTPUT << 8),
- PWM3 | (MAP_TO_SERVO_OUTPUT << 8),
- PWM4 | (MAP_TO_SERVO_OUTPUT << 8),
- PWM5 | (MAP_TO_SERVO_OUTPUT << 8),
- PWM1 | (MAP_TO_SERVO_OUTPUT << 8),
0xFFFF
};
@@ -87,17 +77,17 @@ const uint16_t airPWM[] = {
const timerHardware_t timerHardware[USABLE_TIMER_CHANNEL_COUNT] = {
- { TIM12, IO_TAG(PB14), TIM_Channel_1, TIM8_BRK_TIM12_IRQn, IOCFG_IPD, GPIO_Mode_AF, GPIO_AF_TIM12 }, // PPM (5th pin on FlexiIO port)
- { TIM12, IO_TAG(PB15), TIM_Channel_2, TIM8_BRK_TIM12_IRQn, IOCFG_IPD, GPIO_Mode_AF, GPIO_AF_TIM12 }, // S2_IN - GPIO_PartialRemap_TIM3
- { TIM8, IO_TAG(PC6), TIM_Channel_1, TIM8_CC_IRQn, IOCFG_IPD, GPIO_Mode_AF, GPIO_AF_TIM8 }, // S3_IN
- { TIM8, IO_TAG(PC7), TIM_Channel_2, TIM8_CC_IRQn, IOCFG_IPD, GPIO_Mode_AF, GPIO_AF_TIM8 }, // S4_IN
- { TIM8, IO_TAG(PC8), TIM_Channel_3, TIM8_CC_IRQn, IOCFG_IPD, GPIO_Mode_AF, GPIO_AF_TIM8 }, // S5_IN
- { TIM8, IO_TAG(PC9), TIM_Channel_4, TIM8_CC_IRQn, IOCFG_IPD, GPIO_Mode_AF, GPIO_AF_TIM8 }, // S6_IN
+ { TIM12, IO_TAG(PB14), TIM_Channel_1, TIM8_BRK_TIM12_IRQn, 0, IOCFG_IPD, GPIO_AF_TIM12 },// PPM (5th pin on FlexiIO port)
+ { TIM12, IO_TAG(PB15), TIM_Channel_2, TIM8_BRK_TIM12_IRQn, 0, IOCFG_IPD, GPIO_AF_TIM12 },// S2_IN - GPIO_PartialRemap_TIM3
+ { TIM8, IO_TAG(PC6), TIM_Channel_1, TIM8_CC_IRQn, 0, IOCFG_IPD, GPIO_AF_TIM8 }, // S3_IN
+ { TIM8, IO_TAG(PC7), TIM_Channel_2, TIM8_CC_IRQn, 0, IOCFG_IPD, GPIO_AF_TIM8 }, // S4_IN
+ { TIM8, IO_TAG(PC8), TIM_Channel_3, TIM8_CC_IRQn, 0, IOCFG_IPD, GPIO_AF_TIM8 }, // S5_IN
+ { TIM8, IO_TAG(PC9), TIM_Channel_4, TIM8_CC_IRQn, 0, IOCFG_IPD, GPIO_AF_TIM8 }, // S6_IN
- { TIM3, IO_TAG(PB0), TIM_Channel_3, TIM3_IRQn, IOCFG_AF_PP_PD, GPIO_Mode_AF, GPIO_AF_TIM3 }, // S1_OUT
- { TIM3, IO_TAG(PB1), TIM_Channel_4, TIM3_IRQn, IOCFG_AF_PP_PD, GPIO_Mode_AF, GPIO_AF_TIM3 }, // S2_OUT
- { TIM9, IO_TAG(PA3), TIM_Channel_2, TIM1_BRK_TIM9_IRQn, IOCFG_AF_PP_PD, GPIO_Mode_AF, GPIO_AF_TIM9 }, // S3_OUT
- { TIM2, IO_TAG(PA2), TIM_Channel_3, TIM2_IRQn, IOCFG_AF_PP_PD, GPIO_Mode_AF, GPIO_AF_TIM2 }, // S4_OUT
- { TIM5, IO_TAG(PA1), TIM_Channel_2, TIM5_IRQn, IOCFG_AF_PP_PD, GPIO_Mode_AF, GPIO_AF_TIM5 }, // S5_OUT - GPIO_PartialRemap_TIM3
- { TIM5, IO_TAG(PA0), TIM_Channel_1, TIM5_IRQn, IOCFG_AF_PP_PD, GPIO_Mode_AF, GPIO_AF_TIM5 }, // S6_OUT
+ { TIM3, IO_TAG(PB0), TIM_Channel_3, TIM3_IRQn, 1, IOCFG_AF_PP_PD, GPIO_AF_TIM3 }, // S1_OUT
+ { TIM3, IO_TAG(PB1), TIM_Channel_4, TIM3_IRQn, 1, IOCFG_AF_PP_PD, GPIO_AF_TIM3 }, // S2_OUT
+ { TIM9, IO_TAG(PA3), TIM_Channel_2, TIM1_BRK_TIM9_IRQn, 1, IOCFG_AF_PP_PD, GPIO_AF_TIM9 }, // S4_OUT
+ { TIM2, IO_TAG(PA2), TIM_Channel_3, TIM2_IRQn, 1, IOCFG_AF_PP_PD, GPIO_AF_TIM2 }, // S4_OUT
+ { TIM5, IO_TAG(PA1), TIM_Channel_2, TIM5_IRQn, 1, IOCFG_AF_PP_PD, GPIO_AF_TIM5 }, // S5_OUT - GPIO_PartialRemap_TIM3
+ { TIM5, IO_TAG(PA0), TIM_Channel_1, TIM5_IRQn, 1, IOCFG_AF_PP_PD, GPIO_AF_TIM5 }, // S6_OUT
};
diff --git a/src/main/target/OMNIBUSF4/target.h b/src/main/target/OMNIBUSF4/target.h
index 4bd45103a3..dd30c52f28 100644
--- a/src/main/target/OMNIBUSF4/target.h
+++ b/src/main/target/OMNIBUSF4/target.h
@@ -114,7 +114,7 @@
#define USE_ADC
#define CURRENT_METER_ADC_PIN PC1
#define VBAT_ADC_PIN PC2
-#define RSSI_ADC_GPIO_PIN PA0
+#define RSSI_ADC_PIN PA0
#define SENSORS_SET (SENSOR_ACC)
diff --git a/src/main/target/REVO/target.h b/src/main/target/REVO/target.h
index b697c887f3..ca6ea3b4f2 100644
--- a/src/main/target/REVO/target.h
+++ b/src/main/target/REVO/target.h
@@ -27,8 +27,12 @@
#endif
#define LED0 PB5
-#define LED1 PB4
+// Disable LED1, conflicts with AirbotF4/Flip32F4 beeper
+//#define LED1 PB4
+
#define BEEPER PB4
+#define BEEPER_INVERTED
+
#define INVERTER PC0 // PC0 used as inverter select GPIO
#define INVERTER_USART USART1
@@ -103,12 +107,23 @@
#define USE_ADC
#define CURRENT_METER_ADC_PIN PC1
#define VBAT_ADC_PIN PC2
-#define RSSI_ADC_GPIO_PIN PA0
+//#define RSSI_ADC_PIN PA0
+#define LED_STRIP
+// LED Strip can run off Pin 6 (PA0) of the MOTOR outputs.
+#define WS2811_GPIO_AF GPIO_AF_TIM5
+#define WS2811_PIN PA0
+#define WS2811_TIMER TIM5
+#define WS2811_TIMER_CHANNEL TIM_Channel_2
+#define WS2811_DMA_HANDLER_IDENTIFER DMA1_ST2_HANDLER
+#define WS2811_DMA_STREAM DMA1_Stream2
+#define WS2811_DMA_CHANNEL DMA_Channel_6
+#define WS2811_DMA_IRQ DMA1_Stream2_IRQn
+#define WS2811_DMA_FLAG DMA_FLAG_TCIF2
+#define WS2811_DMA_IT DMA_IT_TCIF2
#define SENSORS_SET (SENSOR_ACC)
-
#define DEFAULT_RX_FEATURE FEATURE_RX_SERIAL
#define DEFAULT_FEATURES (FEATURE_BLACKBOX)
diff --git a/src/main/target/REVO/target.mk b/src/main/target/REVO/target.mk
index 7347dd10f2..e3fc89c21c 100644
--- a/src/main/target/REVO/target.mk
+++ b/src/main/target/REVO/target.mk
@@ -4,5 +4,6 @@ FEATURES += VCP ONBOARDFLASH
TARGET_SRC = \
drivers/accgyro_spi_mpu6000.c \
drivers/barometer_ms5611.c \
- drivers/compass_hmc5883l.c
-
+ drivers/compass_hmc5883l.c \
+ drivers/light_ws2811strip.c \
+ drivers/light_ws2811strip_stm32f4xx.c
diff --git a/src/main/target/VRRACE/target.h b/src/main/target/VRRACE/target.h
index cda9b14463..fbca59cbea 100644
--- a/src/main/target/VRRACE/target.h
+++ b/src/main/target/VRRACE/target.h
@@ -153,7 +153,7 @@
#define USE_ADC
#define BOARD_HAS_VOLTAGE_DIVIDER
#define VBAT_ADC_PIN PC0
-#define RSSI_ADC_GPIO_PIN PB1
+#define RSSI_ADC_PIN PB1
#define CURRENT_METER_ADC_PIN PA5
#define DEFAULT_FEATURES (FEATURE_VBAT | FEATURE_SOFTSERIAL | FEATURE_TELEMETRY)
diff --git a/src/main/version.h b/src/main/version.h
index 0f770674c1..f566ea80ab 100644
--- a/src/main/version.h
+++ b/src/main/version.h
@@ -17,7 +17,7 @@
#define FC_VERSION_MAJOR 3 // increment when a major release is made (big new feature, etc)
#define FC_VERSION_MINOR 0 // increment when a minor release is made (small new feature, change etc)
-#define FC_VERSION_PATCH_LEVEL 0 // increment when a bug is fixed
+#define FC_VERSION_PATCH_LEVEL 1 // increment when a bug is fixed
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)