mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-17 05:15:25 +03:00
* stop motors after 90 degrees of rotation and with max rate * handle no accelerometer data * improve check for acc, although seems to be OK without it * disable all attenuation if rate is set to zero * refactoring thanks Karate * use sensors.h * remove unnecessary arming check * exit crashFlip immediately switch is reverted if throttle is zero * add Crashflip Rate to OSD * Revert unnecessary changes in crashflip core.c code and clarify comments about crashflip switch * update / minimise comments, thanks Karate * ensure all names say `crashflip` consistently * Undo quick re-arm because motrors were not reversed * fix issue with reversed motors, we must disarm * ignore yaw rotation and set gyro limit to 1900 deg/s * default attenuation to off (crashflip_rate = 0) * refactoring, increase rate limit to allow stronger inhibition * enable in race_pro mode * don't attenuate on attitude until a significant change occurs * no attenuation for small changes * Updates from review by PL * remove whitespace * refactor motorOutput, update comments, renaming variables thanks PL * changes from review PL * only permit fast re-arm if crashflip rate set and crashflip was successful * properly exit turtle mode * add crashFlipSuccessful to unit test extern c * small updates from review * improved crashflip switch handling * remove unnecessary motors normal check
150 lines
3.7 KiB
C
150 lines
3.7 KiB
C
/*
|
|
* This file is part of Cleanflight and Betaflight.
|
|
*
|
|
* Cleanflight and Betaflight are free software. You can redistribute
|
|
* this software and/or modify this software 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 and Betaflight are distributed in the hope that they
|
|
* 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 this software.
|
|
*
|
|
* If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#include "platform.h"
|
|
|
|
#include "common/time.h"
|
|
|
|
#include "pg/pg.h"
|
|
|
|
#include "drivers/io_types.h"
|
|
#include "drivers/pwm_output.h"
|
|
|
|
#define QUAD_MOTOR_COUNT 4
|
|
|
|
// Note: this is called MultiType/MULTITYPE_* in baseflight.
|
|
typedef enum mixerMode
|
|
{
|
|
MIXER_TRI = 1,
|
|
MIXER_QUADP = 2,
|
|
MIXER_QUADX = 3,
|
|
MIXER_BICOPTER = 4,
|
|
MIXER_GIMBAL = 5,
|
|
MIXER_Y6 = 6,
|
|
MIXER_HEX6 = 7,
|
|
MIXER_FLYING_WING = 8,
|
|
MIXER_Y4 = 9,
|
|
MIXER_HEX6X = 10,
|
|
MIXER_OCTOX8 = 11,
|
|
MIXER_OCTOFLATP = 12,
|
|
MIXER_OCTOFLATX = 13,
|
|
MIXER_AIRPLANE = 14, // airplane / singlecopter / dualcopter (not yet properly supported)
|
|
MIXER_HELI_120_CCPM = 15,
|
|
MIXER_HELI_90_DEG = 16,
|
|
MIXER_VTAIL4 = 17,
|
|
MIXER_HEX6H = 18,
|
|
MIXER_PPM_TO_SERVO = 19, // PPM -> servo relay
|
|
MIXER_DUALCOPTER = 20,
|
|
MIXER_SINGLECOPTER = 21,
|
|
MIXER_ATAIL4 = 22,
|
|
MIXER_CUSTOM = 23,
|
|
MIXER_CUSTOM_AIRPLANE = 24,
|
|
MIXER_CUSTOM_TRI = 25,
|
|
MIXER_QUADX_1234 = 26,
|
|
MIXER_OCTOX8P = 27
|
|
} mixerMode_e;
|
|
|
|
typedef enum mixerType
|
|
{
|
|
MIXER_LEGACY = 0,
|
|
MIXER_LINEAR = 1,
|
|
MIXER_DYNAMIC = 2,
|
|
MIXER_EZLANDING = 3,
|
|
} mixerType_e;
|
|
|
|
// Custom mixer data per motor
|
|
typedef struct motorMixer_s {
|
|
float throttle;
|
|
float roll;
|
|
float pitch;
|
|
float yaw;
|
|
} motorMixer_t;
|
|
|
|
PG_DECLARE_ARRAY(motorMixer_t, MAX_SUPPORTED_MOTORS, customMotorMixer);
|
|
|
|
// Custom mixer configuration
|
|
typedef struct mixer_s {
|
|
uint8_t motorCount;
|
|
uint8_t useServo;
|
|
const motorMixer_t *motor;
|
|
} mixer_t;
|
|
|
|
typedef struct mixerConfig_s {
|
|
uint8_t mixerMode;
|
|
bool yaw_motors_reversed;
|
|
uint8_t crashflip_motor_percent;
|
|
uint8_t crashflip_rate;
|
|
uint8_t mixer_type;
|
|
#ifdef USE_RPM_LIMIT
|
|
bool rpm_limit;
|
|
uint16_t rpm_limit_p;
|
|
uint16_t rpm_limit_i;
|
|
uint16_t rpm_limit_d;
|
|
uint16_t rpm_limit_value;
|
|
#endif
|
|
} mixerConfig_t;
|
|
|
|
PG_DECLARE(mixerConfig_t, mixerConfig);
|
|
|
|
#define CHANNEL_FORWARDING_DISABLED (uint8_t)0xFF
|
|
|
|
#ifdef USE_RPM_LIMIT
|
|
#define RPM_LIMIT_ACTIVE mixerConfig()->rpm_limit
|
|
#else
|
|
#define RPM_LIMIT_ACTIVE false
|
|
#endif
|
|
|
|
extern const mixer_t mixers[];
|
|
extern float motor[MAX_SUPPORTED_MOTORS];
|
|
extern float motor_disarmed[MAX_SUPPORTED_MOTORS];
|
|
struct rxConfig_s;
|
|
|
|
uint8_t getMotorCount(void);
|
|
float getMotorMixRange(void);
|
|
bool areMotorsRunning(void);
|
|
bool areMotorsSaturated(void);
|
|
|
|
void mixerLoadMix(int index, motorMixer_t *customMixers);
|
|
void initEscEndpoints(void);
|
|
void mixerInit(mixerMode_e mixerMode);
|
|
void mixerInitProfile(void);
|
|
void mixerResetRpmLimiter(void);
|
|
void mixerResetDisarmedMotors(void);
|
|
void mixTable(timeUs_t currentTimeUs);
|
|
void stopMotors(void);
|
|
void writeMotors(void);
|
|
|
|
bool mixerIsTricopter(void);
|
|
|
|
void mixerSetThrottleAngleCorrection(int correctionValue);
|
|
float mixerGetThrottle(void);
|
|
float mixerGetRcThrottle(void);
|
|
mixerMode_e getMixerMode(void);
|
|
bool mixerModeIsFixedWing(mixerMode_e mixerMode);
|
|
bool isFixedWing(void);
|
|
|
|
float getMotorOutputLow(void);
|
|
float getMotorOutputHigh(void);
|
|
bool crashFlipSuccessful(void);
|