diff --git a/CMakeLists.txt b/CMakeLists.txt index 87172bfc43..6183069ba1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,7 +51,7 @@ else() endif() endif() -project(INAV VERSION 8.1.0) +project(INAV VERSION 8.0.1) enable_language(ASM) diff --git a/docs/ADSB.md b/docs/ADSB.md index 933cb264cd..3a36d1aa34 100644 --- a/docs/ADSB.md +++ b/docs/ADSB.md @@ -13,6 +13,7 @@ All ADSB receivers which can send Mavlink [ADSB_VEHICLE](https://mavlink.io/en/m * [PINGRX](https://uavionix.com/product/pingrx-pro/) (not tested) * [TT-SC1](https://www.aerobits.pl/product/aero/) (tested) +* [ADSBee1090](https://pantsforbirds.com/adsbee-1090/) (tested) ## TT-SC1 settings * download software for ADSB TT-SC1 from https://www.aerobits.pl/product/aero/ , file Micro_ADSB_App-vX.XX.X_win_setup.zip and install it @@ -24,3 +25,21 @@ All ADSB receivers which can send Mavlink [ADSB_VEHICLE](https://mavlink.io/en/m PCB board for TT-SC1-B module https://oshwlab.com/error414/adsb-power-board ![TT-SC1 settings](Screenshots/ADSB_TTSC01_settings.png) +## ADSBee 1090 settings +* connect to ADSBee1090 via USB and set COMMS_UART to mavlink2 \ +`` +AT+PROTOCOL=COMMS_UART,MAVLINK2 +``\ +`` +AT+BAUDRATE=COMMS_UART,115200 +``\ +It's recommended to turn of wifi \ +`` +AT+ESP32_ENABLE=0 +``\ +`` +AT+SETTINGS=SAVE +`` +* in INAV configurator ports TAB set telemetry MAVLINK, and baudrate 115200 +* https://pantsforbirds.com/adsbee-1090/quick-start/ + diff --git a/lib/main/STM32H7/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_mdma.c b/lib/main/STM32H7/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_mdma.c index c57e98d3a2..dcd5f41a6b 100644 --- a/lib/main/STM32H7/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_mdma.c +++ b/lib/main/STM32H7/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_mdma.c @@ -23,8 +23,10 @@ #ifdef USE_FULL_ASSERT #include "stm32_assert.h" #else +#ifndef assert_param #define assert_param(expr) ((void)0U) #endif +#endif /** @addtogroup STM32H7xx_LL_Driver * @{ diff --git a/lib/main/STM32H7/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_rcc.c b/lib/main/STM32H7/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_rcc.c index e7b85d92d6..7aa7d509dd 100644 --- a/lib/main/STM32H7/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_rcc.c +++ b/lib/main/STM32H7/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_rcc.c @@ -22,8 +22,10 @@ #ifdef USE_FULL_ASSERT #include "stm32_assert.h" #else +#ifndef assert_param #define assert_param(expr) ((void)0U) #endif +#endif /** @addtogroup STM32H7xx_LL_Driver * @{ diff --git a/src/main/navigation/navigation_multicopter.c b/src/main/navigation/navigation_multicopter.c index cd23edd6b3..811186d0bd 100644 --- a/src/main/navigation/navigation_multicopter.c +++ b/src/main/navigation/navigation_multicopter.c @@ -140,19 +140,14 @@ bool adjustMulticopterAltitudeFromRCInput(void) const int16_t rcThrottleAdjustment = applyDeadbandRescaled(rcCommand[THROTTLE] - altHoldThrottleRCZero, rcControlsConfig()->alt_hold_deadband, -500, 500); if (rcThrottleAdjustment) { - // set velocity proportional to stick movement - float rcClimbRate; + /* Set velocity proportional to stick movement + * Scale from altHoldThrottleRCZero to maxthrottle or minthrottle to altHoldThrottleRCZero */ - // Make sure we can satisfy max_manual_climb_rate in both up and down directions - if (rcThrottleAdjustment > 0) { - // Scaling from altHoldThrottleRCZero to maxthrottle - rcClimbRate = rcThrottleAdjustment * navConfig()->mc.max_manual_climb_rate / (float)(getMaxThrottle() - altHoldThrottleRCZero - rcControlsConfig()->alt_hold_deadband); - } - else { - // Scaling from minthrottle to altHoldThrottleRCZero - rcClimbRate = rcThrottleAdjustment * navConfig()->mc.max_manual_climb_rate / (float)(altHoldThrottleRCZero - getThrottleIdleValue() - rcControlsConfig()->alt_hold_deadband); - } + // Calculate max up or min down limit value scaled for deadband + int16_t limitValue = rcThrottleAdjustment > 0 ? getMaxThrottle() : getThrottleIdleValue(); + limitValue = applyDeadbandRescaled(limitValue - altHoldThrottleRCZero, rcControlsConfig()->alt_hold_deadband, -500, 500); + int16_t rcClimbRate = ABS(rcThrottleAdjustment) * navConfig()->mc.max_manual_climb_rate / limitValue; updateClimbRateToAltitudeController(rcClimbRate, 0, ROC_TO_ALT_CONSTANT); return true; diff --git a/src/main/rx/jetiexbus.c b/src/main/rx/jetiexbus.c index 9e3c04d2c1..a793bdae2c 100644 --- a/src/main/rx/jetiexbus.c +++ b/src/main/rx/jetiexbus.c @@ -39,6 +39,7 @@ #include #include +#include #include "platform.h" @@ -48,6 +49,7 @@ #include "build/debug.h" #include "common/utils.h" +#include "common/maths.h" #include "drivers/time.h" @@ -83,13 +85,15 @@ serialPort_t *jetiExBusPort; -uint32_t jetiTimeStampRequest = 0; +volatile uint32_t jetiTimeStampRequest = 0; + +volatile bool jetiExBusCanTx = false; static uint8_t jetiExBusFramePosition; static uint8_t jetiExBusFrameLength; -static uint8_t jetiExBusFrameState = EXBUS_STATE_ZERO; -uint8_t jetiExBusRequestState = EXBUS_STATE_ZERO; +static volatile uint8_t jetiExBusFrameState = EXBUS_STATE_ZERO; +volatile uint8_t jetiExBusRequestState = EXBUS_STATE_ZERO; // Use max values for ram areas static uint8_t jetiExBusChannelFrame[EXBUS_MAX_CHANNEL_FRAME_SIZE]; @@ -117,16 +121,18 @@ void jetiExBusDecodeChannelFrame(uint8_t *exBusFrame) { uint16_t value; uint8_t frameAddr; + uint8_t channelDataLen = exBusFrame[EXBUS_HEADER_LEN - 1]; + uint8_t receivedChannelCount = MIN((channelDataLen) / 2, JETIEXBUS_CHANNEL_COUNT); // Decode header switch (((uint16_t)exBusFrame[EXBUS_HEADER_SYNC] << 8) | ((uint16_t)exBusFrame[EXBUS_HEADER_REQ])) { case EXBUS_CHANNELDATA_DATA_REQUEST: // not yet specified case EXBUS_CHANNELDATA: - for (uint8_t i = 0; i < JETIEXBUS_CHANNEL_COUNT; i++) { - frameAddr = EXBUS_HEADER_LEN + i * 2; + for (uint8_t i = 0; i < receivedChannelCount; i++) { + frameAddr = EXBUS_HEADER_LEN + (i * 2); value = ((uint16_t)exBusFrame[frameAddr + 1]) << 8; - value += (uint16_t)exBusFrame[frameAddr]; + value |= (uint16_t)exBusFrame[frameAddr]; // Convert to internal format jetiExBusChannelData[i] = value >> 3; } @@ -152,7 +158,7 @@ void jetiExBusFrameReset(void) */ // Receive ISR callback -static void jetiExBusDataReceive(uint16_t c, void *data) +FAST_CODE NOINLINE static void jetiExBusDataReceive(uint16_t c, void *data) { UNUSED(data); @@ -189,6 +195,14 @@ static void jetiExBusDataReceive(uint16_t c, void *data) } } + if(jetiExBusFramePosition == 1) { + if(c == 0x01) { + jetiExBusCanTx = true; + } else { + jetiExBusCanTx = false; + } + } + if (jetiExBusFramePosition == jetiExBusFrameMaxSize) { // frame overrun jetiExBusFrameReset(); @@ -204,7 +218,6 @@ static void jetiExBusDataReceive(uint16_t c, void *data) // Check the header for the message length if (jetiExBusFramePosition == EXBUS_HEADER_LEN) { - if ((jetiExBusFrameState == EXBUS_STATE_IN_PROGRESS) && (jetiExBusFrame[EXBUS_HEADER_MSG_LEN] <= EXBUS_MAX_CHANNEL_FRAME_SIZE)) { jetiExBusFrameLength = jetiExBusFrame[EXBUS_HEADER_MSG_LEN]; return; @@ -223,9 +236,12 @@ static void jetiExBusDataReceive(uint16_t c, void *data) // Done? if (jetiExBusFrameLength == jetiExBusFramePosition) { - if (jetiExBusFrameState == EXBUS_STATE_IN_PROGRESS) + if (jetiExBusFrameState == EXBUS_STATE_IN_PROGRESS) { jetiExBusFrameState = EXBUS_STATE_RECEIVED; + jetiExBusRequestState = EXBUS_STATE_ZERO; + } if (jetiExBusRequestState == EXBUS_STATE_IN_PROGRESS) { + jetiExBusFrameState = EXBUS_STATE_ZERO; jetiExBusRequestState = EXBUS_STATE_RECEIVED; jetiTimeStampRequest = now; } @@ -268,6 +284,8 @@ bool jetiExBusInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfi rxRuntimeConfig->rcReadRawFn = jetiExBusReadRawRC; rxRuntimeConfig->rcFrameStatusFn = jetiExBusFrameStatus; + memset(jetiExBusChannelData, 0, sizeof(uint16_t) * JETIEXBUS_CHANNEL_COUNT); + jetiExBusFrameReset(); const serialPortConfig_t *portConfig = findSerialPortConfig(FUNCTION_RX_SERIAL); diff --git a/src/main/rx/jetiexbus.h b/src/main/rx/jetiexbus.h index d23999e9b0..5029cad7c3 100644 --- a/src/main/rx/jetiexbus.h +++ b/src/main/rx/jetiexbus.h @@ -21,7 +21,7 @@ #define EXBUS_CRC_LEN 2 #define EXBUS_OVERHEAD (EXBUS_HEADER_LEN + EXBUS_CRC_LEN) #define EXBUS_MAX_CHANNEL_FRAME_SIZE (EXBUS_HEADER_LEN + JETIEXBUS_CHANNEL_COUNT*2 + EXBUS_CRC_LEN) -#define EXBUS_MAX_REQUEST_FRAME_SIZE 9 +#define EXBUS_MAX_REQUEST_FRAME_SIZE 32 //9 #define EXBUS_EX_REQUEST (0x3A) @@ -42,11 +42,13 @@ enum { EXBUS_STATE_PROCESSED }; -extern uint8_t jetiExBusRequestState; -extern uint32_t jetiTimeStampRequest; +extern volatile uint8_t jetiExBusRequestState; +extern volatile uint32_t jetiTimeStampRequest; extern uint8_t jetiExBusRequestFrame[EXBUS_MAX_REQUEST_FRAME_SIZE]; struct serialPort_s; extern struct serialPort_s *jetiExBusPort; +extern volatile bool jetiExBusCanTx; + uint16_t jetiExBusCalcCRC16(uint8_t *pt, uint8_t msgLen); bool jetiExBusInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig); diff --git a/src/main/target/MATEKF405/CMakeLists.txt b/src/main/target/MATEKF405/CMakeLists.txt index ebf457cda2..d5c4656763 100644 --- a/src/main/target/MATEKF405/CMakeLists.txt +++ b/src/main/target/MATEKF405/CMakeLists.txt @@ -1,2 +1,3 @@ target_stm32f405xg(MATEKF405) target_stm32f405xg(MATEKF405OSD) +target_stm32f405xg(MATEKF405MINI) diff --git a/src/main/target/MATEKF405/target.h b/src/main/target/MATEKF405/target.h index 50786e8efc..a33807c06a 100644 --- a/src/main/target/MATEKF405/target.h +++ b/src/main/target/MATEKF405/target.h @@ -53,15 +53,7 @@ #define SPI3_MISO_PIN PB4 #define SPI3_MOSI_PIN PB5 -#ifdef MATEKF405OSD -// *************** SD Card ************************** -#define USE_SDCARD -#define USE_SDCARD_SPI -#define SDCARD_SPI_BUS BUS_SPI3 -#define SDCARD_CS_PIN PC1 - -#define ENABLE_BLACKBOX_LOGGING_ON_SDCARD_BY_DEFAULT -#else +#ifdef MATEKF405MINI // *************** M25P256 flash ******************** #define USE_FLASHFS #define USE_FLASH_M25P16 @@ -69,6 +61,14 @@ #define M25P16_CS_PIN PC0 #define ENABLE_BLACKBOX_LOGGING_ON_SPIFLASH_BY_DEFAULT +#else +// *************** SD Card ************************** +#define USE_SDCARD +#define USE_SDCARD_SPI +#define SDCARD_SPI_BUS BUS_SPI3 +#define SDCARD_CS_PIN PC1 + +#define ENABLE_BLACKBOX_LOGGING_ON_SDCARD_BY_DEFAULT #endif // *************** OSD ***************************** @@ -173,11 +173,7 @@ #define CURRENT_METER_ADC_CHANNEL ADC_CHN_2 #define RSSI_ADC_CHANNEL ADC_CHN_3 -#ifdef MATEKF405 #define DEFAULT_FEATURES (FEATURE_OSD | FEATURE_CURRENT_METER | FEATURE_VBAT | FEATURE_TELEMETRY | FEATURE_BLACKBOX ) -#else -#define DEFAULT_FEATURES (FEATURE_OSD | FEATURE_CURRENT_METER | FEATURE_VBAT | FEATURE_TELEMETRY ) -#endif #define CURRENT_METER_SCALE 179 #define USE_LED_STRIP diff --git a/src/main/telemetry/jetiexbus.c b/src/main/telemetry/jetiexbus.c index b0ffad8434..56073e54cc 100644 --- a/src/main/telemetry/jetiexbus.c +++ b/src/main/telemetry/jetiexbus.c @@ -138,14 +138,22 @@ const exBusSensor_t jetiExSensors[] = { {"GPS Speed", "m/s", EX_TYPE_22b, DECIMAL_MASK(2)}, {"GPS H-Distance", "m", EX_TYPE_22b, DECIMAL_MASK(0)}, {"GPS H-Direction", "\xB0", EX_TYPE_22b, DECIMAL_MASK(1)}, - {"INAV D2", "", EX_TYPE_DES, 0 }, // device descripton + {"INAV D2", "", EX_TYPE_DES, 0 }, // device descripton {"GPS Heading", "\xB0", EX_TYPE_22b, DECIMAL_MASK(1)}, {"GPS Altitude", "m", EX_TYPE_22b, DECIMAL_MASK(2)}, {"G-Force X", "", EX_TYPE_22b, DECIMAL_MASK(3)}, {"G-Force Y", "", EX_TYPE_22b, DECIMAL_MASK(3)}, {"G-Force Z", "", EX_TYPE_22b, DECIMAL_MASK(3)}, {"RPM", "", EX_TYPE_22b, DECIMAL_MASK(0)}, - {"Trip Distance", "m", EX_TYPE_22b, DECIMAL_MASK(1)} + {"Trip Distance", "m", EX_TYPE_22b, DECIMAL_MASK(1)}, + {"DEBUG0", "", EX_TYPE_22b, DECIMAL_MASK(0)}, + {"DEBUG1", "", EX_TYPE_22b, DECIMAL_MASK(0)}, + {"DEBUG2", "", EX_TYPE_22b, DECIMAL_MASK(0)}, + {"DEBUG3", "", EX_TYPE_22b, DECIMAL_MASK(0)}, + {"DEBUG4", "", EX_TYPE_22b, DECIMAL_MASK(0)}, + {"DEBUG5", "", EX_TYPE_22b, DECIMAL_MASK(0)}, + {"DEBUG6", "", EX_TYPE_22b, DECIMAL_MASK(0)}, + {"DEBUG7", "", EX_TYPE_22b, DECIMAL_MASK(0)} }; // after every 15 sensors increment the step by 2 (e.g. ...EX_VAL15, EX_VAL16 = 17) to skip the device description @@ -172,6 +180,14 @@ enum exSensors_e { EX_GFORCE_Z, EX_RPM, EX_TRIP_DISTANCE, + EX_DEBUG0, + EX_DEBUG1, + EX_DEBUG2, + EX_DEBUG3, + EX_DEBUG4, + EX_DEBUG5, + EX_DEBUG6, + EX_DEBUG7 }; union{ @@ -183,8 +199,7 @@ union{ #define JETI_EX_SENSOR_COUNT (ARRAYLEN(jetiExSensors)) -static uint8_t jetiExBusTelemetryFrame[40]; -static uint8_t jetiExBusTransceiveState = EXBUS_TRANS_RX; +static uint8_t jetiExBusTelemetryFrame[JETI_EXBUS_TELEMETRY_FRAME_LEN]; static uint8_t firstActiveSensor = 0; static uint32_t exSensorEnabled = 0; @@ -283,6 +298,17 @@ void initJetiExBusTelemetry(void) } #endif + if (debugMode != DEBUG_NONE) { + bitArraySet(&exSensorEnabled, EX_DEBUG0); + bitArraySet(&exSensorEnabled, EX_DEBUG1); + bitArraySet(&exSensorEnabled, EX_DEBUG2); + bitArraySet(&exSensorEnabled, EX_DEBUG3); + bitArraySet(&exSensorEnabled, EX_DEBUG4); + bitArraySet(&exSensorEnabled, EX_DEBUG5); + bitArraySet(&exSensorEnabled, EX_DEBUG6); + bitArraySet(&exSensorEnabled, EX_DEBUG7); + } + firstActiveSensor = getNextActiveSensor(0); // find the first active sensor } @@ -421,6 +447,23 @@ int32_t getSensorValue(uint8_t sensor) case EX_TRIP_DISTANCE: return getTotalTravelDistance() / 10; + + case EX_DEBUG0: + return debug[0]; + case EX_DEBUG1: + return debug[1]; + case EX_DEBUG2: + return debug[2]; + case EX_DEBUG3: + return debug[3]; + case EX_DEBUG4: + return debug[4]; + case EX_DEBUG5: + return debug[5]; + case EX_DEBUG6: + return debug[6]; + case EX_DEBUG7: + return debug[7]; default: return -1; @@ -503,12 +546,16 @@ void checkJetiExBusTelemetryState(void) return; } -void handleJetiExBusTelemetry(void) +void NOINLINE handleJetiExBusTelemetry(void) { static uint16_t framesLost = 0; // only for debug static uint8_t item = 0; uint32_t timeDiff; + if(!jetiExBusCanTx) { + return; + } + // Check if we shall reset frame position due to time if (jetiExBusRequestState == EXBUS_STATE_RECEIVED) { @@ -523,7 +570,6 @@ void handleJetiExBusTelemetry(void) if ((jetiExBusRequestFrame[EXBUS_HEADER_DATA_ID] == EXBUS_EX_REQUEST) && (jetiExBusCalcCRC16(jetiExBusRequestFrame, jetiExBusRequestFrame[EXBUS_HEADER_MSG_LEN]) == 0)) { if (serialRxBytesWaiting(jetiExBusPort) == 0) { - jetiExBusTransceiveState = EXBUS_TRANS_TX; item = sendJetiExBusTelemetry(jetiExBusRequestFrame[EXBUS_HEADER_PACKET_ID], item); jetiExBusRequestState = EXBUS_STATE_PROCESSED; return; @@ -534,13 +580,7 @@ void handleJetiExBusTelemetry(void) } } - // check the state if transmit is ready - if (jetiExBusTransceiveState == EXBUS_TRANS_IS_TX_COMPLETED) { - if (isSerialTransmitBufferEmpty(jetiExBusPort)) { - jetiExBusTransceiveState = EXBUS_TRANS_RX; - jetiExBusRequestState = EXBUS_STATE_ZERO; - } - } + jetiExBusRequestState = EXBUS_STATE_ZERO; } uint8_t sendJetiExBusTelemetry(uint8_t packetID, uint8_t item) @@ -587,7 +627,7 @@ uint8_t sendJetiExBusTelemetry(uint8_t packetID, uint8_t item) } serialWriteBuf(jetiExBusPort, jetiExBusTelemetryFrame, jetiExBusTelemetryFrame[EXBUS_HEADER_MSG_LEN]); - jetiExBusTransceiveState = EXBUS_TRANS_IS_TX_COMPLETED; + jetiExBusCanTx = false; return item; } diff --git a/src/main/telemetry/jetiexbus.h b/src/main/telemetry/jetiexbus.h index 9c8327db4a..3c6b465ed0 100644 --- a/src/main/telemetry/jetiexbus.h +++ b/src/main/telemetry/jetiexbus.h @@ -17,6 +17,8 @@ #pragma once +#define JETI_EXBUS_TELEMETRY_FRAME_LEN 128 + void initJetiExBusTelemetry(void); void checkJetiExBusTelemetryState(void); void handleJetiExBusTelemetry(void);