//#include "Arduino.h"
//#include "sys/time.h"
//#include "BLEBeacon.h"
//#include "esp_sleep.h"

#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include <BLEBeacon.h>

#define BEACON_POWER ESP_PWR_LVL_N12

/*
02 01 06 09 FF 16 0F 01 Префикс
03 57 уровень топлива
24 напряжение питания
1C термиапература
00 версия проткоола
0A 09 разделитель 
69 32 31 30 38 30 30 31 имя
05 77 разделитель
61 05 e4 01 время UTC
00 Версия пакета
*/

byte topB = 1;
byte temB = 1;

BLEAdvertising *pAdvertising;

void setup() {

    
  Serial.begin(115200);
  Serial.println("START");
  // Create the BLE Device
  BLEDevice::init("ESP32 TEST");
  BLEDevice::setPower(BEACON_POWER);
  pAdvertising = BLEDevice::getAdvertising();
  
}

void loop() {

  setBeacon();
  Serial.println("Advertizing started...");
  pAdvertising->start();  
  delay(100);
  Serial.println("Advertizing stoped...");
  pAdvertising->stop();  
  delay(300);
}

void setBeacon() {
  pAdvertising->stop();
  BLEAdvertisementData oAdvertisementData;//Важно не трогай больше
 // BLEAdvertisementData oAdvertisementData = BLEAdvertisementData();
 // BLEAdvertisementData oScanResponseData = BLEAdvertisementData();
  /*
  char strServiceData[30];
  
  strServiceData [0] = 0x02;
  strServiceData [1] = 0x01;
  strServiceData [2] = 0x06;  
  strServiceData [3] = 0x1A;//тут типо длина строки
  strServiceData [4] = 0xFF;
  strServiceData [5] = 0x16;
  strServiceData [6] = 0x0F;
  strServiceData [7] = 0x01;//Формирование  префикса закончилось
  topB++;
  strServiceData [8] = topB;
  strServiceData [9] = 0x01;//Уровень топлива
  //strServiceData += (char)0x00;//Уровень топлива
  strServiceData [10] = 0x24;//Зарпяд питания
  temB++;
  strServiceData [11] = temB;//Температура
  //strServiceData += (char)0x1C;//Температура
  strServiceData [12] = 0x01;//Версия протокола
  strServiceData [13] = 0xA0;
  strServiceData [14] = 0x09;//Разделитель
  strServiceData [15] = 0x69;
  strServiceData [16] = 0x32;
  strServiceData [17] = 0x31;
  strServiceData [18] = 0x30;
  strServiceData [19] = 0x38;
  strServiceData [20] = 0x30;
  strServiceData [21] = 0x30;
  strServiceData [22] = 0x31;//Конец имени
  strServiceData [23] = 0x05;
  strServiceData [24] = 0x77;//Разделитель
  strServiceData [25] = 0x01;
  strServiceData [26] = 0xE4;
  strServiceData [27] = 0x05;
  strServiceData [28] = 0x61;//Время в UTC
  strServiceData [29] = 0x00;//версия пакета
  //strServiceData [30] = 0x00;
  oAdvertisementData.addData(strServiceData);
  */
  
  String strServiceData = "";
  
  //strServiceData += (char)0x1A;
  //strServiceData += (char)0xFF;
  strServiceData += (char)0x02;
  strServiceData += (char)0x01;
  strServiceData += (char)0x06;  
  strServiceData += (char)0x1A;//тут типо длина строки
  strServiceData += (char)0xFF;
  strServiceData += (char)0x16;
  strServiceData += (char)0x0F;
  strServiceData += (char)0x01;//Формирование  префикса закончилось
  topB++;
  strServiceData += (char)topB;
  strServiceData += (char)0x00;//Уровень топлива
  //strServiceData += (char)0x00;//Уровень топлива
  strServiceData += (char)0x24;//Зарпяд питания
  temB++;
  strServiceData += (char)temB;//Температура
  //strServiceData += (char)0x1C;//Температура
  strServiceData += (char)0x00;//Версия протокола
  strServiceData += (char)0xA0;
  strServiceData += (char)0x09;//Разделитель
  strServiceData += (char)0x69;
  strServiceData += (char)0x32;
  strServiceData += (char)0x31;
  strServiceData += (char)0x30;
  strServiceData += (char)0x38;
  strServiceData += (char)0x30;
  strServiceData += (char)0x30;
  strServiceData += (char)0x31;//Конец имени
  strServiceData += (char)0x05;
  strServiceData += (char)0x77;//Разделитель
  strServiceData += (char)0x01;
  strServiceData += (char)0xE4;
  strServiceData += (char)0x05;
  strServiceData += (char)0x61;//Время в UTC
  strServiceData += (char)0x00;//версия пакета
  //strServiceData += oBeacon.getData();
  //oAdvertisementData.addData(strServiceData);
  oAdvertisementData.addData(strServiceData.c_str());
  Serial.println(strServiceData.c_str());
  
  pAdvertising->setAdvertisementData(oAdvertisementData);
  //pAdvertising->setScanResponseData(oScanResponseData);
  //pAdvertising->setAdvertisementType(ADV_TYPE_NONCONN_IND);//ADV_TYPE_NONCONN_IND //ADV_TYPE_IND

}
