Subversion Repositories MK3Mag

Rev

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

// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Copyright (c) 04.2007 Holger Buss
// + only for non-profit use
// + www.MikroKopter.com
// + see the File "License.txt" for further Informations
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#include <stdlib.h>
#include <inttypes.h>
#include "menu.h"
#include "uart.h"
#include "printf_P.h"
#include "analog.h"
#include "main.h"


uint8_t MaxMenuItem = 2;
uint8_t MenuItem = 0;

int8_t DisplayBuff[DISPLAYBUFFSIZE] = "Hello World";
uint8_t DispPtr = 0;


/************************************/
/*  Put Character to  LCD Buffer    */
/************************************/
void Menu_Putchar(char c)
{
        if(DispPtr < DISPLAYBUFFSIZE) DisplayBuff[DispPtr++] = c;
}

/************************************/
/*        Clear LCD Buffer          */
/************************************/
void Menu_Clear(void)
{
        uint8_t i;
        for( i = 0; i < DISPLAYBUFFSIZE; i++) DisplayBuff[i] = ' ';
}


/************************************/
/*        Update Menu on LCD        */
/************************************/
// Display with 20 characters in 4 lines
void Menu_Update(uint8_t Keys)
{
        if(Keys & KEY1)
        {
                if(MenuItem) MenuItem--;
                else MenuItem = MaxMenuItem;
        }
        if(Keys  & KEY2)
        {
                if(MenuItem == MaxMenuItem) MenuItem = 0;
                else MenuItem++;
        }
        if((Keys  & KEY1) && (Keys  & KEY2)) MenuItem = 0;


        Menu_Clear();

        if(MenuItem > MaxMenuItem) MenuItem = MaxMenuItem;
        // print menu item number in the upper right corner
        if(MenuItem < 10)
        {
                LCD_printfxy(17,0,"[%i]",MenuItem);
        }
        else
        {
                LCD_printfxy(16,0,"[%i]",MenuItem);
        }
        switch(MenuItem)
        {
                case 0:// Version Info Menu Item
                        LCD_printfxy(0,0,"++   MK3MAG   ++ ");
                        LCD_printfxy(0,1," V %d.%d%c", VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH + 'a');
                        if(AccPresent)
                        {
                                LCD_printfxy(0,2, " ACC Support  ");
                        }
                        else
                        {
                                LCD_printfxy(0,2, "             ");
                        }
                        LCD_printfxy(0,3,"(c) Buss, Busker   ");
                        break;

                case 1: // Magnet readings
                        LCD_printfxy(0,0,"Magnet Sensors: ");
                        LCD_printfxy(0,1,"X:%+4d   Attitude", MagX);
                        LCD_printfxy(0,2,"Y:%+4d   by", MagY);
                        LCD_printfxy(0,3,"Z:%+4d ", MagZ);
                        switch(AttitudeSource)
                        {
                        case ATTITUDE_SOURCE_I2C:  LCD_printfxy(12,2,"I2C"); break;
                        case ATTITUDE_SOURCE_UART: LCD_printfxy(12,2,"UART"); break;
                        case ATTITUDE_SOURCE_ACC:  LCD_printfxy(12,2,"ACC"); break;
                        default: LCD_printfxy(12,2,"???"); break;
                        break;
                        }
                        break;
                case 2: // Calcstate
                        LCD_printfxy(0,0,"Calibrating: ");
                        LCD_printfxy(0,1,"Step: %1d ",ActualCalstate);
                        switch(ActualCalstate)
                         {
                          default:
                          case 0: LCD_printfxy(0,2," -- "); break;
                          case 3:
                          case 1: LCD_printfxy(0,2," pause "); break;
                          case 2: LCD_printfxy(0,2,"measure horizontal"); break;
                          case 4: LCD_printfxy(0,2,"measure vertical"); break;
                          case 5: LCD_printfxy(0,2,"store data"); break;
                         }
                        if(!ActualCalstate) LCD_printfxy(13,3,"(start)")
                        else                            LCD_printfxy(9,3,"(ESC)(step)");
                        if(Keys  & KEY4) InternalCalstate++;
                        if(ActualCalstate >= 5 || (Keys & KEY3)) InternalCalstate = 0;
                        break;

                default:
                        MaxMenuItem = MenuItem - 1;
                        MenuItem = 0;
                        break;
        }
}