Subversion Repositories Projects

Rev

Blame | Last modification | View Log | RSS feed


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

#include "main.h"
#include "rs232.h"
#include "base64.h"
#include "lcd.h"

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


uint8_t get_message()                                                                                           // 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(index);                                                                           // Die base64-kodierten Rohdaten umwandeln
                return 0;                       // kein Fehler aufgetreten
        }
        else
        {
                return 1;                       // Fehler aufgetreten
        }
}


uint8_t base64_decode(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;
               
                p_buffer[q + 0] = (a << 2) | (b >> 4);                                  // gespeichert werden die Daten in p_buffer
                p_buffer[q + 1] = ((b & 0x0F) << 4) | (c >> 2);
                p_buffer[q + 2] = ((c & 0x03) << 6) | d;
 
                q += 3;
        }
        return q;                                                                                                               // Rückgabe der Anzahl der Datenbytes
}

void base64_send(uint8_t number)                                                                        // Sendet Daten zur Flight-Control
{                                                                                                                                       // Die Daten werden in p_buffer erwartet, umcodiert und gesendet
        uint8_t bpointer,spointer;
        uint8_t x,y,z,a;
        uint16_t checksum;

        r_buffer[0] = p_buffer[0];
        r_buffer[1] = p_buffer[1];
        r_buffer[2] = p_buffer[2];

        bpointer = 3;
        spointer = 3;

        while (spointer < number)
        {
                x = p_buffer[spointer];
                y = p_buffer[spointer + 1];
                z = p_buffer[spointer + 2];
                spointer += 3;
 
                r_buffer[bpointer + 0] = (x >> 2) + 61;
                r_buffer[bpointer + 1] = (((x & 0x03) << 4) | ((y & 0xF0) >> 4)) + 61;
                r_buffer[bpointer + 2] = (((y & 0x0F) << 2) | ((z & 0xC0) >> 6)) + 61;
                r_buffer[bpointer + 3] = (z & 0x3F) + 61;
                 
                bpointer += 4;
        }

        checksum = 0;
        for(a=0;a<bpointer;a++)
          checksum += r_buffer[a];
       
        checksum %= 4096;
       
        r_buffer[bpointer] = (checksum / 64) + 61;
        r_buffer[bpointer + 1] = (checksum % 64) + 61;
        r_buffer[bpointer + 2] = 13;
        r_buffer[bpointer + 3] = 0;
       
        bpointer += 3;
       
        for(a=0;a<bpointer;a++)
          RS232_send(r_buffer[a]);
}