Account con password

Salve a tutti

Avrei bisogno di un aiuto…praticamente sto lavorando sempre sul mio solito progetto per creare una tastiera ethernet partendo da una tastiera PS2…
a questo punto devo introdurre degli account sotto password…mi spiego meglio…cio che devo fare è scrivere un messaggio, premere invio e fare una richiesta di password…dopo aver introdotto la password corretta, abilito una scrittura su Sd card e infine passo alla immissione su ethernet…fino ad ora sono riuscito a creare una funzione password attraverso la libreria Pasword.h che scrive su Sd se riesco a loggarmi correttamente, con la scrittura su sd che nn avviene fino a quando non mi loggo correttamente…cio che non riesco a fare è legare tra di loro la funzione appena citata e la funzione di lettura tastiera…nel senso che se immetto i caratteri via tastiera e premo invio, non riesco in nessun modo ad entrare nella funzione password da me creata…sapete darmi una mano? di seguito riporto lo sketch della funzione passoword (chiamata valuta_account) e la funzione lettura tastiera…

void valuta_account_di_invio(int abilitazione) {
  //
  while(abilitazione) {
    if (!keyboard.available())   return;
    char c = keyboard.read();
    if (c != PS2_ENTER) {
      password.append(c);
      password1.append(c);
      Serial.print("*");
      e++; 
    }
    if((e == 4 && c == PS2_ENTER) || (e > 4 && c == PS2_ENTER) || (e < 4 && c == PS2_ENTER))
    {
      if(password.evaluate()) 
      {
        Serial.println();
        Serial.println("password corretta, sei Antonio");
        strcpy(temp1, temp);
        password.reset(); 
        if (!myFile.open("test.txt", O_RDWR | O_CREAT | O_AT_END))
        {
          Serial.println(F("Errore apertura file"));
        } 
        else 
        {
          
          Serial.println();
          Serial.println(temp1);
          myFile.print("Messaggio da Antonio: ");
          myFile.print(temp1);
          myFile.println("

");
          myFile.println();
          myFile.close();
        }
        break;
      } 
      else if(password1.evaluate())
      {
        Serial.println();
        Serial.println("password corretta, sei Marco");
        password1.reset();
        strcpy(temp1, temp);
        if (!myFile.open("test.txt", O_RDWR | O_CREAT | O_AT_END))
        {
          Serial.println(F("Errore apertura file"));
        } 
        else 
        {
          Serial.println();
          Serial.println(temp1);
          myFile.print("Messaggio da Marco: ");
          myFile.print(temp1);
          myFile.println("

");
          myFile.println();
          myFile.close();
        }
        break;
      } 
      else       
      {
        Serial.println();
        Serial.println("password errata prego reinserire la password");
        password.reset();
        password1.reset();
        e = 0;        
      }
    }
  }
  abilitazione = 0;
}
void tastiera () 
{
  while(1) 
  {
    if(!keyboard.available()) return;
    char c = keyboard.read();
    Serial.print(c);
    if( c == PS2_ENTER || (i == (SIZE-1))) break;
    temp[i] = c;
    i++;
  }
  temp[i] = 0x00;
  i = 0;
  consenso = 1;
  //
  Serial.println();
  Serial.println("Prego inserire la password");
  //
  valuta_account_di_invio(consenso);
}

Invece di stampare

 Serial.print("*");

perché non stampi il contenuto di password e il carattere immesso?
Almeno vedi se tutto funziona.
Poi lo cambi in fase di rilascio.

La funzione fa cio che deve fare.....il problema è che nn riesco a legare le due funzioni assieme.....
dovrei fare qualcosa che escluda le due funzioni......il mio timore è che siano i due cicli while che non si piacciono molto......

Io invece non ho capito la linea di principio di funzionamento:

Inserisci un messaggio da tastiera? tipo “sono Marco” e il sistema ti chiede una passw dopo? sulla SD quando deve scriverci? ecosa deve scriverci?

immetto un messaggio da tastiera PS2......mano mano che i caratteri dalla tastiera (PS2) vengono digitati, vengono caricati in un buffer......quando premo il tasto invio della tastiera succedere che questo buffer viene memorizzato all interno di un ulteriore buffer che verra memorizzato sulla sd (della ethernet shield) e successivamente verrà immesso su rete ethernet....

la modifica che devo fare sul programma sopracitato è la seguente:
Quando premo invio il programma anziche memorizzare i caratteri digitati sulla Sd, deve chiedermi una password.....quando la password è corretta il programma copiera sulla sd il buffer precedentemente memorizzato e immettera il tutto su rete ethernet......
questa cosa la funzione che ho messo la fa perfettamente......chiede una password.....e fino a quando non viene immessa la password corretta la scrittura su sd non avviene......il problema è che cio di cui ho bisogno io è immettere prima di tutto il testo (che visualizzo su monitor seriale) e poi quando premo invio far partire la funzione che ho creato

Capito, il modo migliore per fonderlo è usare un solo input da tastiera e usare dei flag a seconda di quello che si sta facendo o chiedendo in quel momento

void Inserimento_dati_tastiera() {
flag =0 (nessun utente sta scrivendo)
flag =1 (si è presentato un utente "pinco pallino" e deve inserire un USERNAME)
salvo i char in un char buffer USER
premo invio quindi chiudo l'immissione del flag 1 ...
flag =2 (deve inserire PASSWORD)
salvo i char in un char buffer PASSW
premo invio quindi chiudo l'immissione del flag 2 ...
aspetta che controllo se sei registrato
si, sei registrato ... scrivo sul server esterno
si, sei registrato ... scrivo su SD
flag=0 (nessun utente sta scrivendo)
}

è tutto un gioco di IF

E' chiaro che nessuno di noi sa cosa sta facendo il loop() mentre inseriamo i dati sulla keyboard, se deve fare nel frattempo qualcosa o se tutto è fermo fino a quando ti trovi dentro l'immissione.
non è possibile darti un listato di codice funzionante, perchè intanto va capito cosa hai fatto tu, andrebbe caricato tutto e modificato, poi non tutti abbiamo lo stesso metodo, tu hai l'idea finale di come deve essere il tutto noi no.

ciao

infatti mi sto accorgendo che la migliore gestione del programma avviene usando una variabile globale di lettura tastiera e basta.....

usi lo stesso while,
if flag==1 i char ricevuti vanno nel buffer USER
if flag==2 i char ricevuti vanno nel buffer PASSW
poi chiudi con invio .... non si accettano più char da tastiera per quel buffer

almeno questo è come lo vedo io, poi magari qualcun'altro la pensa in modo diverso

problema risolto!
sono riuscito ad ingtegrare le due funzioni tra di loro....

Quindi come?

Cosi

#include <SdFat.h>
#include <SPI.h>
#include <Ethernet.h>
#include <PS2Keyboard.h>
#include <Password.h>
//
Password password = Password("1234");
Password password1 = Password("4567");
//
#define SIZE 300
#define DATA 2
#define CLOCK 3
//
char temp[SIZE];
char temp1[SIZE];
int i;
//
char f;
int e = 0;
//
SdFat sd;
SdFile myFile;
//
EthernetClient client;
byte mac[]={
  0x90, 0xA2, 0xDA, 0x0F, 0x41, 0xD3};
IPAddress ip (192,168,1,238);
EthernetServer server = EthernetServer(80);
//
PS2Keyboard keyboard;
//
void setup() {
  //
  delay(1000);         
  //
  temp[0] =0x00;
  temp1[0]=0x00;
  i = 0;
  //
  pinMode(10, OUTPUT);
  digitalWrite(10, HIGH);
  //
  Serial.begin(9600);
  Serial.println(F("Inizializzazione sistema ... attendere prego ..."));
  Serial.println();
  //
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print(F("Inizializzazione Ethernet completata: IP: "));
  Serial.println(Ethernet.localIP());
  Serial.println();
  //
  if (!sd.begin(4, SPI_HALF_SPEED)) {
    Serial.println(F("Inizializzazione SD card fallita ..."));
    Serial.println();
    return;
  }
  else {
    Serial.println(F("Inizializzazione SD card completata"));
    Serial.println();
  }
  keyboard.begin(DATA, CLOCK, PS2Keymap_US);
  //keyboard.begin(DATA, CLOCK, PS2Keymap_German);
  //keyboard.begin(DATA, CLOCK, PS2Keymap_French);
  Serial.println(F("... sistema inizializzato."));
  Serial.println();
  Serial.println(F("Immettere un messaggio ..."));
  Serial.println();
}

void loop() 
{
  EthernetClient client = server.available();
  if (client) 
  {
    boolean currentLineIsBlank = true;
    while (client.connected()) 
    {
      if (client.available()) 
      {
        char c = client.read();


        if (c == '\n' && currentLineIsBlank) 
        {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  
          client.println("Refresh: 20");  
          client.println();          
          if (myFile.open("test.txt", O_READ)) 
          {
            while (myFile.available()) 
            {         
              client.write(myFile.read());                         
            }

            client.println();
            myFile.close();

          }          

          break;
        }
        if (c == '\n') 
        {

          currentLineIsBlank = true;

        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }

    delay(1);

    client.stop();
  }

  delay(50);  
  //
  lettura_tastiera();
}


void lettura_tastiera() 
{
  while(1) 
  {  
    if(!keyboard.available()) return;
    char c = keyboard.read();

    Serial.print(c);

    if(c == PS2_ENTER || i == (SIZE-1)) break;
    temp[i]=c;
    i++;
  }
  temp[i]=0x00;
  i=0;
  //
  Serial.println();
  Serial.println(F("Prego immettere password"));
  //
  immissione_password();
  //
}


void immissione_password()
{//
  while(1)
  {
    if(keyboard.available()) {
      f = keyboard.read();
      if(f != PS2_ENTER) 
      {
        password.append(f);
        password1.append(f);
        Serial.print("*");
        e++;
      }
      if((f == PS2_ENTER && e == 4) || (f == PS2_ENTER && e < 4) || (f == PS2_ENTER && e > 4))      {
        if(password.evaluate()) {
          strcpy(temp1,temp);
          Serial.println();
          Serial.println(F("La password e' corretta, sei Antonio"));
          password.reset();
          password1.reset(); 
          if (!myFile.open("test.txt", O_RDWR | O_CREAT | O_AT_END))
          {
            Serial.println(F("Errore apertura file"));
          } 
          else 
          {
            Serial.println();
            Serial.println(temp1);
            myFile.print(F("Messaggio da Antonio:"));
            myFile.print(temp1);
            myFile.println("

");
            myFile.println();
            myFile.close();
          }        
          break;
        } 
        else  if(password1.evaluate()) {
          strcpy(temp1,temp);
          Serial.println();
          Serial.println(F("La password e' corretta, sei Marco"));
          password.reset();
          password1.reset();
          if (!myFile.open("test.txt", O_RDWR | O_CREAT | O_AT_END))
          {
            Serial.println(F("Errore apertura file"));
          } 
          else 
          {
            Serial.println();
            Serial.println(temp1);
            myFile.print(F("Messaggio da Marco: "));
            myFile.print(temp1);
            myFile.println("

");
            myFile.println();
            myFile.close();
          }
          break;
        }
        else 
        {
          Serial.println();
          Serial.println(F("Password sbagliata"));
          password.reset();
          password1.reset();
        }
      }
    }
  }
}