#include <WiFi.h>
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"
#include <esp_now.h>
#include <Arduino.h>
#include <HCSR04.h>
#include <esp_sleep.h>
//Define necessary parameters
#define WIFI_SSID "Wokwi-GUEST"
#define uS_TO_S_FACTOR 1000000
#define TIME_TO_SLEEP  37.5 //Slep for 37.5 seconds
RTC_DATA_ATTR int bootCount = 0;
unsigned long time1;
unsigned long time2;
unsigned long time3;
unsigned long time4;

unsigned long time5;
uint8_t broadcastAddress[] = {0x8C, 0xAA, 0xB5, 0x84, 0xFB, 0x90};

esp_now_peer_info_t peerInfo;

// Define the trigger and echo pins for the HC-SR04 sensor
const int TRIGPIN = 12; // Replace with the actual pin
const int ECHOPIN = 25;    // Replace with the actual pin

HCSR04 hc(TRIGPIN, ECHOPIN); //Create HCSR04 object (parameters: trig pin, echo pin)
 
// Send data
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  Serial.print("Send Status: ");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Ok" : "Error");
}

//Receiving Callback
void OnDataRecv(const uint8_t * mac, const uint8_t *data, int len) {
  Serial.print("Message received: ");
  char receivedString[len];
  memcpy(receivedString, data, len);
  Serial.println(String(receivedString));
}
// Initialize wi-fi
void initWiFi() {
  // Connect to Wi-Fi
  WiFi.begin(WIFI_SSID);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");
} 
// Initialize ESP-NOW 
void initESPNow() {
  
  if (esp_now_init() != ESP_OK) {
    Serial.println("ESP-NOW initialization failed");
    ESP.restart();
  }
  esp_now_register_send_cb(OnDataSent);
  esp_now_register_recv_cb(OnDataRecv);
  memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  peerInfo.channel = 0;
  peerInfo.encrypt = false;
  esp_now_add_peer(&peerInfo);
  }

void setup(){
  Serial.begin(115200);
  delay(2000);
  // Initialize
   initWiFi();
  initESPNow();
   // Print wifi on time
  time5 = millis();
    Serial.print("wifi on: ");
    Serial.println(time5);
    //Wi-Fi start
    WiFi.mode(WIFI_STA);
    // Print wifi finish time
    time1 = millis();
    Serial.print("wifi: ");
    Serial.println(time1);
   //Get distance data
    float distance = hc.dist();  
  // Print Senor time
    time2 = millis();
    Serial.print("Senor: ");
    Serial.println(time2);
    //Convert test data into status and send it out
    String message;
    if(distance<50){
      message = "OCCUPIED";  
    }
    else{
      message = "FREE";
    }
    esp_now_send(broadcastAddress, (uint8_t*)message.c_str(), message.length() + 1);
      // Print Transmition time
    time3 = millis();
    Serial.print("Trans: ");
    Serial.println(time3);
    delay(100);
 esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);//Set wake up time 
   Serial.println("Going to sleep now");
  esp_deep_sleep_start();//Start deep sleep
}

void loop(){
}


esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
ultrasonic1:VCC
ultrasonic1:TRIG
ultrasonic1:ECHO
ultrasonic1:GND