Hallo,
das Verhalten meines Quellcodes bereitet mir gerade Kopfzerbrechen. Ich kann mir beim besten Willen nicht erklären was da los ist. Es werden Sensorwerte auf einem LCD ausgegeben und eine Ledbar zeigt einen einen entsprechenden Bargraphen, bzw eine Regenbogen Animation. Man kann über die Variable "screen" zwischen verschiedenen Bildschirmen für verschiedene Sensoren wechseln.
switch (screen) {
case 0: { Screens.main(); //case 0 funktioniert Einwandfrei
LedBar.rainbow(10);
} break;
case 1: { Screens.air();
int16_t val = Sensors[3].get_value();
if (val > 0) LedBar.bargraph(val, 150, Color::Green, Color::Red, true); //Hier wird der letzte Parameter "true" völlig ignoriert.
else LedBar.bargraph((val * -1), 100, Color::Green, Color::Blue, false); // Hier ebenfalls
} break;
case 2: { Screens.oil();
LedBar.bargraph(Sensors[1].get_value(), 700, 400, Color::Green, Color::Red, true);
} break;
case 3: { LedBar.bargraph(Sensors[4].get_value(), 1200, Color::Green, Color::Red, true); // Hier wird der zweite Farb Parameter völlig ignoriert, stattdessen nimmt er schwarz ( Null) Screens.egt();
} break;
case 4: { Screens.oil2();
LedBar.pointgraph(Sensors[5].get_value()-1000, 800, 470, Color::Green, Color::Red, true ); //Funktioniert
}break;
}
Unter case 1 wird der letzte boolsche Parameter der Funktion LedBar.bargraph() einfach ignoriert. Völlig egal was ich dort schreibe, er arbeitet immer mit false. Jetzt kommt das mysteriöse: Wenn ich zuerst den Bargraphen aufrufe, und danach erst Screens.air() nimmt er den Parameter korrekt entgegen. Ich kann mir das nicht erklären. Die beiden Funktionen haben eigentlich nichts miteinander zu tun, außer dass sie die gleichen Sensorwerte übergeben bekommen.
Unter Case 3 wird die zweite Farbe komplett ignoriert, egal was ich dort übergebe, er arbeitet immer mit schwarz (0x000000). Und auch hier funktioniert es wenn ich die Reihenfolge mit Screens.egt() tausche.
Was ist denn da los? Irgend eine Speicheradresse defekt an der dann zufällig die besagten Variablen landen? Kompilerfehler? Oder sitzt das Problem vor dem Rechner? Der Fehler ist 100% Wiederholbar.
void c_Screens::air() {
float intakeP_f = IntakeP->get_value()/100.00; //Wird später ohne float gehen, ist momentan nur angenehmer während ich noch ständig die Formatierung des Displays ändere.
float maxP[2], holdP[2];
maxP[1] = IntakeP->get_Max()[1]/100.00;
maxP[0] = IntakeP->get_Max()[0]/100.00;
holdP[0] = IntakeP->get_Peak()[0]/100.00;
holdP[1] = IntakeP->get_Peak()[1]/100.00;
char buffer[4][40];
sprintf(buffer[0], "Ansaugluft (\337C | bar) %3i | %5.2f", IntakeT->get_value(), intakeP_f);
sprintf(buffer[1], "----------------------------------------");
sprintf(buffer[2], "min: %3i | %5.2f max: %3i | %5.2f", IntakeT->get_Max()[0], maxP[0], IntakeT->get_Max()[1], maxP[1]);
sprintf(buffer[3], "hold: %3i | %5.2f hold: %3i | %5.2f", IntakeT->get_Peak()[0], holdP[0], IntakeT->get_Peak()[1], holdP[1]);
for (uint8_t i = 0; i < 4; ++i)
for (uint8_t j = 0; j < strlen(buffer[i]); ++j)
lcd->lines_set(i,j, buffer[i][j]);
}
void c_LedBar::bargraph(int16_t value, int16_t maxValue, c_Led color1, c_Led color2, bool invert) {
uint16_t number = numPixels();
if (value <= 0) {
for (uint8_t i = 0; i < number; ++i)
leds[i] = Color::Black;
if (invert) leds[number-1] = color1;
else leds[0] = color1;
} else if (value >= maxValue){
for (uint8_t i = 0; i < number; ++i)
leds[i] = color2;
} else {
c_Led color;
color.R(map(value, value, maxValue, color1.R(), color2.R()));
color.G(map(value, value, maxValue, color1.G(), color2.G()));
color.B(map(value, value, maxValue, color1.B(), color2.B()));
value = map(value, 0, maxValue, 0, number);
if (invert){
for ( uint16_t i = 0; i < number; i++ )
if ( value >= i) leds[number - i -1] = color;
else leds[number - i -1] = Color::Black;
}else{
for ( uint16_t i = 0; i < number; i++ )
if ( value >= i) leds[i] = color;
else leds[i] = Color::Black;
}
}
}
c_Led Color::Red(0xFF0000);
c_Led Color::Green(0x00FF00);