Pages: 1 [2]   Go Down
Author Topic: Wie kann ich meinen Code vereinfachen?  (Read 1676 times)
0 Members and 1 Guest are viewing this topic.
Germany S-H
Offline Offline
Faraday Member
**
Karma: 146
Posts: 3040
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Was würde Arbeitsspeicher sparen?

Es würde z.B. Arbeitsspeicher sparen, wenn Du
a) Texte einsparst
b) Texte in den PROGMEM Speicher verschiebst

Einsparen kannst Du z.B. bei immer wieder in leicher Variation auftretenden Texten wie z.B.
"Code Frage 15 erkannt"
indem Du eine Funktion schreibst, die den Text und die jeweils andere Zahl ausgibt. Dann müssen nicht jedesmal eine leicht unterschiedliche Variante des Textes gespeichert werden.
Logged

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Verstehe.

Die seriellen Ausgaben werden am Ende überhaupt nicht mehr gebraucht. Also können diese relativ schnell entfallen.

Würde es etwas bringen wenn in die Dateinamen in der funktionsübergabe in den Progmem Speicher verlege?
Und falls ja, wir rufe ich die dann ab und übergebe sie an meine Funktion. Das Abspeichern dort sollte ich noch hinbekommen.

Da war doch etwas mit pointer.

Das Speichern sollte auf diesem Wag klappen? oder?

Quote
prog_uchar F1[] PROGMEM  = {"startp.txt"};

Der Funktionsaufruf dann so?

Quote
printMyFile(F1);

Könnte ich es auch in ein mehrdimensionales array packen?

Grüße
Sven
« Last Edit: January 02, 2013, 03:26:32 pm by SvenM » Logged

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mal wieder einen kleinen zwischenstand.

Also der Server läuft wieder. Schon mal toll. Die Anfragen kommen rein.
Werden aber noch nicht abgearbeitet bzw. zugeordnet.

Ich habe versucht die eben angesprochene verlagerung in Flash umzusetzen. Aber ich habe keine wirkliche
Einsparung hinbekommen (50Bytes).

Welche Art des Aufrufs ist die richtig für mich? Siehe anhang.
Ich meine im besonderen die übergabe des Dateinamens an meine funktion und den auszuwertenden "Code"
an meine IF abfrage.

Grüße
Sven


Quote
#include <SPI.h>
#include <SD.h>
#include <Ethernet.h>
#include <avr/pgmspace.h>

prog_char F1[] PROGMEM  = {"startp.txt"};
prog_char F2[] PROGMEM  = {"zsperr.txt"};
prog_char F3[] PROGMEM  = {"0101fr.txt"};
prog_char F4[] PROGMEM  = {""};
prog_char F5[] PROGMEM  = {""};
prog_char F6[] PROGMEM  = {"0102fr.txt"};
prog_char F7[] PROGMEM  = {""};
prog_char F8[] PROGMEM  = {""};
prog_char F9[] PROGMEM  = {"0103fr.txt"};
prog_char F10[] PROGMEM = {""};
prog_char F11[] PROGMEM = {""};
prog_char F12[] PROGMEM = {"0104fr.txt"};
prog_char F13[] PROGMEM = {""};
prog_char F14[] PROGMEM = {""};
prog_char F15[] PROGMEM = {"0105fr.txt"};
prog_char F16[] PROGMEM = {""};
prog_char F17[] PROGMEM = {""};
prog_char F18[] PROGMEM = {"0106fr.txt"};
prog_char F19[] PROGMEM = {""};
prog_char F20[] PROGMEM = {""};
prog_char F21[] PROGMEM = {"0107fr.txt"};
prog_char F22[] PROGMEM = {""};
prog_char F23[] PROGMEM = {""};
prog_char F24[] PROGMEM = {"0108fr.txt"};
prog_char F25[] PROGMEM = {""};
prog_char F26[] PROGMEM = {""};
prog_char F27[] PROGMEM = {"0109fr.txt"};
prog_char F28[] PROGMEM = {""};
prog_char F29[] PROGMEM = {""};
prog_char F30[] PROGMEM = {"0110fr.txt"};
prog_char F31[] PROGMEM = {""};
prog_char F32[] PROGMEM = {""};
prog_char F33[] PROGMEM = {"0111fr.txt"};
prog_char F34[] PROGMEM = {""};
prog_char F35[] PROGMEM = {""};
prog_char F36[] PROGMEM = {"0112fr.txt"};
prog_char F37[] PROGMEM = {""};
prog_char F38[] PROGMEM = {""};
prog_char F39[] PROGMEM = {"0113fr.txt"};
prog_char F40[] PROGMEM = {""};
prog_char F41[] PROGMEM = {""};
prog_char F42[] PROGMEM = {"0114fr.txt"};
prog_char F43[] PROGMEM = {""};
prog_char F44[] PROGMEM = {""};
prog_char F45[] PROGMEM = {"0115fr.txt"};
prog_char F46[] PROGMEM = {""};
prog_char F47[] PROGMEM = {""};
prog_char F48[] PROGMEM = {"spende.txt"};

PROGMEM const char *Quest_table[] =    
{  
   F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9, F10,
  F11, F12, F13, F14, F15, F16, F17, F18, F19, F20,
  F21, F22, F23, F24, F25, F26, F27, F28, F29, F30,
  F31, F32, F33, F34, F35, F36, F37, F38, F39, F40,
  F41, F42, F43, F44, F45, F46, F47, F48
 };

prog_char J2[] PROGMEM  = {"Code=36811"};
prog_char J3[] PROGMEM  = {"Code=63026"};
prog_char J4[] PROGMEM  = {"Code=98222"};
prog_char J5[] PROGMEM  = {"Code=23284"};
prog_char J6[] PROGMEM  = {"Code=88168"};
prog_char J7[] PROGMEM  = {"Code=47022"};
prog_char J8[] PROGMEM  = {"Code=20692"};
prog_char J9[] PROGMEM  = {"Code=80692"};
prog_char J10[] PROGMEM = {"Code=39762"};
prog_char J11[] PROGMEM = {"Code=46047"};
prog_char J12[] PROGMEM = {"Code=97346"};
prog_char J13[] PROGMEM = {"Code=68095"};
prog_char J14[] PROGMEM = {"Code=92060"};
prog_char J15[] PROGMEM = {"Code=05860"};

PROGMEM const char *Joker_table[] =    
{  
        J2,  J3,  J4,  J5,
   J6,  J7,  J8,  J9, J10,
  J11, J12, J13, J14, J15,
 };

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x65, 0x3A };
byte ip[] = { 192, 168, 1, 2 };
byte gateway[] = { 192, 168, 1, 1 };
byte subnet[] = { 255, 255, 255, 0 };

char JokerBuffer[11];
char FileBuffer [11];

EthernetServer server(80); //server port

String readString;

long Sperrzeit         = 1200000; // 20min = 1 200 000
long Abschaltzeit      = 1500000; // 25min = 1 500 000
long LetzteZeitSperr;             // Sperrzeit bei Falscher Antwort
long LetzteZeitAus;               // Zeit um Aus Automatisch

int Fragencounter      = 0;       // Zähler aktuelle Frage
int AusPin             = 5;       // Pin mit Relais Aus
int StatusAusPin       = LOW;     // Statusspeicher des Relais für AUS
int StatusFalscheFrage = LOW;     // Frage Falsch = Sperrzeit abwarten

void setup(){

  Serial.begin(9600);

  pinMode(10,OUTPUT);
  
  digitalWrite(10,HIGH);
  Serial.print("SD..");
  if(!SD.begin(4)) Serial.println("Err");
  else Serial.println("Ok");
  delay(3000);
  
  Ethernet.begin(mac, ip, gateway, subnet);
  digitalWrite(10,HIGH);

  server.begin();
  Serial.println("Rdy");
}
  
EthernetClient client;

void loop(){
/* // ------------------------------------------------------------------------- Abschaltzeit  
  if (millis() - LetzteZeitAus > LetzteZeitAus) {
      StatusAusPin = false; }
    else {
      StatusAusPin = true;
      digitalWrite(AusPin, StatusAusPin);
  }

// ------------------------------------------------------------------------- Sperrzeit falsche Frage  
  if (StatusFalscheFrage = HIGH) {
    if (millis() - LetzteZeitSperr > Sperrzeit) {
      StatusFalscheFrage = HIGH; }
    else {
      StatusFalscheFrage = LOW;
    }
  }  */

// ------------------------------------------------------------------------- Create a client connection
  client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (readString.length() < 100) {             //read char by char HTTP request
          readString += c;                           //store characters to string
        }
        if (c == '\n') {                             //if HTTP request has ended
            
          Serial.println(readString);                //print to serial monitor for debuging
          Serial.println(J2);
          //LetzteZeitAus = millis();  
// ------------------------------------------------------------------------- Programmstand erkennen
          if(readString.indexOf(J2) > -1) {             //// --- Code Frage 2
          //  Serial.println("Code Frage 2 erkannt");
            Fragencounter = 2;
            strcpy_P(FileBuffer, (char*)pgm_read_word(&(Quest_table[6])));
            printMyFile(FileBuffer);.......................................................................................  
  
            .........................................Fragencounter = 15;
            printMyFile(F45);
          }          
          else if (readString.indexOf("Joker+einl") > -1) {       //// --- Kein Code eingegeben
          //  Serial.println("Kein Code eingegeben");
              Fragencounter = 0;
              printMyFile(F1);
          }
          else if(readString.indexOf("Neu=Neues+Spiel") > -1) {     // ----- Neues Spiel
            Serial.println("Neu Zeit");
            if  (StatusFalscheFrage == HIGH) {
            //  Serial.println("Neustart gesperrt");
              printMyFile(F2);
            }
            else if (StatusFalscheFrage == LOW) {
              Serial.println("Neu frei");
              Fragencounter = 1;
              printMyFile(F3);
            }
          }
          else if(Fragencounter >> 1 && readString.indexOf("Antw=") > -1) {     // ----- Frage 1
            Serial.println("Antw");
            if (readString.indexOf("Antw=B") > -1) {                      //// --- Richtig
              Serial.println("Ok"); }
            else {
              Serial.println("Err");
            }
          }
          else {                                                               // ----- Nichts erkannt - neuladen
              Serial.println("neuladen");
              printMyFile(F1);
          }
          }
    //      client.stop();
    //      readString="";
        }
      }
    }
  }


// ------------------------------------------------------------------------- Client ausgeben

void printMyFile(char* filename) {
   client.println("HTTP/1.1 200 OK");
   client.println("Content-Type: text/html");
   client.println();
   File myFile = SD.open(filename);
   if (myFile) {
     while (myFile.available()) {
       client.write(myFile.read());
     }
     myFile.close();
   }
   delay(1000);
}
  
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3060
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Was würde Arbeitsspeicher sparen?
Nachdem du schon viele feste Texte ins PROGMEM gepackt hast,
kommt als nächstes, den String readString; rauszuschmeissen.

         readString += c;                           //store characters to string
Ist eine der aufwendigsten Operationen, die du dir (nicht) vorstellen kannst.

         else if(readString.indexOf("Neu=Neues+Spiel") > -1) {     // ----- Neues Spiel

für solche Sachen ist ein Arduino als Web-Server auch nicht optimal ...
Logged

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

so mein Programm hat sich wieder weiterentwickelt. Die einzelnen IF-Abfrage wurden nun durch Schleifen ersetzt usw...
Trotzdem knapse ich an der Grenze meines Arbeitsspeichers herum.

@Michael_x und alle anderen:

Gibts eine Möglichekit diesen vorher angesprochenen

Quote
readString += c;

so zu verändern das mein Webserver immer noch unverändert läuft, ich aber weniger Speicher verbrauche?

Grüße
Sven
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3060
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Gibts eine Möglichekit diesen vorher angesprochenen
readString += c;
so zu verändern das mein Webserver immer noch unverändert läuft, ich aber weniger Speicher verbrauche?

z.B. wie hier
statt readString wird hier ein statisches char array clientline verwendet.

Code:
#define BUFSIZ 80  //defines the buffer size.  reduce size if less ram is available.
char clientline[BUFSIZ];

void loop() {
  EthernetClient client = server.available();
  if (client) {
    boolean current_line_is_blank = true;
    index = 0;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c != '\n' && c != '\r') {
          clientline[index] = c;
          if (index < BUFSIZ-1)
            index++;
          continue;
        }
        clientline[index] = 0;
        Serial.println(clientline);
        // ... clientline auswerten
      }
    }
  }
}
Mit einfach auszuwertenden Paramtern in der URL machst du dir das Leben leichter ( Es gibt sinnvolleres als deinen knappen RAM bzw die clientline auf das Vorkommen von "Neu=Neues+Spiel" -- was auch im RAM liegt -- zu durchsuchen ... )
Die clientline schon auszuwerten während sie gelesen wird, und allen unnötigen Schnickschnack erst gar nicht zu speichern,  ist noch ausgefuchster.
Logged

Pages: 1 [2]   Go Up
Jump to: