0,0 → 1,556 |
|
#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" |
|
uint8_t array[8]; |
|
prog_uchar p_menus[12][11]= |
{ |
"Config ", |
"Channels ", |
"Stick ", |
"Hoehe ", |
"Gyro ", |
"Looping ", |
"Camera ", |
"Sonstiges ", |
"User ", |
"Coupling ", |
"Config(2) ", |
"Loopingset" |
}; |
|
|
// Diese Tabelle ordnet die eingelesenen Parameter den Menü-Seiten zu |
|
prog_uchar p_menu_number[67]= |
{ |
2,2,2,2,2,2,2,2, // Die ersten 8 Parameter werden auf Menüseite 2 angezeigt (=Kanalzuordnungen) |
0,4,4,4,4,4,4,3, |
3,3,8,8,8,8,5,5, |
8,8,8,0,5,9,9,9, |
9,7,7,7,7,7,7,6, |
6,6,10,10,6,6,5,5, |
5,9,9,9,9,0,7,11, |
11,11,11,12,12, 12, |
12,12,12,12,12 |
|
}; |
|
prog_uchar p_limits[199]= // Limits für die Parameter |
{ |
1,8,2, // 2:Nick (3) |
1,8,2, // 2:Roll (4) |
1,8,2, // 2:Gas (2) |
1,8,2, // 2:Gier (1) |
1,8,2, // 2:Poti1 (6) |
1,8,2, // 2:Poti2 (6) |
1,8,2, // 2:Poti3 (7) |
1,8,2, // 2:Poti4 (5) |
0,0,0, // 1:Config |
0,255,4, // 4:Höhe MinGas (30) |
0,255,4, // 4:Luftdruck_D (30) |
0,255,4, // 4:MaxHöhe (Setpoint?) (Poti4) |
0,255,4, // 4:Höhe_P (10) |
0,50,4, // 4:Höhe Verstärkung (3) |
0,255,4, // 4:Höhe Z-acc (30) |
0,6,3, // 3:Nick/Roll P (3) |
0,64,3, // 3:Nick/Roll D (4) |
0,20,3, // 3:Gier_P (6) |
0,32,8, // 8:Min.Gas (15) |
33,250,8, // 8:Max.Gas (250) |
0,50,8, // 5:Gyro-Acc Faktor (30) |
0,255,8, // 8:Kompass-Wirkung (128) |
0,0,5, // 5:Gyro-P (80) |
0,0,5, // 5:Gyro-I (120) |
0,250,8, // 8:Unterspannung (94) |
0,250,8, // 8:Not-Gas Zeit (20) |
0,250,8, // 8:Not-Gas (35) |
0,1,0, // Ufo-Ausrichtung (X +) |
0,255,5, // I-Faktor (32) |
0,255,9, // 9:User1 (80) |
0,255,9, // 9:User2 (0) |
0,255,9, // 9:User3 |
0,255,9, // 9:User4 |
0,255,7, // 7:Servo Nick Control (100) |
0,250,7, // 7:Servo Nick Compensation (40) |
0,250,7, // 7:Servo Nick min (50) |
0,250,7, // 7:Servo Nick max (150) |
0,25,7, // 7:Servo Nick refrsh (5) |
0,255,6, // 6:Loop Gas Limit (50) |
0,250,6, // 6:Loop Ansprechschwelle (90) |
0,250,6, // 6:Loop Hysterese (50) |
0,255,10, // 10:Achskopplung (90) |
0,255,10, // 10:Achsgegenkopplung (5) |
0,250,6, // 6:Turnover Nick (100) |
0,250,6, // 6:Turnover Roll (100) |
0,250,5, // 5: Gyro-Abgleich (Comp.) (32) |
0,250,5, // 5: Drift (4) |
0,255,5, // 5: Dynamic stability (75) |
0,255,9, // 9:User5 |
0,255,9, // 9:User6 |
0,255,9, // 9:User7 |
0,255,9, // 9:User8 (0) |
|
0,0,1, // 6:Loop Config (0) |
0,1,7 // 7:Servo Nick Compensation Invert (0) |
|
}; |
|
prog_char bin_parameter[12][16] = // Die binär kodierten Parametern werden getrennt behandelt. |
{ |
"Loop up ", |
"Loop down ", |
"Loop left ", |
"Loop right ", |
"Höhenregler ", // 8 |
"Höhenschalter ", |
"Headhold ", |
"Kompass ", |
"KompassFix ", |
"GPS ", |
"Achsenkopplung ", |
"Drehrate " |
}; |
|
prog_char parameter[54][16]= |
{ |
"Nick ", // 0 (3) |
"Roll ", // 1 (4) |
"Gas ", // (2) |
"Gier ", // (1) |
"Poti1 ", // (6) |
"Poti2 ", // (6) |
"Poti3 ", // (7) |
"Poti4 ", // 7 (5) |
"Config ", // 8 |
"Hoehe_MinGas ", // 9 (30) |
"Luftdruck_D ", // 10 Wert : 0-250 (30) |
"MaxHoehe ", // 11 Wert : 0-250 251 -> Poti1 (Poti4) |
"Hoehe_P ", // 12 Wert : 0-32 (10) |
"Hoehe_Verstaerk", // 13 Wert : 0-50 |
"Hoehe_ACC_Wirk.", // 14 Wert : 0-250 (30) |
"Stick_P ", // 15 Wert : 1-6 |
"Stick_D ", // 16 Wert : 0-64 |
"Gier_P ", // 17 Wert : 1-20 POTI(?) |
"Gas_Min ", // 17 Wert : 0-32 |
"Gas_Max ", // 18 Wert : 33-250 |
"GyroAccFaktor ", // 19 Wert : 1-64 |
"KompassWirkung ", // 20 Wert : 0-250 |
"Gyro_P ", // 21 Wert : 0-250 |
"Gyro_I ", // 22 Wert : 0-250 |
"Unterspannung ", // 23 Wert : 0-250 |
"NotGas ", // 24 Wert : 0-250 // Gaswert bei Empangsverlust |
"NotGasZeit ", // 25 Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
"UfoAusrichtung ", // 26 X oder + Formation |
"I_Faktor ", // 27 = 32; |
"UserParam1 ", // 28 = 32 * 4; //zur freien Verwendung |
"UserParam2 ", // 29 zur freien Verwendung |
"UserParam3 ", // 30 zur freien Verwendung |
"UserParam4 ", // 31 zur freien Verwendung |
"ServoNickCtrl ", // 32 Wert : 0-250 // Stellung des Servos |
"ServoNickComp ", // 33 Wert : 0-250 // Einfluss Gyro/Servo |
"ServoNickMin ", // 34 Wert : 0-250 // Anschlag |
"ServoNickMax ", // 35 Wert : 0-250 // Anschlag |
"ServoNickRefrsh", // 36 |
"LoopGasLimit ", // 37 |
"LoopThreshold ", // 38 Wert: 0-250 Schwelle für Stickausschlag |
"LoopHysterese ", // 39 |
"AchsKopplung ", // 40 |
"AchsGegenKoppl.", // 41 |
"WinklUmschlNick", // 42 |
"WinklUmschlRoll", // 43 |
"GyroAccAbgleich", // 44 1/k |
"Driftkomp ", // 45 |
"DynamicStabilit", // 47 |
"UserParam5 ", // 48 zur freien Verwendung |
"UserParam6 ", // 49 zur freien Verwendung |
"UserParam7 ", // 50 zur freien Verwendung |
"UserParam8 ", // 51 zur freien Verwendung |
"LoopConfig ", // 52 Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
"ServoNickCompIn" // 53 Wert : 0-250 // Richtung Einfluss Gyro/Servo |
// "Name " // 54 |
}; |
|
|
// Parameter lesen, editieren und zurückschreiben |
|
uint8_t read_parameter (uint8_t number) // Number = Parameter-Set# |
{ |
uint8_t timeout; |
|
timeout = 0; |
|
p_buffer[0] = '#'; // Parameter anfordern |
p_buffer[1] = 'a'; |
p_buffer[2] = 'q'; |
p_buffer[3] = number; |
p_buffer[4] = 0; |
p_buffer[5] = 0; |
base64_send(6); |
|
do // warten, bis die Parameter gesendet werden |
{ |
if (get_message() == 1) // Fehler bei der Übertragung? |
timeout = 30; // Timeout sofort auf Endwert setzen |
timeout ++; |
} |
while (((r_buffer[1] < 'L') || (r_buffer[1] > 'P')) && (timeout < 30)); // warten, bis Parameter empfangen wurden oder ein Timeout auftrat |
|
if (timeout >= 30) // Wenn ein Timeout (=Fehler) auftrat, eine 1 zurückgeben, ansonsten 0 |
return 1; |
else |
return 0; |
} |
|
void write_parameter(uint8_t number) // Schreibe Parameter-Satz |
{ |
uint8_t i; |
|
if (number <= 5) |
{ |
|
for (i=0;i<71;i++) // Den gesamten Parameter-Puffer um 3 Bytes nach hinten verschieben |
p_buffer[(70-i)+3] = p_buffer[70-i]; |
|
p_buffer[0] = '#'; // Befehl zum Schreiben der Parameter |
p_buffer[1] = 'a'; |
p_buffer[2] = number + 'k'; // Nummer des Parameters |
p_buffer[74] = 0; |
base64_send(75); // Parameter in base64 kodieren und senden, 75 Bytes |
} |
} |
|
void binary (uint8_t data, uint8_t *feld) // Wandelt eine 8-Bit Zahl in eine Binärzahl um (Array mit 8 Elementen) |
{ // Wird für die Flags (Loop + Grundkonfiguration) benötigt |
uint8_t i; |
|
i=0; |
for (i=0;i<8;i++) |
{ |
if ((1<<i) & data) |
feld[i] = 1; |
else |
feld[i] = 0; |
} |
} |
|
uint8_t bindec (uint8_t *feld) // wandelt eine Binärzahl (im Array) in eine 8-Bit Zahl |
{ // Wird für die Flags (Loop + Grundkonfiguration) benötigt |
uint8_t i; |
uint8_t result; |
|
result = 0; |
for (i=0;i<8;i++) |
{ |
if (feld[i] == 1) |
result += 1<<i; |
} |
return result; |
} |
|
|
|
|
void decimal (uint8_t data, uint8_t *text) // wandelt Wert in rechtsbündigen Text um |
{ // (schneller/kleiner als printf()) |
text[0] = data/100; |
data -= (text[0] * 100); |
text[1] = data/10; |
data -= (text[1] *10); |
text[2] = data + 0x30; |
text[0] += 0x30; |
text[1] += 0x30; |
|
if (text[0] == 0x30) |
{ |
text[0] = 0x20; |
if (text[1] == 0x30) |
text[1] = 0x20; |
} |
text[3] = 0x00; |
} |
|
uint8_t show_parameter (uint8_t number) // Zeigt eine Parameter-Seite an und gibt die ausgewählte Zeile zurück |
{ |
uint8_t i; |
uint8_t line; |
uint8_t text[25]; |
uint8_t bin[8]; |
|
line = 0; |
|
if (number > 1) |
{ |
for (i = 0; i<66; i++) |
{ |
if (pgm_read_byte(p_limits+i*3+2) == number) |
{ |
array[line] = i; |
decimal(p_buffer[i],text); |
lcd_print_at(0,line,text,0); |
lcd_print_atp(5,line,parameter[i],0); |
if (line <= 7) |
line++; |
} |
} |
} |
else |
{ // Sonderfälle: Binäre Eingabe |
if (number == 1) |
{ |
binary(p_buffer[52],bin); // Loop-Config |
text[1] = 0x00; |
for (i=0;i<4;i++) |
{ |
text[0] = bin[i] + 0x30; |
lcd_print_at(0,i,text,0); |
lcd_print_atp(5,i,bin_parameter[i],0); |
} |
|
} |
if (number == 0) |
{ |
binary(p_buffer[8],bin); // Config |
text[1] = 0x00; |
for (i=0;i<8;i++) |
{ |
text[0] = bin[i] + 0x30; |
lcd_print_at(0,i,text,0); |
lcd_print_atp(5,i,bin_parameter[i+4],0); |
} |
} |
|
|
} |
return line; |
} |
|
void edit_parameter2 (uint8_t page, uint8_t lines) // Ändern der Parameter einer Seite |
{ |
uint8_t line; |
uint8_t par; |
uint8_t min; |
uint8_t max; |
uint8_t text[10]; |
uint8_t bin[8]; |
|
if (page > 1) // "normale" Parameter-Seiten |
{ |
line = menu_choose(0,lines-1,4); |
if (line != 255) // Wenn line == 255, wurde Escape gedrückt |
{ |
par = p_buffer[array[line]]; |
min = pgm_read_byte(p_limits + par * 3); |
max = pgm_read_byte(p_limits + par * 3 + 1); |
|
lcd_print_atp(4,line,PSTR("-"),0); |
|
while (key != key_nokey); |
|
do |
{ |
if (key == key_minus) |
{ |
//if (par > min) // Überprüfung der Parameter auf Bereichsüberschreitung derzeit deaktiviert |
par --; |
} |
if (key == key_plus) |
{ |
//if (par < max) |
par ++; |
} |
|
decimal(par,text); |
lcd_print_at(0,line,text,0); |
|
timer = 20; |
while (timer > 0); |
} |
while ((key != 0x04) && (key != 0x08)); |
|
if (key == 0x08) |
p_buffer[array[line]] = par; |
} |
} |
|
if (page == 1) // Spezialfall: Loop-Config (einzelne Bits setzen / löschen) |
{ |
binary(p_buffer[52],bin); |
text[1] = 0x00; |
|
line = menu_choose(0,3,4); |
if (line != 255) // Wenn line == 255, wurde Escape gedrückt |
{ |
par = bin[line]; |
|
lcd_print_atp(4,line,PSTR("-"),0); |
|
do |
{ |
|
if (key == key_minus) |
{ |
par = 0x00; |
} |
if (key == key_plus) |
{ |
par = 0x01; |
} |
|
text[0] = par+0x30; |
lcd_print_at(0,line,text,0); |
timer = 20; |
while (timer > 0); |
|
|
} |
while ((key != key_enter) && (key != key_esc)); |
|
if (key == key_enter) |
{ |
bin[line] = par; |
p_buffer[52] = bindec(bin); |
} |
|
lcd_cls(); |
decimal(p_buffer[52],text); |
lcd_print(text,0); |
timer = 200; |
while(timer > 0); |
} |
} |
if (page == 0) // Spezialfall: Allgemeine Konfiguration (einzelne Bits setzen/löschen) |
{ |
binary(p_buffer[8],bin); |
text[1] = 0x00; |
|
line = menu_choose(0,7,4); |
if (line != 255) // Wenn line == 255, wurde Escape gedrückt |
{ |
par = bin[line]; |
|
lcd_print_atp(4,line,PSTR("-"),0); |
|
do |
{ |
|
if (key == key_minus) |
{ |
par = 0x00; |
} |
if (key == key_plus) |
{ |
par = 0x01; |
} |
|
text[0] = par+0x30; |
lcd_print_at(0,line,text,0); |
timer = 20; |
while (timer > 0); |
|
|
} |
while ((key != key_enter) && (key != key_esc)); |
|
if (key == key_enter) |
{ |
bin[line] = par; |
p_buffer[8] = bindec(bin); |
} |
|
lcd_cls(); |
decimal(p_buffer[8],text); |
lcd_print(text,0); |
timer = 200; |
while(timer > 0); |
} |
} |
} |
|
|
void edit_parameter (void) // Blättert die Parameter seitenweise durch, Einsprung vom Hauptmenü |
{ |
uint8_t page; // 12 Pages |
uint8_t text[15]; |
uint8_t lines; |
uint8_t parameter; |
|
lcd_cls(); |
|
lcd_printp(PSTR("Lade Parameter\r\n"),0); |
lcd_printp(PSTR(" 1:\r\n"),0); |
lcd_printp(PSTR(" 2:\r\n"),0); |
lcd_printp(PSTR(" 3:\r\n"),0); |
lcd_printp(PSTR(" 4:\r\n"),0); |
lcd_printp(PSTR(" 5:\r\n"),0); |
|
parameter = menu_choose(1,5,0); |
|
page = 2; |
if (read_parameter(parameter) == 1) |
{ |
lcd_print_atp(0,6,PSTR("Timeout"),0); |
} |
else |
{ |
do |
{ |
lcd_cls(); |
utoa(page,text,10); |
lcd_print(text,0); |
timer = 50; |
|
while (timer > 0); |
|
lcd_cls(); |
|
lines = show_parameter(page); |
|
while (key == key_nokey); |
if (key == key_plus) |
page++; |
if (key == key_minus) |
page--; |
|
if (page == 255) |
page = 12; |
|
if (page > 12) |
page = 0; |
|
if (key == key_enter) |
edit_parameter2(page,lines); |
|
} |
while (key != key_esc); |
|
lcd_cls(); |
lcd_printp(PSTR("Parameter speichern?\r\n ja\r\n nein"),0); |
|
lines = menu_choose(1,2,0); |
|
if (lines == 1 ) |
{ |
lcd_printp(PSTR("\r\n--->"),0); |
write_parameter(5); // Sicherheitshalber wird derzeit ausschließlich auf Parametersatz 5 gesichert. |
lcd_printp(PSTR("\r\nParameter gespeichert"),0); |
} |
else |
{ |
lcd_printp(PSTR("\r\nNicht gespeichert"),0); |
} |
} |
timer = 100; |
while(timer > 0); |
|
} |