/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/ttgo-lora32-sx1276-arduino-ide/
*********/

//Libraries for LoRa
#include <SPI.h>
#include <LoRa.h>

#include "BluetoothSerial.h"

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif


BluetoothSerial SerialBT;

//Libraries for OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

//define the pins used by the LoRa transceiver module
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 14
#define DIO0 26

//433E6 for Asia
//866E6 for Europe
//915E6 for North America
#define BAND 866E6

//OLED pins
#define OLED_SDA 4
#define OLED_SCL 15 
#define OLED_RST 16
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);

String LoRaData;

void setup() { 
  
  //reset OLED display via software
  pinMode(OLED_RST, OUTPUT);
  digitalWrite(OLED_RST, LOW);
  delay(20);
  digitalWrite(OLED_RST, HIGH);
  
  //initialize OLED
  Wire.begin(OLED_SDA, OLED_SCL);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  display.print("LORA RECEIVER ");
  display.display();
  
  //initialize Serial Monitor
  Serial.begin(115200);
 SerialBT.begin("ESP32test"); //Bluetooth device name
  Serial.println("LoRa Receiver Test");
  
  //SPI LoRa pins
  SPI.begin(SCK, MISO, MOSI, SS);
  //setup LoRa transceiver module
  LoRa.setPins(SS, RST, DIO0);

  if (!LoRa.begin(BAND)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
  Serial.println("LoRa Initializing OK!");
  display.setCursor(0,10);
  display.println("LoRa Initializing OK!");
  display.display();  
}

void loop() {

  //try to parse packet
  int packetSize = LoRa.parsePacket();
  if (packetSize) {
    //received a packet
    Serial.print("Received packet ");

    //read packet
    while (LoRa.available()) {
      LoRaData = LoRa.readString();
    //Serial.print(LoRaData);
     
    // SerialBT.print(LoRa.readString());
     
    //if (Serial.available()) {
    // SerialBT.print(LoRa.readString());
     
 // }
    
    }

    //print RSSI of packet
    SerialBT.print(LoRaData);
    Serial.print(LoRaData);
    int rssi = LoRa.packetRssi();
    Serial.print(" with RSSI ");    
    Serial.println(rssi);
    SerialBT.print("' with RSSI ");
     SerialBT.println(LoRa.packetRssi());
 //   Dsiplay information

String readString = (LoRaData);

// Split the readString by a pre-defined delimiter in a simple way. '%'(percentage) is defined as the delimiter in this project.
int delimiter, delimiter_1, delimiter_2,  delimiter_3 ;

delimiter = readString.indexOf("#");
delimiter_1 = readString.indexOf(",", delimiter + 1);
delimiter_2 = readString.indexOf(",", delimiter_1 +1);
delimiter_3 = readString.indexOf(",", delimiter_2 +1);

// Define variables to be executed on the code later by collecting information from the readString as substrings.
String pression = readString.substring(delimiter + 1, delimiter_1);
String numcapteur = readString.substring(delimiter_1 + 1, delimiter_2);
String compteur = readString.substring(delimiter_2 + 1, delimiter_3);


 
   display.clearDisplay();
   display.setCursor(0,0);
   //display.print("RECEPT CAPTEUR POMPE");
   //display.setCursor(0,10);
   display.print("pression   ");
   display.print(pression);
   display.setCursor(0,20);
   display.setTextSize(2);
   display.print(numcapteur);
   display.setTextSize(1);
  display.setCursor(0,40);
  // display.print(compteur);
   display.setCursor(0,50);
   display.print("RSSI:");
   display.setCursor(30,50);
   display.print(rssi);
   display.display();   
   
    int Pression = pression.toInt();
    
  if (Pression > 100) { 
    display.setCursor(60,40);
    display.setTextSize(2);
    display.print("OK");
    display.setTextSize(1);
    Serial.println(Pression);
    display.display();
  }
 else {
    display.setCursor(60,40);
    display.setTextSize(2);
    display.print("Fail");
    display.setTextSize(1);
    display.display();
  }
  }
  }

  
