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]); |
} |