RingBuffer buf(8) wifiesp - vorrei capirci qualcosa in più

ciao, Come da titolo sto cercando di capirci qualcosa in più.. ho più o meno chiaro il principio su come funziona un buffer circolare, ma non ho capito cosa comporta diminuire e aumentare quel numero tra parentesi... sono i byte massimi che si possono memorizzare? Ho provato a diminuirlo impostandolo a 1 e ho esagerato portalo a 200... ma nn è cambiato nulla... a che serve quindi?

L'esempio della libreria nel quale fa accendere un led da remoto(sono da cell e nn ricordo nome) imposta 8 come valore... come faccio a capire se per me va bene?

Grazie

Sono il numero massimo di byte memorizzati in un istante. Se buffer 8 avrai sempre solo memoria degli ultimi 8 byte, al nono che arriva, il primo lo perdi

nid69ita: Sono il numero massimo di byte memorizzati in un istante. Se buffer 8 avrai sempre solo memoria degli ultimi 8 byte, al nono che arriva, il primo lo perdi

ok grazie per la risposta, come ci si regola per la lunghezza? come mai passando impostando 1 o 200 non ho avuto comportamenti diversi? che valore consigliate?

Non conosco il caso specifico. Da programmatore, presumo solo che serva una lunghezza abbastanza grande per farci stare dentro i comandi che devi verificare. esempio led, se arriva parola 0 o 1 basta 1 byte se parola on o off ci vogliono già 3 byte.

ok grazie del chiarimento. devo quindi considerare la parola più lunga che invio per la dimensione del buffer... immagino però che serva sovrastimare un pochino..

grazie

il testo più lungo che devo trasmettereè di 13 caratteri. quindi di impostare 20 byte come dimensione massima, troppo lungo? meglio 15? come ci si regola?

quindi il tipo invece di dato che esi invia, un int o un float, non pesa come numero di byte?

faccio un'esempio: devo inviare il dato float di 12,25, sono solo 5 byte? oppure il fatto che sia un float incide? quindi 5 byte per i numeri stampati + i 4 byte di peso del tipo float?

ancora grazie

Dipende cosa intendi per invio di un float o un int, trasmissione binaria o testuale ? Un int sono 2 byte se spedisci i due byte che compongono un int, tipo Serial.write() Se invece il numero è inviato come testo (esempio Seria.print) allora vengono inviate le singole cifre che lo compongono. Quindi 10 viene inviato come char '1' e poi '0' mentre 1234 invia '1','2','3','4' quindi 5 byte/char

Se i dati di ricezione sono "roba web" penso allora parliamo di trasmissione testuale

invio i dati con la libreria wifisep e uso i client.print

Quindi trasmissione testuale. Anche se fai client.print(iVar) dove iVar è un int, spedisce i singoli caratteri che compongono il numero. Anche perché è come lavorare con pagine html, quindi testo

ook grazie mille per il chiarimento.

tu che consigli?

il testo più lungo che devo trasmettere è di 13 caratteri. quindi di impostare 20 byte come dimensione massima, troppo lungo? meglio 15? come ci si regola?

come regola generale mi auto setto mentalmente come il valore massimo?

Secondo me si. Poi tra 13 impostare a 20, al max 7 byte "sprecati", va bene comunque. Ovvio su 13 imposto 200 allora "spreco" di 187 è troppo.

ok chiarissimo!!!

ancora 1000 grazie!!

Se si guardano i sorgenti della liberia si trova:

// the ring buffer is used to search the tags in the stream
static RingBuffer ringBuf;

quindi il ring buffer non credo sia è usato per le tue cose, ma internamente dalla libreria per la ricerca dei vari tags nello stream di dati.

Guglielmo

Guglielmo, lui parla dell'esempio WebServerLed di quella lib, e li il buffer è usato a mo di String per accumulare i dati ricevuti dal client https://github.com/bportaluri/WiFiEsp/blob/master/examples/WebServerLed/WebServerLed.ino

azz Guglielmo…

forse postando la parte di codice che gestisce l’invio dei dati potrebbe aiutare o meno…

se ci ho capito qualcosa… quello che riceve il client lo sposta sul buffer… ma sono una pippa lo sapere bene…

char c = client.read();
        buf.push(c);

poi visto che ci sono chiedo: per stampare un pulsante… ad esempio:

      client.print("<form id='F1' action='/E'><input class='button' type='submit' value='PI A' ></form>\r\n");

qui quanti byte ho? e come lo capisco/conto?

#include "WiFiEsp.h"
// Emulate Serial1 on pins 6/7 if not present
#ifndef HAVE_HWSERIAL1
#endif
char ssid[] = "xxxxxxx";            // your network SSID (name)
char pass[] = "xxxxxxx";        // your network password
int status = WL_IDLE_STATUS;     // the Wifi radio's status
int reqCount = 0;                // number of requests received
WiFiEspServer server(80);
RingBuffer buf(8);



void inviodati() {
  // listen for incoming clients
  WiFiEspClient client = server.available();
  if (client) {
    buf.init();
    // an http request ends with a blank line
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        buf.push(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (buf.endsWith("\r\n\r\n")) {
          client.print("<!DOCTYPE HTML>\r\n");
          client.print(F("Pioggia:"));
          client.print(valorestatopioggia);
          client.println(F("
"));
          client.print(F("Vento:"));
          client.print(WindSpeed, 2);
          client.println(F("
"));
          client.println(F("T:"));
          client.println(Tpercepita8, 2);
          client.println(F("
"));
          client.println(F("rH%:"));
          client.println(bme280.getHumidity() + 8);
          client.println(F("
"));
          // The HTTP response ends with another blank line:
          client.print(F("A-C:"));
          client.println(attivaz_chiusuraGRANDESX);
          client.print(F("-"));
          client.println(attivaz_chiusuraGRANDECENTRO);
          client.print(F("-"));
          client.println(attivaz_chiusuraPICCOLA);
          client.println(F("
"));
          client.println(F("TSX:"));
          if (((millis() - startingTimeGRANDESX) / 60000) < (TIMEOUTGRANDESX / 60000)) {
            client.println(((TIMEOUTGRANDESX / 60000) - (millis() - startingTimeGRANDESX) / 60000));
          }
          else
          {
            client.println("   ");
          }
          client.println(F("
"));
          client.println(F("TCE:"));
          if (((millis() - startingTimeGRANDECENTRO) / 60000) < (TIMEOUTGRANDECENTRO / 60000)) {
            client.println(((TIMEOUTGRANDECENTRO / 60000) - (millis() - startingTimeGRANDECENTRO) / 60000));
          }
          else
          {
            client.println("   ");
          }
          client.println(F("
"));
          client.println(F("TPI:"));
          if (((millis() - startingTimePICCOLA) / 60000) < (TIMEOUTPICCOLA / 60000)) {
            client.println(((TIMEOUTPICCOLA / 60000) - (millis() - startingTimePICCOLA) / 60000));
          }
          else
          {
            client.println("   ");
          }
          client.println(F("
"));
          if (stato_pulsanteSX == 0) {
            client.print("<form id='F1' action='/A'><input class='button' type='submit' value='SX A' ></form>\r\n");
          }
          else if (stato_pulsanteSX == 1) {
            client.print("<form id='F1' action='/B'><input class='button' type='submit' value='SX D' ></form>\r\n");
          }
          if (stato_pulsanteCENTRO == 0) {
            client.print("<form id='F1' action='/C'><input class='button' type='submit' value='CE A' ></form>\r\n");
          }
          else if (stato_pulsanteCENTRO == 1) {
            client.print("<form id='F1' action='/D'><input class='button' type='submit' value='CE D' ></form>\r\n");
          }
          if (stato_pulsantePICCOLA == 0) {
            client.print("<form id='F1' action='/E'><input class='button' type='submit' value='PI A' ></form>\r\n");
          }
          else if (stato_pulsantePICCOLA == 1) {
            client.print("<form id='F1' action='/F'><input class='button' type='submit' value='PI D' ></form>\r\n");
          }
          client.println(F("Sta Piovendo:"));
          if ((((millis() - startingTimePioggia2) / 60000) < (TIMEOUTPICCOLA / 60000)) && (stapiovendo == true)) {
            client.println((((TIMEOUTPICCOLA / 60000) - (millis() - startingTimePioggia2) / 60000)));
          }
          else
          {
            client.println("NO");
          }
          client.println(F("
"));
          client.print("</html>\r\n");
          break;

        }
        if (buf.endsWith("GET /A")) {
          stato_pulsanteSX = 1;
        }
        if (buf.endsWith("GET /B")) {
          stato_pulsanteSX = 0;
        }
        if (buf.endsWith("GET /C")) {
          stato_pulsanteCENTRO = 1;
        }
        if (buf.endsWith("GET /D")) {
          stato_pulsanteCENTRO = 0;
        }
        if (buf.endsWith("GET /E")) {
          stato_pulsantePICCOLA = 1;
        }
        if (buf.endsWith("GET /F")) {
          stato_pulsantePICCOLA = 0;
        }
      }
    }
    // give the web browser time to receive the data
    delay(10);
    // close the connection:
    client.stop();
  }
}

nid69ita: Guglielmo, lui parla dell'esempio WebServerLed di quella lib, e li il buffer è usato a mo di String per accumulare i dati ricevuti dal client

Ah, ok, quindi se ne istanzia una copia per l'uso dell'esempio ...

Guglielmo

due cose, una mi auto quoto per non perdere la domanda:

poi visto che ci sono chiedo: per stampare un pulsante… ad esempio:

      client.print("<form id='F1' action='/E'><input class='button' type='submit' value='PI A' ></form>\r\n");

qui quanti byte ho? e come lo capisco/conto?

l’altra è, prendendo l’esempio nel link

se The LED is sono 10 caratteri ovvero 10 byte, perchè il buffer è di 8?

// the content of the HTTP response follows the header:
  client.print("The LED is ");
  client.print(ledStatus);
  client.println("
");
  client.println("
");

?? quello è la pagina di risposta, il ringbuffer è usato solo per ricevere i parametri del richiedente, tipicamente dopo ? esempio http..../pagina.htm?par=1 quindi par=1

nid69ita: ?? quello è la pagina di risposta, il ringbuffer è usato solo per ricevere i parametri del richiedente, tipicamente dopo ? esempio http..../pagina.htm?par=1 quindi par=1

cioè solo se io da remoto chiedo di fare qualcosa? come se cambio lo stato di un pulsante?

e dove momorizzo i dati se richiedo qualcosa da remoto? e nello specifico tutte quelle informazioni che avevo postato nel post #14?

>simosere: ma mi spieghi perché ti incasini con certe librerie e non utilizzi invece l'ottima libreria Webbino di SukkoPera? Funziona che è una bellezza. è semplice da implementare, è mutipiattaforma, fa tutto lei ... che vuoi di più? Solo complicarti la vita ... :o

Guglielmo