antonello94:
Un eventuale miglioramento sarebbe usare dei cicli for nelle funzioni SetOUTs(), SetTimedOUTs() ecc... Visto che il codice si ripete.
Intanto ti consiglio di togliere di mezzo la Strcontains() e di sostituirla con strstr() che fa la stessa cosa ma più rapidamente.
Per quanto riguarda tutte quelle parti dove hai codice che si ripete, si, sarebbe possibile ma devi fare svariate modifiche, non banali se non hai mai fatto cose del genere.
Per cui se il programma fa ciò per cui lo hai pensato, lascialo com'è e ci penserai successivamente qualora dovessi fare qualche altra modifica sostanziale.
Se vorrai comunque farlo, devi in primo luogo trasformare in array i vari elementi e quindi gestirli tramite un indice.
Questo è solo un esempio di come "iniziare" quella conversione, poi cerca tu di capire cosa ho fatto, e quindi di adattare il resto del codice (se hai domande, chiedi pure!):
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <EEPROM.h>
// size of buffer used to capture HTTP requests
#define REQ_BUF_SZ 60
#define ON LOW
#define OFF HIGH
const byte OUT[8] = { A0, A1, 2, 3, 5, 6, 7, 8 }
const byte time[8] = { 0, 4, 8, 12, 16, 20, 24, 28 }
unsigned long startTime[8];
boolean timing[8];
...
void setup()
{
...
// OUTs
for(byte i=0; i<8; ++i)
{
pinMode(OUT[i], OUTPUT);
digitalWrite(OUT[i], OFF);
}
Ethernet.begin(mac, ip); // initialize Ethernet device
server.begin(); // start to listen for clients
}
...
// checks if received HTTP request is switching on/off OUTs
// also saves the state of the OUTs
void SetOUTs(void)
{
char cmd[16];
for (byte i=0; i<8; ++i)
{ // Cerco il comando per questo OUT
sprintf(cmd, "OUT%d=", i);
char* p = strstr(HTTP_req, cmd);
// Ho il comando per questo OUT?
if ( p != 0 )
{ // Si, leggo il carattere dello stato e lo converto in bool
// true=ON, false=OFF
bool state = (p[5] == '1');
// Imposto lo stato
OUT_state[i] = state;
digitalWrite(OUT[i], OUT_state[i]);
if ( state == false ) // OFF
timing[i] = false;
}
}
...
A tal proposito è possibile definire degli array che non risiedono nella ram? Ovviamente solo in lettura
Dipende. Si può fare qualcosa, ad esempio usando la EEPROM o la Flash, ma dipende da cosa ti serve e soprattutto SE e A COSA ti serve... 