Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 109 → Rev 110

/Transportables_Koptertool/trunk/V-0.1/base64.c
0,0 → 1,116
 
#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[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 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]);
}