[gelöst] Bitte um Hilfe bei einem Schleifen-Thema

Hallo zusammen,
vorneweg: Ich bin eher in der Hardware zu Hause. Ich Sachen Software bin ich Anfänger, von daher bitte ich um Verständnis, wenn euch die Frage dämlich vorkommen sollte.

Es geht um folgendes:
Ich habe einen Sensor, der mir alle 3 Sekunden einen Wert liefert (Variable: scd30.CO2). Dieser Wert wird in einem OLED-Display angezeigt. Je nachdem, in welchem Bereich sich der Wert befindet, soll sich die Hintergrundfarbe im Display ändern.
Gelöst habe ich das bis jetzt so (Auszug aus dem Code):

if(scd30.CO2 < 900)
  { 
    LCD_Clear(GREEN);                                               // lösche Display-Inhalt, Hintergrundfarbe grün
    Paint_DrawString_EN(45, 10, "CO2:",  &Font24, GREEN, BLACK);    // schreibe Messgröße an richtigen Platz
    Paint_DrawString_EN(85, 42, "ppm",  &Font20, GREEN, BLACK);     // schreibe Einheit an richtigen Platz

    Paint_DrawNum(25, 40, (scd30.CO2), &Font24, GREEN, BLACK);      // schreibe Messwert an richtigen Platz
  }
  
else if (scd30.CO2 >= 900 && scd30.CO2 < 1000)

 {
    LCD_Clear(YELLOW);                                              // lösche Display-Inhalt, Hintergrundfarbe grün
    Paint_DrawString_EN(45, 10, "CO2:",  &Font24, YELLOW, BLACK);   // schreibe Messgröße an richtigen Platz
    Paint_DrawString_EN(90, 42, "ppm",  &Font20, YELLOW, BLACK);    // schreibe Einheit an richtigen Platz
    
    Paint_DrawNum(20, 40, (scd30.CO2), &Font24, YELLOW, BLACK);     // schreibe Messwert an richtigen Platz
  }

else if (scd30.CO2 >= 1000 && scd30.CO2 < 1200)

.
.
.

Problem ist, dass immer alle Anweisungen hinter den If's ausgeführt werden, also auch das LCD_Clear. Damit wird permanent das komplette Display aktualisiert, obwohl eigentlich nur der Wert aktualisiert werden müsste. Das führt zu einem nervigen Geblinke.

Also hab ich mich an einer while-Schleife versucht, in der nur der Sensorwert aktualisiert werden soll, nicht das komplette Display. In dieser Schleife möchte ich bleiben, bis der Sensorwert die if-Bedingung nicht mehr erfüllt.
So sah das Ganze aus (wieder ein Auszug):

if(scd30.CO2 < 900)
  { 
    LCD_Clear(GREEN);                                               // lösche Display-Inhalt, Hintergrundfarbe grün
    Paint_DrawString_EN(45, 10, "CO2:",  &Font24, GREEN, BLACK);    // schreibe Messgröße an richtigen Platz
    Paint_DrawString_EN(85, 42, "ppm",  &Font20, GREEN, BLACK);     // schreibe Einheit an richtigen Platz
    
    while (scd30.CO2 < 900)
    {
    Paint_DrawNum(25, 40, (scd30.CO2), &Font24, GREEN, BLACK);      // schreibe Messwert an richtigen Platz
    }
  }
.
.
.

Ist (natürlich ) falsch. Allerdings verstehe ich nicht ganz, wieso. Auch wenn der Sensorwert den angegebenen Wert von 900 übersteigt, komme ich scheinbar nicht aus der Schleife.

Habt ihr da evtl. einen Tip für mich?

VG

stell die Hintergrundfarbe (inkl. clear) nur um, wenn sich dein Grenzwert geändert hat.

mach dir zweiVariabeln
fontcolor und bgcolor
die fontcolor setzt entsprechend wenn sich dein Grenzwert ändert

und in den Ausgaben nimmst dann auch nur mehr die Variablen

paint_DrawString_EN(45, 10, "CO2:",  &Font24, bgcolor, fontcolor);

Danke für die schnelle Antwort.
Das klappt so leider nicht. Wenn ich es so versuche, dann wird nur die Hintergrundfarbe im Bereich der Schrift geändert, nicht jedoch der Hintergrund des kompletten Displays. Das wird dann sehr bunt :wink:

du machst ein clear in der Farbe EINMAL wenn sich die Farbe ändern soll.
nicht aber, wenn die farbe gleich bleiben soll, dann gibst nur die Werte aus.

...ich glaub, ich verstehe, was du meinst.
Werde mal versuchen, das umzusetzen. Kann etwas dauern. Wie gesagt, Software ist nicht meine Welt :wink:

Merke Dir den Wert - und vergleiche.
Pseudocode da Du nichts vollständiges geliefert hast:

if (oldScd.CO2 != scd30.CO2)
{
  oldScd.CO2 = scd30.CO2;
  if (scd30.CO2 < 900)
  {
    LCD_Clear(GREEN);                                               // lösche Display-Inhalt, Hintergrundfarbe grün
    Paint_DrawString_EN(45, 10, "CO2:",  &Font24, GREEN, BLACK);    // schreibe Messgröße an richtigen Platz
    Paint_DrawString_EN(85, 42, "ppm",  &Font20, GREEN, BLACK);     // schreibe Einheit an richtigen Platz
    Paint_DrawNum(25, 40, (scd30.CO2), &Font24, GREEN, BLACK);      // schreibe Messwert an richtigen Platz
  }
  else if (scd30.CO2 >= 900 && scd30.CO2 < 1000)
  {
    LCD_Clear(YELLOW);                                              // lösche Display-Inhalt, Hintergrundfarbe grün
    Paint_DrawString_EN(45, 10, "CO2:",  &Font24, YELLOW, BLACK);   // schreibe Messgröße an richtigen Platz
    Paint_DrawString_EN(90, 42, "ppm",  &Font20, YELLOW, BLACK);    // schreibe Einheit an richtigen Platz
    Paint_DrawNum(20, 40, (scd30.CO2), &Font24, YELLOW, BLACK);     // schreibe Messwert an richtigen Platz
  }
  else if (scd30.CO2 >= 1000 && scd30.CO2 < 1200)

Ein Extrapunkt für die richtige Erkenntnis.

Grundsätzlich wird mit if alles einfacher als mit while.

@my_xy_projekt

Am fehlenden kompletten Code soll es nicht scheitern :wink:

#include <SPI.h>
#include "LCD_Driver.h"
#include "GUI_Paint.h"
#include "image.h"

#include <Adafruit_SCD30.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>

Adafruit_SCD30  scd30;

void setup()
{
  Config_Init();
  LCD_Init();
  LCD_Clear(GREEN);
  LCD_SetBacklight(80);
  Paint_NewImage(LCD_WIDTH, LCD_HEIGHT,0,WHITE);
  Paint_Clear(GREEN);
  Paint_SetRotate(180);
//  Paint_DrawString_EN(0, 0, "Temp:", &Font24, GREEN, BROWN);
//  Paint_DrawString_EN(0, 28, "Hum:", &Font24, WHITE, GRAYBLUE);
//  Paint_DrawString_EN(0, 56, "CO2:",  &Font24, GREEN, BLACK);
//  Paint_DrawRectangle(70, 10, 100, 40, RED,DRAW_FILL_EMPTY, DOT_PIXEL_2X2 );
//  Paint_DrawLine(70, 10, 100, 40, MAGENTA, LINE_STYLE_SOLID, DOT_PIXEL_2X2);
//  Paint_DrawLine(100, 10, 70, 40, MAGENTA, LINE_STYLE_SOLID, DOT_PIXEL_2X2);
//
//  Paint_DrawImage(gImage_40X40,120, 0,40, 40);

//  while (!Serial) delay(10);     // will pause Zero, Leonardo, etc until serial console opens
  Serial.println("Adafruit SCD30 test!");


    // Try to initialize!
    if (!scd30.begin()) 
    {
    Serial.println("Failed to find SCD30 chip");
    while (1) { delay(10); }
    }
    Serial.println("SCD30 Found!");

    if (!scd30.setMeasurementInterval(3))
    {
    Serial.println("Failed to set measurement interval");
    while(1){ delay(10);}
    }
    
  Serial.print("Measurement Interval: "); 
  Serial.print(scd30.getMeasurementInterval()); 
  Serial.println(" seconds");
    
}



void loop()
{
  if (scd30.dataReady())
  {
    Serial.println("Data available!");

    if (!scd30.read()){ Serial.println("Error reading sensor data"); return; }

    Serial.print("Temperature: ");
//   Serial.print(scd30.temperature);
    Serial.print(scd30.temperature,1);
    Serial.println(" degrees C");
    
    Serial.print("Relative Humidity: ");
//    Serial.print(scd30.relative_humidity);
    Serial.print(scd30.relative_humidity,0);
    Serial.println(" %");
    
    Serial.print("CO2: ");
    Serial.print(scd30.CO2, 0);
    Serial.println(" ppm");
    Serial.println("");
  } else 
  {
  //  Serial.println("No data");
  }

if(scd30.CO2 < 900)
  { 
    LCD_Clear(GREEN);                                               // lösche Display-Inhalt, Hintergrundfarbe grün
    Paint_DrawString_EN(45, 10, "CO2:",  &Font24, GREEN, BLACK);    // schreibe Messgröße an richtigen Platz
    Paint_DrawString_EN(85, 42, "ppm",  &Font20, GREEN, BLACK);     // schreibe Einheit an richtigen Platz
    
    while (scd30.CO2 < 900)
    {
    Paint_DrawNum(25, 40, (scd30.CO2), &Font24, GREEN, BLACK);      // schreibe Messwert an richtigen Platz
    }
  }
  
else if (scd30.CO2 >= 900 && scd30.CO2 < 1000)

 {
    LCD_Clear(YELLOW);                                              // lösche Display-Inhalt, Hintergrundfarbe grün
    Paint_DrawString_EN(45, 10, "CO2:",  &Font24, YELLOW, BLACK);   // schreibe Messgröße an richtigen Platz
    Paint_DrawString_EN(90, 42, "ppm",  &Font20, YELLOW, BLACK);    // schreibe Einheit an richtigen Platz
    
    Paint_DrawNum(20, 40, (scd30.CO2), &Font24, YELLOW, BLACK);     // schreibe Messwert an richtigen Platz
  }

else if (scd30.CO2 >= 1000 && scd30.CO2 < 1200)

 {
    LCD_Clear(YELLOW);
    Paint_DrawString_EN(45, 10, "CO2:",  &Font24, YELLOW, BLACK);
    Paint_DrawString_EN(95, 42, "ppm",  &Font20, YELLOW, BLACK);
    
    Paint_DrawNum(18, 40, (scd30.CO2), &Font24, YELLOW, BLACK);
  }

else

 {  
    LCD_Clear(RED); 
    Paint_DrawString_EN(45, 10, "CO2:",  &Font24, RED, BLACK);
    Paint_DrawString_EN(95, 42, "ppm",  &Font20, RED, BLACK);
    
    Paint_DrawNum(18, 40, (scd30.CO2), &Font24, RED, BLACK);
 }

}

// für später:
//  Paint_DrawString_EN(0, 5, "Temp:", &Font20, GREEN, BROWN);
//  Paint_DrawNum(77, 5, (scd30.temperature), &Font20, GREEN, BROWN);
//  Paint_DrawString_EN(120, 5, "C", &Font20, GREEN, BROWN);
//  Paint_DrawString_EN(0, 32, "Hum:", &Font20, GREEN, BLUE);
//  Paint_DrawNum(77, 32, (scd30.relative_humidity), &Font20, GREEN, BLUE);
//  Paint_DrawString_EN(120, 32, "%", &Font20, GREEN, BLUE);

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

Danke für die schnelle Antworten. Kaum reagiere ich, steht schon wieder was neues da :slight_smile:

Ja, das ist der Fluch dieses Forums. Kaum hast Du eine andere Seite im Browser aufgemacht steht hier schon wieder Anfragen auf mehr Infos, Änderungsvorschläge zum ausprobieren, Lösungen und Fehlererklährungen.

Grüße Uwe

Na dann mal zum testen...

#include <SPI.h>
#include "LCD_Driver.h"
#include "GUI_Paint.h"
#include "image.h"

#include <Adafruit_SCD30.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>

Adafruit_SCD30  scd30;
unsigned int oldScdCO;
void setup()
{
  Config_Init();
  LCD_Init();
  LCD_Clear(GREEN);
  LCD_SetBacklight(80);
  Paint_NewImage(LCD_WIDTH, LCD_HEIGHT, 0, WHITE);
  Paint_Clear(GREEN);
  Paint_SetRotate(180);
  //  Paint_DrawString_EN(0, 0, "Temp:", &Font24, GREEN, BROWN);
  //  Paint_DrawString_EN(0, 28, "Hum:", &Font24, WHITE, GRAYBLUE);
  //  Paint_DrawString_EN(0, 56, "CO2:",  &Font24, GREEN, BLACK);
  //  Paint_DrawRectangle(70, 10, 100, 40, RED,DRAW_FILL_EMPTY, DOT_PIXEL_2X2 );
  //  Paint_DrawLine(70, 10, 100, 40, MAGENTA, LINE_STYLE_SOLID, DOT_PIXEL_2X2);
  //  Paint_DrawLine(100, 10, 70, 40, MAGENTA, LINE_STYLE_SOLID, DOT_PIXEL_2X2);
  //
  //  Paint_DrawImage(gImage_40X40,120, 0,40, 40);
  //  while (!Serial) delay(10);     // will pause Zero, Leonardo, etc until serial console opens
  Serial.println("Adafruit SCD30 test!");
  // Try to initialize!
  if (!scd30.begin())
  {
    Serial.println("Failed to find SCD30 chip");
    while (1) { delay(10); }
  }
  Serial.println("SCD30 Found!");
  if (!scd30.setMeasurementInterval(3))
  {
    Serial.println("Failed to set measurement interval");
    while (1) { delay(10);}
  }
  Serial.print("Measurement Interval: ");
  Serial.print(scd30.getMeasurementInterval());
  Serial.println(" seconds");
}



void loop()
{
  if (scd30.dataReady())
  {
    Serial.println("Data available!");
    if (!scd30.read()) { Serial.println("Error reading sensor data"); return; }
    Serial.print("Temperature: ");
    //   Serial.print(scd30.temperature);
    Serial.print(scd30.temperature, 1);
    Serial.println(" degrees C");
    Serial.print("Relative Humidity: ");
    //    Serial.print(scd30.relative_humidity);
    Serial.print(scd30.relative_humidity, 0);
    Serial.println(" %");
    Serial.print("CO2: ");
    Serial.print(scd30.CO2, 0);
    Serial.println(" ppm");
    Serial.println("");
  }
  else
  {
    //  Serial.println("No data");
  }
  if (oldScdCO != scd30.CO2)
  {
    oldScdCO = scd30.CO2;
    if (scd30.CO2 < 900)
    {
      LCD_Clear(GREEN);                                               // lösche Display-Inhalt, Hintergrundfarbe grün
      Paint_DrawString_EN(45, 10, "CO2:",  &Font24, GREEN, BLACK);    // schreibe Messgröße an richtigen Platz
      Paint_DrawString_EN(85, 42, "ppm",  &Font20, GREEN, BLACK);     // schreibe Einheit an richtigen Platz
      Paint_DrawNum(25, 40, (scd30.CO2), &Font24, GREEN, BLACK);      // schreibe Messwert an richtigen Platz
    }
    else if (scd30.CO2 >= 900 && scd30.CO2 < 1000)
    {
      LCD_Clear(YELLOW);                                              // lösche Display-Inhalt, Hintergrundfarbe grün
      Paint_DrawString_EN(45, 10, "CO2:",  &Font24, YELLOW, BLACK);   // schreibe Messgröße an richtigen Platz
      Paint_DrawString_EN(90, 42, "ppm",  &Font20, YELLOW, BLACK);    // schreibe Einheit an richtigen Platz
      Paint_DrawNum(20, 40, (scd30.CO2), &Font24, YELLOW, BLACK);     // schreibe Messwert an richtigen Platz
    }
    else if (scd30.CO2 >= 1000 && scd30.CO2 < 1200)
    {
      LCD_Clear(YELLOW);
      Paint_DrawString_EN(45, 10, "CO2:",  &Font24, YELLOW, BLACK);
      Paint_DrawString_EN(95, 42, "ppm",  &Font20, YELLOW, BLACK);
      Paint_DrawNum(18, 40, (scd30.CO2), &Font24, YELLOW, BLACK);
    }
    else
    {
      LCD_Clear(RED);
      Paint_DrawString_EN(45, 10, "CO2:",  &Font24, RED, BLACK);
      Paint_DrawString_EN(95, 42, "ppm",  &Font20, RED, BLACK);
      Paint_DrawNum(18, 40, (scd30.CO2), &Font24, RED, BLACK);
    }
  }
}
// für später:
//  Paint_DrawString_EN(0, 5, "Temp:", &Font20, GREEN, BROWN);
//  Paint_DrawNum(77, 5, (scd30.temperature), &Font20, GREEN, BROWN);
//  Paint_DrawString_EN(120, 5, "C", &Font20, GREEN, BROWN);
//  Paint_DrawString_EN(0, 32, "Hum:", &Font20, GREEN, BLUE);
//  Paint_DrawNum(77, 32, (scd30.relative_humidity), &Font20, GREEN, BLUE);
//  Paint_DrawString_EN(120, 32, "%", &Font20, GREEN, BLUE);
/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

@my_xy_projekt
Getestet.
Aber auch hier wird immer das komplette Display aktualisiert (LCD_Clear) und nicht nur der Wert der Variable.

Ja, aber nur, wenn sich der Wert ändert.
Du könntest noch eine Hysterese einbauen. Oder Du lagerst das clear() auch noch aus. na mal schaun, was mir einfällt.

Der Sensor liefert den Wert mit 3 Nachkomma-Stellen. Der ändert sich also praktisch permanent.
Das Auslagern des clear wäre wohl die zielführendste Variante.

Schau mal anders:

#include <SPI.h>
#include "LCD_Driver.h"
#include "GUI_Paint.h"
#include "image.h"

#include <Adafruit_SCD30.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>

Adafruit_SCD30  scd30;
unsigned int oldScdCO;
int alteFarbe;
void setup()
{
  Config_Init();
  LCD_Init();
  alteFarbe = GREEN;
  LCD_Clear(alteFarbe);
  LCD_SetBacklight(80);
  Paint_NewImage(LCD_WIDTH, LCD_HEIGHT, 0, WHITE);
  Paint_Clear(alteFarbe);
  Paint_SetRotate(180);
  //  Paint_DrawString_EN(0, 0, "Temp:", &Font24, GREEN, BROWN);
  //  Paint_DrawString_EN(0, 28, "Hum:", &Font24, WHITE, GRAYBLUE);
  //  Paint_DrawString_EN(0, 56, "CO2:",  &Font24, GREEN, BLACK);
  //  Paint_DrawRectangle(70, 10, 100, 40, RED,DRAW_FILL_EMPTY, DOT_PIXEL_2X2 );
  //  Paint_DrawLine(70, 10, 100, 40, MAGENTA, LINE_STYLE_SOLID, DOT_PIXEL_2X2);
  //  Paint_DrawLine(100, 10, 70, 40, MAGENTA, LINE_STYLE_SOLID, DOT_PIXEL_2X2);
  //
  //  Paint_DrawImage(gImage_40X40,120, 0,40, 40);
  //  while (!Serial) delay(10);     // will pause Zero, Leonardo, etc until serial console opens
  Serial.println("Adafruit SCD30 test!");
  // Try to initialize!
  if (!scd30.begin())
  {
    Serial.println("Failed to find SCD30 chip");
    while (1) { delay(10); }
  }
  Serial.println("SCD30 Found!");
  if (!scd30.setMeasurementInterval(3))
  {
    Serial.println("Failed to set measurement interval");
    while (1) { delay(10);}
  }
  Serial.print("Measurement Interval: ");
  Serial.print(scd30.getMeasurementInterval());
  Serial.println(" seconds");
}



void loop()
{
  if (scd30.dataReady())
  {
    Serial.println("Data available!");
    if (!scd30.read()) { Serial.println("Error reading sensor data"); return; }
    Serial.print("Temperature: ");
    //   Serial.print(scd30.temperature);
    Serial.print(scd30.temperature, 1);
    Serial.println(" degrees C");
    Serial.print("Relative Humidity: ");
    //    Serial.print(scd30.relative_humidity);
    Serial.print(scd30.relative_humidity, 0);
    Serial.println(" %");
    Serial.print("CO2: ");
    Serial.print(scd30.CO2, 0);
    Serial.println(" ppm");
    Serial.println("");
  }
  else
  {
    //  Serial.println("No data");
  }
  if (oldScdCO != scd30.CO2)
  {
    oldScdCO = scd30.CO2;
    if (scd30.CO2 < 900)
    {
      if (alteFarbe != GREEN)
      {
        alteFarbe = GREEN;
        LCD_Clear(GREEN);                                               // lösche Display-Inhalt, Hintergrundfarbe grün
        Paint_DrawString_EN(45, 10, "CO2:",  &Font24, GREEN, BLACK);    // schreibe Messgröße an richtigen Platz
        Paint_DrawString_EN(85, 42, "ppm",  &Font20, GREEN, BLACK);     // schreibe Einheit an richtigen Platz
      }
      Paint_DrawNum(25, 40, (scd30.CO2), &Font24, GREEN, BLACK);      // schreibe Messwert an richtigen Platz
    }
    else if (scd30.CO2 >= 900 && scd30.CO2 < 1000)
    {
      if (alteFarbe != YELLOW)
      {
        alteFarbe = YELLOW;
        LCD_Clear(YELLOW);                                              // lösche Display-Inhalt, Hintergrundfarbe grün
        Paint_DrawString_EN(45, 10, "CO2:",  &Font24, YELLOW, BLACK);   // schreibe Messgröße an richtigen Platz
        Paint_DrawString_EN(90, 42, "ppm",  &Font20, YELLOW, BLACK);    // schreibe Einheit an richtigen Platz
      }
      Paint_DrawNum(20, 40, (scd30.CO2), &Font24, YELLOW, BLACK);     // schreibe Messwert an richtigen Platz
    }
    else if (scd30.CO2 >= 1000 && scd30.CO2 < 1200)
    {
      LCD_Clear(YELLOW);
      Paint_DrawString_EN(45, 10, "CO2:",  &Font24, YELLOW, BLACK);
      Paint_DrawString_EN(95, 42, "ppm",  &Font20, YELLOW, BLACK);
      Paint_DrawNum(18, 40, (scd30.CO2), &Font24, YELLOW, BLACK);
    }
    else
    {
      LCD_Clear(RED);
      Paint_DrawString_EN(45, 10, "CO2:",  &Font24, RED, BLACK);
      Paint_DrawString_EN(95, 42, "ppm",  &Font20, RED, BLACK);
      Paint_DrawNum(18, 40, (scd30.CO2), &Font24, RED, BLACK);
    }
  }
}
// für später:
//  Paint_DrawString_EN(0, 5, "Temp:", &Font20, GREEN, BROWN);
//  Paint_DrawNum(77, 5, (scd30.temperature), &Font20, GREEN, BROWN);
//  Paint_DrawString_EN(120, 5, "C", &Font20, GREEN, BROWN);
//  Paint_DrawString_EN(0, 32, "Hum:", &Font20, GREEN, BLUE);
//  Paint_DrawNum(77, 32, (scd30.relative_humidity), &Font20, GREEN, BLUE);
//  Paint_DrawString_EN(120, 32, "%", &Font20, GREEN, BLUE);
/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

(Nur für greun und gelb gemacht)

oh ja, das geht in eine gute Richtung :+1: :slight_smile:
Es wurde lediglich - wenn Anfangs der Wert im "grünen" Bereich lag - nur der Sensorwert angezeigt, die restliche Schrift nicht.
Ich hab dann beim der Initialisierung den Anfangswert der Farbe geändert damit der Ausdruck

if (alteFarbe != GREEN)

am Anfang auch tatsächlich mal wahr ist.

Das sieht jetzt wirklich nicht schlecht aus. Werde mal den restlichen Code anpassen und noch mal Rückmeldung geben.

Herzlichen Dank!

Code läuft :+1:

Vielen Dank für die Unterstützung! :slightly_smiling_face:

Nix anderes erwartet - dann kannst den als gelöst setzen.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.