/* Credits: Optimus Digital
 *  Programul creat mai jos are rolul de a afișa în Serial Monitor curentul și tensiunea 
 *  de ieșire atunci când se introduce caracterul 'C' (pentru curent) și 'R' (pentru tensiune)
 */

  

//biblioteca utilizata pentru a crea o conexiune serială cu sursa
#include <SoftwareSerial.h>

//definiți pinii utilizat ca RX și TX

//în exemplul nostru pinul RX este pinul digital 10, iar
//pinul TX este pinul digital 11

#define rxPin 10
#define txPin 11

//se configurează conexiunea serială 
SoftwareSerial mySerial(rxPin, txPin);


byte readCurrent[]={'\xBB','\xCC','\x01', '\x00', '\x00', '\x00' ,'\x88'};

byte readVoltage[]={'\xBB','\xCC','\x01', '\x01', '\x00', '\x00' ,'\x89'};

char ch='V';

void setup()
{ 
  //se inițializează comunicarea cu sursa de tensiune
  //baud rate-ul este de 9600
  mySerial.begin(9600);

  //se inițializează comunicarea cu computerul
  //baud rate-ul este de 9600
  Serial.begin(9600);

  //se trimite în Serial Monitor confirmarea că placa de dezvoltare
  //a pornit cu succes
  Serial.println("Comunicarea seriala a fost pornita");
  
}
int i=0;
int value;

void loop()
{  i=0;
// se verifică dacă s-a introdus o comandă în Serial Monitor
  if( Serial.available() )
  {  
    ch=Serial.read();
    
     //dacă caracterul introdus este 'V' atunci se trimite comanda
     //readVoltage către sursa.
     if(ch == 'V')
          { 
            //se trimite comanda de citire a tensiunii de ieșire            
            mySerial.write(readVoltage,sizeof(readVoltage)/sizeof(readVoltage[0]) );

            //se asteaptă până când se primește un raspuns de la sursa de tensiune
            while(!mySerial.available());

            //se reseteaza contorul i cu valoarea 0
            i=0;

            //sursa trimite mai multe mesaje, fiecare mesaj reprezinta un octet
            //octetul care ne oferă informații utile este al 5-lea
            while(mySerial.available())
            {

            //se stochează valoarea citita de la sursa
            value=mySerial.read();
            //se asteaptă 10 ms pentru a ne asigura ca ajunge si mesajul urmator
            delay(10);

            //daca octetul citit este al 5-lea, atunci afisam in Serial Monitor
            //tensiunea citita
            if(i == 5)
              {Serial.print("Tensiunea de iesire: ");
               Serial.print(value/10.0);
               Serial.println(" V");
              }
              
            //incrementam contorul
            i++;    
            }
           
           
          }
     //dacă caracterul introdus este 'C' atunci se trimite comanda
     //readCurrent către sursa.
     if(ch == 'C')
          {
            //se trimite comanda de citire a curentului de ieșire 
            mySerial.write(readCurrent,sizeof(readCurrent)/sizeof(readCurrent[0]) );

            //se asteaptă până când se primește un raspuns de la sursa de tensiune
            while(!mySerial.available());

            //se reseteaza contorul i cu valoarea 0
            i=0;

            //sursa trimite mai multe mesaje, fiecare mesaj reprezinta un octet
            //octetul care ne oferă informații utile este al 4-lea
            while(mySerial.available())
            {
             //se stochează valoarea citita de la sursa
             value=mySerial.read();
             
             //se asteaptă 10 ms pentru a ne asigura ca ajunge si mesajul urmator
             delay(10);
             //daca octetul citit este al 4-lea, atunci afisam in Serial Monitor
             //curentul consumat
             if(i == 4)
              {
               Serial.print("Curentul consumat: ");
               Serial.print(value/10.0);
               Serial.println(" A");
              }
             //incrementam contorul
            i++;    
            }
          }
  }  


  
}
