Subversion Repositories Projects

Rev

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

// debug Data

#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>

#include "main.h"
#include "lcd.h"
#include "rs232.h"
#include "base64.h"
#include "parameter.h"
#include "menu.h"
#include "debug.h"

uint8_t r_buffer[128];                                                                                          // Dieser Puffer enthält die Rohdaten (kodiert)
//uint8_t p_buffer[128];                                                                                                // Dieser Puffer enthält die Daten im Klartext
//struct str_DebugIn    *p_buffer;

uint8_t base64_decode_debug(unsigned char *ptrOut, uint8_t number)                                                              // Wandelt die base64-Rohdaten in lesbare Daten um
{
        uint8_t p,q;
        uint8_t a,b,c,d;

        p = 2;
        q = 0;
       
        while (p < number)
        {
                a = r_buffer[p + 0] - 61;
                b = r_buffer[p + 1] - 61;
                c = r_buffer[p + 2] - 61;
                d = r_buffer[p + 3] - 61;
               
                p += 4;
               
                ptrOut[q + 0] = (a << 2) | (b >> 4);                                    // gespeichert werden die Daten in p_buffer
                ptrOut[q + 1] = ((b & 0x0F) << 4) | (c >> 2);
                ptrOut[q + 2] = ((c & 0x03) << 6) | d;
 
                q += 3;
        }
        return q;                                                                                                               // Rückgabe der Anzahl der Datenbytes
}

uint8_t get_message_debug()                                                                                             // Liest eine komplette Übertragung und dekodiert sie
{
        uint8_t index, comm;
       
        timer = 20;                                                                                                             // Timer für Timeout
       
        while ((RS232_get() != '#') && (timer > 0));                                    // Warten auf Start-Zeichen #
               
        if (timer > 0)                                                                                                  // Falls kein Timeout auftrat
        {
                index = 0;                                                                                                      // Die Rohdaten in r_buffer einlesen
                do
                {
                        comm = RS232_get();
                        r_buffer[index++] = comm;
                       
                        if (index > 127)                                                                                // Schutz vor Puffer-Überlauf
                                index = 127;
                }
                while (comm != 0x0D);                                                                           // ... bis End-Signal = 0x0D kommt...
                base64_decode_debug((unsigned char *) &DebugIn, index);                                                                         // Die base64-kodierten Rohdaten umwandeln
                return 0;                       // kein Fehler aufgetreten
        }
        else
        {
                return 1;                       // Fehler aufgetreten
        }
}

uint8_t read_debug(uint8_t command)                     //
{
        uint8_t timeout;
       
        timeout = 0;
        p_buffer[0] = '#';                                                      // Debug-Daten anfordern
        p_buffer[1] = 'a';
        p_buffer[2] = 'c';
        p_buffer[3] = command;
        p_buffer[4] = 0;
        p_buffer[5] = 0;
        base64_send(6);
       
        do                                                                                      // warten, bis die Parameter gesendet werden
        {
                if (get_message_debug() == 1)
                        timeout = 30;
                timeout ++;
        }
        while ((r_buffer[1] != 'D') && (timeout < 30));
       
        if (timeout >= 30)
                return 1;
        else
                return 0;
}

#define isminus 65536 / 2

void decimal_int (unsigned int data, uint8_t *text)                     // wandelt Wert in rechtsbündigen Text um
{              
        int sign = 0;
        text[0] = 0x20;                                                                                 // (schneller/kleiner als printf())
        if (data > isminus)
        {
                data = 65536 - data;
                sign = 1;
                text[0] = '-';
        }

        text[1] = data/10000;
        data -= (text[1] * 10000);
        text[2] = data/1000;
        data -= (text[2] *1000);

        text[3] = data/100;
        data -= (text[3] * 100);
        text[4] = data/10;
        data -= (text[4] *10);


        text[5] = data + 0x30;
        text[1] += 0x30;
        text[2] += 0x30;
        text[3] += 0x30;
        text[4] += 0x30;


        if (text[1] == 0x30)
        {
                text[0] = 0x20;
                if (sign == 1) text[1] = '-'; else text[1] = 0x20;
                if (text[2] == 0x30)
                {
                        text[1] = 0x20;
                        if (sign == 1) text[2] = '-'; else text[2] = 0x20;
                        if (text[3] == 0x30)
                        {
                                text[2] = 0x20;
                                if (sign == 1) text[3] = '-'; else text[3] = 0x20;
                                if (text[4] == 0x30)
                                {
                                        text[3] = 0x20;
                                        if (sign == 1) text[4] = '-'; else text[4] = 0x20;
                                }
                        }
                }
        }
//      if (sign == 1) text[0] = '-';
        text[6] = 0x00;
}

void display_debug(void)
{
        uint8_t line;
        uint8_t zeile;
        uint8_t text[10];

        lcd_cls();
        zeile = 0;
        lcd_printp(PSTR("Debug-Display"),0);
        do
        {
                while (key != 0x00);
                if (read_debug(0) == 1)
                {
                        lcd_printp(PSTR("\r\nTimeout!"),0);
                        timer = 200;
                        while (timer > 0);
                        break;
                }
                else
                {
                        line = p_buffer[2];
                        text[0] = line;
                        text[1] = 0x00;
                        lcd_print_at(15,0,text,0);
                       
                        //lcd_print_at(0,++zeile,p_buffer,0);

                        decimal_int(DebugIn.Analog[0],text);
                        lcd_print_at(0,1,"Nick",0);
                        lcd_print_at(10,1,text,0);
                        decimal_int(DebugIn.Analog[1],text);
                        lcd_print_at(0,2,"Roll",0);
                        lcd_print_at(10,2,text,0);
                        decimal_int(DebugIn.Analog[2],text);
                        lcd_print_at(0,3,"ACC Nick",0);
                        lcd_print_at(10,3,text,0);
                        decimal_int(DebugIn.Analog[3],text);
                        lcd_print_at(0,4,"ACC Roll",0);
                        lcd_print_at(10,4,text,0);
                        decimal_int(DebugIn.Analog[4],text);
                        lcd_print_at(0,5,"Gier",0);
                        lcd_print_at(10,5,text,0);
                        decimal_int(DebugIn.Analog[5],text);
                        lcd_print_at(0,6,"ACC",0);
                        lcd_print_at(10,6,text,0);

                        decimal_int(DebugIn.Analog[9],text);
                        lcd_print_at(0,7,"Spannung",0);
                        lcd_print_at(10,7,text,0);

//                      decimal_int(DebugIn.Analog[zeile],text);
//                      lcd_print_at(0,++zeile,text,0);


//                      decimal(p_buffer[zeile],text);
//                      lcd_print_at(0,++zeile,text,0);

                        if (zeile > 5) zeile = 0;

                        timer = 10;
                        while(timer > 0);
               
//                      if (key == 0x01)
//                              read_debug(1);
//                      if (key == 0x02)
//                              read_debug(2);
                }
       
        }
        while (key != 0x04);
}