Go Down

Topic: Modificare serie di if ... in case (Read 1 time) previous topic - next topic

ziopippo

#15
Mar 10, 2018, 01:00 pm Last Edit: Mar 10, 2018, 01:09 pm by ziopippo
Certo lo switch aiuta ma devi fare come suggerisce @sukko appena prima

Solo che @sukko,  non ci sono solo casi con numero ma anche "GET /?out=AllTemp"
un pò complicate le casistiche
ma facendo come suggerito da @SukkoPera non ricado nuovamente in una serie infinita di IF? Dov'è la convenienza?

In ogni caso sono riucito a trovare i link dove ho trovato lo spunto e scopiazzare quello che volevo.

In italiano

In inglese

nid69ita

No, ci sarebbe una funzione che "estrae" il numero e lo converte in vero numero int o byte che lo switch può trattare.
my name is IGOR, not AIGOR

ziopippo

Però penso che poi il problema ci sia come hai già detto con i controlli "GET /?out=AllTemp".

A questo punto considerato che gli IF sono solo 7 se faccio una cosa del genere:


Code: [Select]

char scelta1*="GET /?out=0&value=";
char scelta2*="GET /?out=0&status=1";
...
char scelta6*="GET /?out=AllTemp";
char scelta7*="GET /?out=all";


e poi eseguoi controlli con lo switch può essere una buona soluzione?

C'è da considerare inoltre che a volte dentro quegli IF ce ne sono anche altri annidati però non credo che sia il caso di modificarli.

Che ne penste?

nid69ita

#18
Mar 10, 2018, 06:15 pm Last Edit: Mar 10, 2018, 07:00 pm by nid69ita
Io rimarrei con gli if.
Però prima cosa farei un grosso if così:
Code: [Select]
if (readString.startsWith("GET /?out="))
{ String resto=readString.substring(10);
   //resto contiene da dopo l'uguale
   // esempio rimane "AllTemp" oppure "19&status=1"
   // nel caso "19&status=1"  se fai val=rest.toInt(); ottieni 19
}


Perchè così verifica 1 sola volta se c'e' un comando valido, visto che tutti quelli che hai elencato iniziano così
my name is IGOR, not AIGOR

SukkoPera

#19
Mar 10, 2018, 07:48 pm Last Edit: Mar 10, 2018, 07:49 pm by SukkoPera
Io continuo a suggerire il mio metodo. Per gestire i casi particolari (all e AllTemp) si può usare un valore numerico particolare, tipo 100 o quel che si vuole. Magari anche -1 ma occorre gestire il segno nella funzione che ho postato prima.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

nid69ita

#20
Mar 11, 2018, 11:14 am Last Edit: Mar 11, 2018, 11:21 am by nid69ita
Allora, una soluzione un pò complicata, facendo l'uso delle stringhe e array memorizzati in memoria flash:
Primo tra le variabili ad inizio sketch aggiungi queste, ovvero tabella dei vari comandi:
Code: [Select]
#include <avr/pgmspace.h>
const char str0[] PROGMEM = "GET /?out=AllTemp";
const char str1[] PROGMEM = "GET /?out=all";
const char str2[] PROGMEM = "GET /?out=0&value=";
const char str3[] PROGMEM = "GET /?out=0&status=1";
const char str4[] PROGMEM = "GET /?out=22&status=1";
const char str5[] PROGMEM = "GET /?out=23&status=1";
const char* const string_table[] PROGMEM = {str0,str1,str2,str3,str4,str5};
#define K_DIM_STRING_TABLE 6

Poi dove vuoi metti questa funzione, che cerca tra quei comandi una stringa e ti dice quale è in  base al numero di indice, 0=comando AllTemp, etc.
Code: [Select]
int CercaComando(char* p_cmd)       // trova il numero del comando tra 0 e 5, -1 = non trovato
{ for(byte i=0;i<K_DIM_STRING_TABLE;i++)
  { if ( strcmp_P(p_cmd, (char*)pgm_read_word(&(string_table[i])) ) == 0 ) 
    { return(i);
    }
  }
  return(-1);
}

Nel tuo programma, al posto di readString.startsWith, una volta letto readString, lo converti dentro a buf e lo passi a quella funzione
Code: [Select]
  char buf[30];
  readString.toCharArray(buf, 30);
  switch( CercaComando(buf) )
  { case 0:  Serial.println("AllTemp"); break;
    case 1:  Serial.println("all");     break;
    case 2:  Serial.println("0 value"); break;
    case 3:  Serial.println("0 status");break;
    case 4:  Serial.println("22");      break;
    case 5:  Serial.println("23");      break;
    default: Serial.println("nessun comando"); break;
  }
my name is IGOR, not AIGOR

ziopippo

#21
Mar 11, 2018, 01:35 pm Last Edit: Mar 11, 2018, 05:28 pm by ziopippo
Figa come soluzione Igor! Ed immagino che sia pure piuttosto veloce nello girare.
Ho atteso fin a commentare ora perché dopo il tuo commento precedente che mi aveva fatto comprendere meglio la funzione di sukkopera mi ero ripromesso di  allegare l'intero sketch per chiedere consiglio sull'intero progetto per cercare di rendere più snello ed efficiente il tutto ma dopo la tua soluzione dell'uso della flash memory non sono più riuscito a trattenermi da farti i complimenti :p
Dopo pranzo da pc allego lo sketch. Da tablet é più noioso mettere allegati. ;)

PaoloF_60

Secondo me potresti codificare le stringhe in base ai valori out status

out=06 status=1 (106) se status=0 (206) se out=06 e value (006) e ti leggi solo value dalla stringa
out=19 status=1 (119) se status=0 (219)
out=22 status=1 (122) se status=0 (222)
out=23 status=1 (123) se status=0 (223)
out=all              (250)
out=allTemp       (255)

Go Up