/*
   PAC 1934 Microchip- snimani napeti a proudu na CH1 a CH2
   ve smycce loop je napsan vzorec pro vypocet jednotlivych hodnot
 * * pro CHANNEL 1 je snimani sekundaru, kde je R=0,05 ohm, a FSC= 2
 * * pro CHANNEL 2 je snimani primaru, kde je R=0,02 ohm, FSC =5
 * (float)VBUS2 je pro pretypovani hodnot. Kdyby se tak neudelalo, tak by vysledne hodnoty byly jenom integer 
 * registr pro snimani napeti byl zvolen registr AVARANGE
 * 
*/


//import knihovny pro komunikaci I2C
#include <Wire.h>

#define PAC1934_ADDRESS 0x10                //adresa zařízení zjisteni z datasheetu a nebo pomoci programu "zjisteni I2C"

// PROMENNE ****************************  neznamenkovy 16-bit integer; zadefinovani promennych
uint16_t VSENSE1;                           //proud na sekundarni strane [0,05 ohm]
uint16_t VBUS1;                             //napeti na sekundarni strane
uint16_t VBUS2;                             //napeti na primarni strane
uint16_t VSENSE2;                           //proud na sekundarni strane [0,02 ohm]

//PRIMAR
float V_prim;
float I_prim;

//SEKUNDAR
float V_sek;
float I_sek;



void setup() {
  //Inicializace knihovny
  //Pokud se zadá s parametrem, je zařízení přidělena adresa
  Wire.begin();

  //komunikace po sériovém portu
  Serial.begin(9600);

  // zahajeni a zapis na adresu 01H
  Wire.beginTransmission(PAC1934_ADDRESS);  //zahájení komunikace s PAC na požadovane adrese
  Wire.write(0x01);                         //(Register ADDRESS 01H) (otevru registr)
  Wire.write(0xC0);                         //zapis do registru      (zapsani hodnoty- nastaveni registru)
  Wire.endTransmission();                   //ukončení komunikace

  // Zahajeni zapis na adresu 1C (chanell-dis, SMBUS)   - nastaveni kanalu, on/off
  Wire.beginTransmission(PAC1934_ADDRESS);  //zahájení komunikace s PAC na požadovane adrese
  Wire.write(0x1C);                         //(Register ADDRESS 1CH) (otevru registr)
  Wire.write(0x32);                         //zapis do registru      (zapsani hodnoty- nastaveni registru)
  Wire.endTransmission();                   //ukončení komunikace

  // Zahajeni zapis na adresu 1D (NEG_PWR)  - nastaveni rozsahu pro mereni
  Wire.beginTransmission(PAC1934_ADDRESS);  //zahájení komunikace s PAC na požadovane adrese
  Wire.write(0x1D);                         //(Register ADDRESS 1DH) (otevru registr)
  Wire.write(0x00);                         //zapis do registru      (zapsani hodnoty- nastaveni registru)
  Wire.endTransmission();                   //ukončení komunikace

}


void loop() {
  // REFRESH_V- hodnot
  Wire.beginTransmission(PAC1934_ADDRESS);
  Wire.write(0x1F);
  Wire.endTransmission();  

  // nacteni hodnot z PACU
  VBUS1 = getVBUS1();                       //načtení napeti z kanalu CH1 pro VBUS1
  VSENSE1 = getVSENSE1();                   // nacteni proudu z kanalu CH1 pro VSENSE1
  VBUS2 = getVBUS2();                       //načtení napeti z kanalu CH2 pro VBUS2
  VSENSE2 = getVSENSE2();                   // nacteni proudu z kanalu CH2 pro VSENSE2

  // vypocet hodnot pro primarni stranu
  V_prim = 0.00048828125 * (float)VBUS2;              // vysvetleno nahore             
  I_prim = 0.0000762939453125 * (float)VSENSE2;             
  
  //vypocet hodnot pro sekundarni stranu
  V_sek = 0.00048828125 * (float)VBUS1;                          
  I_sek = 0.000030517578125 * (float)VSENSE1;                    



  //  Serial.println(hodnota1);                //vypsání na sériový port
  delay(100);                                //zpoždění 0,1 sekundy



}

//-------------------------------------------FUNKCE1 pro výpis napeti na CH1------------------------------------------------------------

uint16_t getVBUS1() {                       // nacteni hodnoty pomoci knihovny Wire.h

  uint16_t vbus1;                           //interní proměnná pro měření 16bit proměnná
  Wire.beginTransmission(PAC1934_ADDRESS);  //zahájení komunikace s PAC na požadované adrese
  Wire.write(0x0F);                         // adresa pro napeti na CH1 (Vbus1_AVG)
  Wire.endTransmission();                   //ukončení komunikace - automaticky posle read bit
  Wire.requestFrom(PAC1934_ADDRESS, 2);     //požadavek na dva bajty od zařízení s adresou PAC1934_ADDRESS 0x07


  vbus1 = Wire.read();                      //přečtení dat (horní bajt)
  vbus1 <<= 8;                              //bitový posun o 8 bitů vlevo- potreba pro 16-bit
  vbus1 += Wire.read();                     //přičtení dat (dolní bajt)


  return vbus1;                             //navrácení výsledku
}


//-------------------------------------------FUNKCE2 pro výpis produ na CH1------------------------------------------------------------

uint16_t getVSENSE1() {                       // nacteni hodnoty pomoci knihovny Wire.h

  uint16_t vsense1;                           //interní proměnná pro měření 16bit proměnná
  Wire.beginTransmission(PAC1934_ADDRESS);    //zahájení komunikace s PAC na požadované adrese
  Wire.write(0x13);                           // adresa pro vypis proudu z CH1 (Vsense1_AVG)
  Wire.endTransmission();                     //ukončení komunikace - automaticky posle read bit
  Wire.requestFrom(PAC1934_ADDRESS, 2);       //požadavek na dva bajty od zařízení s adresou PAC1934_ADDRESS 0x0B


  vsense1 = Wire.read();                      //přečtení dat (horní bajt)
  vsense1 <<= 8;                              //bitový posun o 8 bitů vlevo- potreba pro 16-bit
  vsense1 += Wire.read();                     //přičtení dat (dolní bajt)


  return vsense1;                             //navrácení výsledku
}



//-------------------------------------------FUNKCE3 pro výpis napeti na CH2------------------------------------------------------------

uint16_t getVBUS2() {                       // nacteni hodnoty pomoci knihovny Wire.h

  uint16_t vbus2;                           //interní proměnná pro měření 16bit proměnná
  Wire.beginTransmission(PAC1934_ADDRESS);  //zahájení komunikace s PAC na požadované adrese
  Wire.write(0x10);                         // adresa pro napeti na CH1 (Vbus1_AVG)
  Wire.endTransmission();                   //ukončení komunikace - automaticky posle read bit
  Wire.requestFrom(PAC1934_ADDRESS, 2);     //požadavek na dva bajty od zařízení s adresou PAC1934_ADDRESS 0x08


  vbus2 = Wire.read();                      //přečtení dat (horní bajt)
  vbus2 <<= 8;                              //bitový posun o 8 bitů vlevo- potreba pro 16-bit
  vbus2 += Wire.read();                     //přičtení dat (dolní bajt)


  return vbus2;                             //navrácení výsledku
}


//-------------------------------------------FUNKCE4 pro výpis produ na CH2------------------------------------------------------------

uint16_t getVSENSE2() {                       // nacteni hodnoty pomoci knihovny Wire.h

  uint16_t vsense2;                           //interní proměnná pro měření 16bit proměnná
  Wire.beginTransmission(PAC1934_ADDRESS);    //zahájení komunikace s PAC na požadované adrese
  Wire.write(0x14);                           // adresa pro vypis proudu z CH1 (Vsense1_AVG)
  Wire.endTransmission();                     //ukončení komunikace - automaticky posle read bit
  Wire.requestFrom(PAC1934_ADDRESS, 2);       //požadavek na dva bajty od zařízení s adresou PAC1934_ADDRESS 0x0C


  vsense2 = Wire.read();                      //přečtení dat (horní bajt)
  vsense2 <<= 8;                              //bitový posun o 8 bitů vlevo- potreba pro 16-bit
  vsense2 += Wire.read();                     //přičtení dat (dolní bajt)


  return vsense2;                             //navrácení výsledku
}
