Subversion Repositories Projects

Rev

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

/****************************************************************************
 *   Copyright (C) 2011-2012 by Claas Anders "CaScAdE" Rathje               *
 *   admiralcascade@gmail.com                                               *
 *   Project-URL: http://www.mylifesucks.de/oss/c-epilepsy/                 *
 *                                                                          *
 *   This program is free software; you can redistribute it and/or modify   *
 *   it under the terms of the GNU General Public License as published by   *
 *   the Free Software Foundation; either version 2 of the License.         *
 *                                                                          *
 *   This program is distributed in the hope that it 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 program; if not, write to the                          *
 *   Free Software Foundation, Inc.,                                        *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.              *
 ****************************************************************************/



#include "nc_handler.h"

volatile uint16_t nc_handler_time = 2; // request on first call
uint8_t nc_handler_state = 0;


NaviData_t naviData; // = malloc(sizeof(NaviData_t));

void inline nc_handler_timer_callback(void) {
    nc_handler_time++;
}

void show_heading_home(void) {
    uint16_t heading_home = (naviData.HomePositionDeviation.Bearing + 360) % 360;
    degree2epi(animation, heading_home);
}

uint8_t vario_state = 0;

void show_vario(void) {
    uint8_t index = naviData.Variometer > 0 ? 0 : 1;
    if (naviData.Variometer == 0) index = 2;
    for (uint8_t i = 0; i <= 6; i++) {
        if (vario_state < 129) {
            animation[i] = COLORS[index][i];
        } else {
            animation[i] = 0;
        }
    }
    vario_state += 64;
}

void spirit_level(void) {
    /*
        basic principle is:
        take degree nick as y coordinate of a point
        take degree roll as x coordinate of a point
        use atan2 to get the degree between the x-axis and that point
        substract 90 degree since the y-axis is heding front
     */

    int degree = atan2_fp(naviData.AngleNick, naviData.AngleRoll) / 10;
    degree = (degree + 360 - 90) % 360;
    //degree2epi(animation, degree);
    setLedsAround(animation, (degree * 10) / 75, 2, 1);
}

void nc_handler_change_state(void) {
    nc_handler_state = (nc_handler_state + 1) % 3;
    blinkNumer(animation, nc_handler_state + 1, 3);
}

void inline nc_handler(void) {
    if (nc_handler_time >= 2) {
        usart0_request_mk_data(NC_ADDRESS, 'o', 100);
        nc_handler_time = 0;
        LEDGREEN_TOGGLE
    }
    if (rxd_buffer_locked) {
        if (rxd_buffer[2] == 'O') { // NC OSD Data
            Decode64();
            LEDRED_TOGGLE
            //naviData = *((NaviData_t*)pRxData);
            memcpy((unsigned char *) & naviData, (unsigned char *)pRxData, sizeof (NaviData_t));
            rxd_buffer_locked = 0;
        }
    }

    switch (nc_handler_state) {
        case 0:
            show_heading_home();
            break;
        case 1:
            show_vario();
            break;
        case 2:
            spirit_level();
            break;
    }
    if (set_pressed()) {
        nc_handler_change_state();
    }
}