Subversion Repositories FlightCtrl

Rev

Blame | Last modification | View Log | RSS feed

/* pitch.c
 *
 * Copyright 2009 Thomas Jachmann
 *
 * Pitch-Steuerung
 */


#include "main.h"
#include "parameter.h"
#include "pitch_md.h"
#include "pitch.h"

#define UNDEFINED                       255

int  pitchInitialStickValue = UNDEFINED;
unsigned char pitchMode    = PARAM_PITCH_MODE_MK;


char *pitchModeStrings[] = {
        "MK",
        "MD",
        "??"
};


// Prototypen
int pitch_mk_value( void );


/*
 * Führt die Initialisierung der Pitch-Steuerung durch. Diese Funktion
 * wird nach jeder Setting-Auswahl sowie nach jeder Setting-Änderung
 * aufgerufen.
 */

void pitch_init( void ) {

        // Der Schalter Höhenregelung bestimmt den Pitch-Modus
        if( EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG ) {
                pitchMode = PARAM_PITCH_MODE_MD;
        } else {
                pitchMode = PARAM_PITCH_MODE_MK;
        }

        // Nur beim Einschalten ermitteln, da beim Setting-Wechsel ungültig
        if( pitchInitialStickValue == UNDEFINED ) {
       
                // Warten, bis ein gültiger Wert von der Fernsteuerung anliegt
                unsigned int timer = SetDelay( 500 );
                while( !CheckDelay( timer ) );

                pitchInitialStickValue = PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ];
        }
       
        /* Die Stick-Position beim Einschalten muß mit dem im Setting eingestellten
         * Pitch-Modus übereinstimmen. Sonst wird die Pitch-Steuerung aus Sicherheits-
         * gründen deaktiviert. Selbiges gilt, wenn die Höhenregelung deaktiviert wurde.
         */

        switch( pitchMode ) {

                // Pitch-Modus mit 0-Gas
                case PARAM_PITCH_MODE_MK:
                        if( pitchInitialStickValue > 35 - 120 ) {
                                pitchMode = PARAM_PITCH_MODE_INVALID;
                        }
                        break;

                // Pitch-Modus mit neutralisiertem Gas und Standgas
                case PARAM_PITCH_MODE_MD:
                        if( abs( pitchInitialStickValue ) > PARAM_PITCH_STICK_THRESHOLD ) {
                                pitchMode = PARAM_PITCH_MODE_INVALID;
                        } else  {
                                pitch_md_init();
                        }
                        break;
        }
}


int pitch_value( void ) {

        switch( pitchMode ) {

                // Pitch-Modus mit 0-Gas
                case PARAM_PITCH_MODE_MK:
                        return pitch_mk_value();
       
                // Pitch-Modus mit neutralisiertem Gas und Standgas
                case PARAM_PITCH_MODE_MD:
                        return pitch_md_value();

                default:
                        return 0;
        }
}


/*
 * Führt eine Pitch-Berechnung aus, die der Original-SW entspricht.
 */

int pitch_mk_value( void ) {

        register int stickValue = PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ];
        register int pitchCount = stickValue + 120;

        DebugOut.Analog[26] = stickValue;

        return pitchCount;
}