adding untested (and probably non-working) airplane mixer from mwc 2.3

flaperons not implemented (too hacky)
flaps should work
This commit is contained in:
dongie 2013-11-02 16:22:30 +09:00
parent f4eea64805
commit 29a9507c15
5 changed files with 45 additions and 22 deletions

View File

@ -121,6 +121,7 @@ const clivalue_t valueTable[] = {
{ "motor_pwm_rate", VAR_UINT16, &mcfg.motor_pwm_rate, 50, 498 }, { "motor_pwm_rate", VAR_UINT16, &mcfg.motor_pwm_rate, 50, 498 },
{ "servo_pwm_rate", VAR_UINT16, &mcfg.servo_pwm_rate, 50, 498 }, { "servo_pwm_rate", VAR_UINT16, &mcfg.servo_pwm_rate, 50, 498 },
{ "retarded_arm", VAR_UINT8, &mcfg.retarded_arm, 0, 1 }, { "retarded_arm", VAR_UINT8, &mcfg.retarded_arm, 0, 1 },
{ "flaps_speed", VAR_UINT8, &mcfg.flaps_speed, 0, 100 },
{ "serial_baudrate", VAR_UINT32, &mcfg.serial_baudrate, 1200, 115200 }, { "serial_baudrate", VAR_UINT32, &mcfg.serial_baudrate, 1200, 115200 },
{ "softserial_baudrate", VAR_UINT32, &mcfg.softserial_baudrate, 9600, 19200 }, { "softserial_baudrate", VAR_UINT32, &mcfg.softserial_baudrate, 9600, 19200 },
{ "softserial_inverted", VAR_UINT8, &mcfg.softserial_inverted, 0, 1 }, { "softserial_inverted", VAR_UINT8, &mcfg.softserial_inverted, 0, 1 },

View File

@ -78,6 +78,7 @@ gpsData_t gpsData;
static void gpsNewData(uint16_t c); static void gpsNewData(uint16_t c);
static bool gpsNewFrameNMEA(char c); static bool gpsNewFrameNMEA(char c);
static bool gpsNewFrameUBLOX(uint8_t data); static bool gpsNewFrameUBLOX(uint8_t data);
static void gpsSetState(uint8_t state) static void gpsSetState(uint8_t state)
{ {
gpsData.state = state; gpsData.state = state;

View File

@ -321,19 +321,16 @@ void writeAllMotors(int16_t mc)
static void airplaneMixer(void) static void airplaneMixer(void)
{ {
#if 0 int16_t flapperons[2] = { 0, 0 };
uint16_t servomid[8]; int i;
int16_t flaperons[2] = { 0, 0 };
for (i = 0; i < 8; i++) {
servomid[i] = 1500 + cfg.servotrim[i]; // servo center is 1500?
}
if (!f.ARMED) if (!f.ARMED)
motor[0] = cfg.mincommand; // Kill throttle when disarmed servo[7] = mcfg.mincommand; // Kill throttle when disarmed
else else
motor[0] = rcData[THROTTLE]; servo[7] = constrain(rcCommand[THROTTLE], mcfg.minthrottle, mcfg.maxthrottle);
motor[0] = servo[7];
#if 0
if (cfg.flaperons) { if (cfg.flaperons) {
@ -354,19 +351,41 @@ static void airplaneMixer(void)
} }
servo[2] = servomid[2] + (slowFlaps * cfg.servoreverse[2]); servo[2] = servomid[2] + (slowFlaps * cfg.servoreverse[2]);
} }
#endif
if (mcfg.flaps_speed) {
// configure SERVO3 middle point in GUI to using an AUX channel for FLAPS control
// use servo min, servo max and servo rate for proper endpoints adjust
static int16_t slow_LFlaps;
int16_t lFlap = servoMiddle(2);
lFlap = constrain(lFlap, cfg.servoConf[2].min, cfg.servoConf[2].max);
lFlap = mcfg.midrc - lFlap; // shouldn't this be servoConf[2].middle?
if (slow_LFlaps < lFlap)
slow_LFlaps += mcfg.flaps_speed;
else if (slow_LFlaps > lFlap)
slow_LFlaps -= mcfg.flaps_speed;
servo[2] = ((int32_t)cfg.servoConf[2].rate * slow_LFlaps) / 100L;
servo[2] += mcfg.midrc;
}
if (f.PASSTHRU_MODE) { // Direct passthru from RX if (f.PASSTHRU_MODE) { // Direct passthru from RX
servo[3] = servomid[3] + ((rcCommand[ROLL] + flapperons[0]) * cfg.servoreverse[3]); // Wing 1 servo[3] = rcCommand[ROLL] + flapperons[0]; // Wing 1
servo[4] = servomid[4] + ((rcCommand[ROLL] + flapperons[1]) * cfg.servoreverse[4]); // Wing 2 servo[4] = rcCommand[ROLL] + flapperons[1]; // Wing 2
servo[5] = servomid[5] + (rcCommand[YAW] * cfg.servoreverse[5]); // Rudder servo[5] = rcCommand[YAW]; // Rudder
servo[6] = servomid[6] + (rcCommand[PITCH] * cfg.servoreverse[6]); // Elevator servo[6] = rcCommand[PITCH]; // Elevator
} else { // Assisted modes (gyro only or gyro+acc according to AUX configuration in Gui } else {
servo[3] = (servomid[3] + ((axisPID[ROLL] + flapperons[0]) * cfg.servoreverse[3])); // Wing 1 // Assisted modes (gyro only or gyro+acc according to AUX configuration in Gui
servo[4] = (servomid[4] + ((axisPID[ROLL] + flapperons[1]) * cfg.servoreverse[4])); // Wing 2 servo[3] = axisPID[ROLL] + flapperons[0]; // Wing 1
servo[5] = (servomid[5] + (axisPID[YAW] * cfg.servoreverse[5])); // Rudder servo[4] = axisPID[ROLL] + flapperons[1]; // Wing 2
servo[6] = (servomid[6] + (axisPID[PITCH] * cfg.servoreverse[6])); // Elevator servo[5] = axisPID[YAW]; // Rudder
servo[6] = axisPID[PITCH]; // Elevator
}
for (i = 3; i < 7; i++) {
servo[i] = ((int32_t)cfg.servoConf[i].rate * servo[i]) / 100L; // servo rates
servo[i] += servoMiddle(i);
} }
#endif
} }
void mixTable(void) void mixTable(void)

View File

@ -264,6 +264,7 @@ typedef struct master_t {
uint16_t mincheck; // minimum rc end uint16_t mincheck; // minimum rc end
uint16_t maxcheck; // maximum rc end uint16_t maxcheck; // maximum rc end
uint8_t retarded_arm; // allow disarsm/arm on throttle down + roll left/right uint8_t retarded_arm; // allow disarsm/arm on throttle down + roll left/right
uint8_t flaps_speed; // airplane mode flaps, 0 = no flaps, > 0 = flap speed, larger = faster
uint8_t rssi_aux_channel; // Read rssi from channel. 1+ = AUX1+, 0 to disable. uint8_t rssi_aux_channel; // Read rssi from channel. 1+ = AUX1+, 0 to disable.

View File

@ -5,6 +5,7 @@
#define MSP_VERSION 0 #define MSP_VERSION 0
#define CAP_PLATFORM_32BIT ((uint32_t)1 << 31) #define CAP_PLATFORM_32BIT ((uint32_t)1 << 31)
#define CAP_DYNBALANCE ((uint32_t)1 << 2) #define CAP_DYNBALANCE ((uint32_t)1 << 2)
#define CAP_FLAPS ((uint32_t)1 << 3)
#define MSP_IDENT 100 //out message multitype + multiwii version + protocol version + capability variable #define MSP_IDENT 100 //out message multitype + multiwii version + protocol version + capability variable
#define MSP_STATUS 101 //out message cycletime & errors_count & sensor present & box activation & current setting number #define MSP_STATUS 101 //out message cycletime & errors_count & sensor present & box activation & current setting number
@ -354,7 +355,7 @@ static void evaluateCommand(void)
serialize8(VERSION); // multiwii version serialize8(VERSION); // multiwii version
serialize8(mcfg.mixerConfiguration); // type of multicopter serialize8(mcfg.mixerConfiguration); // type of multicopter
serialize8(MSP_VERSION); // MultiWii Serial Protocol Version serialize8(MSP_VERSION); // MultiWii Serial Protocol Version
serialize32(CAP_PLATFORM_32BIT | CAP_DYNBALANCE); // "capability" serialize32(CAP_PLATFORM_32BIT | CAP_DYNBALANCE | (mcfg.flaps_speed ? CAP_FLAPS : 0)); // "capability"
break; break;
case MSP_STATUS: case MSP_STATUS:
headSerialReply(11); headSerialReply(11);