Subversion Repositories FlightCtrl

Rev

Rev 1161 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/* pitch_inc.c
 *
 * Copyright 2009 Klaus Rheinwald
 *
 */


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

#define STICK_FACTOR    ((int16_t) 256)
#define MAX_STICK       125
#define MIN_STICK       -MAX_STICK

static int16_t          stickValue;                             // Aktueller Stick-Wert

static unsigned char expTable[] = {                             // Tabelle zum Mappen auf exponentielle Werten
    1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,6,
    6,6,6,7,7,7,8,8,8,9,9,10,10,10,11,11,12,12,13,14,14,15,15,16,17,18,18,19,20,21,22,
    23,24,25,26,27,29,30,31,33,34,36,37,39,41,43,45,47,49,51,53,56,58,61,64,66,69,73,
    76,79,83,87,91,95,99,103,108,113,118,123,129,135,141,147,154,161,168,176,184,192,
    200,210,219,229,239,250
};

int pitch_inc_value( void ) {

        int8_t  rawStickDiff  = PPM_diff[EE_Parameter.Kanalbelegung[K_GAS]];      //-125..+125
//      int32_t rawStickValue = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]];        //-125..+125
        int16_t rawStickValue = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]];        //-125..+125

        DebugOut.Analog[25] = rawStickValue;

//      rawStickValue = ((rawStickValue * rawStickValue * rawStickValue) / (PARAM_INC_GAS_SCALE+1))  / (PARAM_INC_GAS_SCALE+1);
//      rawStickValue = (rawStickValue * rawStickValue * rawStickValue) / (PARAM_INC_GAS_SCALE+1);
//      rawStickValue = (rawStickValue * rawStickValue) / ((rawStickValue > 0 ? PARAM_INC_GAS_SCALE : -PARAM_INC_GAS_SCALE) +1);

        if (rawStickValue > 3) {
            if (rawStickValue > MAX_STICK)
                rawStickValue = MAX_STICK;
            rawStickValue = expTable[rawStickValue] * PARAM_INC_GAS_P_SCALE;
        } else if (rawStickValue < -3) {
            if (rawStickValue < MIN_STICK)
                rawStickValue = MIN_STICK;
            rawStickValue = -expTable[-rawStickValue] * PARAM_INC_GAS_P_SCALE;
        }
       
        DebugOut.Analog[23] = rawStickValue;

        // Neuer Stick-Wert
        if (rawStickValue < 0 && stickValue < MIN_STICK*STICK_FACTOR - rawStickValue) // ToDo
            stickValue = MIN_STICK*STICK_FACTOR;
        else if (rawStickValue > 0 && stickValue > MAX_STICK*STICK_FACTOR - rawStickValue )
            stickValue = MAX_STICK*STICK_FACTOR;
        else if (rawStickValue != 0)
            stickValue += rawStickValue;

        if (rawStickValue * rawStickDiff > 0) {     // Add only when moving awy from center
            if (abs(stickValue) < MAX_STICK*STICK_FACTOR - abs(rawStickDiff * PARAM_INC_GAS_D_SCALE)) {  // Do not wrap around
                stickValue += rawStickDiff * PARAM_INC_GAS_D_SCALE;
                DebugOut.Analog[24] = rawStickDiff * PARAM_INC_GAS_D_SCALE;
            }
        }
               
        DebugOut.Analog[26] = stickValue;
        DebugOut.Analog[31] = (stickValue / STICK_FACTOR) + MAX_STICK;

        return (stickValue / STICK_FACTOR) + MAX_STICK;        //0..+250
}

void pitch_inc_init( void ) {

    printf("\r\npitch_inc_init()");
    printf("\r\n sizeof(expTable) = %d\r\n", sizeof(expTable));


    stickValue = MIN_STICK*STICK_FACTOR;
   
    pitchValueFP = pitch_inc_value;
}