/*
## ========================================================================================
## MCI Electronics www.mcielectronics.cl  
## 
## Archivo:  picaro_lora.ino
## 
## Descripción: Genera un dato aleatorio y lo envia a través de un LoRaBee
## 
## Dispositivo: Picaro +            - MCI06110
##              LoRaBee             - MCI05818 
## 
## ========================================================================================
##  Ver | dd mmm yyyy | Autor                 | Descripción
## =====|=============|=========|==========================================================
## 1.00 | 25 Nov 2021 | Fernando Velásquez    | Versión inicial
## ========================================================================================
*/

#include <SoftwareSerial.h>
#include <string.h>
#include <rn2xx3.h>
#include <time.h>

#define RX 3
#define TX 2


SoftwareSerial loraSerial(RX, TX);
rn2xx3 myLora(loraSerial);
String str;
time_t periodoTransmision = 300000;               //Cada cuanto tiempo voy a enviar un dato a través de la red LoRa
time_t  t_inico;
size_t temperatura;


void setup(){ 
  
  Serial.begin(115200);
  loraSerial.begin(9600);
  loraSerial.setTimeout(1000);
  Serial.println("Inicializando");
  myLora.autobaud();                            //Esta funcion se encarga de 
  inicializa_radio();
  t_inico = millis();
  transmisionInicial();
 
}

void inicializa_radio()
{
  loraSerial.listen();
  str = loraSerial.readStringUntil('\n');
  Serial.println(str);
  loraSerial.println("sys get ver");
  str = loraSerial.readStringUntil('\n');
  Serial.println(str);
  
  loraSerial.println("mac pause");
  str = loraSerial.readStringUntil('\n');
  Serial.println(str);

  loraSerial.println("radio set mod lora");
  str = loraSerial.readStringUntil('\n');
  Serial.println(str);
  
  loraSerial.println("radio set freq 923300000");
  str = loraSerial.readStringUntil('\n');
  Serial.println(str);
  
  loraSerial.println("radio set pwr 14");
  str = loraSerial.readStringUntil('\n');
  Serial.println(str);
  
  loraSerial.println("radio set sf sf7");
  str = loraSerial.readStringUntil('\n');
  Serial.println(str);
  
  loraSerial.println("radio set afcbw 41.7");
  str = loraSerial.readStringUntil('\n');
  Serial.println(str);
  
  loraSerial.println("radio set rxbw 125");
  str = loraSerial.readStringUntil('\n');
  Serial.println(str);

  loraSerial.println("radio set prlen 8");
  str = loraSerial.readStringUntil('\n');
  Serial.println(str);
  
  loraSerial.println("radio set crc on");
  str = loraSerial.readStringUntil('\n');
  Serial.println(str);
  
  loraSerial.println("radio set iqi off");
  str = loraSerial.readStringUntil('\n');
  Serial.println(str);
  
  loraSerial.println("radio set cr 4/5");
  str = loraSerial.readStringUntil('\n');
  Serial.println(str);
  
  loraSerial.println("radio set wdt 60000");
  str = loraSerial.readStringUntil('\n');
  Serial.println(str);
  
  loraSerial.println("radio set sync 12");
  str = loraSerial.readStringUntil('\n');
  Serial.println(str);
  
  loraSerial.println("radio set bw 125");
  str = loraSerial.readStringUntil('\n');
  Serial.println(str);

  Serial.println("Inicializando loop");
  
}



//Funcion encargada de enviar comandos al modulo LoRaBee
String enviaComandoLora(const String& comando){
  delay(100);
  while(loraSerial.available()){       //Limpia el buffer del modulo LoRaBee
    loraSerial.read();
  }
  loraSerial.println(comando);
  while(loraSerial.available() == 0){
  }
  String res = loraSerial.readStringUntil('\n');
  res.trim();
  Serial.println(res);                //Descomenta para debuguear
  return res;
}

//Funcion encargada de enviar mensajes a travez del modulo LoRaBee
String enviaMensajeLora(const String& mensaje){
  String comando_tx = "radio tx ";
  String mensaje_tx = comando_tx + mensaje;           //Une el mensaje que quiero enviar con el comando radio tx
  while(loraSerial.available()){                       //Limpia el buffer del modulo LoRaBee
  loraSerial.read();
  }
  loraSerial.println(mensaje_tx);                    
  String res = loraSerial.readStringUntil('\n');
  Serial.println(res);
  res = loraSerial.readStringUntil('\n');
  Serial.println(res);                                //Descomenta para debuguear
  return res;
}

void transmisionInicial(){
  temperatura = random(20, 30);
  Serial.println(temperatura);
  enviaMensajeLora(String(temperatura, HEX));
  t_inico = millis();   
}
void loop(){
  if ((millis() - t_inico) > periodoTransmision){
    temperatura = random(20, 30);
    Serial.println(temperatura);
    enviaMensajeLora(String(temperatura, HEX));
    t_inico = millis();  
  } 
}
